RSS news reader; initially copied from "all the news"
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.news / src / net / sourceforge / phpeclipse / news / Plugin.java
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 (file)
index 0000000..424e081
--- /dev/null
@@ -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;
+  }
+}
+