From 51fc32b3be62c91ade12bcc493e3e7ab50b7c5ae Mon Sep 17 00:00:00 2001 From: jsurfer Date: Sat, 9 Oct 2004 14:03:31 +0000 Subject: [PATCH] RSS news reader; initially copied from "all the news" --- archive/net.sourceforge.phpeclipse.news/.classpath | 8 + archive/net.sourceforge.phpeclipse.news/.cvsignore | 7 + archive/net.sourceforge.phpeclipse.news/.project | 29 ++ .../.settings/org.eclipse.core.resources.prefs | 3 + archive/net.sourceforge.phpeclipse.news/about.html | 238 +++++++++++ .../build.properties | 11 + .../default_feeds.properties | 16 + .../icons/clear.gif | Bin 0 -> 162 bytes .../icons/external_browser.gif | Bin 0 -> 331 bytes .../icons/headlines.png | Bin 0 -> 589 bytes .../icons/led_dark_green.gif | Bin 0 -> 213 bytes .../icons/led_light_green.gif | Bin 0 -> 213 bytes .../icons/led_red.gif | Bin 0 -> 213 bytes .../icons/led_yellow.gif | Bin 0 -> 213 bytes .../net.sourceforge.phpeclipse.news/icons/leds.xcf | Bin 0 -> 2612 bytes .../net.sourceforge.phpeclipse.news/icons/link.gif | Bin 0 -> 132 bytes .../net.sourceforge.phpeclipse.news/icons/news.gif | Bin 0 -> 937 bytes .../icons/refresh.gif | Bin 0 -> 211 bytes .../lib/xmlrpc-1.2-b1.jar | Bin 0 -> 108476 bytes archive/net.sourceforge.phpeclipse.news/plugin.xml | 61 +++ .../net/sourceforge/phpeclipse/news/Channel.java | 194 +++++++++ .../sourceforge/phpeclipse/news/IconManager.java | 100 +++++ .../src/net/sourceforge/phpeclipse/news/Item.java | 273 ++++++++++++ .../net/sourceforge/phpeclipse/news/Messages.java | 39 ++ .../sourceforge/phpeclipse/news/Perspective.java | 31 ++ .../net/sourceforge/phpeclipse/news/Plugin.java | 248 +++++++++++ .../sourceforge/phpeclipse/news/RssListener.java | 23 + .../sourceforge/phpeclipse/news/UpdateThread.java | 36 ++ .../phpeclipse/news/messages.properties | 3 + .../phpeclipse/news/pref/BanListEditor.java | 63 +++ .../phpeclipse/news/pref/ChannelStore.java | 173 ++++++++ .../phpeclipse/news/pref/ListEncoder.java | 47 ++ .../phpeclipse/news/pref/PreferencePage.java | 59 +++ .../phpeclipse/news/pref/SiteListEditor.java | 442 ++++++++++++++++++++ .../phpeclipse/news/search/SearchDialog.java | 238 +++++++++++ .../phpeclipse/news/view/ExplorerView.java | 159 +++++++ .../phpeclipse/news/view/HeadlineView.java | 105 +++++ .../news/view/NewsTreeViewerProvider.java | 130 ++++++ 38 files changed, 2736 insertions(+), 0 deletions(-) create mode 100644 archive/net.sourceforge.phpeclipse.news/.classpath create mode 100644 archive/net.sourceforge.phpeclipse.news/.cvsignore create mode 100644 archive/net.sourceforge.phpeclipse.news/.project create mode 100644 archive/net.sourceforge.phpeclipse.news/.settings/org.eclipse.core.resources.prefs create mode 100644 archive/net.sourceforge.phpeclipse.news/about.html create mode 100644 archive/net.sourceforge.phpeclipse.news/build.properties create mode 100644 archive/net.sourceforge.phpeclipse.news/default_feeds.properties create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/clear.gif create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/external_browser.gif create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/headlines.png create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/led_dark_green.gif create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/led_light_green.gif create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/led_red.gif create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/led_yellow.gif create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/leds.xcf create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/link.gif create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/news.gif create mode 100644 archive/net.sourceforge.phpeclipse.news/icons/refresh.gif create mode 100644 archive/net.sourceforge.phpeclipse.news/lib/xmlrpc-1.2-b1.jar create mode 100644 archive/net.sourceforge.phpeclipse.news/plugin.xml create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Channel.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/IconManager.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Item.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Messages.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Perspective.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Plugin.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/RssListener.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/UpdateThread.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/messages.properties create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/BanListEditor.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/ChannelStore.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/ListEncoder.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/PreferencePage.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/SiteListEditor.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/search/SearchDialog.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/ExplorerView.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/HeadlineView.java create mode 100644 archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/NewsTreeViewerProvider.java diff --git a/archive/net.sourceforge.phpeclipse.news/.classpath b/archive/net.sourceforge.phpeclipse.news/.classpath new file mode 100644 index 0000000..0845836 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/archive/net.sourceforge.phpeclipse.news/.cvsignore b/archive/net.sourceforge.phpeclipse.news/.cvsignore new file mode 100644 index 0000000..c865ab9 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/.cvsignore @@ -0,0 +1,7 @@ +build.xml +org.jnegre.allthenews_*.*.*.jar +bin +allthenews.jar +allthenewssrc.zip +patch_*.txt +todo.txt diff --git a/archive/net.sourceforge.phpeclipse.news/.project b/archive/net.sourceforge.phpeclipse.news/.project new file mode 100644 index 0000000..aecfda3 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/.project @@ -0,0 +1,29 @@ + + + net.sourceforge.phpeclipse.news + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.team.cvs.core.cvsnature + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/archive/net.sourceforge.phpeclipse.news/.settings/org.eclipse.core.resources.prefs b/archive/net.sourceforge.phpeclipse.news/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..4e795ad --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Tue Oct 05 18:40:07 CEST 2004 +eclipse.preferences.version=1 +encoding//src/net/sourceforge/phpeclipse/news/messages.properties=8859_1 diff --git a/archive/net.sourceforge.phpeclipse.news/about.html b/archive/net.sourceforge.phpeclipse.news/about.html new file mode 100644 index 0000000..d16f631 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/about.html @@ -0,0 +1,238 @@ + + + + Common Public License - v 1.0 + + + +

Common Public License - v 1.0 +

+

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER +THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR +DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS +AGREEMENT. +

+

1. DEFINITIONS +

"Contribution" means: + +

+ + + +

+

"Contributor" means any person or entity that distributes the +Program. +

+

"Licensed Patents " mean patent claims licensable by a +Contributor which are necessarily infringed by the use or sale of its +Contribution alone or when combined with the Program. + +

+

"Program" means the Contributions +distributed in accordance with this Agreement. +

+

"Recipient" means anyone who receives the Program under this +Agreement, including all Contributors. +

+

2. GRANT OF RIGHTS +

+ + + + + + + + +

3. REQUIREMENTS +

A Contributor may choose to distribute the Program in +object code form under its own license agreement, provided that: +

+ + + + + + + +

When the Program is made available in source code form: + +

+ +

+

Contributors +may not remove or alter any copyright notices contained within the Program. + +

+

Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent Recipients +to identify the originator of the Contribution. +

+

4. COMMERCIAL DISTRIBUTION +

Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the like. +While this license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product offering should +do so in a manner which does not create potential liability for other +Contributors. Therefore, if a Contributor includes the Program in a commercial +product offering, such Contributor ("Commercial Contributor") hereby agrees to +defend and indemnify every other Contributor ("Indemnified Contributor") against +any losses, damages and costs (collectively "Losses") arising from claims, +lawsuits and other legal actions brought by a third party against the +Indemnified Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program in a +commercial product offering. The obligations in this section do not apply to any +claims or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor must: a) promptly +notify the Commercial Contributor in writing of such claim, and b) allow the +Commercial Contributor to control, and cooperate with the Commercial Contributor +in, the defense and any related settlement negotiations. The Indemnified +Contributor may participate in any such claim at its own expense. +

+

For example, a Contributor might include the Program in a +commercial product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance claims, or +offers warranties related to Product X, those performance claims and warranties +are such Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a court +requires any other Contributor to pay any damages as a result, the Commercial +Contributor must pay those damages. + +

+

5. NO WARRANTY +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR +CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A +PARTICULAR PURPOSE. Each Recipient is solely responsible for +determining the appropriateness of using and distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement, including but not +limited to the risks and costs of program errors, compliance with applicable +laws, damage to or loss of data, programs or equipment, and +unavailability or interruption of operations. +

+

6. DISCLAIMER OF LIABILITY +

EXCEPT AS EXPRESSLY SET FORTH IN THIS +AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + +(INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR +THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. +

+

7. GENERAL +

If any provision of this Agreement is +invalid or unenforceable under applicable law, it shall not affect the validity +or enforceability of the remainder of the terms of this Agreement, and without +further action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. +

+

If Recipient institutes patent litigation against a Contributor +with respect to a patent applicable to software (including a cross-claim or +counterclaim in a lawsuit), then any patent licenses granted by that Contributor +to such Recipient under this Agreement shall terminate as of the date such +litigation is filed. In addition, if Recipient institutes patent litigation +against any entity (including a cross-claim or counterclaim in a lawsuit) +alleging that the Program itself (excluding combinations of the Program with +other software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of the date +such litigation is filed. +

+

All Recipient's rights under this Agreement shall terminate if +it fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of time after +becoming aware of such noncompliance. If all Recipient's rights under this +Agreement terminate, Recipient agrees to cease use and distribution of the +Program as soon as reasonably practicable. However, Recipient's obligations +under this Agreement and any licenses granted by Recipient relating to the +Program shall continue and survive. +

+

Everyone is permitted +to copy and distribute copies of this Agreement, but in order to avoid +inconsistency the Agreement is copyrighted and may only be modified in the +following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to + +time. No one other than the Agreement +Steward has the right to modify this Agreement. IBM is the initial Agreement +Steward. IBM may assign the responsibility to serve as the Agreement Steward to +a suitable separate entity. Each new version of the +Agreement will be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the Agreement +under which it was received. In addition, after a new version of the Agreement +is published, Contributor may elect to distribute the Program (including its +Contributions) under the new version. +Except as expressly stated in Sections 2(a) and 2(b) above, +Recipient receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by +implication, estoppel or otherwise. All +rights in the Program not expressly granted under this Agreement are +reserved. +

+

This Agreement is governed by the laws of the State of New York +and the intellectual property laws of the United States of America. No party to +this Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. +

+

\ No newline at end of file diff --git a/archive/net.sourceforge.phpeclipse.news/build.properties b/archive/net.sourceforge.phpeclipse.news/build.properties new file mode 100644 index 0000000..6262ab8 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/build.properties @@ -0,0 +1,11 @@ +bin.includes = icons/,\ + plugin.xml,\ + allthenewssrc.zip,\ + about.html,\ + lib/,\ + allthenews.jar,\ + default_feeds.properties,\ + changes.txt +src.includes = src/ +source.allthenews.jar = src/ +bin.excludes = icons/*.xcf diff --git a/archive/net.sourceforge.phpeclipse.news/default_feeds.properties b/archive/net.sourceforge.phpeclipse.news/default_feeds.properties new file mode 100644 index 0000000..474b96a --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/default_feeds.properties @@ -0,0 +1,16 @@ +#This is the list of default feeds. +#The format is url=title +#Beware that characters such as : or = must be escaped in urls + +http\://www.phpeclipse.de/tiki-forums_rss.php=PHPeclipse - User Forums +http\://www.phpeclipse.de/tiki-forum_rss_de.php=PHPeclipse - deutsches Benutzer Forum +http\://www.phpeclipse.de/tiki-wiki_rss.php=PHPeclipse - Wiki +http\://www.eclipseproject.de/backend.php=EclipseProject.de - News +http\://www.eclipseproject.de/backendforum1.php=EclipseProject.de - Eclipse als IDE nutzen +http\://www.eclipseproject.de/backendforum4.php=EclipseProject.de - Eclipse Plugins benutzen +http\://www.eclipseproject.de/backendforum2.php=EclipseProject.de - Eclipse Plugins entwickeln +http\://www.eclipseproject.de/backendforum8.php=EclipseProject.de - SWT/JFace/RCP +http\://www.php.net/news.rss=php.net News +http\://www.jsurfer.org/backend.php=JSurfer.org +http\://today.java.net/pub/q/java_today_rss?x-ver\=1.0=Java.net +http\://eclipse-plugins.2y.net/eclipse/plugins_backend.jsp?what\=newandupdated=EclipsePlugins \ No newline at end of file diff --git a/archive/net.sourceforge.phpeclipse.news/icons/clear.gif b/archive/net.sourceforge.phpeclipse.news/icons/clear.gif new file mode 100644 index 0000000000000000000000000000000000000000..255832653fde9e9748855347fe7bce013aa0a6c7 GIT binary patch literal 162 zcmZ?wbhEHb6krfw*v!Ci|Ni{?`uO?t>-X=UfB*je|NsB*2eRhRZ)j)$vKcUd;!hSv z1_n+B9gqyj3&>#;PFW3S?Ey~Z^d=Ib=Q)_ty((#Hu?(NPPIEQ wFt9a7JasYQt8+ZHp~C0XEcX|=2_;e6_wsD`%rk?zV@6`Fg@V`I3Kj-y0F-Mvy#N3J literal 0 HcmV?d00001 diff --git a/archive/net.sourceforge.phpeclipse.news/icons/external_browser.gif b/archive/net.sourceforge.phpeclipse.news/icons/external_browser.gif new file mode 100644 index 0000000000000000000000000000000000000000..220c13447d255b9d89c2813c5c80236112dcf425 GIT binary patch literal 331 zcmZ?wbhEHb6krfwSgOLn5j)4QaH&%%5Uq8pT71ZEw`Pb3N16PMNiK&Z4E++n%poHKlsj^R1hD_HOHGIsAOe@%MAizh8U#{np#> zkKO-%?(z3)&%a;${Qv#$|KEY=KTUw*PZmZl273k_1|R_WiGeNS!2ALa9U=DSCdNh& z4Y8iK<{vXc3?$FCUH(`j<=*t^LXF$O!`vBX^Wr;RO{lS}=hs!(b%t{V7cj0|w#MF(!5RR;zsWrS literal 0 HcmV?d00001 diff --git a/archive/net.sourceforge.phpeclipse.news/icons/headlines.png b/archive/net.sourceforge.phpeclipse.news/icons/headlines.png new file mode 100644 index 0000000000000000000000000000000000000000..9b386007bd8c40be1fd6e40aab487c883aefd88d GIT binary patch literal 589 zcmV-T0Xoij4?%UONjBF9edtfEGawK@p=dnmvWZ%y^i?oWEI@;{W*90$G-q z%OxRXI-QdL5Iq`=s@3Z2^{UtF05BX5XR{dqD2f6A^ZESUpH8QCyS-koU7{!^lgZU; zrD@t`v*9>yHk%=YTCG+r7AuuXq9}GconEh(%jFn`afzZR2tv2pwJb~5bpRlQM5EC_ zAW*B-3WY+m*(?@|nM|h9XzX@78UO&GQmOR&{d_)uJRT{E^85XQAWSBca=APh3{t6- zBuSA-MAvor$Yk5LX_{ZNI*xNbp9vupAq0LR^e*G^`0;pz!(p%2YnrBMnzAfsvssL> zVHnTn6CuR1EJab@5p3JW7=Mfi01U&BWjPcI?e}|(vD@wTcsv+m%d)Q5E6?+aqOdH> z^E^${e-S<`zwRH82So^3EEX)wx?CFo{IsH{oC2 zf68$jnx+u|91aIblH&2Ws;c+<9b+7gMwiQFI-S1VZmOy}j>B=><#KTx=esMtEkBa{ b_;J4gLnJz9PP#z200000NkvXXu0mjfuIKiU literal 0 HcmV?d00001 diff --git a/archive/net.sourceforge.phpeclipse.news/icons/led_dark_green.gif b/archive/net.sourceforge.phpeclipse.news/icons/led_dark_green.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f0ca90d81fdc14fbe60452d45d7fabd4dca7996 GIT binary patch literal 213 zcmZ?wbhEHb6krfwXyIo7f(9^d08UPHry0|y!!8vX;t|1+|#lXj)1GEL`6afYXR?7v-eJPpqR&=ac*(GC8 zy{|pt@cEeA<#GGA9d9oG(A(fVZ^4h-n$wRh-n_i{QGio~VUUPHry0|y!!8vX;t|1+|#lXj)1GEL`6afYXR?7v-eJPpqR&=ac*(GC8 zy{|p#@cEeA<#GGA9d9oG(A(fVZ_$t2n$wRh-n_i{QGio~VUUPHry0|y!!8vX;t|1+|#lXj)1GEL`6afYXR?7v-eJPpqR&=ac*(GC8 zz0W=A@cEeA<#GGA9d9oG(A(e~x9G=h&FRM$Z(d&fD8MPguu7;X`oV@7B1{a{0ETmJ A8vpUPHry0|y!!8vX;t|1+|#lXj)1GEL`6afYXR?7v-eJPpqR&=ac*(GC8 zz3+I^;qx)K%j5QKJKkLWp|`>L-l8A3HK!k2ym@)?qX4G}!z!Vo=m#5Sh%hl&0|2S> BZyNvr literal 0 HcmV?d00001 diff --git a/archive/net.sourceforge.phpeclipse.news/icons/leds.xcf b/archive/net.sourceforge.phpeclipse.news/icons/leds.xcf new file mode 100644 index 0000000000000000000000000000000000000000..8aaa3ee61c1c0fe89b4534f080a0b88ce228f278 GIT binary patch literal 2612 zcmc(f-D=c86vt;KUz4OU6+f;6w$KVI+nXX@ii#Ir3tn#5Y#O@VNH%JFAuRX;ioSs0 zgY;IPKoB3n2N13Ce!zF~|UMhDvPYw+t@(>la_1LJyz zl6v{!AWM5$nLkB}3gL2VS{;wmB%f4iIZcOEUQDLj!PY1n7UQB!w$#uov%NvmztvaP zA$IiCHn#3{Y&G-A-vwv{fqtP_2<^|I3 z)l`#dZzUeu_*cfP1K|A3n0tdU?-fvgF|!y=GaYF6L0L>HnsnjR0cw-fnmXWXje!MA zI$Y9gOFCN8F*KcJ%!8n3keQBKO-R22l`1n8;<|~q?VR{P@n$4s5OFCyF1_fN^gPKW z_kPEb6P-#=TJqG3BRl#5E#nxI6kE|x#Ic^W)JjLMT~4%2a(nE(+`=s;V)k(83f6u+Hmt&Ur`iDp(Gi-*|5E zIaux}t-y9@1y-+bz?zfJ05*7(XZzK^$kI!k_qT+;Pukp1S}c)uzqNDjcZyfZ`rKcT z^(}u+)_0UvWIMDXtJgPV%}Hk<8>%atm1#PmYP&8i<Rnd`R&s zTEWEvt+2!#t#Fi9Xgjn*tJgPZ%}HlKyVhLV3ukM-^dRQXh#PE)t^dABnVkQT;#IZ* c4;E|#E10tl9HkZ84z1Yg^$lBd(*Lmi0~dNaaR2}S literal 0 HcmV?d00001 diff --git a/archive/net.sourceforge.phpeclipse.news/icons/link.gif b/archive/net.sourceforge.phpeclipse.news/icons/link.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b78f04e0695ea14e1981a43179ba45390b07795 GIT binary patch literal 132 zcmZ?wbhEHb6krfwIK*mdWh!6{GC9WxSRI@B2xIGF=Q k4li4GooR-;MpO>3#12OeV}&{DhrJfBlIZtvXJW7h0IZWPLjV8( literal 0 HcmV?d00001 diff --git a/archive/net.sourceforge.phpeclipse.news/icons/news.gif b/archive/net.sourceforge.phpeclipse.news/icons/news.gif new file mode 100644 index 0000000000000000000000000000000000000000..3d2b8e5d10c39ae5ad54edadacb90a0289e6c524 GIT binary patch literal 937 zcmW+#F=*Fk5PhaCM8uMz9f~4X8)*bPR1qR7eRVKID1w76oz6+@CemqZ?%mV;alY zwVm#8Qe==xRu6ERkE}c83}-sa*(6P))J2IQrdVP#w;25%R4{@WtYFJwIfi;t$w+3h zlC6;y8_A0*Mlp+3#89`#$%j0OL0Sd1YGwo5O)`ZkO=ZGhGZyl(P9rx+&r|DbKDKn1 zT;WPrd5`SwF6`WhkWwnCov={z@lJ&zl%Wc>J(g;c-gT)+WvWu`nU$KkcXKI9S*jAo zy=Z#vb{DmWZC5)pTr?Y6xQ&TnnU-a3PWvzfat@dn^0X4eZ}Xv=`@jy*^ek^Nns-xd zHe;bsrW$$N42z+!$JjC=GqR$=8>dHhcNcapC);l#RwPaOvP>}9Ir{8h9iPAZa2N0% zNBU)d5i`K_Eo|@JKR5H|=^N7@9hm2@57(Eb_AUQ$?aJ$Km;Rgkapi}v|6c##(-T)u z>F(z0y}idT{xW~}(#Gvi7N2iUAN^wE4TU3>g5UtT|dfBD?OLzlm~F!}AL@0OPyeZTtI@3UL8#~!YKb^qrxFXpc~aq@qf Cih}q6 literal 0 HcmV?d00001 diff --git a/archive/net.sourceforge.phpeclipse.news/icons/refresh.gif b/archive/net.sourceforge.phpeclipse.news/icons/refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f6c9b18f1821ded96eb8fedff00e1017db83a7e GIT binary patch literal 211 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 literal 0 HcmV?d00001 diff --git a/archive/net.sourceforge.phpeclipse.news/plugin.xml b/archive/net.sourceforge.phpeclipse.news/plugin.xml new file mode 100644 index 0000000..b503f7f --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/plugin.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Channel.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Channel.java new file mode 100644 index 0000000..8b22c55 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Channel.java @@ -0,0 +1,194 @@ +package net.sourceforge.phpeclipse.news; + +import java.io.InputStream; +import java.io.PushbackInputStream; +import java.net.URL; +import java.net.URLConnection; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.HashSet; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.eclipse.core.runtime.Preferences; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +/** + * @author jnegre - http://www.jnegre.org/ + * + * (c)Copyright 2002 Jérôme Nègre + * + */ +public class Channel { + + private final String url; + private final String title; + + private boolean refreshing = false; + private String errorMessage = null; + private boolean unread = false; + + private ArrayList items = new ArrayList(); + private HashSet readUids = null; + + /** + * Constructor for Channel. + */ + public Channel(String title, String url) { + this(title, url, null); + } + + public Channel(String title, String url, HashSet readUids) { + this.title = title; + this.url = url; + this.readUids = readUids; + } + + + public void update() { + update(Plugin.getDefault().getPluginPreferences()); + } + + + public void update(Preferences prefs) { + ArrayList newItems = new ArrayList(); + String newErrorMessage = null; + try { + + URLConnection conn = new URL(url).openConnection(); + conn.setRequestProperty("User-Agent", Plugin.userAgent); + if(prefs.getBoolean(Plugin.FORCE_CACHE_PREFERENCE)) { + conn.setRequestProperty("Pragma", "no-cache"); + conn.setRequestProperty("Cache-Control", "no-cache"); + } + InputStream stream = conn.getInputStream(); + + /* workaround a bug of crimson (it seems to ignore the encoding + * if it does not get it the first time it reads bytes from + * the stream. We use a PushbackInputStream to be sure that the + * encoding declaration is in the buffer) + */ + PushbackInputStream pbStream = new PushbackInputStream(stream,64); + byte[] buffer = new byte[64]; + int pos = 0; + while(pos != 64) { + pos += pbStream.read(buffer, pos, 64-pos); + } + pbStream.unread(buffer); + //end workaround + + DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + InputSource inputSource = new InputSource(pbStream); + Document doc = parser.parse(inputSource); + pbStream.close(); + NodeList itemNodes = doc.getElementsByTagName("item"); + for (int i = 0; i < itemNodes.getLength(); i++) { + Item aNewItem = new Item(this, (Element) itemNodes.item(i)); + if(aNewItem.isBanned()) continue; + if(readUids!=null && readUids.remove(aNewItem.getUID())) { + aNewItem.setReadFlag(true); + } + int indexOld = items.indexOf(aNewItem); + if(indexOld != -1) { + newItems.add(items.get(indexOld)); + } else { + newItems.add(aNewItem); + } + + } + this.readUids = null; + } catch(UnknownHostException e) { + // no connection to internet + } catch(Exception e) { + newErrorMessage = e.toString(); + Plugin.logInfo("Error in channel update",e); + } + + synchronized(this) { + this.errorMessage = newErrorMessage; + if(newErrorMessage == null) { + this.items = newItems; + computeUnRead(); + } + } + } + + /** + * Returns the url. + * @return String + */ + public String getUrl() { + return url; + } + + /** + * Returns the errorMessage. + * @return String + */ + public synchronized String getErrorMessage() { + return errorMessage; + } + + /** + * Returns the items. + * @return ArrayList + */ + public synchronized ArrayList getItems() { + return new ArrayList(items); + } + + /** + * @see java.lang.Object#toString() + */ + public String toString() { + return "Channel at "+url; + } + + /** + * Returns the title. + * @return String + */ + public String getTitle() { + return title; + } + + /** + * Returns the refreshing. + * @return boolean + */ + public boolean isRefreshing() { + return refreshing; + } + + /** + * Sets the refreshing. + * @param refreshing The refreshing to set + */ + public void setRefreshing(boolean refreshing) { + this.refreshing = refreshing; + } + + /** + * Returns the unread. + * @return boolean + */ + public boolean isUnread() { + return unread; + } + + public synchronized void computeUnRead() { + this.unread = false; + for (int i = 0; i < items.size(); i++) { + this.unread = this.unread || !((Item)items.get(i)).isReadFlag(); + } + } + + public String getUID() { + return "CHA" + url; + } + +} diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/IconManager.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/IconManager.java new file mode 100644 index 0000000..2294108 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/IconManager.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2004 Jérôme Nègre. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.jnegre.org/cpl1_0.html + * + * Contributors: + * Jérôme Nègre - initial API and implementation + *******************************************************************************/ + +/* + * Created on 12 juin 2004 + */ +package net.sourceforge.phpeclipse.news; + +import java.net.URL; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.resource.ImageRegistry; +import org.eclipse.swt.graphics.Image; + +/** + * @author Jérôme Nègre + */ +public class IconManager { + //the root folder containing the icons + private static final String ICON_FOLDER = "icons/"; + + //real file locations + private static final String LOC_LED_DARK_GREEN = "led_dark_green.gif"; + private static final String LOC_LED_LIGHT_GREEN = "led_light_green.gif"; + private static final String LOC_LED_RED = "led_red.gif"; + private static final String LOC_LED_YELLOW = "led_yellow.gif"; + private static final String LOC_LINK = "link.gif"; + private static final String LOC_REFRESH = "refresh.gif"; + private static final String LOC_EXTERNAL_BROWSER = "external_browser.gif"; + + //list of all icon files to put in the ImageRegistry + private static final String[] LOCATIONS = new String[]{ + LOC_LED_DARK_GREEN, + LOC_LED_LIGHT_GREEN, + LOC_LED_RED, + LOC_LED_YELLOW, + LOC_LINK, + LOC_REFRESH, + LOC_EXTERNAL_BROWSER + }; + + //public names + public static final String ICON_STATUS_ERROR = LOC_LED_RED; + public static final String ICON_STATUS_UNREAD = LOC_LED_LIGHT_GREEN; + public static final String ICON_STATUS_READ = LOC_LED_DARK_GREEN; + public static final String ICON_STATUS_REFRESH = LOC_LED_YELLOW; + + public static final String ICON_ACTION_REFRESH = LOC_REFRESH; + public static final String ICON_ACTION_LINK = LOC_LINK; + public static final String ICON_ACTION_EXTERNAL_BROWSER = LOC_EXTERNAL_BROWSER; + + /** + * Populates an image registry with all the locations + * @param registry + */ + protected static void populateImageRegistry(ImageRegistry registry) { + for(int i=0; i position && buffer.charAt(position) == expectedChar) { + return true; + } else { + return false; + } + } + + /** + * @return the description of this item + */ + public String getDescription() { + return description; + } + /** + * @return the author of this item + */ + public String getAuthor() { + return author; + } + + /** + * Returns the date. + * @return String + */ + public String getDate() { + return date; + } + + /** + * Returns the readFlag. + * @return boolean + */ + public boolean isReadFlag() { + return readFlag; + } + + /** + * Returns the channel. + * @return Channel + */ + public Channel getChannel() { + return channel; + } + + /** + * Returns a unique ID used to remember which + * items were read in the ChannelStore + * @return + */ + public String getUID() { + return getUsableLink() + ") ~ (" + getUsableTitle(); + } + +} diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Messages.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Messages.java new file mode 100644 index 0000000..023315b --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Messages.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2004 Jérôme Nègre. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.jnegre.org/cpl1_0.html + * + * Contributors: + * Jérôme Nègre - initial API and implementation + *******************************************************************************/ + +/* + * Created on 27 juil. 2004 + */ +package net.sourceforge.phpeclipse.news; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +/** + * @author Jérôme Nègre + */ +public class Messages { + private static final String BUNDLE_NAME = "net.sourceforge.phpeclipse.news.messages";//$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} \ No newline at end of file diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Perspective.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Perspective.java new file mode 100644 index 0000000..a037d19 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Perspective.java @@ -0,0 +1,31 @@ +package net.sourceforge.phpeclipse.news; + +import net.sourceforge.phpeclipse.webbrowser.views.BrowserView; + +import org.eclipse.ui.IFolderLayout; +import org.eclipse.ui.IPageLayout; +import org.eclipse.ui.IPerspectiveFactory; + +//import org.eclipse.update.internal.ui.UpdatePerspective; +/** + * @author Laurent Fourrier, Jérôme Nègre + * + */ +public class Perspective implements IPerspectiveFactory { + /** + * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(IPageLayout) + */ + public void createInitialLayout(IPageLayout layout) { + String editorArea = layout.getEditorArea(); + layout.setEditorAreaVisible(false); + // IFolderLayout bottom = layout.createFolder("bottom", + // IPageLayout.BOTTOM, 0.70f, editorArea); + // bottom.addView("net.sourceforge.phpeclipse.news.view.headline"); + IFolderLayout bottom = layout.createFolder("bottom", IPageLayout.BOTTOM, 0.50f, editorArea); + bottom.addView(BrowserView.ID_BROWSER); + IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, 0.30f, editorArea); + left.addView("net.sourceforge.phpeclipse.news.view.explorer"); + IFolderLayout right = layout.createFolder("right", IPageLayout.RIGHT, 0.70f, editorArea); + right.addView("net.sourceforge.phpeclipse.news.view.headline"); + } +} \ No newline at end of file diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Plugin.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Plugin.java new file mode 100644 index 0000000..424e081 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/Plugin.java @@ -0,0 +1,248 @@ +package net.sourceforge.phpeclipse.news; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Timer; +import java.util.TimerTask; + +import net.sourceforge.phpeclipse.news.pref.ChannelStore; +import net.sourceforge.phpeclipse.news.pref.ListEncoder; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPluginDescriptor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.resource.ImageRegistry; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +public class Plugin extends AbstractUIPlugin { + + public static final String BACKENDS_SECTION = "backends"; + + public static final String REFRESH_INTERVAL_PREFERENCE = "net.sourceforge.phpeclipse.news.refreshinterval"; + + /** @deprecated */ + public static final String BACKENDS_PREFERENCE = "net.sourceforge.phpeclipse.news.backends"; + + public static final String BROWSER_PREFERENCE = "net.sourceforge.phpeclipse.news.browser"; + + public static final String BANNED_ITEMS_PREFERENCE = "net.sourceforge.phpeclipse.news.banneditems"; + + public static final String FORCE_CACHE_PREFERENCE = "net.sourceforge.phpeclipse.news.forcecache"; + + //Default values + public static final int DEFAULT_REFRESH_INTERVAL = 60; + + public static final String DEFAULT_BROWSER = "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE"; + + public static final String DEFAULT_BANNED_ITEMS = ""; + + public static final boolean DEFAULT_FORCE_CACHE = false; + + //User-Agent + public static String userAgent; + + protected UpdateThread updateThread; + + protected ArrayList views = new ArrayList(); + + protected Timer timer; + + protected ArrayList channelList; + + protected Object channelLock = new Object(); + + protected ArrayList banList = new ArrayList(); + + /** + * List of RssListeners to notify + */ + private ArrayList rssListeners = new ArrayList(); + + /** + * Constructor for Plugin + */ + public Plugin(IPluginDescriptor descriptor) { + super(descriptor); + + //set the user-agent ID + StringBuffer buffer = new StringBuffer(); + buffer.append("AllTheNews/").append(descriptor.getVersionIdentifier()).append(" (").append(System.getProperty("os.name")) + .append("; ").append(System.getProperty("os.arch")).append("; http://www.jnegre.org/)"); + userAgent = buffer.toString(); + + singleton = this; + + //init the channel store + ChannelStore.init(this); + + updateBanList(); + updateChannelList(); + setTimer(); + } + + protected static Plugin singleton; + + public static Plugin getDefault() { + return singleton; + } + + public static void logError(String message, Throwable t) { + getDefault().getLog() + .log(new Status(IStatus.ERROR, getDefault().getDescriptor().getUniqueIdentifier(), IStatus.OK, message, t)); + } + + public static void logInfo(String message, Throwable t) { + getDefault().getLog().log(new Status(IStatus.INFO, getDefault().getDescriptor().getUniqueIdentifier(), IStatus.OK, message, t)); + } + + /* + * @see AbstractUIPlugin#initializeDefaultPreferences(IPreferenceStore) + */ + protected void initializeDefaultPreferences(IPreferenceStore store) { + store.setDefault(REFRESH_INTERVAL_PREFERENCE, DEFAULT_REFRESH_INTERVAL); + store.setDefault(BROWSER_PREFERENCE, DEFAULT_BROWSER); + store.setDefault(BANNED_ITEMS_PREFERENCE, DEFAULT_BANNED_ITEMS); + store.setDefault(FORCE_CACHE_PREFERENCE, DEFAULT_FORCE_CACHE); + } + + protected ImageRegistry createImageRegistry() { + ImageRegistry registry = super.createImageRegistry(); + IconManager.populateImageRegistry(registry); + return registry; + } + + public void addRssListener(RssListener listener) { + synchronized (rssListeners) { + rssListeners.add(listener); + } + } + + public void removeRssListener(RssListener listener) { + synchronized (rssListeners) { + rssListeners.remove(listener); + } + } + + public void notifyChannelListChanged(RssListener source) { + Iterator iterator = rssListeners.iterator(); + ArrayList channels = getChannelList(); + while (iterator.hasNext()) { + RssListener listener = (RssListener) iterator.next(); + if (listener != source) { + listener.onChannelListChanged(channels); + } + } + } + + public void notifyChannelStatusChanged(Channel channel, RssListener source) { + Iterator iterator = rssListeners.iterator(); + while (iterator.hasNext()) { + RssListener listener = (RssListener) iterator.next(); + if (listener != source) { + listener.onChannelStatusChanged(channel); + } + } + } + + public void notifyChannelSelected(Channel channel, RssListener source) { + Iterator iterator = rssListeners.iterator(); + while (iterator.hasNext()) { + RssListener listener = (RssListener) iterator.next(); + if (listener != source) { + listener.onChannelSelected(channel); + } + } + } + + public void notifyItemSelected(Item item, RssListener source) { + Iterator iterator = rssListeners.iterator(); + while (iterator.hasNext()) { + RssListener listener = (RssListener) iterator.next(); + if (listener != source) { + listener.onItemSelected(item); + } + } + } + + public void notifyItemStatusChanged(Item item, RssListener source) { + Iterator iterator = rssListeners.iterator(); + while (iterator.hasNext()) { + RssListener listener = (RssListener) iterator.next(); + if (listener != source) { + listener.onItemStatusChanged(item); + } + } + } + + public void setTimer() { + if (timer != null) { + timer.cancel(); + } + long period = getPreferenceStore().getInt(Plugin.REFRESH_INTERVAL_PREFERENCE) * 60000l; + if (period != 0) { + timer = new Timer(true); + timer.schedule(new UpdateTimer(), 0, period); + } + } + + public void updateBanList() { + synchronized (banList) { + banList.clear(); + + String banned = this.getPreferenceStore().getString(Plugin.BANNED_ITEMS_PREFERENCE); + String[] bannedTitles = ListEncoder.decode(banned); + for (int i = 0; i < bannedTitles.length; i++) { + banList.add(bannedTitles[i]); + } + } + } + + public boolean isBannedTitle(String title) { + synchronized (banList) { + return banList.contains(title); + } + } + + public void updateChannelList() { + synchronized (channelLock) { + channelList = ChannelStore.getChannels(); + } + notifyChannelListChanged(null); + } + + public ArrayList getChannelList() { + synchronized (channelLock) { + return new ArrayList(channelList); + } + } + + public void update() { + if (updateThread == null) { + updateThread = new UpdateThread(); + updateThread.start(); + } + } + + protected class UpdateTimer extends TimerTask { + public void run() { + update(); + } + } + + public void shutdown() throws CoreException { + ChannelStore.saveReadStatus(getChannelList()); + super.shutdown(); + } + + public IWorkbenchPage getActivePage() { + IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow(); + if (window != null) + return window.getActivePage(); + return null; + } +} + diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/RssListener.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/RssListener.java new file mode 100644 index 0000000..5e36f4b --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/RssListener.java @@ -0,0 +1,23 @@ +/* + * Created on 15 mai 2004 + * Copyright 2004 Jérôme Nègre + */ +package net.sourceforge.phpeclipse.news; + +import java.util.ArrayList; + +/** + * @author Jérôme Nègre + */ +public interface RssListener { + + public void onChannelListChanged(ArrayList channels); + + public void onChannelStatusChanged(Channel channel); + + public void onChannelSelected(Channel channel); + + public void onItemStatusChanged(Item tiem); + + public void onItemSelected(Item tiem); +} diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/UpdateThread.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/UpdateThread.java new file mode 100644 index 0000000..8ab8e09 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/UpdateThread.java @@ -0,0 +1,36 @@ +package net.sourceforge.phpeclipse.news; + +import java.util.Iterator; + +public class UpdateThread extends Thread { + + + /** + * Constructor for UpdateThread + */ + public UpdateThread() { + super(); + this.setDaemon(true); + } + + /** + * @see Runnable#run() + */ + public void run() { + try { + Plugin plugin = Plugin.getDefault(); + Iterator iterator = Plugin.getDefault().getChannelList().iterator(); + while(iterator.hasNext()) { + Channel channel = (Channel)iterator.next(); + channel.setRefreshing(true); + plugin.notifyChannelStatusChanged(channel, null); + channel.update(); + channel.setRefreshing(false); + plugin.notifyChannelStatusChanged(channel, null); + } + } finally { + Plugin.getDefault().updateThread = null; + } + } + +} \ No newline at end of file diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/messages.properties b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/messages.properties new file mode 100644 index 0000000..9aa9b8f --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/messages.properties @@ -0,0 +1,3 @@ +#0 = description; 1=description with BR instead of \n; 2=url; 3=title +BrowserView.DescriptionTemplate={3}

{3}

{1}

Read more...

+BrowserView.NoDescription=No description diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/BanListEditor.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/BanListEditor.java new file mode 100644 index 0000000..c685c1f --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/BanListEditor.java @@ -0,0 +1,63 @@ +package net.sourceforge.phpeclipse.news.pref; + +import net.sourceforge.phpeclipse.news.Plugin; + +import org.eclipse.jface.dialogs.InputDialog; +import org.eclipse.jface.preference.ListEditor; +import org.eclipse.swt.widgets.Composite; + +public class BanListEditor extends ListEditor { + + /** + * Constructor for SiteListEditor + */ + protected BanListEditor(String name, String labelText, Composite parent) { + super(name, labelText, parent); + } + + /** + * @see ListEditor#parseString(String) + */ + protected String[] parseString(String stringList) { + return ListEncoder.decode(stringList); + } + + /** + * @see ListEditor#getNewInputObject() + */ + protected String getNewInputObject() { + InputDialog dialog; + dialog = new InputDialog(this.getShell(),"All The News","Enter item title to ban","",null); + dialog.open(); + if("".equals(dialog.getValue()) || dialog.getValue()==null) { + return null; + } else { + return dialog.getValue(); + } + } + + /** + * @see ListEditor#createList(String[]) + */ + protected String createList(String[] items) { + return ListEncoder.encode(items); + } + + /** + * @see org.eclipse.jface.preference.FieldEditor#doStore() + */ + protected void doStore() { + super.doStore(); + Plugin.getDefault().updateBanList(); + } + + + /** + * @see org.eclipse.jface.preference.FieldEditor#doLoadDefault() + */ + protected void doLoadDefault() { + super.doLoadDefault(); + Plugin.getDefault().updateBanList(); + } +} + diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/ChannelStore.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/ChannelStore.java new file mode 100644 index 0000000..f48c494 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/ChannelStore.java @@ -0,0 +1,173 @@ +/* + * Created on 9 juin 2004 + * Copyright 2004 Jérôme Nègre + */ +package net.sourceforge.phpeclipse.news.pref; + +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Properties; + +import net.sourceforge.phpeclipse.news.Channel; +import net.sourceforge.phpeclipse.news.Item; +import net.sourceforge.phpeclipse.news.Plugin; + +import org.eclipse.jface.dialogs.IDialogSettings; + +/** + * @author Jérôme Nègre + */ +public class ChannelStore { + + private final static String DEFAULT_CHANNELS_FILE = "default_feeds.properties"; + + private final static String BACKENDS_SECTION = "backends"; + + private final static String CHANNELS_ORDER_KEY = "order"; + private final static String TITLE_KEY = "title"; + private final static String URL_KEY = "url"; + private final static String TYPE_KEY = "type"; + private final static String READ_KEY = "read"; + + private final static int TYPE_CHANNEL = 1; + + private static Plugin plugin = null; + + public static void init(Plugin plugin) { + ChannelStore.plugin = plugin; + } + + public static synchronized ArrayList getChannels() { + IDialogSettings section = getChannelsSection(); + String[] uids = section.getArray(CHANNELS_ORDER_KEY); + ArrayList result = new ArrayList(); + for(int i=0; inull if none + * (before creation or after disposal). + */ + private List list; + private ArrayList channels; + /** + * The button box containing the Add, Remove, Up, and Down buttons; + * null if none (before creation or after disposal). + */ + private Composite buttonBox; + /** + * The Add button. + */ + private Button addButton; + /** + * The Search button. + */ + private Button searchButton; + /** + * The Remove button. + */ + private Button removeButton; + /** + * The Up button. + */ + private Button upButton; + /** + * The Down button. + */ + private Button downButton; + /** + * The selection listener. + */ + private SelectionListener selectionListener; + /** + * Notifies that the Add button has been pressed. + */ + private void addPressed() { + setPresentsDefaultValue(false); + Channel input = getNewInputChannel(); + if (input != null) { + int index = list.getSelectionIndex(); + if (index >= 0) { + list.add(input.getTitle(), index + 1); + channels.add(index + 1, input); + } else { + list.add(input.getTitle(), 0); + channels.add(0, input); + } + selectionChanged(); + } + } + + /** + * Notifies that the Search button has been pressed. + */ + private void searchPressed() { + setPresentsDefaultValue(false); + SearchDialog sd = new SearchDialog(SiteListEditor.this + .getShell()); + sd.open(); + Channel[] inputs = sd.getChannels(); + for(int i=0; i= 0) { + list.add(inputs[i].getTitle(), index + 1); + channels.add(index + 1, inputs[i]); + } else { + list.add(inputs[i].getTitle(), 0); + channels.add(0, inputs[i]); + } + } + selectionChanged(); + } + + + /* (non-Javadoc) + * Method declared on FieldEditor. + */ + protected void adjustForNumColumns(int numColumns) { + Control control = getLabelControl(); + ((GridData) control.getLayoutData()).horizontalSpan = numColumns; + ((GridData) list.getLayoutData()).horizontalSpan = numColumns - 1; + } + /** + * Creates the Add, Remove, Up, and Down button in the given button box. + * + * @param buttonBox the box for the buttons + */ + private void createButtons(Composite buttonBox) { + addButton = createPushButton(buttonBox, "ListEditor.add");//$NON-NLS-1$ + //TODO use my bundle ? + searchButton = createPushButton(buttonBox, "Search (experimental)"); + removeButton = createPushButton(buttonBox, "ListEditor.remove");//$NON-NLS-1$ + upButton = createPushButton(buttonBox, "ListEditor.up");//$NON-NLS-1$ + downButton = createPushButton(buttonBox, "ListEditor.down");//$NON-NLS-1$ + } + /** + * Helper method to create a push button. + * + * @param parent the parent control + * @param key the resource name used to supply the button's label text + */ + private Button createPushButton(Composite parent, String key) { + Button button = new Button(parent, SWT.PUSH); + button.setText(JFaceResources.getString(key)); + button.setFont(parent.getFont()); + GridData data = new GridData(GridData.FILL_HORIZONTAL); + data.heightHint = convertVerticalDLUsToPixels(button, + IDialogConstants.BUTTON_HEIGHT); + int widthHint = convertHorizontalDLUsToPixels(button, + IDialogConstants.BUTTON_WIDTH); + data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, + SWT.DEFAULT, true).x); + button.setLayoutData(data); + button.addSelectionListener(getSelectionListener()); + return button; + } + /** + * Creates a selection listener. + */ + public void createSelectionListener() { + selectionListener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + Widget widget = event.widget; + if (widget == addButton) { + addPressed(); + } else if (widget == searchButton) { + searchPressed(); + } else if (widget == removeButton) { + removePressed(); + } else if (widget == upButton) { + upPressed(); + } else if (widget == downButton) { + downPressed(); + } else if (widget == list) { + selectionChanged(); + } + } + }; + } + /* (non-Javadoc) + * Method declared on FieldEditor. + */ + protected void doFillIntoGrid(Composite parent, int numColumns) { + Control control = getLabelControl(parent); + GridData gd = new GridData(); + gd.horizontalSpan = numColumns; + control.setLayoutData(gd); + list = getListControl(parent); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.verticalAlignment = GridData.FILL; + gd.horizontalSpan = numColumns - 1; + gd.grabExcessHorizontalSpace = true; + list.setLayoutData(gd); + buttonBox = getButtonBoxControl(parent); + gd = new GridData(); + gd.verticalAlignment = GridData.BEGINNING; + buttonBox.setLayoutData(gd); + } + /* (non-Javadoc) + * Method declared on FieldEditor. + */ + protected void doLoad() { + if (list != null) { + channels = ChannelStore.getChannels(); + for (int i = 0; i < channels.size(); i++) { + list.add(((Channel)channels.get(i)).getTitle()); + } + } + } + /* (non-Javadoc) + * Method declared on FieldEditor. + */ + protected void doLoadDefault() { + if (list != null) { + list.removeAll(); + channels = ChannelStore.getDefaultChannels(); + for (int i = 0; i < channels.size(); i++) { + list.add(((Channel)channels.get(i)).getTitle()); + } + setPresentsDefaultValue(false); + } + } + /* (non-Javadoc) + * Method declared on FieldEditor. + */ + protected void doStore() { + ChannelStore.saveReadStatus(Plugin.getDefault().getChannelList()); + ChannelStore.setChannels(channels); + Plugin.getDefault().updateChannelList(); + } + /** + * Notifies that the Down button has been pressed. + */ + private void downPressed() { + swap(false); + } + /** + * Returns this field editor's button box containing the Add, Remove, + * Up, and Down button. + * + * @param parent the parent control + * @return the button box + */ + public Composite getButtonBoxControl(Composite parent) { + if (buttonBox == null) { + buttonBox = new Composite(parent, SWT.NULL); + GridLayout layout = new GridLayout(); + layout.marginWidth = 0; + buttonBox.setLayout(layout); + createButtons(buttonBox); + buttonBox.addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent event) { + addButton = null; + searchButton = null; + removeButton = null; + upButton = null; + downButton = null; + buttonBox = null; + } + }); + } else { + checkParent(buttonBox, parent); + } + selectionChanged(); + return buttonBox; + } + /** + * Returns this field editor's list control. + * + * @param parent the parent control + * @return the list control + */ + public List getListControl(Composite parent) { + if (list == null) { + list = new List(parent, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL + | SWT.H_SCROLL); + list.setFont(parent.getFont()); + list.addSelectionListener(getSelectionListener()); + list.addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent event) { + list = null; + } + }); + } else { + checkParent(list, parent); + } + return list; + } + /* (non-Javadoc) + * Method declared on FieldEditor. + */ + public int getNumberOfControls() { + return 2; + } + /** + * Returns this field editor's selection listener. + * The listener is created if nessessary. + * + * @return the selection listener + */ + private SelectionListener getSelectionListener() { + if (selectionListener == null) + createSelectionListener(); + return selectionListener; + } + /** + * Returns this field editor's shell. + *

+ * This method is internal to the framework; subclassers should not call + * this method. + *

+ * + * @return the shell + */ + protected Shell getShell() { + if (addButton == null) + return null; + return addButton.getShell(); + } + /** + * Notifies that the Remove button has been pressed. + */ + private void removePressed() { + setPresentsDefaultValue(false); + int index = list.getSelectionIndex(); + if (index >= 0) { + list.remove(index); + channels.remove(index); + selectionChanged(); + } + } + /** + * Notifies that the list selection has changed. + */ + private void selectionChanged() { + int index = list.getSelectionIndex(); + int size = list.getItemCount(); + removeButton.setEnabled(index >= 0); + upButton.setEnabled(size > 1 && index > 0); + downButton.setEnabled(size > 1 && index >= 0 && index < size - 1); + } + /* (non-Javadoc) + * Method declared on FieldEditor. + */ + public void setFocus() { + if (list != null) { + list.setFocus(); + } + } + /** + * Moves the currently selected item up or down. + * + * @param up true if the item should move up, + * and false if it should move down + */ + private void swap(boolean up) { + setPresentsDefaultValue(false); + int index = list.getSelectionIndex(); + int target = up ? index - 1 : index + 1; + if (index >= 0) { + //list widget + String[] selection = list.getSelection(); + Assert.isTrue(selection.length == 1); + list.remove(index); + list.add(selection[0], target); + list.setSelection(target); + //channels arrayList + Object obj = channels.remove(index); + channels.add(target, obj); + } + selectionChanged(); + } + /** + * Notifies that the Up button has been pressed. + */ + private void upPressed() { + swap(true); + } + /* + * @see FieldEditor.setEnabled(boolean,Composite). + */ + public void setEnabled(boolean enabled, Composite parent) { + super.setEnabled(enabled, parent); + getListControl(parent).setEnabled(enabled); + addButton.setEnabled(enabled); + removeButton.setEnabled(enabled); + upButton.setEnabled(enabled); + downButton.setEnabled(enabled); + } + + /* + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + + /** + * Creates a site list field editor. + * + * @param name the name of the preference this field editor works on + * @param labelText the label text of the field editor + * @param parent the parent of the field editor's control + */ + protected SiteListEditor(String name, String labelText, Composite parent) { + init(name, labelText); + createControl(parent); + } + /** + * Creates and returns a new item for the list. + * + * @return a new item + */ + protected Channel getNewInputChannel() { + InputDialog dialog; + dialog = new InputDialog(this.getShell(), "All The News", + "Enter new site name", "", null); + dialog.open(); + if ("".equals(dialog.getValue()) || dialog.getValue() == null) + return null; + String title = dialog.getValue(); + dialog = new InputDialog(this.getShell(), "All The News", + "Enter new site URL", "", null); + dialog.open(); + if ("".equals(dialog.getValue()) || dialog.getValue() == null) + return null; + String url = dialog.getValue(); + return new Channel(title, url); + } +} \ No newline at end of file diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/search/SearchDialog.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/search/SearchDialog.java new file mode 100644 index 0000000..7e63e5a --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/search/SearchDialog.java @@ -0,0 +1,238 @@ +/* + * Created on 25 janv. 2004 + * + * (c)2004 Jérôme Nègre - http://www.jnegre.org/ + */ + +package net.sourceforge.phpeclipse.news.search; + +import java.net.MalformedURLException; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Vector; + +import net.sourceforge.phpeclipse.news.Channel; + +import org.apache.xmlrpc.XmlRpcClient; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Cursor; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.List; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +/** + * @author Jérôme Nègre + * + */ +public class SearchDialog extends Dialog { + + private Label statusBar; + private Text searchText; + private List list; + private Text name; + private Text siteUrl; + private Text feedUrl; + private Text version; + private Text description; + + private ArrayList resultChannels = new ArrayList(); + + private XmlRpcClient xmlRpcClient; + + /** + * @param parentShell + */ + public SearchDialog(Shell parentShell) { + super(parentShell); + this.setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MODELESS); + } + + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText("Search using http://www.syndic8.com/"); + } + + /** + * Adds the controls to the dialog + * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) + */ + protected Control createDialogArea(Composite parent) { + Composite composite = (Composite)super.createDialogArea(parent); + GridLayout gl = (GridLayout)composite.getLayout(); + gl.numColumns = 4; + + //Text to enter the searched words + searchText = new Text(composite,SWT.BORDER); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 3; + searchText.setLayoutData(gd); + //Button "search!" + Button searchButton = new Button(composite,0); + searchButton.setText("Search!"); + searchButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + //TODO use a worker + Cursor waitCursor = new Cursor(SearchDialog.this.getContents().getDisplay(), SWT.CURSOR_WAIT); + try { + SearchDialog.this.getContents().setCursor(waitCursor); + SearchDialog.this.searchNow(); + } catch (Exception x) { + setStatusMessage("Error: "+x.getMessage()); + } finally { + SearchDialog.this.getContents().setCursor(null); + waitCursor.dispose(); + } + } + }); + //List for the titles of the feeds + list = new List(composite,SWT.BORDER|SWT.H_SCROLL|SWT.V_SCROLL|SWT.SINGLE); + gd = new GridData(GridData.FILL_BOTH); + list.setLayoutData(gd); + list.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + SearchDialog.this.showFieldDetails((Hashtable)((ArrayList)list.getData()).get(list.getSelectionIndex())); + } + }); + + //Description of the selected feed + Group group = new Group(composite,0); + group.setText("Selected Feed"); + gd = new GridData(GridData.FILL_BOTH); + gd.horizontalSpan = 3; + group.setLayoutData(gd); + group.setLayout(new GridLayout(2,false)); + //name + new Label(group,0).setText("Name:"); + name = new Text(group,SWT.BORDER|SWT.READ_ONLY); + name.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + //site url + new Label(group,0).setText("Site URL:"); + siteUrl = new Text(group,SWT.BORDER|SWT.READ_ONLY); + siteUrl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + //feed url + new Label(group,0).setText("Feed URL:"); + feedUrl = new Text(group,SWT.BORDER|SWT.READ_ONLY); + feedUrl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + //RSS version + new Label(group,0).setText("RSS version:"); + version = new Text(group,SWT.BORDER|SWT.READ_ONLY); + version.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + //description + new Label(group,0).setText("Description:"); + description = new Text(group,SWT.BORDER|SWT.READ_ONLY|SWT.MULTI|SWT.H_SCROLL|SWT.V_SCROLL|SWT.WRAP); + description.setLayoutData(new GridData(GridData.FILL_BOTH)); + + //status bar + statusBar = new Label(composite,SWT.NONE); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 4; + statusBar.setLayoutData(gd); + setStatusMessage("Ready."); + return composite; + } + + private XmlRpcClient getXmlRpcClient() throws MalformedURLException { + if(this.xmlRpcClient == null) { + this.xmlRpcClient = new XmlRpcClient("http://www.syndic8.com/xmlrpc.php"); + } + return this.xmlRpcClient; + } + + /** + * + */ + protected void searchNow() throws Exception { + clearFeedList(); + setStatusMessage("Connecting..."); + XmlRpcClient client = getXmlRpcClient(); + //Get the list of ids + Vector args = new Vector(); + args.add(searchText.getText()); + args.add("sitename"); + //args.add(new Integer(30)); + Vector ids = (Vector)client.execute("syndic8.FindFeeds",args); + setStatusMessage("Found "+ids.size()+" result(s), asking for details..."); + //Get the descriptions of the feeds + Vector fields = new Vector(); + fields.add("sitename"); + fields.add("siteurl"); + fields.add("dataurl"); + fields.add("rss_version"); + fields.add("description"); + args.clear(); + args.add(ids); + args.add(fields); + Vector infos = (Vector)client.execute("syndic8.GetFeedInfo",args); + setStatusMessage("Showing details..."); + Iterator iterator = infos.iterator(); + while(iterator.hasNext()) { + Hashtable info = (Hashtable)iterator.next(); + addFeedInList(info); + } + setStatusMessage("Ready."); + } + + protected void clearFeedList() { + list.removeAll(); + showFieldDetails(null); + list.setData(new ArrayList()); + } + + protected void showFieldDetails(Hashtable info) { + name.setText(info==null?"":(String)info.get("sitename")); + siteUrl.setText(info==null?"":(String)info.get("siteurl")); + feedUrl.setText(info==null?"":(String)info.get("dataurl")); + version.setText(info==null?"":(String)info.get("rss_version")); + description.setText(info==null?"":(String)info.get("description")); + } + + protected void addFeedInList(Hashtable info) { + String name = (String)info.get("sitename"); + String dataurl = (String)info.get("dataurl"); + if("".equals(name) || "".equals(dataurl)) { + //skip it + return; + } + ArrayList al = (ArrayList)list.getData(); + al.add(info); + list.add(name); + } + + protected void setStatusMessage(String message) { + statusBar.setText(message); + //TODO remove next line + System.out.println(message); + } + + protected void createButtonsForButtonBar(Composite parent) { + createButton(parent,IDialogConstants.OPEN_ID,"Add Selected",false); + createButton(parent,IDialogConstants.OK_ID,IDialogConstants.OK_LABEL,false); + } + + protected void buttonPressed(int buttonId) { + super.buttonPressed(buttonId); + if(buttonId == IDialogConstants.OPEN_ID) { + String name = this.name.getText(); + String url = this.feedUrl.getText(); + if(!"".equals(name) && !"".equals(url)) { + resultChannels.add(new Channel(name, url)); + } + } + } + + public Channel[] getChannels() { + return (Channel[])resultChannels.toArray(new Channel[]{}); + } +} diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/ExplorerView.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/ExplorerView.java new file mode 100644 index 0000000..e1faf8d --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/ExplorerView.java @@ -0,0 +1,159 @@ +/* + * Created on 15 mai 2004 + * Copyright 2004 Jérôme Nègre + */ +package net.sourceforge.phpeclipse.news.view; + +import java.util.ArrayList; + +import net.sourceforge.phpeclipse.news.Channel; +import net.sourceforge.phpeclipse.news.IconManager; +import net.sourceforge.phpeclipse.news.Item; +import net.sourceforge.phpeclipse.news.Plugin; +import net.sourceforge.phpeclipse.news.RssListener; +import net.sourceforge.phpeclipse.webbrowser.views.BrowserView; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.part.ViewPart; + +/** + * @author Jérôme Nègre + */ +public class ExplorerView extends ViewPart implements RssListener { + + private TreeViewer treeViewer; + + private NewsTreeViewerProvider provider; + + private Action refreshAction; + + public ExplorerView() { + super(); + } + + public void dispose() { + Plugin.getDefault().removeRssListener(this); + super.dispose(); + } + + public void createPartControl(Composite parent) { + treeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); + provider = new NewsTreeViewerProvider(); + treeViewer.setContentProvider(provider); + treeViewer.setLabelProvider(provider); + treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + Object selected = ((StructuredSelection) event.getSelection()).getFirstElement(); + if (selected != null) { + if (selected instanceof Channel) { + Plugin.getDefault().notifyChannelSelected((Channel) selected, ExplorerView.this); + } else if (selected instanceof Item) { + Plugin.getDefault().notifyItemSelected((Item) selected, ExplorerView.this); + } + } + } + }); + + createActions(); + createMenu(); + createToolBar(); + + Plugin.getDefault().addRssListener(this); + treeViewer.setInput(Plugin.getDefault()); + } + + public void setFocus() { + treeViewer.getControl().setFocus(); + } + + public void onChannelListChanged(ArrayList channels) { + treeViewer.setInput(Plugin.getDefault()); + } + + public void onChannelStatusChanged(final Channel channel) { + treeViewer.getControl().getDisplay().asyncExec(new Runnable() { + public void run() { + treeViewer.refresh(channel); + } + }); + } + + public void onChannelSelected(Channel channel) { + System.out.println("Explorer.onChannelSelected -> " + channel); + } + + public void onItemStatusChanged(final Item item) { + treeViewer.getControl().getDisplay().asyncExec(new Runnable() { + public void run() { + treeViewer.refresh(item); + } + }); + } + + private void createActions() { + //refresh + refreshAction = new Action("Refresh", IconManager.getImageDescriptor(IconManager.ICON_ACTION_REFRESH)) { + public void run() { + Plugin.getDefault().update(); + } + }; + refreshAction.setToolTipText("Refresh"); + } + + private void createMenu() { + //IMenuManager mgr = getViewSite().getActionBars().getMenuManager(); + //mgr.add(clearAction); + } + + private void createToolBar() { + IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager(); + mgr.add(refreshAction); + } + + private void setUrl(String url) { + IWorkbenchPage page = Plugin.getDefault().getActivePage(); + try { + IViewPart part = page.findView(BrowserView.ID_BROWSER); + if (part == null) { + part = page.showView(BrowserView.ID_BROWSER); + } else { + page.bringToTop(part); + } + ((BrowserView) part).setUrl(url); + } catch (Exception e) { + } + } + + // public void onItemSelected(Item tiem) { + // // NOP + // } + public void onItemSelected(Item item) { + if (item != null) { // && uiReady && linkAction.isChecked()) { + // if(showDescritionAction.isChecked()) { + // String desc = item.getDescription(); + // if(desc == null) + // desc = HTML_NO_DESCRIPTION; + // browser.setText(MessageFormat.format(HTML,new String[]{desc, encodeNewLine(desc), item.getUsableLink(), + // item.getUsableTitle()})); + // } else { + setUrl(item.getUsableLink()); + // } + //XXX this is a hack, should be done otherwise + boolean channelStatus = item.getChannel().isUnread(); + item.setReadFlag(true); + Plugin.getDefault().notifyItemStatusChanged(item, this); + if (channelStatus != item.getChannel().isUnread()) { + Plugin.getDefault().notifyChannelStatusChanged(item.getChannel(), this); + } + } + } +} \ No newline at end of file diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/HeadlineView.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/HeadlineView.java new file mode 100644 index 0000000..e87ef3e --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/HeadlineView.java @@ -0,0 +1,105 @@ +/* + * Created on 15 mai 2004 + * Copyright 2004 Jérôme Nègre + */ +package net.sourceforge.phpeclipse.news.view; + +import java.util.ArrayList; +import java.util.Iterator; + +import net.sourceforge.phpeclipse.news.Channel; +import net.sourceforge.phpeclipse.news.IconManager; +import net.sourceforge.phpeclipse.news.Item; +import net.sourceforge.phpeclipse.news.Plugin; +import net.sourceforge.phpeclipse.news.RssListener; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.ui.part.ViewPart; + +/** + * @author Jérôme Nègre + */ +public class HeadlineView extends ViewPart implements RssListener { + + Table table; + + public HeadlineView() { + super(); + } + + public void dispose() { + Plugin.getDefault().removeRssListener(this); + super.dispose(); + } + + private TableColumn createColumn(int style, int width, String text) { + TableColumn col = new TableColumn(table, style); + col.setWidth(width); + col.setText(text); + return col; + } + + public void createPartControl(Composite parent) { + table = new Table(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); + //TODO remember the width of the columns + createColumn(SWT.LEFT, 120, "Publication Date"); + createColumn(SWT.CENTER, 20, ""); + createColumn(SWT.LEFT, 600, "Title"); + table.setHeaderVisible(true); + table.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + Item item = (Item) e.item.getData(); + Plugin.getDefault().notifyItemSelected(item,HeadlineView.this); + } + }); + Plugin.getDefault().addRssListener(this); + } + + public void setFocus() { + table.setFocus(); + } + + public void onChannelListChanged(ArrayList channels) { + // NOP + } + + public void onChannelStatusChanged(Channel channel) { + // NOP + } + + public void onChannelSelected(Channel channel) { + fillTable(channel); + } + + public void onItemSelected(Item item) { + fillTable(item.getChannel()); + int index = item.getChannel().getItems().indexOf(item); + table.setSelection(index); + } + + public void onItemStatusChanged(Item item) { + fillTable(item.getChannel()); + int index = item.getChannel().getItems().indexOf(item); + table.setSelection(index); + } + + private void fillTable(Channel channel) { + Iterator items = channel.getItems().iterator(); + table.removeAll(); + while(items.hasNext()) { + Item item = (Item)items.next(); + TableItem tableItem = new TableItem(table,SWT.NONE); + tableItem.setText(0,item.getDate()); + String image = item.isReadFlag()? IconManager.ICON_STATUS_READ : IconManager.ICON_STATUS_UNREAD; + tableItem.setImage(1,IconManager.getImage(image)); + tableItem.setText(2,item.getUsableTitle()); + tableItem.setData(item); + } + } +} diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/NewsTreeViewerProvider.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/NewsTreeViewerProvider.java new file mode 100644 index 0000000..8b225b3 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/view/NewsTreeViewerProvider.java @@ -0,0 +1,130 @@ +/* + * Created on 16 mai 2004 + * Copyright 2004 Jérôme Nègre + */ +package net.sourceforge.phpeclipse.news.view; + +import net.sourceforge.phpeclipse.news.Channel; +import net.sourceforge.phpeclipse.news.IconManager; +import net.sourceforge.phpeclipse.news.Item; +import net.sourceforge.phpeclipse.news.Plugin; + +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.graphics.Image; + +/** + * @author Jérôme Nègre + */ +public class NewsTreeViewerProvider + implements + ITreeContentProvider, + ILabelProvider { + + public Object[] getChildren(Object parentElement) { + if(parentElement instanceof Channel) { + return ((Channel)parentElement).getItems().toArray(); + } else { + return null; + } + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) + */ + public Object getParent(Object element) { + // TODO Auto-generated method stub + return null; + } + + public boolean hasChildren(Object element) { + if(element instanceof Channel) { + return !((Channel)element).getItems().isEmpty(); + } else { + return false; + } + } + + public Object[] getElements(Object inputElement) { + return ((Plugin)inputElement).getChannelList().toArray(); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.IContentProvider#dispose() + */ + public void dispose() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) + */ + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + // TODO Auto-generated method stub + } + + public Image getImage(Object element) { + + String iconId; + + if(element instanceof Channel) { + Channel channel = (Channel)element; + if(channel.isRefreshing()) { + iconId = IconManager.ICON_STATUS_REFRESH; + } else if(channel.getErrorMessage()!=null) { + iconId = IconManager.ICON_STATUS_ERROR; + } else if(channel.isUnread()) { + iconId = IconManager.ICON_STATUS_UNREAD; + } else { + iconId = IconManager.ICON_STATUS_READ; + } + } else if(element instanceof Item) { + Item item = (Item)element; + if(item.isReadFlag()) { + iconId = IconManager.ICON_STATUS_READ; + } else { + iconId = IconManager.ICON_STATUS_UNREAD; + } + } else { + return null; + } + return Plugin.getDefault().getImageRegistry().getDescriptor(iconId).createImage(); + } + + public String getText(Object element) { + if(element instanceof Channel) { + return ((Channel)element).getTitle(); + } else if(element instanceof Item) { + return ((Item)element).getUsableTitle(); + } else { + return "Unexpected object: "+element; + } + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener) + */ + public void addListener(ILabelProviderListener listener) { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String) + */ + public boolean isLabelProperty(Object element, String property) { + // TODO Auto-generated method stub + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener) + */ + public void removeListener(ILabelProviderListener listener) { + // TODO Auto-generated method stub + + } +} -- 1.7.1