New branch created and author list changed to test the commit-function
[jalview.git] / src / jalview / gui / Desktop.java
old mode 100755 (executable)
new mode 100644 (file)
index 3205dab..9797694
@@ -27,6 +27,7 @@ import java.awt.dnd.*;
 import java.awt.event.*;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.beans.PropertyVetoException;
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
@@ -47,83 +48,17 @@ import javax.swing.event.MenuListener;
  * 
  * 
  * @author $author$
- * @version $Revision$
+ * @version $Revision: 1.155 $
  */
 public class Desktop extends jalview.jbgui.GDesktop implements
-        DropTargetListener, ClipboardOwner, IProgressIndicator
+        DropTargetListener, ClipboardOwner, IProgressIndicator, jalview.api.StructureSelectionManagerProvider
 {
 
-  private class JalviewChangeSupport implements PropertyChangeListener
-  {
-    public void propertyChange(PropertyChangeEvent evt)
-    {
-      // Handle change events - most are simply routed to other sources
-      changeSupport.firePropertyChange(evt);
-    }
-
-    /**
-     * change listeners are notified of changes to resources so they can update
-     * their state. E.g. - the 'services' property notifies when the available
-     * set of web service endpoints have changed.
-     */
-    private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(
-            this);
-
-    /**
-     * @param propertyName
-     * @param listener
-     * @see java.beans.PropertyChangeSupport#addPropertyChangeListener(java.lang.String,
-     *      java.beans.PropertyChangeListener)
-     */
-    public void addJalviewPropertyChangeListener(String propertyName,
-            PropertyChangeListener listener)
-    {
-      changeSupport.addPropertyChangeListener(propertyName, listener);
-    }
-
-    /**
-     * @param listener
-     * @see java.beans.PropertyChangeSupport#addPropertyChangeListener(java.beans.PropertyChangeListener)
-     */
-    public void addJalviewPropertyChangeListener(
-            PropertyChangeListener listener)
-    {
-      changeSupport.addPropertyChangeListener(listener);
-    }
-
-    /*
-     * @param propertyName
-     * 
-     * @param oldValue
-     * 
-     * @param newValue
-     * 
-     * @see
-     * java.beans.PropertyChangeSupport#firePropertyChange(java.lang.String,
-     * java.lang.Object, java.lang.Object) public void firePropertyChange(String
-     * propertyName, Object oldValue, Object newValue) {
-     * changeSupport.firePropertyChange(propertyName, oldValue, newValue); }
-     */
-
-    /**
-     * @param propertyName
-     * @param listener
-     * @see java.beans.PropertyChangeSupport#removePropertyChangeListener(java.lang.String,
-     *      java.beans.PropertyChangeListener)
-     */
-    public void removeJalviewPropertyChangeListener(String propertyName,
-            PropertyChangeListener listener)
-    {
-      changeSupport.removePropertyChangeListener(propertyName, listener);
-    }
-
-  }
-
   private JalviewChangeSupport changeSupport = new JalviewChangeSupport();
 
   /**
    * @param listener
-   * @see jalview.gui.Desktop.JalviewChangeSupport#addJalviewPropertyChangeListener(java.beans.PropertyChangeListener)
+   * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.beans.PropertyChangeListener)
    */
   public void addJalviewPropertyChangeListener(
           PropertyChangeListener listener)
@@ -134,7 +69,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   /**
    * @param propertyName
    * @param listener
-   * @see jalview.gui.Desktop.JalviewChangeSupport#addJalviewPropertyChangeListener(java.lang.String,
+   * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.lang.String,
    *      java.beans.PropertyChangeListener)
    */
   public void addJalviewPropertyChangeListener(String propertyName,
@@ -146,7 +81,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   /**
    * @param propertyName
    * @param listener
-   * @see jalview.gui.Desktop.JalviewChangeSupport#removeJalviewPropertyChangeListener(java.lang.String,
+   * @see jalview.gui.JalviewChangeSupport#removeJalviewPropertyChangeListener(java.lang.String,
    *      java.beans.PropertyChangeListener)
    */
   public void removeJalviewPropertyChangeListener(String propertyName,
@@ -297,9 +232,13 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     showMemusage.setSelected(selmemusage);
     desktop.setBackground(Color.white);
     getContentPane().setLayout(new BorderLayout());
+    // alternate config - have scrollbars - see notes in JAL-153
+    //JScrollPane sp = new JScrollPane();
+    //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(
@@ -373,6 +312,20 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         Cache.log.debug("Filechooser init thread finished.");
       }
     }).start();
+    // Add the service change listener
+    changeSupport.addJalviewPropertyChangeListener("services",
+            new PropertyChangeListener()
+            {
+
+              @Override
+              public void propertyChange(PropertyChangeEvent evt)
+              {
+                Cache.log.debug("Firing service changed event for "
+                        + evt.getNewValue());
+                JalviewServicesChanged(evt);
+              }
+
+            });
   }
 
   /**
@@ -629,6 +582,47 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         }
       }
     });
+    menuItem.addMouseListener(new MouseListener()
+    {
+      
+      @Override
+      public void mouseReleased(MouseEvent e)
+      {
+      }
+      
+      @Override
+      public void mousePressed(MouseEvent e)
+      {
+      }
+      
+      @Override
+      public void mouseExited(MouseEvent e)
+      {
+        try
+        {
+          frame.setSelected(false);
+        } catch (PropertyVetoException e1)
+        {
+        }
+      }
+      
+      @Override
+      public void mouseEntered(MouseEvent e)
+      {
+        try
+        {
+          frame.setSelected(true);
+        } catch (PropertyVetoException e1)
+        {
+        }
+      }
+      
+      @Override
+      public void mouseClicked(MouseEvent e)
+      {
+        
+      }
+    });
 
     windowMenu.add(menuItem);
 
@@ -641,6 +635,10 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     } catch (java.beans.PropertyVetoException ve)
     {
     }
+    catch (java.lang.ClassCastException cex)
+    {
+      Cache.log.warn("Squashed a possible GUI implementation error. If you can recreate this, please look at http://issues.jalview.org/browse/JAL-869",cex);
+    }
   }
 
   public void lostOwnership(Clipboard clipboard, Transferable contents)
@@ -953,7 +951,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     }
     // TODO: update this text for each release or centrally store it for lite
     // and application
-    message.append("\nAuthors:  Andrew Waterhouse, Jim Procter, Michele Clamp, James Cuff, Steve Searle,\n    David Martin & Geoff Barton."
+    message.append("\nAuthors:  Jim Procter, Jan Engelhardt, Lauren Lui, 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:"
@@ -1184,11 +1182,18 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
     if (value == JalviewFileChooser.APPROVE_OPTION)
     {
-      java.io.File choice = chooser.getSelectedFile();
+      final Desktop me = this;
+      final java.io.File choice = chooser.getSelectedFile();
+      new Thread(new Runnable()
+      {
+        public void run()
+        {
+
       setProgressBar("Saving jalview project " + choice.getName(),
               choice.hashCode());
       jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
       // TODO catch and handle errors for savestate
+      // TODO prevent user from messing with the Desktop whilst we're saving
       try
       {
         new Jalview2XML().SaveState(choice);
@@ -1201,12 +1206,13 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         Cache.log
                 .error("Problems whilst trying to save to "
                         + choice.getName(), ex);
-        JOptionPane.showMessageDialog(this,
+        JOptionPane.showMessageDialog(me,
                 "Error whilst saving current state to " + choice.getName(),
                 "Couldn't save project", JOptionPane.WARNING_MESSAGE);
       }
       setProgressBar(null, choice.hashCode());
-
+        }
+      }).start();
     }
   }
 
@@ -1326,18 +1332,18 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     validate();
   }
 
-  public static int getViewCount(String viewId)
+  public static int getViewCount(String alignmentId)
   {
-    AlignViewport[] aps = getViewports(viewId);
+    AlignViewport[] aps = getViewports(alignmentId);
     return (aps == null) ? 0 : aps.length;
   }
 
   /**
    * 
-   * @param viewId
-   * @return all AlignmentPanels concerning the viewId sequence set
+   * @param alignmentId
+   * @return all AlignmentPanels concerning the alignmentId sequence set
    */
-  public static AlignmentPanel[] getAlignmentPanels(String viewId)
+  public static AlignmentPanel[] getAlignmentPanels(String alignmentId)
   {
     int count = 0;
     if (Desktop.desktop == null)
@@ -1355,7 +1361,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         AlignFrame af = (AlignFrame) frames[t];
         for (int a = 0; a < af.alignPanels.size(); a++)
         {
-          if (viewId
+          if (alignmentId
                   .equals(((AlignmentPanel) af.alignPanels.elementAt(a)).av
                           .getSequenceSetId()))
           {
@@ -1996,6 +2002,42 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     avp.clear();
     return afs;
   }
+  public AppJmol[] getJmols()
+  {
+    JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+
+    if (frames == null)
+    {
+      return null;
+    }
+    Vector avp = new Vector();
+    try
+    {
+      // REVERSE ORDER
+      for (int i = frames.length - 1; i > -1; i--)
+      {
+        if (frames[i] instanceof AppJmol)
+        {
+          AppJmol af = (AppJmol) frames[i];
+          avp.addElement(af);
+        }
+      }
+    } catch (Exception ex)
+    {
+      ex.printStackTrace();
+    }
+    if (avp.size() == 0)
+    {
+      return null;
+    }
+    AppJmol afs[] = new AppJmol[avp.size()];
+    for (int i = 0, j = avp.size(); i < j; i++)
+    {
+      afs[i] = (AppJmol) avp.elementAt(i);
+    }
+    avp.clear();
+    return afs;
+  }
 
   /**
    * Add Groovy Support to Jalview
@@ -2199,10 +2241,17 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     }
     if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
     {
-      jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
-              .addPropertyChangeListener(changeSupport);
-      (t2 = new Thread(jalview.ws.jws2.Jws2Discoverer.getDiscoverer()))
-              .start();
+      if (jalview.ws.jws2.Jws2Discoverer.getDiscoverer().isRunning())
+      {
+        jalview.ws.jws2.Jws2Discoverer.getDiscoverer().setAborted(true);
+      }
+      t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer().startDiscoverer(
+              changeSupport);
+      
+    }
+    Thread t3=null;
+    {
+      // TODO: do rest service discovery
     }
     if (blocking)
     {
@@ -2216,12 +2265,62 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         }
         alive = (t1 != null && t1.isAlive())
                 || (t2 != null && t2.isAlive())
+                || (t3 != null && t3.isAlive())
                 || (t0 != null && t0.isAlive());
       }
     }
   }
 
   /**
+   * called to check if the service discovery process completed successfully.
+   * 
+   * @param evt
+   */
+  protected void JalviewServicesChanged(PropertyChangeEvent evt)
+  {
+    if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
+    {
+      final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+              .getErrorMessages();
+      if (ermsg != null)
+      {
+        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()
+                  {
+                    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;
+
+                    }
+                  });
+        }
+      }
+        else
+        {
+          Cache.log
+                  .error("Errors reported by JABA discovery service. Check web services preferences.\n"
+                          + ermsg);
+        }
+      }
+    }
+  }
+
+  private Runnable serviceChangedDialog = null;
+
+  /**
    * start a thread to open a URL in the configured browser. Pops up a warning
    * dialog to the user if there is an exception when calling out to the browser
    * to open the URL.
@@ -2230,12 +2329,24 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    */
   public static void showUrl(final String url)
   {
+    showUrl(url, Desktop.instance);
+  }
+  /**
+   * Like showUrl but allows progress handler to be specified
+   * @param url
+   * @param progress (null) or object implementing IProgressIndicator
+   */
+  public static void showUrl(final String url, final IProgressIndicator progress)
+  {
     new Thread(new Runnable()
     {
       public void run()
       {
         try
         {
+          if (progress!=null) {
+            progress.setProgressBar("Opening "+url, this.hashCode());
+          }
           jalview.util.BrowserLauncher.openURL(url);
         } catch (Exception ex)
         {
@@ -2249,6 +2360,9 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
           ex.printStackTrace();
         }
+        if (progress!=null) {
+          progress.setProgressBar(null, this.hashCode());
+        }
       }
     }).start();
   }
@@ -2264,4 +2378,5 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     return wsparamManager;
   }
 
+
 }