X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FBlogReader.java;h=c120a1bde09aa56cd93f5b529ae9d4df6cd6e44d;hb=5640ec0623c6d1205e62f9fe15292f32bfdab7d9;hp=3b7df4820309548f7325b6320e361a05272af5ad;hpb=3be300f0d9107885e183ae7c86b081c8e6c6780f;p=jalview.git
diff --git a/src/jalview/gui/BlogReader.java b/src/jalview/gui/BlogReader.java
index 3b7df48..c120a1b 100644
--- a/src/jalview/gui/BlogReader.java
+++ b/src/jalview/gui/BlogReader.java
@@ -1,10 +1,32 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see .
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
package jalview.gui;
import jalview.bin.Cache;
-import jalview.jbgui.GBlogReader;
+import jalview.bin.Console;
+import jalview.util.MessageManager;
import java.awt.BorderLayout;
import java.awt.Component;
+import java.awt.Dialog.ModalExclusionType;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
@@ -20,6 +42,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
+import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -32,6 +55,7 @@ import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
+import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenuItem;
@@ -46,14 +70,11 @@ 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;
@@ -63,19 +84,14 @@ 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
+public class BlogReader extends JPanel
{
- private JButton buttonAbout = new JButton();
-
private JButton buttonRefresh = new JButton();
private JToolBar toolBar = new JToolBar();
@@ -92,10 +108,6 @@ public class BlogReader extends GBlogReader
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());
@@ -118,7 +130,12 @@ public class BlogReader extends GBlogReader
@Override
public void actionPerformed(ActionEvent arg0)
{
- setVisible(false);
+ if (xf != null)
+ {
+ xf.dispose();
+ }
+ xf = null;
+ jd = null;
if (parent != null)
{
parent.showNews(false);
@@ -168,6 +185,43 @@ public class BlogReader extends GBlogReader
}
};
+ private JFrame xf = null;
+
+ private JalviewDialog jd = null;
+
+ private JalviewDialog createDialog()
+ {
+
+ return jd = new JalviewDialog()
+ {
+
+ @Override
+ protected void raiseClosed()
+ {
+ if (parent != null)
+ {
+ Console.debug("News window closed.");
+ jd = null;
+ parent.showNews(false);
+ }
+ }
+
+ @Override
+ protected void okPressed()
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void cancelPressed()
+ {
+ // TODO Auto-generated method stub
+
+ }
+ };
+ }
+
private JLabel lblChannels = new JLabel();
private List _updatableActions = new ArrayList();
@@ -194,31 +248,15 @@ public class BlogReader extends GBlogReader
public BlogReader(Desktop desktop)
{
+ Console.debug("Constructing news reader.");
+
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"));
+ chan.setURL(Cache.getDefault("JALVIEW_NEWS_RSS",
+ Cache.getDefault("www.jalview.org", "https://www.jalview.org")
+ + "/feeds/desktop/rss"));
loadLastM();
_channelModel.addChannel(chan);
updating = true;
@@ -233,26 +271,82 @@ public class BlogReader extends GBlogReader
initItems(chan);
updating = false;
- boolean setvisible = checkForNew(chan, true);
- if (setvisible)
+ if (!Cache.getDefault("NONEWS", false))
{
- Cache.log.info("Will show jalview news automatically");
- SwingUtilities.invokeLater(new Runnable()
+ boolean setvisible = checkForNew(chan, true);
+
+ if (setvisible)
{
- @Override
- public void run()
+
+ Console.debug("Will show jalview news automatically");
+ showNews();
+ }
+ }
+ Console.debug("Completed construction of reader.");
+
+ }
+
+ /**
+ * check if the news panel's container is visible
+ */
+ @Override
+ public boolean isVisible()
+ {
+ if (parent == null)
+ {
+ return xf != null && xf.isVisible();
+ }
+ return jd != null && jd.isVisible();
+ }
+
+ /**
+ * display the container for the news panel
+ */
+ public void showNews()
+ {
+ final BlogReader me = this;
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ Rectangle bounds = new Rectangle(5, 5, 550, 350);
+ if (parent == null)
{
- if (parent != null)
+ xf = new JFrame();
+ xf.setContentPane(me);
+ xf.addWindowListener(new WindowAdapter()
{
- parent.showNews(true);
- }
- else
- {
- setVisible(true);
- }
+ @Override
+ public void windowClosing(WindowEvent e)
+ {
+ ActionEvent actionEvent = new ActionEvent(this,
+ ActionEvent.ACTION_FIRST,
+ (String) exitAction.getValue(Action.NAME));
+ exitAction.actionPerformed(actionEvent);
+ }
+
+ @Override
+ public void windowOpened(WindowEvent e)
+ {
+ }
+ });
+ me.setSize(new Dimension(550, 350));
+ xf.setVisible(true);
}
- });
- }
+ else
+ {
+ createDialog();
+ bounds = new Rectangle(5, 5, 550, 350);
+ jd.initDialogFrame(me, false, false,
+ MessageManager.getString("label.news_from_jalview"),
+ bounds.width, bounds.height);
+ jd.frame.setModalExclusionType(ModalExclusionType.NO_EXCLUDE);
+ Console.debug("Displaying news.");
+ jd.waitForInput();
+ }
+ }
+ });
}
/**
@@ -260,18 +354,30 @@ public class BlogReader extends GBlogReader
*/
private boolean checkForNew(Channel chan, boolean updateItems)
{
+
if (!updating || updateItems)
{
newsnew = false;
}
+ java.util.Date earliest = null;
+ try
+ {
+ earliest = new SimpleDateFormat("YYYY-MM-DD")
+ .parse(chan.getHTTPLastModified());
+ } catch (Exception x)
+ {
+ }
if (chan != null && chan.getItems() != null)
{
+ Console.debug("Scanning news items: newsnew=" + newsnew
+ + " and lastDate is " + lastDate);
for (Item i : (List- ) chan.getItems())
{
- boolean isread = (lastDate != null && i.getPublishDate() != null && !lastDate
- .before(i.getPublishDate()));
+ Date published = i.getPublishDate();
+ boolean isread = lastDate == null ? false
+ : (published != null && !lastDate.before(published));
- if (i.getPublishDate() != null && (!updating || updateItems))
+ if (!updating || updateItems)
{
newsnew |= !isread;
}
@@ -279,8 +385,19 @@ public class BlogReader extends GBlogReader
{
i.setRead(isread);
}
+ if (published != null && !i.isRead())
+ {
+ if (earliest == null || earliest.after(published))
+ {
+ earliest = published;
+ }
+ }
}
}
+ if (!updateItems && !updating && lastDate == null)
+ {
+ lastDate = earliest;
+ }
return newsnew;
}
@@ -293,29 +410,32 @@ public class BlogReader extends GBlogReader
private void saveLastM(Item item)
{
- if (item != null && item.getPublishDate() != null
- && (lastDate == null || item.getPublishDate().after(lastDate)))
+ if (item != null)
{
- lastDate = item.getPublishDate();
- if (lastDate != null)
+ if (item.getPublishDate() != 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 (lastDate == null || item.getPublishDate().after(lastDate))
+ {
+ lastDate = item.getPublishDate();
+ }
}
+
if (_channelModel.getElementAt(0) != null)
{
checkForNew((Channel) _channelModel.getElementAt(0), false);
}
+ if (lastDate != null)
+ {
+ String formatted = Cache
+ .setDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED", lastDate);
+ Console.debug("Saved last read date as " + formatted);
+ }
}
}
private void jbInit() throws Exception
{
- this.setTitle("News from www.jalview.org");
- this.getContentPane().setLayout(layoutMain);
+ setLayout(layoutMain);
panelMain.setLayout(borderLayout1);
topPanel.setLayout(borderLayout5);
bottomPanel.setLayout(borderLayout4);
@@ -325,25 +445,28 @@ public class BlogReader extends GBlogReader
topBottomSplitPane.setBottomComponent(bottomPanel);
JScrollPane spTextDescription = new JScrollPane(textDescription);
textDescription.setText("");
- statusBar.setText(" [Status] ");
+ statusBar.setText(new StringBuffer("[")
+ .append(MessageManager.getString("label.status")).append("]")
+ .toString());
buttonRefresh.addActionListener(new ActionListener()
{
-
+
@Override
public void actionPerformed(ActionEvent e)
{
refreshNews();
}
});
- this.getContentPane().add(statusBar, BorderLayout.SOUTH);
+ add(statusBar, BorderLayout.SOUTH);
toolBar.add(buttonRefresh);
toolBar.addSeparator();
- JLabel about=new JLabel("brought to you by JSwingReader (jswingreader.sourceforge.net)");
+ JLabel about = new JLabel(
+ "brought to you by JSwingReader (jswingreader.sourceforge.net)");
toolBar.add(about);
toolBar.setFloatable(false);
- this.getContentPane().add(toolBar, BorderLayout.NORTH);
+ add(toolBar, BorderLayout.NORTH);
panelMain.add(topBottomSplitPane, BorderLayout.CENTER);
- this.getContentPane().add(panelMain, BorderLayout.CENTER);
+ add(panelMain, BorderLayout.CENTER);
JScrollPane spListItems = new JScrollPane(listItems);
listItems
.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
@@ -353,6 +476,7 @@ public class BlogReader extends GBlogReader
listItems.addMouseListener(new java.awt.event.MouseAdapter()
{
+ @Override
public void mouseClicked(MouseEvent e)
{
listItems_mouseClicked(e);
@@ -366,7 +490,7 @@ public class BlogReader extends GBlogReader
_popupChannels);
listItems.addMouseListener(popupAdapter);
listItems.setCellRenderer(new ItemsRenderer());
- lblChannels.setText("Channels");
+ lblChannels.setText(MessageManager.getString("label.channels"));
}
private void postInit()
@@ -378,6 +502,7 @@ public class BlogReader extends GBlogReader
}
textDescription.addHyperlinkListener(new HyperlinkListener()
{
+ @Override
public void hyperlinkUpdate(HyperlinkEvent e)
{
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
@@ -387,23 +512,9 @@ public class BlogReader extends GBlogReader
}
});
- 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()
{
+ @Override
public void valueChanged(ListSelectionEvent e)
{
if (e.getValueIsAdjusting() == false)
@@ -420,19 +531,20 @@ public class BlogReader extends GBlogReader
_itemsValueChanged(listItems);
}
- public class LaunchJvBrowserOnItem extends AbstractAction implements
- UpdatableAction
+ 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(MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_O));
this.putValue(Action.LONG_DESCRIPTION, "Open in Browser");
_listItems = listItems;
}
+ @Override
public void actionPerformed(ActionEvent e)
{
Object o = _listItems.getSelectedValue();
@@ -446,6 +558,7 @@ public class BlogReader extends GBlogReader
}
}
+ @Override
public void update(Object o)
{
setEnabled(true);
@@ -474,7 +587,8 @@ public class BlogReader extends GBlogReader
private JPopupMenu _buildChannelsPopupMenu()
{
JPopupMenu popup = new JPopupMenu();
- popup.add(new JMenuItem(new MarkChannelAsRead(listChannels, listItems)));
+ popup.add(
+ new JMenuItem(new MarkChannelAsRead(listChannels, listItems)));
popup.add(new JMenuItem(
new MarkChannelAsUnread(listChannels, listItems)));
return popup;
@@ -498,8 +612,9 @@ public class BlogReader extends GBlogReader
}
DefaultListModel itemsModel = (DefaultListModel) listItems.getModel();
itemsModel.clear();
- Iterator iter = (channel.getItems() != null) ? channel.getItems()
- .iterator() : Collections.EMPTY_LIST.iterator();
+ Iterator iter = (channel.getItems() != null)
+ ? channel.getItems().iterator()
+ : Collections.EMPTY_LIST.iterator();
while (iter.hasNext())
{
itemsModel.addElement(iter.next());
@@ -595,8 +710,8 @@ public class BlogReader extends GBlogReader
button.setVerticalTextPosition(AbstractButton.BOTTOM);
button.setHorizontalTextPosition(AbstractButton.CENTER);
}
- else if (Boolean.toString(true).equals(
- general.get("radioTextRight")))
+ else if (Boolean.toString(true)
+ .equals(general.get("radioTextRight")))
{
button.setVerticalTextPosition(AbstractButton.CENTER);
button.setHorizontalTextPosition(AbstractButton.RIGHT);
@@ -629,65 +744,71 @@ public class BlogReader extends GBlogReader
*/
public void refreshNews()
{
- try {
- initItems((Channel)_channelModel.getElementAt(0));
-
+ try
+ {
+ initItems((Channel) _channelModel.getElementAt(0));
+
} catch (Exception x)
- {}
+ {
+ }
}
+ /**
+ * @j2sIgnore
+ * @param args
+ */
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();
+ Cache.loadProperties(null);
+ Console.initLogger();
// test will advance read date each time
- Calendar today = Calendar.getInstance(), lastread = Calendar
- .getInstance();
+ Calendar today = Calendar.getInstance(),
+ lastread = Calendar.getInstance();
lastread.set(1983, 01, 01);
while (lastread.before(today))
{
- Cache.setDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED",
- lastread.getTime());
+ String formattedDate = 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()));
+ jalview.bin.Console.outPrintln("Set last date to " + formattedDate);
if (me.isNewsNew())
{
- Cache.log.info("There is news to read.");
+ Console.debug("There is news to read.");
}
else
{
- Cache.log.info("There is no new news.");
+ Console.debug("There is no new news.");
+ me.xf.setTitle("Testing : Last read is " + me.lastDate);
+ me.showNews();
+ me.xf.toFront();
}
- me.setTitle("Testing : Last read is " + me.lastDate);
- me.setVisible(true);
- me.toFront();
- while (me.isVisible())
+ Console.debug("Waiting for closure.");
+ do
{
try
{
- Thread.sleep(100);
+ Thread.sleep(300);
} catch (InterruptedException x)
{
}
- ;
- }
+ } while (me.isVisible());
+
if (me.isNewsNew())
{
- Cache.log.info("Still new news after reader displayed.");
+ Console.debug("Still new news after reader displayed.");
}
if (lastread.getTime().before(me.lastDate))
{
- Cache.log.info("The news was read.");
+ Console.debug("The news was read.");
lastread.setTime(me.lastDate);
}
else
{
lastread.add(Calendar.MONTH, 1);
}
- me.dispose();
+
}
}
@@ -702,6 +823,7 @@ class ChannelsRenderer extends DefaultListCellRenderer
private final static Icon _icon = new ImageIcon(
Main.class.getResource("image/ComposeMail16.gif"));
+ @Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus)
{
@@ -711,8 +833,10 @@ class ChannelsRenderer extends DefaultListCellRenderer
if (value instanceof Channel)
{
Channel channel = (Channel) value;
- component.setText(channel.getTitle() + " ("
- + channel.getUnreadItemCount() + ")");
+ component.setText(MessageManager
+ .formatMessage("label.channel_title_item_count", new String[]
+ { channel.getTitle(), Integer
+ .valueOf(channel.getUnreadItemCount()).toString() }));
component.setToolTipText(channel.getURL());
}
return component;
@@ -724,6 +848,7 @@ class ItemsRenderer extends DefaultListCellRenderer
private final static Icon _icon = new ImageIcon(
Main.class.getResource("image/ComposeMail16.gif"));
+ @Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus)
{
@@ -735,9 +860,13 @@ class ItemsRenderer extends DefaultListCellRenderer
Item item = (Item) value;
if (item.getPublishDate() != null)
{
- component.setText(DateFormat.getDateInstance().format(
- item.getPublishDate())
- + " " + item.getTitle());
+ component.setText(MessageManager.formatMessage(
+ "label.blog_item_published_on_date", new String[]
+ { DateFormat
+ .getDateInstance(DateFormat.LONG,
+ MessageManager.getLocale())
+ .format(item.getPublishDate()).toString(),
+ item.getTitle() }));
}
component.setToolTipText(item.getLink());
if (!item.isRead())