avoid OutOfBoundsException and break of format action, when marker positions are...
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.news / src / net / sourceforge / phpeclipse / news / Plugin.java
1 package net.sourceforge.phpeclipse.news;
2
3 import java.io.File;
4 import java.util.ArrayList;
5 import java.util.Iterator;
6 import java.util.Timer;
7 import java.util.TimerTask;
8
9 import net.sourceforge.phpeclipse.news.pref.ChannelStore;
10 import net.sourceforge.phpeclipse.news.pref.ListEncoder;
11
12 import org.eclipse.core.runtime.CoreException;
13 import org.eclipse.core.runtime.IPluginDescriptor;
14 import org.eclipse.core.runtime.IStatus;
15 import org.eclipse.core.runtime.Status;
16 import org.eclipse.jface.preference.IPreferenceStore;
17 import org.eclipse.jface.resource.ImageRegistry;
18 import org.eclipse.ui.IWorkbenchPage;
19 import org.eclipse.ui.IWorkbenchWindow;
20 import org.eclipse.ui.plugin.AbstractUIPlugin;
21
22 public class Plugin extends AbstractUIPlugin {
23
24   public static final String BACKENDS_SECTION = "backends";
25
26   public static final String REFRESH_INTERVAL_PREFERENCE = "net.sourceforge.phpeclipse.news.refreshinterval";
27
28   /** @deprecated */
29   public static final String BACKENDS_PREFERENCE = "net.sourceforge.phpeclipse.news.backends";
30
31   public static final String BROWSER_PREFERENCE = "net.sourceforge.phpeclipse.news.browser";
32
33   public static final String BANNED_ITEMS_PREFERENCE = "net.sourceforge.phpeclipse.news.banneditems";
34
35   public static final String FORCE_CACHE_PREFERENCE = "net.sourceforge.phpeclipse.news.forcecache";
36
37   //Default values
38   public static final int DEFAULT_REFRESH_INTERVAL = 60;
39
40   public static final String DEFAULT_BROWSER = "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";
41
42   public static final String DEFAULT_BANNED_ITEMS = "";
43
44   public static final boolean DEFAULT_FORCE_CACHE = false;
45
46   //User-Agent
47   public static String userAgent;
48
49   protected UpdateThread updateThread;
50
51   protected ArrayList views = new ArrayList();
52
53   protected Timer timer;
54
55   protected ArrayList channelList;
56
57   protected Object channelLock = new Object();
58
59   protected ArrayList banList = new ArrayList();
60
61   /**
62    * List of RssListeners to notify
63    */
64   private ArrayList rssListeners = new ArrayList();
65
66   /**
67    * Constructor for Plugin
68    */
69   public Plugin(IPluginDescriptor descriptor) {
70     super(descriptor);
71
72     //set the user-agent ID
73     StringBuffer buffer = new StringBuffer();
74     buffer.append("AllTheNews/").append(descriptor.getVersionIdentifier()).append(" (").append(System.getProperty("os.name"))
75         .append("; ").append(System.getProperty("os.arch")).append("; http://www.jnegre.org/)");
76     userAgent = buffer.toString();
77
78     singleton = this;
79
80     //init the channel store
81     ChannelStore.init(this);
82
83     updateBanList();
84     updateChannelList();
85     setTimer();
86   }
87
88   protected static Plugin singleton;
89
90   public static Plugin getDefault() {
91     return singleton;
92   }
93
94   public static void logError(String message, Throwable t) {
95     getDefault().getLog()
96         .log(new Status(IStatus.ERROR, getDefault().getDescriptor().getUniqueIdentifier(), IStatus.OK, message, t));
97   }
98
99   public static void logInfo(String message, Throwable t) {
100     getDefault().getLog().log(new Status(IStatus.INFO, getDefault().getDescriptor().getUniqueIdentifier(), IStatus.OK, message, t));
101   }
102
103   /*
104    * @see AbstractUIPlugin#initializeDefaultPreferences(IPreferenceStore)
105    */
106   protected void initializeDefaultPreferences(IPreferenceStore store) {
107     store.setDefault(REFRESH_INTERVAL_PREFERENCE, DEFAULT_REFRESH_INTERVAL);
108     File file = new File(DEFAULT_BROWSER);
109     if (file.exists()) {
110       store.setDefault(BROWSER_PREFERENCE, DEFAULT_BROWSER);
111     }
112     store.setDefault(BANNED_ITEMS_PREFERENCE, DEFAULT_BANNED_ITEMS);
113     store.setDefault(FORCE_CACHE_PREFERENCE, DEFAULT_FORCE_CACHE);
114   }
115
116   protected ImageRegistry createImageRegistry() {
117     ImageRegistry registry = super.createImageRegistry();
118     IconManager.populateImageRegistry(registry);
119     return registry;
120   }
121
122   public void addRssListener(RssListener listener) {
123     synchronized (rssListeners) {
124       rssListeners.add(listener);
125     }
126   }
127
128   public void removeRssListener(RssListener listener) {
129     synchronized (rssListeners) {
130       rssListeners.remove(listener);
131     }
132   }
133
134   public void notifyChannelListChanged(RssListener source) {
135     Iterator iterator = rssListeners.iterator();
136     ArrayList channels = getChannelList();
137     while (iterator.hasNext()) {
138       RssListener listener = (RssListener) iterator.next();
139       if (listener != source) {
140         listener.onChannelListChanged(channels);
141       }
142     }
143   }
144
145   public void notifyChannelStatusChanged(Channel channel, RssListener source) {
146     Iterator iterator = rssListeners.iterator();
147     while (iterator.hasNext()) {
148       RssListener listener = (RssListener) iterator.next();
149       if (listener != source) {
150         listener.onChannelStatusChanged(channel);
151       }
152     }
153   }
154
155   public void notifyChannelSelected(Channel channel, RssListener source) {
156     Iterator iterator = rssListeners.iterator();
157     while (iterator.hasNext()) {
158       RssListener listener = (RssListener) iterator.next();
159       if (listener != source) {
160         listener.onChannelSelected(channel);
161       }
162     }
163   }
164
165   public void notifyItemSelected(Item item, RssListener source) {
166     Iterator iterator = rssListeners.iterator();
167     while (iterator.hasNext()) {
168       RssListener listener = (RssListener) iterator.next();
169       if (listener != source) {
170         listener.onItemSelected(item);
171       }
172     }
173   }
174
175   public void notifyItemStatusChanged(Item item, RssListener source) {
176     Iterator iterator = rssListeners.iterator();
177     while (iterator.hasNext()) {
178       RssListener listener = (RssListener) iterator.next();
179       if (listener != source) {
180         listener.onItemStatusChanged(item);
181       }
182     }
183   }
184
185   public void setTimer() {
186     if (timer != null) {
187       timer.cancel();
188     }
189     long period = getPreferenceStore().getInt(Plugin.REFRESH_INTERVAL_PREFERENCE) * 60000l;
190     if (period != 0) {
191       timer = new Timer(true);
192       timer.schedule(new UpdateTimer(), 0, period);
193     }
194   }
195
196   public void updateBanList() {
197     synchronized (banList) {
198       banList.clear();
199
200       String banned = this.getPreferenceStore().getString(Plugin.BANNED_ITEMS_PREFERENCE);
201       String[] bannedTitles = ListEncoder.decode(banned);
202       for (int i = 0; i < bannedTitles.length; i++) {
203         banList.add(bannedTitles[i]);
204       }
205     }
206   }
207
208   public boolean isBannedTitle(String title) {
209     synchronized (banList) {
210       return banList.contains(title);
211     }
212   }
213
214   public void updateChannelList() {
215     synchronized (channelLock) {
216       channelList = ChannelStore.getChannels();
217     }
218     notifyChannelListChanged(null);
219   }
220
221   public ArrayList getChannelList() {
222     synchronized (channelLock) {
223       return new ArrayList(channelList);
224     }
225   }
226
227   public void update() {
228     if (updateThread == null) {
229       updateThread = new UpdateThread();
230       updateThread.start();
231     }
232   }
233
234   protected class UpdateTimer extends TimerTask {
235     public void run() {
236       update();
237     }
238   }
239
240   public void shutdown() throws CoreException {
241     ChannelStore.saveReadStatus(getChannelList());
242     super.shutdown();
243   }
244
245   public IWorkbenchPage getActivePage() {
246     IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow();
247     if (window != null)
248       return window.getActivePage();
249     return null;
250   }
251 }
252