From 3be300f0d9107885e183ae7c86b081c8e6c6780f Mon Sep 17 00:00:00 2001 From: jprocter Date: Thu, 22 Sep 2011 16:50:56 +0100 Subject: [PATCH] jalview rss reader based on jswingreader (JAL-943) --- THIRDPARTYLIBS | 1 + lib/jswingreader-0.3.jar | Bin 0 -> 88615 bytes src/jalview/bin/Cache.java | 34 ++ src/jalview/gui/BlogReader.java | 754 ++++++++++++++++++++++++++++++++++++ src/jalview/gui/Desktop.java | 39 ++ src/jalview/jbgui/GBlogReader.java | 8 + src/jalview/jbgui/GDesktop.java | 15 + 7 files changed, 851 insertions(+) create mode 100644 lib/jswingreader-0.3.jar create mode 100644 src/jalview/gui/BlogReader.java create mode 100644 src/jalview/jbgui/GBlogReader.java diff --git a/THIRDPARTYLIBS b/THIRDPARTYLIBS index 2671d8c..5918fc2 100644 --- a/THIRDPARTYLIBS +++ b/THIRDPARTYLIBS @@ -19,6 +19,7 @@ httpcore-4.0.1.jar httpmime-4.0.3.jar jaxrpc.jar jhall.jar +jswingreader-0.3.jar : Apache license - built from http://jswingreader.sourceforge.net/ svn/trunk v12 log4j-1.2.8.jar mail.jar miglayout-4.0-swing.jar BSD http://www.migcalendar.com/miglayout/versions/4.0/license.txt diff --git a/lib/jswingreader-0.3.jar b/lib/jswingreader-0.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..c8a4fffd39f0fbae25173c3f0558f651645ea923 GIT binary patch literal 88615 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 literal 0 HcmV?d00001 diff --git a/src/jalview/bin/Cache.java b/src/jalview/bin/Cache.java index ab08140..fab075e 100755 --- a/src/jalview/bin/Cache.java +++ b/src/jalview/bin/Cache.java @@ -19,6 +19,8 @@ package jalview.bin; import java.awt.Color; import java.io.*; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.*; import org.apache.log4j.*; @@ -767,4 +769,36 @@ public class Cache setProperty(property, jalview.util.Format .getHexString(colour)); } + + public static final DateFormat date_format = SimpleDateFormat.getDateTimeInstance(); + + /** + * store a date in a jalview property + * @param string + * @param time + */ + public static void setDateProperty(String property, Date time) + { + setProperty(property, date_format.format(time)); + } + /** + * read a date stored in a jalview property + * @param property + * @return valid date as stored by setDateProperty, or null + * + */ + public static Date getDateProperty(String property) + { + String val = getProperty(property); + if (val!=null) + { + try { + return date_format.parse(val); + } catch (Exception ex) + { + System.err.println("Invalid or corrupt date in property '"+property+"' : value was '"+val+"'"); + } + } + return null; + } } diff --git a/src/jalview/gui/BlogReader.java b/src/jalview/gui/BlogReader.java new file mode 100644 index 0000000..3b7df48 --- /dev/null +++ b/src/jalview/gui/BlogReader.java @@ -0,0 +1,754 @@ +package jalview.gui; + +import jalview.bin.Cache; +import jalview.jbgui.GBlogReader; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.beans.PropertyChangeListener; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.Action; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JToolBar; +import javax.swing.ListSelectionModel; +import javax.swing.SwingUtilities; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.text.DateFormatter; + +import org.robsite.jswingreader.action.AboutAction; +import org.robsite.jswingreader.action.MarkChannelAsRead; +import org.robsite.jswingreader.action.MarkChannelAsUnread; +import org.robsite.jswingreader.action.MarkItemAsRead; +import org.robsite.jswingreader.action.MarkItemAsUnread; +import org.robsite.jswingreader.action.RefreshChannelAction; +import org.robsite.jswingreader.action.UpdatableAction; +import org.robsite.jswingreader.model.Channel; +import org.robsite.jswingreader.model.ChannelListModel; +import org.robsite.jswingreader.model.Item; +import org.robsite.jswingreader.model.SimpleRSSParser; +import org.robsite.jswingreader.ui.BlogContentPane; +import org.robsite.jswingreader.ui.ItemReadTimer; +import org.robsite.jswingreader.ui.Main; +import org.robsite.jswingreader.ui.util.ContextMenuMouseAdapter; +import org.robsite.jswingreader.util.BrowserUtils; + +import quicktime.std.movies.media.TextDescription; + +/** + * Blog reading window, adapted from JSwingReader's + * org.robsite.jswingreader.ui.MainWindow class + */ + +public class BlogReader extends GBlogReader +{ + private JButton buttonAbout = new JButton(); + + private JButton buttonRefresh = new JButton(); + + private JToolBar toolBar = new JToolBar(); + + private JLabel statusBar = new JLabel(); + + private JPanel panelMain = new JPanel(); + + private BorderLayout layoutMain = new BorderLayout(); + + private BorderLayout borderLayout1 = new BorderLayout(); + + private JPanel topPanel = new JPanel(); + + private JPanel bottomPanel = new JPanel(); + + private BorderLayout borderLayout2 = new BorderLayout(); + + private BorderLayout borderLayout3 = new BorderLayout(); + + private JSplitPane topBottomSplitPane = new JSplitPane(); + + private JList listItems = new JList(new DefaultListModel()); + + // SWITCH IN JALVIEW HTML VIEWER PANE HERE + private BlogContentPane textDescription = new BlogContentPane(); + + // ADD IN JALVIEW BANNER FOR PRETTINESS + private BorderLayout borderLayout4 = new BorderLayout(); + + private BorderLayout borderLayout5 = new BorderLayout(); + + private ChannelListModel _channelModel = null; + + private JList listChannels = new JList(); + + private Action exitAction = new Action() + { + + @Override + public void actionPerformed(ActionEvent arg0) + { + setVisible(false); + if (parent != null) + { + parent.showNews(false); + } + + } + + @Override + public void setEnabled(boolean arg0) + { + + } + + @Override + public void removePropertyChangeListener(PropertyChangeListener arg0) + { + // TODO Auto-generated method stub + + } + + @Override + public void putValue(String arg0, Object arg1) + { + // TODO Auto-generated method stub + + } + + @Override + public boolean isEnabled() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public Object getValue(String arg0) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public void addPropertyChangeListener(PropertyChangeListener arg0) + { + // TODO Auto-generated method stub + + } + }; + + private JLabel lblChannels = new JLabel(); + + private List _updatableActions = new ArrayList(); + + private ItemReadTimer _itemTimer = null; + + private JPopupMenu _popupItems = null; + + private JPopupMenu _popupChannels = null; + + private String lastm = ""; + + private boolean newsnew = false; + + private Desktop parent = null; + + BlogReader() + { + this(null); + } + + // should we ignore fake gui events + private boolean updating = false; + + public BlogReader(Desktop desktop) + { + parent = desktop; + if (parent == null) + { + this.setSize(new Dimension(550, 350)); + } + else + { + Rectangle bounds = parent + .getLastKnownDimensions("JALVIEW_RSS_WINDOW_"); + if (bounds == null) + { + setBounds(parent.getX(), parent.getY(), 550, 350); + } + else + { + setBounds(bounds.x, bounds.y, bounds.width, bounds.height); + } + } + _channelModel = new ChannelListModel(); + // Construct our jalview news channel + Channel chan = new Channel(); + chan.setURL(jalview.bin.Cache.getDefault( + "JALVIEW_NEWS_RSS", + jalview.bin.Cache.getDefault("www.jalview.org", + "http://www.jalview.org") + "/feeds/desktop/rss")); + loadLastM(); + _channelModel.addChannel(chan); + updating = true; + try + { + jbInit(); + postInit(); + } catch (Exception e) + { + e.printStackTrace(); + } + + initItems(chan); + updating = false; + boolean setvisible = checkForNew(chan, true); + if (setvisible) + { + Cache.log.info("Will show jalview news automatically"); + SwingUtilities.invokeLater(new Runnable() + { + @Override + public void run() + { + if (parent != null) + { + parent.showNews(true); + } + else + { + setVisible(true); + } + } + }); + } + } + + /** + * update hasnew flag and mark all new messages as unread. + */ + private boolean checkForNew(Channel chan, boolean updateItems) + { + if (!updating || updateItems) + { + newsnew = false; + } + if (chan != null && chan.getItems() != null) + { + for (Item i : (List) chan.getItems()) + { + boolean isread = (lastDate != null && i.getPublishDate() != null && !lastDate + .before(i.getPublishDate())); + + if (i.getPublishDate() != null && (!updating || updateItems)) + { + newsnew |= !isread; + } + if (updateItems) + { + i.setRead(isread); + } + } + } + return newsnew; + } + + java.util.Date lastDate = null; + + private void loadLastM() + { + lastDate = Cache.getDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED"); + } + + private void saveLastM(Item item) + { + if (item != null && item.getPublishDate() != null + && (lastDate == null || item.getPublishDate().after(lastDate))) + { + lastDate = item.getPublishDate(); + if (lastDate != null) + { + jalview.bin.Cache.setDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED", + lastDate); + jalview.bin.Cache.log.info("Saved last read date as " + + jalview.bin.Cache.date_format.format(lastDate)); + + } + if (_channelModel.getElementAt(0) != null) + { + checkForNew((Channel) _channelModel.getElementAt(0), false); + } + } + } + + private void jbInit() throws Exception + { + this.setTitle("News from www.jalview.org"); + this.getContentPane().setLayout(layoutMain); + panelMain.setLayout(borderLayout1); + topPanel.setLayout(borderLayout5); + bottomPanel.setLayout(borderLayout4); + topBottomSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); + topBottomSplitPane.setDividerLocation(100); + topBottomSplitPane.setTopComponent(topPanel); + topBottomSplitPane.setBottomComponent(bottomPanel); + JScrollPane spTextDescription = new JScrollPane(textDescription); + textDescription.setText(""); + statusBar.setText(" [Status] "); + buttonRefresh.addActionListener(new ActionListener() + { + + @Override + public void actionPerformed(ActionEvent e) + { + refreshNews(); + } + }); + this.getContentPane().add(statusBar, BorderLayout.SOUTH); + toolBar.add(buttonRefresh); + toolBar.addSeparator(); + JLabel about=new JLabel("brought to you by JSwingReader (jswingreader.sourceforge.net)"); + toolBar.add(about); + toolBar.setFloatable(false); + this.getContentPane().add(toolBar, BorderLayout.NORTH); + panelMain.add(topBottomSplitPane, BorderLayout.CENTER); + this.getContentPane().add(panelMain, BorderLayout.CENTER); + JScrollPane spListItems = new JScrollPane(listItems); + listItems + .setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); + topPanel.add(spListItems, BorderLayout.CENTER); + bottomPanel.add(spTextDescription, BorderLayout.CENTER); + listChannels.setModel(_channelModel); + + listItems.addMouseListener(new java.awt.event.MouseAdapter() + { + public void mouseClicked(MouseEvent e) + { + listItems_mouseClicked(e); + } + }); + _popupItems = _buildItemsPopupMenu(); + _popupChannels = _buildChannelsPopupMenu(); + ContextMenuMouseAdapter popupAdapter = new ContextMenuMouseAdapter( + _popupItems); + ContextMenuMouseAdapter popupChannelsAdapter = new ContextMenuMouseAdapter( + _popupChannels); + listItems.addMouseListener(popupAdapter); + listItems.setCellRenderer(new ItemsRenderer()); + lblChannels.setText("Channels"); + } + + private void postInit() + { + // clear the default hyperlink listener and replace with our own. + for (HyperlinkListener hll : textDescription.getHyperlinkListeners()) + { + textDescription.removeHyperlinkListener(hll); + } + textDescription.addHyperlinkListener(new HyperlinkListener() + { + public void hyperlinkUpdate(HyperlinkEvent e) + { + if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) + { + Desktop.showUrl(e.getURL().toExternalForm()); + } + } + }); + + this.addWindowListener(new WindowAdapter() + { + public void windowClosing(WindowEvent e) + { + ActionEvent actionEvent = new ActionEvent(this, + ActionEvent.ACTION_FIRST, (String) exitAction + .getValue(Action.NAME)); + exitAction.actionPerformed(actionEvent); + } + + public void windowOpened(WindowEvent e) + { + } + }); + + listItems.addListSelectionListener(new ListSelectionListener() + { + public void valueChanged(ListSelectionEvent e) + { + if (e.getValueIsAdjusting() == false) + { + _itemsValueChanged(listItems); + } + } + }); + listChannels.setSelectedIndex(1); + _updateAllActions(); + _updateToolbarButtons(); + + _itemTimer = new ItemReadTimer(listChannels, listItems); + _itemsValueChanged(listItems); + } + + public class LaunchJvBrowserOnItem extends AbstractAction implements + UpdatableAction + { + JList _listItems = null; + + public LaunchJvBrowserOnItem(JList listItems) + { + super("Open in Browser"); + this.putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_O)); + this.putValue(Action.LONG_DESCRIPTION, "Open in Browser"); + _listItems = listItems; + } + + public void actionPerformed(ActionEvent e) + { + Object o = _listItems.getSelectedValue(); + if (o instanceof Item) + { + Item item = (Item) o; + item.setRead(true); + _listItems.repaint(); + + Desktop.showUrl(item.getLink()); + } + } + + public void update(Object o) + { + setEnabled(true); + if (_listItems == null || _listItems.getModel().getSize() == 0) + { + setEnabled(false); + } + else if (_listItems.getSelectedIndex() == -1) + { + setEnabled(false); + } + } + + } + + private JPopupMenu _buildItemsPopupMenu() + { + JPopupMenu popup = new JPopupMenu(); + popup.add(new JMenuItem(new LaunchJvBrowserOnItem(listItems))); + popup.addSeparator(); + popup.add(new JMenuItem(new MarkItemAsRead(listItems))); + popup.add(new JMenuItem(new MarkItemAsUnread(listItems))); + return popup; + } + + private JPopupMenu _buildChannelsPopupMenu() + { + JPopupMenu popup = new JPopupMenu(); + popup.add(new JMenuItem(new MarkChannelAsRead(listChannels, listItems))); + popup.add(new JMenuItem( + new MarkChannelAsUnread(listChannels, listItems))); + return popup; + } + + private void initItems(Channel channel) + { + if (channel == null) + { + channel = new Channel(); + } + if (!channel.isOpen() && channel.getURL() != null) + { + try + { + SimpleRSSParser.parse(channel); + } catch (Exception ex) + { + ex.printStackTrace(); + } + } + DefaultListModel itemsModel = (DefaultListModel) listItems.getModel(); + itemsModel.clear(); + Iterator iter = (channel.getItems() != null) ? channel.getItems() + .iterator() : Collections.EMPTY_LIST.iterator(); + while (iter.hasNext()) + { + itemsModel.addElement(iter.next()); + } + if (itemsModel.getSize() > 0) + { + listItems.setSelectedIndex(0); + _itemsValueChanged(listItems); + } + setStatusBarText(channel.getURL()); + _updateAllActions(); + } + + private void _itemsValueChanged(JList itemList) + { + Item item = (Item) itemList.getSelectedValue(); + if (item == null) + { + if (itemList.getModel().getSize() > 0) + { + item = (Item) itemList.getModel().getElementAt(0); + } + if (item == null) + { + item = new Item(); + } + else + { + itemList.setSelectedIndex(0); + } + } + + if (_itemTimer != null) + { + // prefer a shorter delay than 5s + _itemTimer.setDelay(300); + _itemTimer.start(); + _itemTimer.setLastItem(item); + final Item lastitem = item; + _itemTimer.addActionListener(new ActionListener() + { + + @Override + public void actionPerformed(ActionEvent e) + { + saveLastM(lastitem); + } + }); + } + + setStatusBarText(item.getLink()); + textDescription.setBlogText(item); + _updateAllActions(); + } + + public void setStatusBarText(String text) + { + statusBar.setText(text); + } + + private void _updateAllActions() + { + Iterator iter = _updatableActions.iterator(); + while (iter.hasNext()) + { + UpdatableAction action = (UpdatableAction) iter.next(); + action.update(this); + } + } + + private void _updateToolbarButtons() + { + Map general = (Map) Main.getPreferences().get("general"); + if (general == null) + { + return; + } + + Component[] components = toolBar.getComponents(); + for (int i = 0; i < components.length; i++) + { + Component component = components[i]; + if (component instanceof JButton) + { + JButton button = (JButton) component; + if (Boolean.toString(false).equals(general.get("useToolBarText"))) + { + // Remove the text if preferences state no toolbar text + button.setText(""); + } + if (Boolean.toString(true).equals(general.get("radioTextBelow"))) + { + button.setVerticalTextPosition(AbstractButton.BOTTOM); + button.setHorizontalTextPosition(AbstractButton.CENTER); + } + else if (Boolean.toString(true).equals( + general.get("radioTextRight"))) + { + button.setVerticalTextPosition(AbstractButton.CENTER); + button.setHorizontalTextPosition(AbstractButton.RIGHT); + } + } + } + } + + private void listItems_mouseClicked(MouseEvent e) + { + if (e.getClickCount() == 2 && e.getModifiersEx() == MouseEvent.NOBUTTON) + { + Item item = (Item) listItems.getSelectedValue(); + item.setRead(true); + saveLastM(item); + if (_itemTimer != null) + { + _itemTimer.stop(); + } + + Action action = new LaunchJvBrowserOnItem(listItems); + ActionEvent event = new ActionEvent(this, + ActionEvent.ACTION_PERFORMED, "LaunchBrowserOnItem"); + action.actionPerformed(event); + } + } + + /** + * force the news panel to refresh + */ + public void refreshNews() + { + try { + initItems((Channel)_channelModel.getElementAt(0)); + + } catch (Exception x) + {} + } + + public static void main(String args[]) + { + // this tests the detection of new news based on the last read date stored + // in jalview properties + jalview.bin.Cache.loadProperties(null); + jalview.bin.Cache.initLogger(); + // test will advance read date each time + Calendar today = Calendar.getInstance(), lastread = Calendar + .getInstance(); + lastread.set(1983, 01, 01); + while (lastread.before(today)) + { + Cache.setDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED", + lastread.getTime()); + BlogReader me = new BlogReader(); + System.out.println("Set last date to " + + jalview.bin.Cache.date_format.format(lastread.getTime())); + if (me.isNewsNew()) + { + Cache.log.info("There is news to read."); + } + else + { + Cache.log.info("There is no new news."); + } + me.setTitle("Testing : Last read is " + me.lastDate); + me.setVisible(true); + me.toFront(); + while (me.isVisible()) + { + try + { + Thread.sleep(100); + } catch (InterruptedException x) + { + } + ; + } + if (me.isNewsNew()) + { + Cache.log.info("Still new news after reader displayed."); + } + if (lastread.getTime().before(me.lastDate)) + { + Cache.log.info("The news was read."); + lastread.setTime(me.lastDate); + } + else + { + lastread.add(Calendar.MONTH, 1); + } + me.dispose(); + } + } + + boolean isNewsNew() + { + return newsnew; + } +} + +class ChannelsRenderer extends DefaultListCellRenderer +{ + private final static Icon _icon = new ImageIcon( + Main.class.getResource("image/ComposeMail16.gif")); + + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus) + { + JLabel component = (JLabel) super.getListCellRendererComponent(list, + value, index, isSelected, cellHasFocus); + component.setIcon(ChannelsRenderer._icon); + if (value instanceof Channel) + { + Channel channel = (Channel) value; + component.setText(channel.getTitle() + " (" + + channel.getUnreadItemCount() + ")"); + component.setToolTipText(channel.getURL()); + } + return component; + } +} + +class ItemsRenderer extends DefaultListCellRenderer +{ + private final static Icon _icon = new ImageIcon( + Main.class.getResource("image/ComposeMail16.gif")); + + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus) + { + JLabel component = (JLabel) super.getListCellRendererComponent(list, + value, index, isSelected, cellHasFocus); + component.setIcon(ItemsRenderer._icon); + if (value instanceof Item) + { + Item item = (Item) value; + if (item.getPublishDate() != null) + { + component.setText(DateFormat.getDateInstance().format( + item.getPublishDate()) + + " " + item.getTitle()); + } + component.setToolTipText(item.getLink()); + if (!item.isRead()) + { + component.setFont(component.getFont().deriveFont(Font.BOLD)); + } + else + { + component.setFont(component.getFont().deriveFont(Font.PLAIN)); + } + } + return component; + } +} diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index 3796b08..a5778a7 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -57,6 +57,11 @@ public class Desktop extends jalview.jbgui.GDesktop implements private JalviewChangeSupport changeSupport = new JalviewChangeSupport(); /** + * news reader - null if it was never started. + */ + private BlogReader jvnews=null; + + /** * @param listener * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.beans.PropertyChangeListener) */ @@ -267,6 +272,18 @@ public class Desktop extends jalview.jbgui.GDesktop implements showConsole(showjconsole); + showNews.setVisible(false); + final Desktop me = this; + // Thread off the news reader, in case there are connection problems. + new Thread( new Runnable() { + @Override + public void run() + { + jvnews = new BlogReader(me); + showNews.setVisible(true); + } + }).start(); + this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) @@ -328,6 +345,22 @@ public class Desktop extends jalview.jbgui.GDesktop implements }); } + protected void showNews_actionPerformed(ActionEvent e) + { + showNews(showNews.isSelected()); + } + void showNews(boolean default1) + { + { + jvnews.setVisible(default1); + if (default1) + { + jvnews.refreshNews(); + jvnews.toFront(); + } + } + } + /** * recover the last known dimensions for a jalview window * @@ -914,6 +947,12 @@ public class Desktop extends jalview.jbgui.GDesktop implements storeLastKnownDimensions("JAVA_CONSOLE_", jconsole.getBounds()); jconsole.stopConsole(); } + if (jvnews!=null) + { + storeLastKnownDimensions("JALVIEW_RSS_WINDOW_", jvnews.getBounds()); + + } + System.exit(0); } diff --git a/src/jalview/jbgui/GBlogReader.java b/src/jalview/jbgui/GBlogReader.java new file mode 100644 index 0000000..c27f4b1 --- /dev/null +++ b/src/jalview/jbgui/GBlogReader.java @@ -0,0 +1,8 @@ +package jalview.jbgui; + +import javax.swing.JFrame; + +public class GBlogReader extends JFrame +{ + +} diff --git a/src/jalview/jbgui/GDesktop.java b/src/jalview/jbgui/GDesktop.java index 5effdbd..fc3f358 100755 --- a/src/jalview/jbgui/GDesktop.java +++ b/src/jalview/jbgui/GDesktop.java @@ -88,6 +88,8 @@ public class GDesktop extends JFrame protected JCheckBoxMenuItem showConsole = new JCheckBoxMenuItem(); + protected JCheckBoxMenuItem showNews = new JCheckBoxMenuItem(); + /** * Creates a new GDesktop object. */ @@ -306,6 +308,14 @@ public class GDesktop extends JFrame showConsole_actionPerformed(e); } }); + showNews.setText("Show Jalview News"); + showNews.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + showNews_actionPerformed(e); + } + }); desktopMenubar.add(FileMenu); desktopMenubar.add(toolsMenu); VamsasMenu.setVisible(false); @@ -330,6 +340,7 @@ public class GDesktop extends JFrame toolsMenu.add(preferences); toolsMenu.add(showMemusage); toolsMenu.add(showConsole); + toolsMenu.add(showNews); toolsMenu.add(garbageCollect); inputMenu.add(inputLocalFileMenuItem); inputMenu.add(inputURLMenuItem); @@ -346,7 +357,11 @@ public class GDesktop extends JFrame // TODO Auto-generated method stub } + protected void showNews_actionPerformed(ActionEvent e) + { + // TODO Auto-generated method stub + } protected void showMemusage_actionPerformed(ActionEvent e) { // TODO Auto-generated method stub -- 1.7.10.2