X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=294beaccaaec81e8b5c02f68c1b36b1d3617913e;hb=e43ffeb12a7e4bbadebe734cab824a14175b34a2;hp=3205cab493019bd9958c4ee490f45c85b598bada;hpb=f215c30c91a7532eb97655349b70b9eb73a283d5;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index 3205cab..294beac 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle * * This file is part of Jalview. * @@ -59,11 +59,15 @@ import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.ArrayList; import java.util.Hashtable; import java.util.StringTokenizer; import java.util.Vector; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; import javax.swing.DefaultDesktopManager; import javax.swing.DesktopManager; @@ -79,9 +83,12 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JProgressBar; +import javax.swing.JTextArea; import javax.swing.SwingUtilities; +import javax.swing.event.HyperlinkEvent; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; +import javax.swing.event.HyperlinkEvent.EventType; /** * Jalview Desktop @@ -204,6 +211,10 @@ public class Desktop extends jalview.jbgui.GDesktop implements public void dragFrame(JComponent f, int newX, int newY) { + if (newY<0) + { + newY=0; + } delegate.dragFrame(f, newX, newY); } @@ -240,6 +251,11 @@ public class Desktop extends jalview.jbgui.GDesktop implements public void resizeFrame(JComponent f, int newX, int newY, int newWidth, int newHeight) { + Rectangle b=desktop.getBounds(); + if (newY<0) + { + newY=0; + } delegate.resizeFrame(f, newX, newY, newWidth, newHeight); } @@ -282,12 +298,14 @@ public class Desktop extends jalview.jbgui.GDesktop implements //sp.getViewport().setView(desktop); //getContentPane().add(sp, BorderLayout.CENTER); getContentPane().add(desktop, BorderLayout.CENTER); - desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); + desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); + // This line prevents Windows Look&Feel resizing all new windows to maximum // if previous window was maximised desktop.setDesktopManager(new MyDesktopManager( new DefaultDesktopManager())); + Rectangle dims = getLastKnownDimensions(""); if (dims != null) { @@ -313,16 +331,6 @@ 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() { @@ -332,7 +340,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements } }); - this.addMouseListener(new MouseAdapter() + MouseAdapter ma; + this.addMouseListener(ma=new MouseAdapter() { public void mousePressed(MouseEvent evt) { @@ -342,6 +351,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements } } }); + desktop.addMouseListener(ma); + this.addFocusListener(new FocusListener() { @@ -402,6 +413,22 @@ public class Desktop extends jalview.jbgui.GDesktop implements }); } + public void checkForNews() + { + final Desktop me = this; + // Thread off the news reader, in case there are connection problems. + addDialogThread(new Runnable() { + @Override + public void run() + { + Cache.log.debug("Starting news thread."); + + jvnews = new BlogReader(me); + showNews.setVisible(true); + Cache.log.debug("Completed news thread."); + } + }); + } protected void showNews_actionPerformed(ActionEvent e) { showNews(showNews.isSelected()); @@ -409,22 +436,19 @@ public class Desktop extends jalview.jbgui.GDesktop implements void showNews(boolean visible) { { - jvnews.setVisible(visible); + Cache.log.debug((visible?"Showing":"Hiding")+" news."); showNews.setSelected(visible); - if (visible) + if (visible && !jvnews.isVisible()) { - jvnews.refreshNews(); - jvnews.toFront(); - // try real hard to get focus when the news is first opened new Thread(new Runnable() { @Override public void run() { - while (jvnews.isVisible() && !jvnews.requestFocusInWindow()) - { - try { Thread.sleep(50); } catch (InterruptedException x) {}; - } - + long instance=System.currentTimeMillis(); + Desktop.instance.setProgressBar("Refreshing news", instance); + jvnews.refreshNews(); + Desktop.instance.setProgressBar(null, instance); + jvnews.showNews(); } }).start(); } @@ -1022,6 +1046,10 @@ public class Desktop extends jalview.jbgui.GDesktop implements storeLastKnownDimensions("JALVIEW_RSS_WINDOW_", jvnews.getBounds()); } + if (dialogExecutor!=null) + { + dialogExecutor.shutdownNow(); + } System.exit(0); } @@ -1046,30 +1074,78 @@ public class Desktop extends jalview.jbgui.GDesktop implements */ public void aboutMenuItem_actionPerformed(ActionEvent e) { - StringBuffer message = new StringBuffer("Jalview version " - + jalview.bin.Cache.getProperty("VERSION") + "; last updated: " - + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")); +// StringBuffer message = getAboutMessage(false); +// JOptionPane.showInternalMessageDialog(Desktop.desktop, +// +// message.toString(), "About Jalview", JOptionPane.INFORMATION_MESSAGE); + new Thread(new Runnable() { public void run() {new SplashScreen(true);}}).start(); + } + + public StringBuffer getAboutMessage(boolean shortv) + { + StringBuffer message = new StringBuffer(); + message.append(""); + if (shortv) + { + message.append("

Version: " + + jalview.bin.Cache.getProperty("VERSION") + + "


"); + message.append("Last Updated: " + + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown") + + ""); - if (!jalview.bin.Cache.getProperty("LATEST_VERSION").equals( - jalview.bin.Cache.getProperty("VERSION"))) + } + else { - message.append("\n\n!! Jalview version " - + jalview.bin.Cache.getProperty("LATEST_VERSION") - + " is available for download from "+jalview.bin.Cache.getDefault("www.jalview.org","http://www.jalview.org")+" !!\n"); + message.append("Version " + + jalview.bin.Cache.getProperty("VERSION") + + "; last updated: " + + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")); } - // TODO: update this text for each release or centrally store it for lite - // and application - message.append("\nAuthors: Jim Procter, Andrew Waterhouse, Michele Clamp, James Cuff, Steve Searle,\n David Martin & Geoff Barton." - + "\nDevelopment managed by The Barton Group, University of Dundee, Scotland, UK.\n" - + "\nFor help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list\n" - + "\nIf you use Jalview, please cite:" - + "\nWaterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)" - + "\nJalview Version 2 - a multiple sequence alignment editor and analysis workbench" - + "\nBioinformatics doi: 10.1093/bioinformatics/btp033"); - JOptionPane.showInternalMessageDialog(Desktop.desktop, - message.toString(), "About Jalview", JOptionPane.INFORMATION_MESSAGE); + if (jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking").equals( + "Checking")) + { + message.append("
...Checking latest version...
"); + } + else if (!jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking") + .equals(jalview.bin.Cache.getProperty("VERSION"))) + { + boolean red = false; + if (jalview.bin.Cache.getProperty("VERSION").toLowerCase() + .indexOf("automated build") == -1) + { + red = true; + // Displayed when code version and jnlp version do not match and code + // version is not a development build + message.append("
"); + } + + message.append("
!! Version " + + jalview.bin.Cache.getDefault("LATEST_VERSION", + "..Checking..") + + " is available for download from " + + jalview.bin.Cache.getDefault("www.jalview.org", + "http://www.jalview.org") + " !!"); + if (red) + { + message.append("
"); + } + } + message.append("
Authors: " + + jalview.bin.Cache + .getDefault( + "AUTHORNAMES", + "Jim Procter, Andrew Waterhouse, Jan Engelhardt, Lauren Lui, Michele Clamp, James Cuff, Steve Searle, David Martin & Geoff Barton") + + "
Development managed by The Barton Group, University of Dundee, Scotland, UK.
" + + "
For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list" + + "
If you use Jalview, please cite:" + + "
Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)" + + "
Jalview Version 2 - a multiple sequence alignment editor and analysis workbench" + + "
Bioinformatics doi: 10.1093/bioinformatics/btp033" + + ""); + return message; } /** @@ -1578,7 +1654,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements source.viewport.gatherViewsHere = true; source.viewport.explodedPosition = source.getBounds(); JInternalFrame[] frames = desktop.getAllFrames(); - String viewId = source.viewport.sequenceSetID; + String viewId = source.viewport.getSequenceSetId(); for (int t = 0; t < frames.length; t++) { @@ -2052,7 +2128,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements } } } - } /** @@ -2060,10 +2135,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements */ public void relayerWindows() { - if (jvnews!=null && jvnews.isVisible()) - { - jvnews.toFront(); - } + } protected JMenuItem groovyShell; @@ -2271,6 +2343,20 @@ public class Desktop extends jalview.jbgui.GDesktop implements } /** + * + * @return true if any progress bars are still active + */ + @Override + public boolean operationInProgress() + { + if (progressBars != null && progressBars.size() > 0) + { + return true; + } + return false; + } + + /** * This will return the first AlignFrame viewing AlignViewport av. It will * break if there are more than one AlignFrames viewing a particular av. This * @@ -2411,28 +2497,58 @@ public class Desktop extends jalview.jbgui.GDesktop implements { if (Cache.getDefault("SHOW_WSDISCOVERY_ERRORS", true)) { - if (serviceChangedDialog == null) - { - // only run if we aren't already displaying one of these. - javax.swing.SwingUtilities - .invokeLater(serviceChangedDialog = new Runnable() + if (serviceChangedDialog == null) + { + // only run if we aren't already displaying one of these. + addDialogThread(serviceChangedDialog = new Runnable() + { + public void run() + { + + /* + JalviewDialog jd =new JalviewDialog() { + @Override + protected void cancelPressed() + { + // TODO Auto-generated method stub + + }@Override + protected void okPressed() + { + // TODO Auto-generated method stub + + }@Override + protected void raiseClosed() { - public void run() - { - - JOptionPane - .showInternalMessageDialog( - Desktop.desktop, - ermsg - + "It may be that you have invalid JABA URLs\nin your web service preferences.\n\nGo to the Web services tab of the\nTools->Preferences dialog box to change them.\n", - "Preferences Problem", - JOptionPane.WARNING_MESSAGE); - serviceChangedDialog = null; - - } - }); + // TODO Auto-generated method stub + + } + }; + jd.initDialogFrame(new JLabel("
" + + ermsg + + "
It may be that you have invalid JABA URLs in your web service preferences," + + " or mis-configured HTTP proxy settings.
" + + "Check the Connections and Web services tab of the" + + " Tools->Preferences dialog box to change them.
"), true, true, "Web Service Configuration Problem", 450, 400); + + jd.waitForInput(); + */ + JOptionPane.showConfirmDialog( + Desktop.desktop, + new JLabel("
" + + ermsg+"
" + + "

It may be that you have invalid JABA URLs
in your web service preferences," + + " or mis-configured HTTP proxy settings.

" + + "

Check the Connections and Web services tab
of the" + + " Tools->Preferences dialog box to change them.

"), "Web Service Configuration Problem", + JOptionPane.DEFAULT_OPTION, + JOptionPane.ERROR_MESSAGE); + serviceChangedDialog = null; + + } + }); + } } - } else { Cache.log @@ -2503,5 +2619,78 @@ public class Desktop extends jalview.jbgui.GDesktop implements return wsparamManager; } + /** + * static hyperlink handler proxy method for use by Jalview's internal windows + * @param e + */ + public static void hyperlinkUpdate(HyperlinkEvent e) + { + if (e.getEventType() == EventType.ACTIVATED) + { + String url=null; + try + { + url = e.getURL().toString(); + Desktop.showUrl(url); + } catch (Exception x) + { + if (url!=null) { + if (Cache.log!=null) { + Cache.log.error("Couldn't handle string "+url+" as a URL."); + } else { + System.err.println("Couldn't handle string "+url+" as a URL."); + } + } + // ignore any exceptions due to dud links. + } + + } + } + /** + * single thread that handles display of dialogs to user. + */ + ExecutorService dialogExecutor=Executors.newSingleThreadExecutor(); + /** + * flag indicating if dialogExecutor should try to acquire a permit + */ + private volatile boolean dialogPause=true; + /** + * pause the queue + */ + private java.util.concurrent.Semaphore block=new Semaphore(0); + + /** + * add another dialog thread to the queue + * @param prompter + */ + public void addDialogThread(final Runnable prompter) + { + dialogExecutor.submit(new Runnable() + { + public void run() + { + if (dialogPause) { + try { block.acquire(); } catch (InterruptedException x){}; + } + if (instance==null) + { + return; + } + try + { + SwingUtilities.invokeAndWait(prompter); + } catch (Exception q) + { + Cache.log.warn("Unexpected Exception in dialog thread.", q); + } + } + }); + } + public void startDialogQueue() + { + // set the flag so we don't pause waiting for another permit and semaphore the current task to begin + dialogPause=false; + block.release(); + } }