Multiple Views
authoramwaterhouse <Andrew Waterhouse>
Thu, 5 Oct 2006 16:24:09 +0000 (16:24 +0000)
committeramwaterhouse <Andrew Waterhouse>
Thu, 5 Oct 2006 16:24:09 +0000 (16:24 +0000)
20 files changed:
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignViewport.java
src/jalview/gui/AlignmentPanel.java
src/jalview/gui/CutAndPasteTransfer.java
src/jalview/gui/Desktop.java
src/jalview/gui/IdCanvas.java
src/jalview/gui/IdPanel.java
src/jalview/gui/Jalview2XML.java
src/jalview/gui/Jalview2XML_V1.java
src/jalview/gui/PCAPanel.java
src/jalview/gui/PaintRefresher.java
src/jalview/gui/PairwiseAlignPanel.java
src/jalview/gui/PopupMenu.java
src/jalview/gui/RedundancyPanel.java
src/jalview/gui/RotatableCanvas.java
src/jalview/gui/SeqCanvas.java
src/jalview/gui/SeqPanel.java
src/jalview/gui/SequenceFetcher.java
src/jalview/gui/TreeCanvas.java
src/jalview/gui/TreePanel.java

index ef228df..79f1e8b 100755 (executable)
@@ -48,13 +48,17 @@ public class AlignFrame
     extends GAlignFrame implements DropTargetListener, FeatureListener
 {
   /** DOCUMENT ME!! */
-  public static final int NEW_WINDOW_WIDTH = 700;
+  public static final int DEFAULT_WIDTH = 700;
 
   /** DOCUMENT ME!! */
-  public static final int NEW_WINDOW_HEIGHT = 500;
-  AlignmentPanel alignPanel;
+  public static final int DEFAULT_HEIGHT = 500;
+  public AlignmentPanel alignPanel;
   AlignViewport viewport;
 
+
+  Vector alignPanels = new Vector();
+
+
   /** DOCUMENT ME!! */
   public String currentFileFormat = null;
   Stack historyList = new Stack();
@@ -62,17 +66,56 @@ public class AlignFrame
   private int treeCount = 0;
 
   /**
+   * Creates a new AlignFrame object.
+   *
+   * @param al DOCUMENT ME!
+   */
+  public AlignFrame(AlignmentI al, int width, int height)
+  {
+    this(al, null, width, height);
+  }
+
+
+  /**
    * new alignment window with hidden columns
    * @param al AlignmentI
    * @param hiddenColumns ColumnSelection or null
    */
-  public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns) {
-
+  public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
+                    int width, int height)
+  {
+    this.setSize(width, height);
     viewport = new AlignViewport(al, hiddenColumns);
 
+    alignPanel = new AlignmentPanel(this, viewport);
+
+    if(al.getDataset()==null)
+    {
+      al.setDataset(null);
+    }
+
+    addAlignmentPanel(alignPanel);
+    init();
+  }
+
+  /**
+   * Make a new AlignFrame from exisiting alignmentPanels
+   * @param ap AlignmentPanel
+   * @param av AlignViewport
+   */
+  public AlignFrame(AlignmentPanel ap)
+  {
+    viewport = ap.av;
+    alignPanel = ap;
+    addAlignmentPanel(ap);
+    init();
+  }
+
+  void init()
+  {
     this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
 
-    if(viewport.vconsensus==null)
+    if (viewport.vconsensus == null)
     {
       //Out of memory calculating consensus.
       BLOSUM62Colour.setEnabled(false);
@@ -83,73 +126,312 @@ public class AlignFrame
       modifyPID.setEnabled(false);
     }
 
-    alignPanel = new AlignmentPanel(this, viewport);
-
     String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT", "No sort");
 
-    if(sortby.equals("Id"))
+    if (sortby.equals("Id"))
       sortIDMenuItem_actionPerformed(null);
-    else if(sortby.equals("Pairwise Identity"))
+    else if (sortby.equals("Pairwise Identity"))
       sortPairwiseMenuItem_actionPerformed(null);
 
-   // remove(tabbedPane);
-    getContentPane().add(alignPanel, BorderLayout.CENTER);
+    if (Desktop.desktop != null)
+   {
+     addServiceListeners();
+     setGUINucleotide(viewport.alignment.isNucleotide());
+   }
 
+   if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
+   {
+     wrapMenuItem.setSelected(true);
+     wrapMenuItem_actionPerformed(null);
+   }
 
+   addKeyListener();
+  }
 
-  //  tabbedPane.add(al.isNucleotide() ? "DNA":"Protein", alignPanel);
+  void addKeyListener()
+  {
+      final AlignFrame af = this;
+      addKeyListener(new KeyAdapter()
+      {
+        public void keyPressed(KeyEvent evt)
+        {
+          if (viewport.cursorMode
+              && evt.getKeyCode() >= KeyEvent.VK_0
+              && evt.getKeyCode() <= KeyEvent.VK_9)
+          {
+            alignPanel.seqPanel.numberPressed(evt.getKeyChar());
+          }
 
-    ///Dataset tab
-    /////////////////////////
-    if(al.getDataset()==null)
+          switch (evt.getKeyCode())
+          {
+            case KeyEvent.VK_V:
+              if (!evt.isControlDown())
+              {
+                AlignmentI al;
+                if(viewport.hasHiddenRows)
+                {
+                  al = viewport.alignment.getHiddenSequences().getFullAlignment();
+                }
+                else
+                  al = new Alignment(viewport.alignment.getSequencesArray());
+
+                AlignViewport newview = new AlignViewport(al);
+
+                AlignmentPanel copy = new AlignmentPanel(af, newview);
+
+                if(viewport.viewName==null)
+                  viewport.viewName="View 1";
+
+                copy.av.sequenceSetID = viewport.getSequenceSetId();
+                copy.av.viewName = "View " +
+                    (Desktop.getViewCount(viewport.getSequenceSetId())+1);
+
+
+                addAlignmentPanel(copy);
+                PaintRefresher.Register(copy, viewport.getSequenceSetId());
+                PaintRefresher.Register(alignPanel,
+                                        viewport.getSequenceSetId());
+
+              }
+              break;
+            case KeyEvent.VK_G:
+              Desktop.instance.gatherViews(af);
+              break;
+
+            case KeyEvent.VK_X:
+              if (!evt.isControlDown())
+              {
+                Desktop.instance.explodeViews(af);
+              }
+              break;
+
+
+            case 27: // escape key
+              deselectAllSequenceMenuItem_actionPerformed(null);
+
+              break;
+
+            case KeyEvent.VK_DOWN:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.moveCursor(0, 1);
+              }
+              else
+                moveSelectedSequences(false);
+              break;
+
+            case KeyEvent.VK_UP:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.moveCursor(0, -1);
+              }
+              else
+                moveSelectedSequences(true);
+              break;
+
+            case KeyEvent.VK_LEFT:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.moveCursor( -1, 0);
+              }
+              break;
+
+            case KeyEvent.VK_RIGHT:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.moveCursor(1, 0);
+              }
+              break;
+
+            case KeyEvent.VK_SPACE:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
+                                           || evt.isShiftDown()
+                                           || evt.isAltDown());
+              }
+              break;
+
+            case KeyEvent.VK_DELETE:
+            case KeyEvent.VK_BACK_SPACE:
+              if (!viewport.cursorMode)
+              {
+                cut_actionPerformed(null);
+              }
+              else
+                alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
+                                           || evt.isShiftDown()
+                                           || evt.isAltDown());
+
+              break;
+
+            case KeyEvent.VK_S:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.setCursorRow();
+              }
+              break;
+            case KeyEvent.VK_C:
+              if (viewport.cursorMode && !evt.isControlDown())
+              {
+                alignPanel.seqPanel.setCursorColumn();
+              }
+              break;
+            case KeyEvent.VK_P:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.setCursorPosition();
+              }
+              break;
+
+            case KeyEvent.VK_ENTER:
+            case KeyEvent.VK_COMMA:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.setCursorRowAndColumn();
+              }
+              break;
+
+            case KeyEvent.VK_Q:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.setSelectionAreaAtCursor(true);
+              }
+              break;
+            case KeyEvent.VK_M:
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.setSelectionAreaAtCursor(false);
+              }
+              break;
+
+            case KeyEvent.VK_F2:
+              viewport.cursorMode = !viewport.cursorMode;
+              statusBar.setText("Keyboard editing mode is " +
+                                           (viewport.cursorMode ? "on" : "off"));
+              if (viewport.cursorMode)
+              {
+                alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
+                alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
+              }
+              alignPanel.seqPanel.seqCanvas.repaint();
+              break;
+
+            case KeyEvent.VK_F1:
+              try
+              {
+                ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
+                java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");
+                javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
+
+                javax.help.HelpBroker hb = hs.createHelpBroker();
+                hb.setCurrentID("home");
+                hb.setDisplayed(true);
+              }
+              catch (Exception ex)
+              {
+                ex.printStackTrace();
+              }
+              break
+                  ;
+            case KeyEvent.VK_H:
+            {
+              boolean toggleSeqs = !evt.isControlDown();
+              boolean toggleCols = !evt.isShiftDown();
+
+              boolean hide = false;
+
+              SequenceGroup sg = viewport.getSelectionGroup();
+              if (toggleSeqs)
+              {
+                if (sg != null && sg.getSize(false) != viewport.alignment.getHeight())
+                {
+                  hideSelSequences_actionPerformed(null);
+                  hide = true;
+                }
+                else if (! (toggleCols && viewport.colSel.getSelected().size() > 0))
+                  showAllSeqs_actionPerformed(null);
+              }
+
+              if (toggleCols)
+              {
+                if (viewport.colSel.getSelected().size() > 0)
+                {
+                  hideSelColumns_actionPerformed(null);
+                  if (!toggleSeqs)
+                    viewport.selectionGroup = sg;
+                }
+                else if (!hide)
+                  showAllColumns_actionPerformed(null);
+              }
+              break;
+            }
+            case KeyEvent.VK_PAGE_UP:
+              if (viewport.wrapAlignment)
+                alignPanel.scrollUp(true);
+              else
+                alignPanel.setScrollValues(viewport.startRes,
+                                           viewport.startSeq
+                                           - viewport.endSeq + viewport.startSeq);
+              break;
+            case KeyEvent.VK_PAGE_DOWN:
+              if (viewport.wrapAlignment)
+                alignPanel.scrollUp(false);
+              else
+                alignPanel.setScrollValues(viewport.startRes,
+                                           viewport.startSeq
+                                           + viewport.endSeq - viewport.startSeq);
+              break;
+
+
+          }
+        }
+      });
+  }
+
+
+  public void addAlignmentPanel(final AlignmentPanel ap)
+  {
+    alignPanels.addElement(ap);
+
+    int aSize = alignPanels.size();
+
+   tabbedPane.setVisible(aSize>1 || ap.av.viewName!=null);
+
+    if (aSize == 1 && ap.av.viewName==null)
     {
-      al.setDataset(null);
+      this.getContentPane().add(ap, BorderLayout.CENTER);
+    }
+    else
+    {
+      if (aSize == 2)
+      {
+        AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
+        tabbedPane.addTab(first.av.viewName==null?"Original":first.av.viewName,first);
+
+        this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
+      }
+
+      tabbedPane.addTab(ap.av.viewName==null?"Original":ap.av.viewName, ap);
     }
-   // AlignViewport ds = new AlignViewport(al.getDataset(), true);
-   // AlignmentPanel dap = new AlignmentPanel(this, ds);
-  //  tabbedPane.add("Dataset", dap);
-  //  viewports.add(ds);
-  //  alignPanels.add(dap);
-    /////////////////////////
 
 
-    viewport.addPropertyChangeListener(new PropertyChangeListener()
+    ap.av.addPropertyChangeListener(new PropertyChangeListener()
     {
      public void propertyChange(PropertyChangeEvent evt)
      {
        if (evt.getPropertyName().equals("alignment"))
        {
+         PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
          alignmentChanged();
        }
      }
    });
 
-
-    if (Desktop.desktop != null)
-    {
-      addServiceListeners();
-      setGUINucleotide(al.isNucleotide());
-    }
-
-
-    if (jalview.bin.Cache.getDefault("WRAP_ALIGNMENT", false))
-    {
-      wrapMenuItem.setSelected(true);
-      wrapMenuItem_actionPerformed(null);
-    }
-
   }
 
 
-  /**
-   * Creates a new AlignFrame object.
-   *
-   * @param al DOCUMENT ME!
-   */
-  public AlignFrame(AlignmentI al)
-  {
-    this(al, null);
-  }
+
 
   public AlignViewport getViewport()
   {
@@ -175,6 +457,7 @@ public class AlignFrame
         }
       }
     });
+
     addInternalFrameListener(new javax.swing.event.
                              InternalFrameAdapter()
     {
@@ -518,6 +801,7 @@ public class AlignFrame
 
   }
 
+
   /**
    * DOCUMENT ME!
    *
@@ -527,7 +811,14 @@ public class AlignFrame
   {
     try
     {
-      PaintRefresher.components.remove(viewport.alignment);
+      for(int i=0; i<alignPanels.size(); i++)
+      {
+        AlignmentPanel ap = (AlignmentPanel)alignPanels.elementAt(i);
+        PaintRefresher.RemoveComponent(ap.seqPanel.seqCanvas);
+        PaintRefresher.RemoveComponent(ap.idPanel.idCanvas);
+        PaintRefresher.RemoveComponent(ap);
+      }
+
       this.setClosed(true);
     }
     catch (Exception ex)
@@ -535,6 +826,7 @@ public class AlignFrame
     }
   }
 
+
   /**
    * DOCUMENT ME!
    */
@@ -695,6 +987,7 @@ public class AlignFrame
    */
   protected void copy_actionPerformed(ActionEvent e)
   {
+    System.gc();
     if (viewport.getSelectionGroup() == null)
     {
       return;
@@ -713,9 +1006,36 @@ public class AlignFrame
         seqs,
         omitHidden);
 
+    StringSelection ss = new StringSelection(output);
+
+    try
+    {
+      //Its really worth setting the clipboard contents
+      //to empty before setting the large StringSelection!!
+      Toolkit.getDefaultToolkit().getSystemClipboard()
+          .setContents(new StringSelection(""), null);
 
-    Toolkit.getDefaultToolkit().getSystemClipboard()
-        .setContents(new StringSelection(output), Desktop.instance);
+      Toolkit.getDefaultToolkit().getSystemClipboard()
+          .setContents(ss, Desktop.instance);
+    }
+    catch (OutOfMemoryError er)
+    {
+      er.printStackTrace();
+      javax.swing.SwingUtilities.invokeLater(new Runnable()
+          {
+            public void run()
+            {
+              javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
+                  "Out of memory copying region!!"
+                  +
+                  "\nSee help files for increasing Java Virtual Machine memory."
+                  , "Out of memory",
+                  javax.swing.JOptionPane.WARNING_MESSAGE);
+            }
+          });
+
+      return;
+    }
 
     Vector hiddenColumns = null;
     if(viewport.hasHiddenColumns)
@@ -732,9 +1052,12 @@ public class AlignFrame
       }
     }
 
+
+
     Desktop.jalviewClipboard = new Object[]{ seqs,
         viewport.alignment.getDataset(),
         hiddenColumns};
+    statusBar.setText("Copied "+seqs.length+" sequences to clipboard.");
   }
 
   /**
@@ -776,11 +1099,35 @@ public class AlignFrame
         return;
       }
 
-      String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
-      if(str.length()<1)
+      String str, format;
+      try
+      {
+        str = (String) contents.getTransferData(DataFlavor.stringFlavor);
+        if (str.length() < 1)
+          return;
+
+        format = new IdentifyFile().Identify(str, "Paste");
+
+      }
+      catch (OutOfMemoryError er)
+      {
+        er.printStackTrace();
+        javax.swing.SwingUtilities.invokeLater(new Runnable()
+        {
+          public void run()
+          {
+            javax.swing.JOptionPane.showInternalMessageDialog(Desktop.desktop,
+                "Out of memory pasting sequences!!"
+                +
+                "\nSee help files for increasing Java Virtual Machine memory."
+                , "Out of memory",
+                javax.swing.JOptionPane.WARNING_MESSAGE);
+          }
+        });
+
         return;
+      }
 
-      String format = new IdentifyFile().Identify(str, "Paste");
       SequenceI[] sequences;
 
 
@@ -799,13 +1146,12 @@ public class AlignFrame
 
       if (newAlignment)
       {
-        alignment = new Alignment(sequences);
-
-        if(Desktop.jalviewClipboard!=null)
-           alignment.setDataset( (Alignment)Desktop.jalviewClipboard[1] );
-        else
-           alignment.setDataset( null );
+          alignment = new Alignment(sequences);
 
+          if (Desktop.jalviewClipboard != null)
+            alignment.setDataset( (Alignment) Desktop.jalviewClipboard[1]);
+          else
+            alignment.setDataset(null);
       }
       else
       {
@@ -819,6 +1165,9 @@ public class AlignFrame
               sequences[i].getEnd());
 
           alignment.addSequence(newseq);
+          PaintRefresher.Refresh(alignPanel,
+                                 alignPanel.av.getSequenceSetId(),
+                                 null,newseq);
         }
 
 
@@ -829,8 +1178,6 @@ public class AlignFrame
 
 
 
-
-
       // Add any annotations attached to sequences
       for (int i = 0; i < sequences.length; i++)
      {
@@ -862,7 +1209,7 @@ public class AlignFrame
 
      if(newAlignment)
      {
-       AlignFrame af = new AlignFrame(alignment);
+       AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH, DEFAULT_HEIGHT);
        String newtitle = new String("Copied sequences");
 
        if(Desktop.jalviewClipboard!=null && Desktop.jalviewClipboard[2]!=null)
@@ -890,8 +1237,8 @@ public class AlignFrame
          newtitle = newtitle.concat("- from " + title);
        }
 
-       Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,
-                                NEW_WINDOW_HEIGHT);
+       Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
+                                DEFAULT_HEIGHT);
 
      }
 
@@ -935,33 +1282,6 @@ public class AlignFrame
     SequenceGroup sg = viewport.getSelectionGroup();
 
 
-
-    //Jalview no longer allows deletion of residues.
-    //Check here whether any residues are in selection area
-   /* if( sg.getEndRes()-sg.getStartRes() < viewport.alignment.getWidth()-1)
-    {
-      for (int i = 0; i < sg.sequences.size(); i++)
-      {
-        SequenceI seq = sg.getSequenceAt(i);
-        int j = sg.getStartRes();
-        do
-        {
-          if (!jalview.util.Comparison.isGap(seq.getCharAt(j)))
-          {
-            JOptionPane.showInternalMessageDialog(
-                Desktop.desktop, "Cannot delete residues from alignment!\n"
-                + "Try hiding columns instead.",
-                "Deletion of residues not permitted",
-                JOptionPane.WARNING_MESSAGE);
-
-            return;
-          }
-          j++;
-        }while(j<=sg.getEndRes());
-      }
-    }*/
-
-
     addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,
                                    HistoryItem.HIDE));
 
@@ -983,6 +1303,7 @@ public class AlignFrame
       if (seq.getSequence().length() < 1)
       {
         viewport.getAlignment().deleteSequence(seq);
+        PaintRefresher.Refresh(alignPanel,alignPanel.av.getSequenceSetId(),seq,null);
       }
       else
       {
@@ -1019,6 +1340,7 @@ public class AlignFrame
   {
     viewport.alignment.deleteAllGroups();
     viewport.setSelectionGroup(null);
+    PaintRefresher.Refresh(this, viewport.getSequenceSetId());
     alignPanel.repaint();
   }
 
@@ -1039,7 +1361,8 @@ public class AlignFrame
 
     sg.setEndRes(viewport.alignment.getWidth() - 1);
     viewport.setSelectionGroup(sg);
-    PaintRefresher.Refresh(null, viewport.alignment);
+    alignPanel.repaint();
+    PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
   }
 
   /**
@@ -1060,7 +1383,7 @@ public class AlignFrame
     alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
     alignPanel.idPanel.idCanvas.searchResults = null;
     alignPanel.repaint();
-    PaintRefresher.Refresh(null, viewport.alignment);
+    PaintRefresher.Refresh(this, viewport.getSequenceSetId());
   }
 
   /**
@@ -1085,7 +1408,7 @@ public class AlignFrame
       sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
     }
 
-    PaintRefresher.Refresh(null, viewport.alignment);
+    PaintRefresher.Refresh(this, viewport.getSequenceSetId());
   }
 
   public void invertColSel_actionPerformed(ActionEvent e)
@@ -1196,6 +1519,7 @@ public class AlignFrame
       viewport.getColumnSelection().compensateForEdits(shifts);
     viewport.setStartRes(seq.findIndex(startRes)-1);
    viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
+
   }
 
   /**
@@ -1217,7 +1541,6 @@ public class AlignFrame
 
 
     SequenceI current;
-    int jSize;
 
     Vector seqs = null;
 
@@ -1275,29 +1598,37 @@ public class AlignFrame
     viewport.setStartRes(seq.findIndex(startRes)-1);
 
     viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
+
   }
 
  public void alignmentChanged()
  {
-   if(viewport.padGaps)
-     viewport.getAlignment().padGaps();
+   AlignViewport av;
+   AlignmentPanel ap;
 
-   if(viewport.vconsensus!=null && viewport.autoCalculateConsensus)
+   for(int i=0; i<alignPanels.size(); i++)
    {
-     viewport.updateConsensus();
-     viewport.updateConservation();
-   }
+     ap = (AlignmentPanel) alignPanels.elementAt(i);
+     av = ap.av;
 
-   resetAllColourSchemes();
-   if(alignPanel.overviewPanel!=null)
-     alignPanel.overviewPanel.updateOverviewImage();
+   if (av.padGaps)
+       av.getAlignment().padGaps();
 
-   viewport.alignment.adjustSequenceAnnotations();
+     if (av.vconsensus != null && av.autoCalculateConsensus)
+     {
+       av.updateConsensus();
+       av.updateConservation();
+     }
+
+     resetAllColourSchemes();
+
+     av.alignment.adjustSequenceAnnotations();
 
-   if(alignPanel.overviewPanel!=null)
-     alignPanel.overviewPanel.updateOverviewImage();
+     if (ap.overviewPanel != null)
+       ap.overviewPanel.updateOverviewImage();
 
-   alignPanel.repaint();
+     ap.repaint();
+   }
  }
 
   void resetAllColourSchemes()
@@ -1352,8 +1683,9 @@ public class AlignFrame
 
     viewport.padGaps = padGapsMenuitem.isSelected();
 
-   // if (viewport.padGaps)
-    alignmentChanged();
+    viewport.firePropertyChange("alignment",
+                                null,
+                                viewport.getAlignment().getSequences());
   }
 
   /**
@@ -1441,6 +1773,7 @@ public class AlignFrame
   public void hideSelSequences_actionPerformed(ActionEvent e)
   {
     viewport.hideAllSelectedSeqs();
+    alignPanel.repaint();
   }
 
   public void hideSelColumns_actionPerformed(ActionEvent e)
@@ -2110,7 +2443,9 @@ public class AlignFrame
     viewport.autoCalculateConsensus = autoCalculate.isSelected();
     if(viewport.autoCalculateConsensus)
     {
-      alignmentChanged();
+      viewport.firePropertyChange("alignment",
+                                  null,
+                                  viewport.getAlignment().getSequences());
     }
   }
 
@@ -2196,7 +2531,7 @@ public class AlignFrame
       }
 
       title = title + " on region";
-      tp = new TreePanel(viewport, type, pwType);
+      tp = new TreePanel(alignPanel, type, pwType);
     }
     else
     {
@@ -2216,7 +2551,7 @@ public class AlignFrame
       if(viewport.alignment.getHeight()<2)
         return;
 
-      tp = new TreePanel(viewport, type, pwType);
+      tp = new TreePanel(alignPanel, type, pwType);
     }
 
     addTreeMenuItem(tp, title);
@@ -2430,7 +2765,7 @@ public class AlignFrame
 
       if (nf.getTree() != null)
       {
-        tp = new TreePanel(viewport,
+        tp = new TreePanel(alignPanel,
                            "FromFile",
                            title,
                            nf);
@@ -2684,39 +3019,16 @@ public void showTranslation_actionPerformed(ActionEvent e)
     }
   }
 
-    AlignFrame af = new AlignFrame(al);
+    AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
     Desktop.addInternalFrame(af, "Translation of "+this.getTitle(),
-                             NEW_WINDOW_WIDTH,
-                             NEW_WINDOW_HEIGHT);
+                             DEFAULT_WIDTH,
+                             DEFAULT_HEIGHT);
 
 
-   // AlignViewport newViewport = new AlignViewport(al);
-   // AlignmentPanel ap = new AlignmentPanel(this, newViewport);
-   // tabbedPane.add("Protein", ap);
-   // viewports.add(newViewport);
-  //  alignPanels.add(ap);
-
-    ///Dataset tab
-  /////////////////////////
-
-  //  AlignViewport ds = new AlignViewport(al.getDataset());
-  //  ds.setDataset(true);
-  //  AlignmentPanel dap = new AlignmentPanel(this, ds);
-  //  tabbedPane.add("Dataset", dap);
-  //  viewports.add(ds);
-  //  alignPanels.add(dap);
-  /////////////////////////
 
 
 }
 
-/*public void tabSelected()
- {
-  int index = tabbedPane.getSelectedIndex();
-  viewport = (AlignViewport)viewports.elementAt(index);
-  alignPanel = (AlignmentPanel)alignPanels.elementAt(index);
- }*/
-
 /**
  * DOCUMENT ME!
  *
@@ -2866,4 +3178,36 @@ public void drop(DropTargetDropEvent evt)
       ex.printStackTrace();
     }
   }
+
+  public void tabSelectionChanged(int index)
+  {
+    if (index > -1)
+    {
+      alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
+      viewport = alignPanel.av;
+    }
+  }
+
+  public void tabbedPane_mousePressed(MouseEvent e)
+  {
+    if(SwingUtilities.isRightMouseButton(e))
+    {
+      String reply = JOptionPane.showInternalInputDialog(this,
+          "Enter View Name",
+          "Edit View Name",
+          JOptionPane.QUESTION_MESSAGE);
+
+      if (reply != null)
+      {
+        viewport.viewName = reply;
+        tabbedPane.setTitleAt( tabbedPane.getSelectedIndex() ,reply);
+      }
+    }
+  }
+
+
+  public AlignViewport getCurrentView()
+  {
+    return viewport;
+  }
 }
index 05a52dd..6d0f766 100755 (executable)
@@ -104,6 +104,14 @@ public class AlignViewport
 
     boolean padGaps = false;
 
+    Rectangle explodedPosition;
+
+    String viewName;
+
+    String sequenceSetID;
+
+    boolean gatherViewsHere = false;
+
 
     public AlignViewport(AlignmentI al, boolean dataset)
     {
@@ -1406,4 +1414,13 @@ public class AlignViewport
     {
       showHiddenMarkers = show;
     }
+
+    public String getSequenceSetId()
+    {
+      if(sequenceSetID==null)
+        sequenceSetID =  alignment.hashCode()+"";
+
+      return sequenceSetID;
+    }
+
 }
index 94e2a84..bd87bb2 100755 (executable)
@@ -81,202 +81,27 @@ public class AlignmentPanel extends GAlignmentPanel
     annotationPanel = new AnnotationPanel(this);\r
     alabels = new AnnotationLabels(this);\r
 \r
-\r
     annotationScroller.setViewportView(annotationPanel);\r
     annotationSpaceFillerHolder.add(alabels, BorderLayout.CENTER);\r
 \r
     fontChanged();\r
 \r
     scalePanelHolder.add(scalePanel, BorderLayout.CENTER);\r
-    seqPanelHolder.add(seqPanel, BorderLayout.CENTER);\r
+   seqPanelHolder.add(seqPanel, BorderLayout.CENTER);\r
 \r
     setScrollValues(0, 0);\r
 \r
-    adjustAnnotationHeight();\r
-\r
     setAnnotationVisible(av.getShowAnnotation());\r
 \r
     hscroll.addAdjustmentListener(this);\r
     vscroll.addAdjustmentListener(this);\r
 \r
-    af.addKeyListener(new KeyAdapter()\r
-    {\r
-      public void keyPressed(KeyEvent evt)\r
-      {\r
-        if(av.cursorMode\r
-           && evt.getKeyCode()>=KeyEvent.VK_0\r
-           && evt.getKeyCode()<=KeyEvent.VK_9)\r
-        {\r
-          seqPanel.numberPressed(evt.getKeyChar());\r
-        }\r
-\r
-        switch (evt.getKeyCode())\r
-        {\r
-          case 27: // escape key\r
-            alignFrame.deselectAllSequenceMenuItem_actionPerformed(null);\r
-\r
-            break;\r
-\r
-          case KeyEvent.VK_DOWN:\r
-            if(av.cursorMode)\r
-            {\r
-              seqPanel.moveCursor(0,1);\r
-            }\r
-            else\r
-              alignFrame.moveSelectedSequences(false);\r
-            break;\r
-\r
-          case KeyEvent.VK_UP:\r
-            if (av.cursorMode)\r
-            {\r
-              seqPanel.moveCursor(0,-1);\r
-            }\r
-            else\r
-              alignFrame.moveSelectedSequences(true);\r
-            break;\r
-\r
-          case KeyEvent.VK_LEFT:\r
-            if(av.cursorMode)\r
-            {\r
-              seqPanel.moveCursor(-1,0);\r
-            }\r
-            break;\r
-\r
-          case KeyEvent.VK_RIGHT:\r
-            if (av.cursorMode)\r
-            {\r
-              seqPanel.moveCursor(1,0);\r
-            }\r
-            break;\r
-\r
-          case KeyEvent.VK_SPACE:\r
-            if(av.cursorMode)\r
-            {\r
-              seqPanel.insertGapAtCursor(evt.isControlDown()\r
-                                         || evt.isShiftDown()\r
-                                         || evt.isAltDown());\r
-            }\r
-            break;\r
-\r
-          case KeyEvent.VK_DELETE:\r
-          case KeyEvent.VK_BACK_SPACE:\r
-            if(!av.cursorMode)\r
-            {\r
-              alignFrame.cut_actionPerformed(null);\r
-            }\r
-            else\r
-              seqPanel.deleteGapAtCursor(evt.isControlDown()\r
-                                         || evt.isShiftDown()\r
-                                         || evt.isAltDown());\r
-\r
-            break;\r
-\r
-          case KeyEvent.VK_S:\r
-            if(av.cursorMode)\r
-            {\r
-              seqPanel.setCursorRow();\r
-            }\r
-            break;\r
-          case KeyEvent.VK_C:\r
-            if(av.cursorMode && !evt.isControlDown())\r
-            {\r
-              seqPanel.setCursorColumn();\r
-            }\r
-            break;\r
-          case KeyEvent.VK_P:\r
-            if(av.cursorMode)\r
-            {\r
-              seqPanel.setCursorPosition();\r
-            }\r
-            break;\r
-\r
-          case KeyEvent.VK_ENTER:\r
-          case KeyEvent.VK_COMMA:\r
-            if(av.cursorMode)\r
-            {\r
-              seqPanel.setCursorRowAndColumn();\r
-            }\r
-            break;\r
-\r
-          case KeyEvent.VK_Q:\r
-            if(av.cursorMode)\r
-            {\r
-              seqPanel.setSelectionAreaAtCursor(true);\r
-            }\r
-            break;\r
-          case KeyEvent.VK_M:\r
-            if(av.cursorMode)\r
-            {\r
-              seqPanel.setSelectionAreaAtCursor(false);\r
-            }\r
-            break;\r
-\r
-         case KeyEvent.VK_F2:\r
-           av.cursorMode = ! av.cursorMode;\r
-           alignFrame.statusBar.setText("Keyboard editing mode is "+\r
-               (av.cursorMode ? "on" : "off"));\r
-           if(av.cursorMode)\r
-           {\r
-             seqPanel.seqCanvas.cursorX = av.startRes;\r
-             seqPanel.seqCanvas.cursorY = av.startSeq;\r
-           }\r
-           seqPanel.seqCanvas.repaint();\r
-           break;\r
-\r
-          case KeyEvent.VK_F1:\r
-            try\r
-            {\r
-              ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();\r
-              java.net.URL url = javax.help.HelpSet.findHelpSet(cl, "help/help");\r
-              javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);\r
 \r
-              javax.help.HelpBroker hb = hs.createHelpBroker();\r
-              hb.setCurrentID("home");\r
-              hb.setDisplayed(true);\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-              ex.printStackTrace();\r
-            }\r
-            break;\r
-          case KeyEvent.VK_H:\r
-          {\r
-            boolean toggleSeqs = !evt.isControlDown();\r
-            boolean toggleCols = !evt.isShiftDown();\r
-\r
-            boolean hide = false;\r
-\r
-            SequenceGroup sg = av.getSelectionGroup();\r
-            if(toggleSeqs)\r
-             {\r
-               if(sg != null && sg.getSize(false) != av.alignment.getHeight())\r
-               {\r
-                 alignFrame.hideSelSequences_actionPerformed(null);\r
-                 hide = true;\r
-               }\r
-               else if (!(toggleCols && av.colSel.getSelected().size() > 0))\r
-                 alignFrame.showAllSeqs_actionPerformed(null);\r
-             }\r
-\r
-             if (toggleCols)\r
-             {\r
-               if(av.colSel.getSelected().size() > 0)\r
-               {\r
-                 alignFrame.hideSelColumns_actionPerformed(null);\r
-                 if(!toggleSeqs)\r
-                   av.selectionGroup = sg;\r
-               }\r
-               else if(!hide)\r
-                 alignFrame.showAllColumns_actionPerformed(null);\r
-             }\r
-            break;\r
-          }\r
+    adjustAnnotationHeight();\r
 \r
-        }\r
-      }\r
-    });\r
   }\r
 \r
+\r
   /**\r
    * DOCUMENT ME!\r
    */\r
@@ -300,19 +125,6 @@ public class AlignmentPanel extends GAlignmentPanel
     idPanel.idCanvas.setPreferredSize(d);\r
     hscrollFillerPanel.setPreferredSize(d);\r
 \r
-    if (av.getWrapAlignment())\r
-    {\r
-      int max = av.alignment.getWidth() /\r
-          seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());\r
-      vscroll.setMaximum(max);\r
-      vscroll.setUnitIncrement(1);\r
-      vscroll.setVisibleAmount(1);\r
-    }\r
-    else\r
-    {\r
-      setScrollValues(av.getStartRes(), av.getStartSeq());\r
-    }\r
-\r
     if (overviewPanel != null)\r
       overviewPanel.setBoxPosition();\r
 \r
@@ -453,34 +265,28 @@ public class AlignmentPanel extends GAlignmentPanel
 \r
   public void adjustAnnotationHeight()\r
   {\r
-    javax.swing.SwingUtilities.invokeLater(new Runnable()\r
+    if (alignFrame.getHeight() == 0)\r
     {\r
-      public void run()\r
-      {\r
-          while(alignFrame.getHeight()==0)\r
-          {\r
-            Thread.yield();\r
-          }\r
+      System.out.println("NEEDS FIXING");\r
+    }\r
 \r
-        int height = annotationPanel.adjustPanelHeight();\r
+    int height = annotationPanel.adjustPanelHeight();\r
 \r
-        if (height > alignFrame.getHeight() / 2)\r
-        {\r
-          height = alignFrame.getHeight() / 2;\r
-        }\r
+    if (height > alignFrame.getHeight() / 2)\r
+    {\r
+      height = alignFrame.getHeight() / 2;\r
+    }\r
 \r
-        annotationScroller.setPreferredSize(\r
-            new Dimension(annotationScroller.getWidth(),\r
-                          height));\r
+    annotationScroller.setPreferredSize(\r
+        new Dimension(annotationScroller.getWidth(),\r
+                      height));\r
 \r
-        annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
-            annotationSpaceFillerHolder.getWidth(),\r
-            height));\r
+    annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
+        annotationSpaceFillerHolder.getWidth(),\r
+        height));\r
 \r
-        annotationPanel.repaint();\r
-        repaint();\r
-      }\r
-    });\r
+    annotationPanel.repaint();\r
+    repaint();\r
   }\r
 \r
   /**\r
@@ -740,14 +546,17 @@ public class AlignmentPanel extends GAlignmentPanel
       if (av.hasHiddenColumns)\r
         maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;\r
 \r
-      int max = maxwidth /\r
-          seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth()) +\r
-          1;\r
-\r
-\r
-      vscroll.setMaximum(max);\r
-      vscroll.setUnitIncrement(1);\r
-      vscroll.setVisibleAmount(1);\r
+      int canvasWidth = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());\r
+            if(canvasWidth>0)\r
+      {\r
+        int max = maxwidth /\r
+            seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.\r
+            getWidth()) +\r
+            1;\r
+        vscroll.setMaximum(max);\r
+        vscroll.setUnitIncrement(1);\r
+        vscroll.setVisibleAmount(1);\r
+      }\r
     }\r
     else\r
     {\r
@@ -757,7 +566,6 @@ public class AlignmentPanel extends GAlignmentPanel
     if( this.getVisibleRect().getBounds() == g.getClipBounds()\r
         && overviewPanel != null)\r
         overviewPanel.updateOverviewImage();\r
-\r
   }\r
 \r
   /**\r
index 508e51f..b857405 100755 (executable)
@@ -193,11 +193,13 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
           }\r
           else\r
           {\r
-            AlignFrame af = new AlignFrame(new Alignment(sequences));\r
+            AlignFrame af = new AlignFrame(new Alignment(sequences),\r
+                                           AlignFrame.DEFAULT_WIDTH,\r
+                                           AlignFrame.DEFAULT_HEIGHT);\r
             af.currentFileFormat = format;\r
             Desktop.addInternalFrame(af, "Cut & Paste input - " + format,\r
-                                     AlignFrame.NEW_WINDOW_WIDTH,\r
-                                     AlignFrame.NEW_WINDOW_HEIGHT);\r
+                                     AlignFrame.DEFAULT_WIDTH,\r
+                                     AlignFrame.DEFAULT_HEIGHT);\r
             af.statusBar.setText("Successfully pasted alignment file");\r
 \r
             try\r
index 9d58c7b..163e297 100755 (executable)
@@ -665,5 +665,88 @@ public class Desktop extends jalview.jbgui.GDesktop
       validate();\r
     }\r
 \r
+    public static int getViewCount(String viewId)\r
+    {\r
+      int count = 0;\r
+      JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
+      for (int t = 0; t < frames.length; t++)\r
+      {\r
+        if (frames[t] instanceof AlignFrame)\r
+        {\r
+          AlignFrame af = (AlignFrame) frames[t];\r
+          for(int a=0; a<af.alignPanels.size(); a++)\r
+          {\r
+            if(viewId.equals(\r
+                ((AlignmentPanel)af.alignPanels.elementAt(a)).av.getSequenceSetId() )\r
+                )\r
+            count ++;\r
+          }\r
+        }\r
+      }\r
+\r
+      return count;\r
+    }\r
+\r
+    public void explodeViews(AlignFrame af)\r
+    {\r
+      int size = af.alignPanels.size();\r
+      if(size<2)\r
+        return;\r
+      af.closeMenuItem_actionPerformed(null);\r
+\r
+      for(int i=0; i<size; i++)\r
+      {\r
+        AlignmentPanel ap = (AlignmentPanel)af.alignPanels.elementAt(i);\r
+        AlignFrame newaf = new AlignFrame(ap);\r
+        if(ap.av.explodedPosition!=null)\r
+          newaf.setBounds(ap.av.explodedPosition);\r
+\r
+        ap.av.gatherViewsHere = false;\r
+\r
+        PaintRefresher.Register(ap.seqPanel.seqCanvas, ap.av.getSequenceSetId());\r
+        PaintRefresher.Register(ap.idPanel.idCanvas, ap.av.getSequenceSetId());\r
+        PaintRefresher.Register(ap, ap.av.getSequenceSetId());\r
+\r
+\r
+        newaf.viewport = ap.av;\r
+        addInternalFrame(newaf, af.getTitle(),\r
+                         AlignFrame.DEFAULT_WIDTH,\r
+                         AlignFrame.DEFAULT_HEIGHT);\r
+      }\r
+\r
+    }\r
+\r
+    public void gatherViews(AlignFrame source)\r
+    {\r
+      source.viewport.gatherViewsHere = true;\r
+      source.viewport.explodedPosition = source.getBounds();\r
+      JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
+      String viewId = source.viewport.sequenceSetID;\r
+\r
+      for (int t = 0; t < frames.length; t++)\r
+      {\r
+        if (frames[t] instanceof AlignFrame && frames[t] != source)\r
+        {\r
+          AlignFrame af = (AlignFrame) frames[t];\r
+          boolean gatherThis = false;\r
+          for (int a = 0; a < af.alignPanels.size(); a++)\r
+          {\r
+            AlignmentPanel ap = (AlignmentPanel) af.alignPanels.elementAt(a);\r
+            if (viewId.equals(ap.av.getSequenceSetId()))\r
+            {\r
+              gatherThis = true;\r
+              ap.av.gatherViewsHere = false;\r
+              ap.av.explodedPosition = af.getBounds();\r
+              source.addAlignmentPanel(ap);\r
+            }\r
+          }\r
+          if (gatherThis)\r
+            af.closeMenuItem_actionPerformed(null);\r
+        }\r
+      }\r
+\r
+    }\r
+\r
+\r
 }\r
 \r
index 571cf52..1f91e26 100755 (executable)
@@ -53,7 +53,7 @@ public class IdCanvas extends JPanel
     {\r
         setLayout(new BorderLayout());\r
         this.av = av;\r
-        PaintRefresher.Register(this, av.alignment);\r
+        PaintRefresher.Register(this, av.getSequenceSetId());\r
     }\r
 \r
     /**\r
index 9f86d96..d6dff14 100755 (executable)
@@ -289,9 +289,14 @@ public class IdPanel extends JPanel implements MouseListener,
      */\r
     void selectSeqs(int start, int end)\r
     {\r
-      if(av.getSelectionGroup()==null)\r
+        if(av.getSelectionGroup()==null)\r
             return;\r
 \r
+          if (end >= av.getAlignment().getHeight())\r
+          {\r
+            end = av.getAlignment().getHeight() - 1;\r
+          }\r
+\r
         lastid = start;\r
 \r
         if (end < start)\r
@@ -322,7 +327,7 @@ public class IdPanel extends JPanel implements MouseListener,
         }\r
 \r
         mouseDragging = false;\r
-        PaintRefresher.Refresh(av.alignment);\r
+        PaintRefresher.Refresh(this, av.getSequenceSetId());\r
     }\r
 \r
     /**\r
index d6061a4..e118309 100755 (executable)
@@ -48,10 +48,9 @@ import jalview.schemabinding.version2.*;
  */
 public class Jalview2XML
 {
-    // SAVES SEVERAL ALIGNEMENT WINDOWS TO SAME JARFILE
+    // SAVES SEVERAL ALIGNMENT WINDOWS TO SAME JARFILE
     public void SaveState(File statefile)
     {
-        long creation = System.currentTimeMillis();
         JInternalFrame[] frames = Desktop.desktop.getAllFrames();
 
         if (frames == null)
@@ -107,7 +106,19 @@ public class Jalview2XML
                         shortName = shortName + ".xml";
                     }
 
-                    SaveState(af, creation, shortName, jout, out);
+                    int ap, apSize= af.alignPanels.size();
+                    for (ap = 0; ap < apSize; ap++)
+                    {
+                      AlignmentPanel apanel = (AlignmentPanel) af.alignPanels.
+                          elementAt(ap);
+
+                      if (apanel.av.explodedPosition == null)
+                        apanel.av.explodedPosition = af.getBounds();
+
+                      SaveState(apanel,
+                                apSize == 1 ? shortName : ap+shortName,
+                                jout, out);
+                    }
                 }
             }
 
@@ -126,17 +137,25 @@ public class Jalview2XML
     {
         try
         {
-            FileOutputStream fos = new FileOutputStream(jarFile);
-            JarOutputStream jout = new JarOutputStream(fos);
+          int ap, apSize= af.alignPanels.size();
+          FileOutputStream fos = new FileOutputStream(jarFile);
+          JarOutputStream jout = new JarOutputStream(fos);
+          PrintWriter out = new PrintWriter(new OutputStreamWriter(jout,
+                "UTF-8"));
+          for( ap=0; ap<apSize; ap++)
+          {
+            AlignmentPanel apanel = (AlignmentPanel)af.alignPanels.elementAt(ap);
 
-            //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS
-            ////////////////////////////////////////////////////
-            PrintWriter out = new PrintWriter(new OutputStreamWriter(jout,
-                        "UTF-8"));
+            if (apanel.av.explodedPosition == null)
+              apanel.av.explodedPosition = af.getBounds();
 
-            SaveState(af, System.currentTimeMillis(), fileName, jout, out);
-            out.close();
-            jout.close();
+            SaveState(apanel,
+                      apSize==1?fileName:fileName+ap,
+                      jout, out);
+          }
+
+          out.close();
+          jout.close();
         }
         catch (Exception ex)
         {
@@ -153,30 +172,31 @@ public class Jalview2XML
      * @param jout DOCUMENT ME!
      * @param out DOCUMENT ME!
      */
-    public void SaveState(AlignFrame af, long timeStamp,
-        String fileName, JarOutputStream jout, PrintWriter out)
+    public void SaveState(AlignmentPanel ap,
+                          String fileName,
+                          JarOutputStream jout,
+                          PrintWriter out)
     {
-        Vector seqids = new Vector();
+      if (seqRefIds == null)
+        seqRefIds = new Hashtable();
+
         Vector userColours = new Vector();
 
-        AlignViewport av = af.viewport;
+        AlignViewport av = ap.av;
 
         JalviewModel object = new JalviewModel();
         object.setVamsasModel(new jalview.schemabinding.version2.VamsasModel());
 
-        object.setCreationDate(new java.util.Date(timeStamp));
+        object.setCreationDate(new java.util.Date(System.currentTimeMillis()));
         object.setVersion(jalview.bin.Cache.getProperty("VERSION"));
 
-        jalview.datamodel.AlignmentI jal = af.viewport.alignment;
-        jalview.datamodel.AlignmentI jalhidden = null;
+        jalview.datamodel.AlignmentI jal = av.alignment;
 
         if(av.hasHiddenRows)
         {
-          jalhidden = jal;
           jal = jal.getHiddenSequences().getFullAlignment();
         }
 
-
         SequenceSet vamsasSet = new SequenceSet();
         Sequence vamsasSeq;
         JalviewModelSequence jms = new JalviewModelSequence();
@@ -190,26 +210,37 @@ public class Jalview2XML
         int id = 0;
         for (int i = 0; i < jal.getHeight(); i++)
         {
-            seqids.add(jal.getSequenceAt(i));
-            vamsasSeq = new Sequence();
-            vamsasSeq.setId(id + "");
-            vamsasSeq.setName(jal.getSequenceAt(i).getName());
-            vamsasSeq.setSequence(jal.getSequenceAt(i).getSequence());
-            vamsasSeq.setDescription(jal.getSequenceAt(i).getDescription());
-
-            if(jal.getSequenceAt(i).getDatasetSequence().getDBRef()!=null)
+            id = jal.getSequenceAt(i).hashCode();
+
+            if(seqRefIds.get(id+"")!=null)
+            {
+
+            }
+            else
             {
-              jalview.datamodel.DBRefEntry [] dbrefs =
-                  jal.getSequenceAt(i).getDatasetSequence().getDBRef();
+              vamsasSeq = new Sequence();
+              vamsasSeq.setId(id + "");
+              vamsasSeq.setName(jal.getSequenceAt(i).getName());
+              vamsasSeq.setSequence(jal.getSequenceAt(i).getSequence());
+              vamsasSeq.setDescription(jal.getSequenceAt(i).getDescription());
 
-              for(int d=0; d<dbrefs.length; d++)
+              if (jal.getSequenceAt(i).getDatasetSequence().getDBRef() != null)
               {
-                DBRef dbref = new DBRef();
-                dbref.setSource( dbrefs[d].getSource() );
-                dbref.setVersion( dbrefs[d].getVersion());
-                dbref.setAccessionId(dbrefs[d].getAccessionId());
-                vamsasSeq.addDBRef(dbref);
+                jalview.datamodel.DBRefEntry[] dbrefs =
+                    jal.getSequenceAt(i).getDatasetSequence().getDBRef();
+
+                for (int d = 0; d < dbrefs.length; d++)
+                {
+                  DBRef dbref = new DBRef();
+                  dbref.setSource(dbrefs[d].getSource());
+                  dbref.setVersion(dbrefs[d].getVersion());
+                  dbref.setAccessionId(dbrefs[d].getAccessionId());
+                  vamsasSeq.addDBRef(dbref);
+                }
               }
+
+              vamsasSet.addSequence(vamsasSeq);
+              seqRefIds.put(id+"", vamsasSeq);
             }
 
             jseq = new JSeq();
@@ -221,7 +252,7 @@ public class Jalview2XML
 
             if (av.hasHiddenRows)
             {
-              jseq.setHidden(jalhidden.getHiddenSequences().isHidden(
+              jseq.setHidden(av.alignment.getHiddenSequences().isHidden(
                   jal.getSequenceAt(i)));
 
               if(jal.getSequenceAt(i).getHiddenSequences()!=null)
@@ -350,13 +381,15 @@ public class Jalview2XML
             }
 
             jms.addJSeq(jseq);
-            vamsasSet.addSequence(vamsasSeq);
-            id++;
         }
 
+        if(av.hasHiddenRows)
+          jal = av.alignment;
+
+
         //SAVE TREES
         ///////////////////////////////////
-        if (af.viewport.currentTree != null)
+        if (av.currentTree != null)
         {
           // FIND ANY ASSOCIATED TREES
           // NOT IMPLEMENTED FOR HEADLESS STATE AT PRESENT
@@ -374,7 +407,7 @@ public class Jalview2XML
                 {
                   Tree tree = new Tree();
                   tree.setTitle(tp.getTitle());
-                  tree.setCurrentTree( (af.viewport.currentTree == tp.getTree()));
+                  tree.setCurrentTree( (av.currentTree == tp.getTree()));
                   tree.setNewick(tp.getTree().toString());
                   tree.setThreshold(tp.treeCanvas.threshold);
 
@@ -531,9 +564,9 @@ public class Jalview2XML
 
                 for (int s = 0; s < sg.getSize(false); s++)
                 {
-                    jalview.datamodel.Sequence seq = (jalview.datamodel.Sequence) sg.getSequenceAt(s);
-                    int index = seqids.indexOf(seq);
-                    groups[i].addSeq(index);
+                    jalview.datamodel.Sequence seq =
+                        (jalview.datamodel.Sequence) sg.getSequenceAt(s);
+                    groups[i].addSeq(seq.hashCode());
                 }
             }
 
@@ -543,11 +576,15 @@ public class Jalview2XML
 
         ///////////SAVE VIEWPORT
         Viewport view = new Viewport();
-        view.setTitle(af.getTitle());
-        view.setXpos(af.getX());
-        view.setYpos(af.getY());
-        view.setWidth(af.getWidth());
-        view.setHeight(af.getHeight());
+        view.setTitle(ap.alignFrame.getTitle());
+        view.setSequenceSetId(av.getSequenceSetId());
+        view.setViewName(av.viewName);
+        view.setGatheredViews(av.gatherViewsHere);
+
+        view.setXpos(av.explodedPosition.x);
+        view.setYpos(av.explodedPosition.y);
+        view.setWidth(av.explodedPosition.width);
+        view.setHeight(av.explodedPosition.height);
         view.setStartRes(av.startRes);
         view.setStartSeq(av.startSeq);
 
@@ -622,7 +659,7 @@ public class Jalview2XML
               = new jalview.schemabinding.version2.FeatureSettings();
 
           String [] renderOrder =
-              af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().renderOrder;
+              ap.seqPanel.seqCanvas.getFeatureRenderer().renderOrder;
 
           Vector settingsAdded = new Vector();
           for(int ro=0; ro<renderOrder.length; ro++)
@@ -630,7 +667,7 @@ public class Jalview2XML
             Setting setting = new Setting();
             setting.setType(renderOrder[ro]);
             setting.setColour(
-                af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(renderOrder[ro]).getRGB()
+                ap.seqPanel.seqCanvas.getFeatureRenderer().getColour(renderOrder[ro]).getRGB()
                 );
 
             setting.setDisplay(
@@ -643,7 +680,7 @@ public class Jalview2XML
 
           //Make sure we save none displayed feature settings
           Enumeration en =
-              af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours.keys();
+              ap.seqPanel.seqCanvas.getFeatureRenderer().featureColours.keys();
           while(en.hasMoreElements())
           {
             String key = en.nextElement().toString();
@@ -653,7 +690,7 @@ public class Jalview2XML
             Setting setting = new Setting();
             setting.setType(key);
             setting.setColour(
-                af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().getColour(key).getRGB()
+                ap.seqPanel.seqCanvas.getFeatureRenderer().getColour(key).getRGB()
                 );
 
             setting.setDisplay(false);
@@ -785,6 +822,8 @@ public class Jalview2XML
         return ucs;
     }
 
+    Hashtable seqRefIds;
+
     /**
      * DOCUMENT ME!
      *
@@ -793,6 +832,10 @@ public class Jalview2XML
     public AlignFrame LoadJalviewAlign(final String file)
     {
         jalview.gui.AlignFrame af = null;
+
+        seqRefIds = new Hashtable();
+        Vector gatherToThisFrame= new Vector();
+
         try
         {
             //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING
@@ -833,6 +876,10 @@ public class Jalview2XML
                     object = (JalviewModel) unmar.unmarshal( in );
 
                     af = LoadFromObject(object, file);
+                    if(af.viewport.gatherViewsHere)
+                    {
+                      gatherToThisFrame.add(af);
+                    }
                     entryCount++;
                 }
                 else if (jarentry != null)
@@ -862,7 +909,6 @@ public class Jalview2XML
         }
         catch (Exception ex)
         {
-
           //Is Version 1 Jar file?
           af =  new Jalview2XML_V1().LoadJalviewAlign(file);
 
@@ -871,7 +917,7 @@ public class Jalview2XML
             System.out.println("Successfully loaded archive file");
             return af;
           }
-          ex.printStackTrace();
+
             System.err.println("Exception whilst loading jalview XML file : " +
                 ex + "\n");
             javax.swing.SwingUtilities.invokeLater(new Runnable()
@@ -886,12 +932,20 @@ public class Jalview2XML
               }});
         }
 
+        if (Desktop.instance != null)
+          Desktop.instance.stopLoading();
+
+        for (int i = 0; i < gatherToThisFrame.size(); i++)
+        {
+          Desktop.instance.gatherViews(
+              (AlignFrame) gatherToThisFrame.elementAt(i));
+        }
+
         return af;
     }
 
     String loadPDBFile(String file, String pdbId)
     {
-      System.out.println("load file "+file);
       try
       {
         JarInputStream jin = null;
@@ -937,112 +991,150 @@ public class Jalview2XML
 
     AlignFrame LoadFromObject(JalviewModel object, String file)
     {
-        Vector seqids = new Vector();
         SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);
         Sequence[] vamsasSeq = vamsasSet.getSequence();
 
         JalviewModelSequence jms = object.getJalviewModelSequence();
 
+        Viewport[] views = jms.getViewport();
+        Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER
+
         //////////////////////////////////
         //LOAD SEQUENCES
+
         Vector hiddenSeqs = null;
-        jalview.datamodel.Sequence[] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];
+        jalview.datamodel.Sequence jseq;
+
+        ArrayList tmpseqs = new ArrayList();
+
+
+        boolean multipleView = false;
+
         JSeq[] JSEQ = object.getJalviewModelSequence().getJSeq();
-        for (int i = 0; i < vamsasSeq.length; i++)
+        for (int i = 0; i < JSEQ.length; i++)
         {
-            jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
-                    vamsasSeq[i].getSequence());
-            jseqs[i].setDescription( vamsasSeq[i].getDescription() );
+          String seqId = JSEQ[i].getId() + "";
+
+          if (seqRefIds.get(seqId) != null)
+          {
+            tmpseqs.add( (jalview.datamodel.Sequence) seqRefIds.get(seqId));
+            multipleView = true;
+          }
+          else
+          {
+            jseq = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),
+                vamsasSeq[i].getSequence());
+            jseq.setDescription(vamsasSeq[i].getDescription());
+            jseq.setStart(JSEQ[i].getStart());
+            jseq.setEnd(JSEQ[i].getEnd());
+            jseq.setColor(new java.awt.Color(JSEQ[i].getColour()));
+            seqRefIds.put(vamsasSeq[i].getId(), jseq);
+            tmpseqs.add( jseq );
+          }
+
+
+          if (JSEQ[i].getHidden())
+          {
+            if (hiddenSeqs == null)
+              hiddenSeqs = new Vector();
+
+
+            hiddenSeqs.addElement(
+                (jalview.datamodel.Sequence) seqRefIds.get(seqId));
+          }
 
-            if(JSEQ[i].getHidden())
-            {
-              if(hiddenSeqs == null)
-                hiddenSeqs = new Vector();
-              hiddenSeqs.addElement(jseqs[i]);
-            }
-            jseqs[i].setStart(JSEQ[i].getStart());
-            jseqs[i].setEnd(JSEQ[i].getEnd());
-            jseqs[i].setColor(new java.awt.Color(JSEQ[i].getColour()));
-            seqids.add(jseqs[i]);
         }
 
         ///SequenceFeatures are added to the DatasetSequence,
         // so we must create the dataset before loading features
         /////////////////////////////////
-        jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);
+
+
+      jalview.datamodel.Sequence[] orderedSeqs = new jalview.datamodel.Sequence[
+          tmpseqs.size()];
+
+       tmpseqs.toArray(orderedSeqs) ;
+
+
+        jalview.datamodel.Alignment al =
+            new jalview.datamodel.Alignment(orderedSeqs);
+
         al.setDataset(null);
         /////////////////////////////////
 
 
         Hashtable pdbloaded = new Hashtable();
-        for (int i = 0; i < vamsasSeq.length; i++)
+        if(!multipleView)
         {
-          if (JSEQ[i].getFeaturesCount() > 0)
+          for (int i = 0; i < vamsasSeq.length; i++)
           {
-            Features[] features = JSEQ[i].getFeatures();
-            for (int f = 0; f < features.length; f++)
+            if (JSEQ[i].getFeaturesCount() > 0)
             {
-              jalview.datamodel.SequenceFeature sf
-                  = new jalview.datamodel.SequenceFeature(features[f].getType(),
-                  features[f].getDescription(), features[f].getStatus(),
-                  features[f].getBegin(), features[f].getEnd(),
-                  features[f].getFeatureGroup());
-
-              sf.setScore(features[f].getScore());
-              for(int od=0; od<features[f].getOtherDataCount(); od++)
+              Features[] features = JSEQ[i].getFeatures();
+              for (int f = 0; f < features.length; f++)
               {
-                OtherData keyValue = features[f].getOtherData(od);
-                if(keyValue.getKey().startsWith("LINK"))
-                  sf.addLink(keyValue.getValue());
-                else
-                  sf.setValue(keyValue.getKey(), keyValue.getValue());
+                jalview.datamodel.SequenceFeature sf
+                    = new jalview.datamodel.SequenceFeature(features[f].getType(),
+                    features[f].getDescription(), features[f].getStatus(),
+                    features[f].getBegin(), features[f].getEnd(),
+                    features[f].getFeatureGroup());
+
+                sf.setScore(features[f].getScore());
+                for (int od = 0; od < features[f].getOtherDataCount(); od++)
+                {
+                  OtherData keyValue = features[f].getOtherData(od);
+                  if (keyValue.getKey().startsWith("LINK"))
+                    sf.addLink(keyValue.getValue());
+                  else
+                    sf.setValue(keyValue.getKey(), keyValue.getValue());
 
-              }
+                }
 
-              al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);
+                al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf);
+              }
             }
-          }
-          if (JSEQ[i].getPdbidsCount() > 0)
-          {
-            Pdbids[] ids = JSEQ[i].getPdbids();
-            for (int p = 0; p < ids.length; p++)
+            if (JSEQ[i].getPdbidsCount() > 0)
             {
-              jalview.datamodel.PDBEntry entry = new jalview.datamodel.PDBEntry();
-              entry.setId(ids[p].getId());
-              entry.setType(ids[p].getType());
-              if (ids[p].getFile() != null)
+              Pdbids[] ids = JSEQ[i].getPdbids();
+              for (int p = 0; p < ids.length; p++)
               {
-                if (!pdbloaded.containsKey(ids[p].getFile()))
+                jalview.datamodel.PDBEntry entry = new jalview.datamodel.
+                    PDBEntry();
+                entry.setId(ids[p].getId());
+                entry.setType(ids[p].getType());
+                if (ids[p].getFile() != null)
                 {
-                  String tmppdb = loadPDBFile(file, ids[p].getId());
-                  entry.setFile(tmppdb);
-                  pdbloaded.put(ids[p].getId(), tmppdb);
+                  if (!pdbloaded.containsKey(ids[p].getFile()))
+                  {
+                    String tmppdb = loadPDBFile(file, ids[p].getId());
+                    entry.setFile(tmppdb);
+                    pdbloaded.put(ids[p].getId(), tmppdb);
+                  }
+                  else
+                    entry.setFile(pdbloaded.get(ids[p].getId()).toString());
                 }
-                else
-                  entry.setFile(pdbloaded.get(ids[p].getId()).toString());
-              }
 
-              al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
+                al.getSequenceAt(i).getDatasetSequence().addPDBId(entry);
+              }
             }
-          }
-          if(vamsasSeq[i].getDBRefCount()>0)
-          {
-            for(int d=0; d<vamsasSeq[i].getDBRefCount(); d++)
+            if (vamsasSeq[i].getDBRefCount() > 0)
             {
-              jalview.datamodel.DBRefEntry entry =
-                  new jalview.datamodel.DBRefEntry(
-                      vamsasSeq[i].getDBRef(d).getSource(),
-                      vamsasSeq[i].getDBRef(d).getVersion(),
-                      vamsasSeq[i].getDBRef(d).getAccessionId()
-                      );
-              al.getSequenceAt(i).getDatasetSequence().addDBRef(entry);
-            }
+              for (int d = 0; d < vamsasSeq[i].getDBRefCount(); d++)
+              {
+                jalview.datamodel.DBRefEntry entry =
+                    new jalview.datamodel.DBRefEntry(
+                        vamsasSeq[i].getDBRef(d).getSource(),
+                        vamsasSeq[i].getDBRef(d).getVersion(),
+                        vamsasSeq[i].getDBRef(d).getAccessionId()
+                    );
+                al.getSequenceAt(i).getDatasetSequence().addDBRef(entry);
+              }
 
+            }
           }
         }
 
 
-
          /////////////////////////////////
         //////////////////////////////////
         //LOAD ANNOTATIONS
@@ -1050,7 +1142,7 @@ public class Jalview2XML
             hideConservation = true,
             hideConsensus = true;
 
-        if (vamsasSet.getAnnotation() != null)
+        if (vamsasSet.getAnnotationCount()>0)
         {
             Annotation[] an = vamsasSet.getAnnotation();
 
@@ -1152,12 +1244,11 @@ public class Jalview2XML
                 }
 
                 Vector seqs = new Vector();
-                int[] ids = groups[i].getSeq();
 
-                for (int s = 0; s < ids.length; s++)
+                for (int s = 0; s < groups[i].getSeqCount(); s++)
                 {
-                    seqs.addElement((jalview.datamodel.SequenceI) seqids.elementAt(
-                            ids[s]));
+                    String seqId = groups[i].getSeq(s)+"";
+                    seqs.addElement((jalview.datamodel.SequenceI) seqRefIds.get(seqId));
                 }
 
                 jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup(seqs,
@@ -1185,11 +1276,17 @@ public class Jalview2XML
 
         /////////////////////////////////
         // LOAD VIEWPORT
-        Viewport[] views = jms.getViewport();
-        Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER
 
+        AlignFrame af = new AlignFrame(al,
+                                       view.getWidth(),
+                                       view.getHeight() );
+
+        af.viewport.sequenceSetID = view.getSequenceSetId();
+
+        af.viewport.gatherViewsHere = view.getGatheredViews();
 
-        AlignFrame af = new AlignFrame(al);
+        if (view.getSequenceSetId() != null)
+          PaintRefresher.Register(af.alignPanel, view.getSequenceSetId());
 
         if(hiddenSeqs!=null)
         {
@@ -1214,7 +1311,8 @@ public class Jalview2XML
         }
 
 
-        if(hideConsensus || hideQuality || hideConservation)
+        if((hideConsensus || hideQuality || hideConservation)
+            && al.getAlignmentAnnotation()!=null)
         {
           int hSize = al.getAlignmentAnnotation().length;
           for (int h = 0; h < hSize; h++)
@@ -1237,6 +1335,7 @@ public class Jalview2XML
           af.alignPanel.adjustAnnotationHeight();
         }
 
+        af.viewport.viewName = view.getViewName();
         af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
             view.getHeight());
         af.viewport.setStartRes(view.getStartRes());
index 8bce1e8..6a4fba8 100755 (executable)
@@ -267,7 +267,7 @@ public class Jalview2XML_V1
         Viewport[] views = jms.getViewport();\r
         Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER\r
 \r
-        AlignFrame af = new AlignFrame(al);\r
+        AlignFrame af = new AlignFrame(al, view.getWidth(), view.getHeight());\r
 \r
 \r
         //  af.changeColour() );\r
index 9626a2c..ea4f44e 100755 (executable)
@@ -284,7 +284,10 @@ public class PCAPanel extends GPCAPanel implements Runnable
           if (true)\r
           {\r
               // make a new frame!\r
-              AlignFrame af = new AlignFrame(al, (ColumnSelection) alAndColsel[1]);\r
+              AlignFrame af = new AlignFrame(al, (ColumnSelection) alAndColsel[1],\r
+                                           AlignFrame.DEFAULT_WIDTH,\r
+                                           AlignFrame.DEFAULT_HEIGHT\r
+);\r
 \r
               //>>>This is a fix for the moment, until a better solution is found!!<<<\r
               // af.getFeatureRenderer().transferSettings(alignFrame.getFeatureRenderer());\r
@@ -293,8 +296,8 @@ public class PCAPanel extends GPCAPanel implements Runnable
               //                                     msaorder);\r
 \r
               Desktop.addInternalFrame(af, "Original Data for " + this.title,\r
-                                       AlignFrame.NEW_WINDOW_WIDTH,\r
-                                       AlignFrame.NEW_WINDOW_HEIGHT);\r
+                                       AlignFrame.DEFAULT_WIDTH,\r
+                                       AlignFrame.DEFAULT_HEIGHT);\r
             }\r
           }\r
           /*      CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
index ef79796..7c155b7 100755 (executable)
@@ -33,7 +33,7 @@ import java.util.*;
  */\r
 public class PaintRefresher\r
 {\r
-    static Hashtable components = new Hashtable();\r
+    static Hashtable components;\r
 \r
     /**\r
      * DOCUMENT ME!\r
@@ -41,60 +41,90 @@ public class PaintRefresher
      * @param comp DOCUMENT ME!\r
      * @param al DOCUMENT ME!\r
      */\r
-    public static void Register(Component comp, AlignmentI al)\r
+    public static void Register(Component comp, String seqSetId)\r
     {\r
-        if (components.containsKey(al))\r
+      if (components == null)\r
+        components = new Hashtable();\r
+\r
+        if (components.containsKey(seqSetId))\r
         {\r
-            Vector comps = (Vector) components.get(al);\r
-            comps.addElement(comp);\r
+            Vector comps = (Vector) components.get(seqSetId);\r
+            if(!comps.contains(comp))\r
+              comps.addElement(comp);\r
         }\r
         else\r
         {\r
             Vector vcoms = new Vector();\r
             vcoms.addElement(comp);\r
-            components.put(al, vcoms);\r
+            components.put(seqSetId, vcoms);\r
         }\r
     }\r
 \r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param al DOCUMENT ME!\r
-     */\r
-    public static void Refresh(AlignmentI al)\r
+    public static void RemoveComponent(Component comp)\r
     {\r
-        Refresh(null, al);\r
+      if (components == null)\r
+        return;\r
+\r
+      Enumeration en = components.keys();\r
+      while(en.hasMoreElements())\r
+      {\r
+        String id = en.nextElement().toString();\r
+        Vector comps = (Vector) components.get(id);\r
+        comps.remove(comp);\r
+        if(comps.size()==0)\r
+        {\r
+          components.remove(id);\r
+        }\r
+      }\r
     }\r
 \r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param c DOCUMENT ME!\r
-     * @param al DOCUMENT ME!\r
-     */\r
-    public static void Refresh(Component c, AlignmentI al)\r
+    public static void Refresh(Component source, String id)\r
+    {\r
+      Refresh( source, id,  null, null);\r
+    }\r
+\r
+    public static void Refresh(Component source, String id,\r
+                                    SequenceI removeSeq,\r
+                                    SequenceI addSeq)\r
     {\r
-        Component temp;\r
-        Vector coms = (Vector) components.get(al);\r
-        if(coms==null)\r
-          return;\r
+      if (components == null)\r
+        return;\r
+\r
+      Component comp;\r
+      Vector comps = (Vector) components.get(id);\r
+\r
+      if(comps==null)\r
+      {\r
+        return;\r
+      }\r
 \r
-        Enumeration e = coms.elements();\r
+      Enumeration e = comps.elements();\r
+      while (e.hasMoreElements())\r
+      {\r
+        comp = (Component) e.nextElement();\r
 \r
-        while (e.hasMoreElements())\r
+        if(comp==source)\r
+          continue;\r
+\r
+        if (!comp.isValid())\r
+        {\r
+          comps.removeElement(comp);\r
+        }\r
+        else if(comp instanceof AlignmentPanel)\r
         {\r
-            temp = (Component) e.nextElement();\r
-\r
-            if (!temp.isValid())\r
-            {\r
-                coms.removeElement(temp);\r
-            }\r
-            else if (temp == c)\r
-            {\r
-                continue;\r
-            }\r
-            else\r
-                temp.repaint();\r
+          AlignmentPanel ap = (AlignmentPanel)comp;\r
+          if(addSeq!=null)\r
+            ap.av.alignment.addSequence(addSeq);\r
+          if(removeSeq!=null)\r
+            ap.av.alignment.deleteSequence(removeSeq);\r
+\r
+         // if(source instanceof AlignmentPanel)\r
+          //  ap.av.alignment.setGroups(\r
+         //       ((AlignmentPanel)source).av.alignment.getGroups() );\r
+\r
         }\r
+        comp.repaint();\r
+      }\r
+\r
     }\r
 }\r
index 980835a..248a54c 100755 (executable)
@@ -150,8 +150,11 @@ public class PairwiseAlignPanel extends GPairwiseAlignPanel
             seq[i] = (Sequence) sequences.elementAt(i);\r
         }\r
 \r
-        AlignFrame af = new AlignFrame(new Alignment(seq));\r
+        AlignFrame af = new AlignFrame(new Alignment(seq),\r
+                                           AlignFrame.DEFAULT_WIDTH,\r
+                                           AlignFrame.DEFAULT_HEIGHT);\r
+\r
         Desktop.addInternalFrame(af, "Pairwise Aligned Sequences",\r
-            AlignFrame.NEW_WINDOW_WIDTH, AlignFrame.NEW_WINDOW_HEIGHT);\r
+            AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);\r
     }\r
 }\r
index 8bcecea..356e5d5 100755 (executable)
@@ -688,7 +688,7 @@ public class PopupMenu extends JPopupMenu
         if (ap.overviewPanel != null)\r
           ap.overviewPanel.updateOverviewImage();\r
 \r
-        ap.seqPanel.repaint();\r
+        PaintRefresher.Refresh(this, ap.av.getSequenceSetId());\r
     }\r
 \r
     /**\r
@@ -1217,7 +1217,7 @@ public class PopupMenu extends JPopupMenu
         }\r
         while (end < sg.getEndRes());\r
       }\r
-      ap.repaint();\r
+      PaintRefresher.Refresh(this, ap.av.getSequenceSetId());\r
     }\r
   }\r
 \r
index fa6e616..50183eb 100755 (executable)
@@ -246,6 +246,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
           {\r
             SequenceI seq = originalSequences[i];\r
             ap.av.alignment.deleteSequence(seq);\r
+            PaintRefresher.Refresh(this,ap.av.getSequenceSetId(),seq,null);\r
             del.add(seq);\r
             if (sg != null)\r
             {\r
index 3aec578..f5517dc 100755 (executable)
@@ -94,7 +94,7 @@ public class RotatableCanvas extends JPanel implements MouseListener,
         ToolTipManager.sharedInstance().registerComponent(this);\r
         ToolTipManager.sharedInstance().setInitialDelay(0);\r
         ToolTipManager.sharedInstance().setDismissDelay(10000);\r
-        PaintRefresher.Register(this, av.alignment);\r
+        PaintRefresher.Register(this, av.getSequenceSetId());\r
 \r
         prefsize = getPreferredSize();\r
         orig = new float[npoint][3];\r
@@ -576,7 +576,7 @@ public class RotatableCanvas extends JPanel implements MouseListener,
             if (av.getSelectionGroup() != null)\r
             {\r
                 av.getSelectionGroup().addOrRemove(found, true);\r
-                PaintRefresher.Refresh(this, av.alignment);\r
+                PaintRefresher.Refresh(this, av.getSequenceSetId());\r
             }\r
             else\r
             {\r
index b4ef770..56e70ac 100755 (executable)
@@ -62,7 +62,7 @@ public class SeqCanvas extends JComponent
         fr = new FeatureRenderer(av);\r
         sr = new SequenceRenderer(av);\r
         setLayout(new BorderLayout());\r
-        PaintRefresher.Register(this, av.alignment);\r
+        PaintRefresher.Register(this, av.getSequenceSetId());\r
         setBackground(Color.white);\r
     }\r
 \r
@@ -328,9 +328,34 @@ public class SeqCanvas extends JComponent
             return;\r
         }\r
 \r
-        img = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);\r
-        gg = (Graphics2D) img.getGraphics();\r
-        gg.setFont(av.getFont());\r
+        if (img == null || imgWidth != img.getWidth() || imgHeight != img.getHeight())\r
+        {\r
+          try{\r
+            img = new BufferedImage(imgWidth, imgHeight,\r
+                                    BufferedImage.TYPE_INT_RGB);\r
+            gg = (Graphics2D) img.getGraphics();\r
+            gg.setFont(av.getFont());\r
+          }catch(OutOfMemoryError er)\r
+          {\r
+            System.gc();\r
+            System.out.println(er +" making image, SeqCanvas");\r
+            javax.swing.SwingUtilities.invokeLater(new Runnable()\r
+            {\r
+              public void run()\r
+              {\r
+                javax.swing.JOptionPane.showInternalMessageDialog(Desktop.\r
+                    desktop,\r
+                    "Out of memory creating alignment image!!"\r
+                    +\r
+                    "\nSee help files for increasing Java Virtual Machine memory."\r
+                    , "Out of memory",\r
+                    javax.swing.JOptionPane.WARNING_MESSAGE);\r
+              }\r
+            });\r
+\r
+            return;\r
+          }\r
+        }\r
 \r
         if (av.antiAlias)\r
           gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
@@ -602,7 +627,7 @@ public class SeqCanvas extends JComponent
             g1.setColor(Color.blue);\r
 \r
             g1.drawLine( (blockEnd - blockStart + 1) * av.charWidth - 1,\r
-                        0+offset,\r
+                        0 + offset,\r
                         (blockEnd - blockStart + 1) * av.charWidth - 1,\r
                         (endSeq - startSeq) * av.charHeight + offset);\r
           }\r
index b1895ef..4b7a388 100755 (executable)
@@ -126,6 +126,8 @@ public class SeqPanel extends JPanel implements MouseListener,
 \r
 \r
         int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth());\r
+        if(cwidth<1)\r
+          return 0;\r
 \r
         wrappedBlock = y / cHeight;\r
         wrappedBlock += av.getStartRes() / cwidth;\r
@@ -1352,7 +1354,8 @@ public class SeqPanel extends JPanel implements MouseListener,
         changeEndRes = false;\r
         changeStartRes = false;\r
         stretchGroup = null;\r
-        PaintRefresher.Refresh(av.alignment);\r
+\r
+        PaintRefresher.Refresh(this, av.getSequenceSetId());\r
     }\r
 \r
     /**\r
index dc5d31a..2beb3d9 100755 (executable)
@@ -386,14 +386,17 @@ public class SequenceFetcher
       {\r
         if (alignFrame == null)\r
         {\r
-          AlignFrame af = new AlignFrame(new Alignment(sequences));\r
+          AlignFrame af = new AlignFrame(new Alignment(sequences),\r
+                                           AlignFrame.DEFAULT_WIDTH,\r
+                                           AlignFrame.DEFAULT_HEIGHT\r
+);\r
           af.currentFileFormat = format;\r
           if(title==null)\r
             title = "Retrieved from " + database.getSelectedItem();\r
           Desktop.addInternalFrame(af,\r
                                    title,\r
-                                   AlignFrame.NEW_WINDOW_WIDTH,\r
-                                   AlignFrame.NEW_WINDOW_HEIGHT);\r
+                                   AlignFrame.DEFAULT_WIDTH,\r
+                                   AlignFrame.DEFAULT_HEIGHT);\r
           af.statusBar.setText("Successfully pasted alignment file");\r
 \r
           try\r
index 70aeb60..a9c3ae0 100755 (executable)
@@ -49,6 +49,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
     NJTree tree;\r
     JScrollPane scrollPane;\r
     AlignViewport av;\r
+    AlignmentPanel ap;\r
     Font font;\r
     FontMetrics fm;\r
     boolean fitToWindow = true;\r
@@ -73,14 +74,15 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
      * @param scroller DOCUMENT ME!\r
      * @param label DOCUMENT ME!\r
      */\r
-    public TreeCanvas(AlignViewport av, JScrollPane scroller)\r
+    public TreeCanvas(AlignmentPanel ap, JScrollPane scroller)\r
     {\r
-        this.av = av;\r
+        this.av = ap.av;\r
+        this.ap = ap;\r
         font = av.getFont();\r
         scrollPane = scroller;\r
         addMouseListener(this);\r
         addMouseMotionListener(this);\r
-        PaintRefresher.Register(this, av.alignment);\r
+        PaintRefresher.Register(this, ap.av.getSequenceSetId());\r
     }\r
 \r
 \r
@@ -680,7 +682,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
           }\r
         }\r
 \r
-        PaintRefresher.Refresh(this, av.alignment);\r
+        PaintRefresher.Refresh(this, av.getSequenceSetId());\r
         repaint();\r
       }\r
     }\r
@@ -728,7 +730,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
         if (ob instanceof SequenceI)\r
         {\r
           treeSelectionChanged( (Sequence) ob);\r
-          PaintRefresher.Refresh(this, av.alignment);\r
+          PaintRefresher.Refresh(this, ap.av.getSequenceSetId());\r
           repaint();\r
           return;\r
         }\r
@@ -750,7 +752,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
                 colourGroups();\r
               }\r
 \r
-              PaintRefresher.Refresh(this, av.alignment);\r
+              PaintRefresher.Refresh(this, ap.av.getSequenceSetId());\r
               repaint();\r
         }\r
 \r
index 05f01cf..06f8269 100755 (executable)
@@ -65,10 +65,10 @@ public class TreePanel extends GTreePanel
      * @param s DOCUMENT ME!\r
      * @param e DOCUMENT ME!\r
      */\r
-    public TreePanel(AlignViewport av, String type, String pwtype)\r
+    public TreePanel(AlignmentPanel ap, String type, String pwtype)\r
     {\r
       super();\r
-      initTreePanel(av, type, pwtype, null);\r
+      initTreePanel(ap, type, pwtype, null);\r
 \r
       // We know this tree has distances. JBPNote TODO: prolly should add this as a userdefined default\r
       // showDistances(true);\r
@@ -83,13 +83,13 @@ public class TreePanel extends GTreePanel
      * @param type DOCUMENT ME!\r
      * @param pwtype DOCUMENT ME!\r
      */\r
-    public TreePanel(AlignViewport av,\r
+    public TreePanel(AlignmentPanel ap,\r
                      String type,\r
                      String pwtype,\r
                      NewickFile newtree)\r
     {\r
       super();\r
-      initTreePanel(av, type, pwtype, newtree);\r
+      initTreePanel(ap, type, pwtype, newtree);\r
     }\r
 \r
     public AlignmentI getAlignment()\r
@@ -98,14 +98,15 @@ public class TreePanel extends GTreePanel
     }\r
 \r
 \r
-    void initTreePanel(AlignViewport av, String type,  String pwtype,\r
+    void initTreePanel(AlignmentPanel ap, String type,  String pwtype,\r
                        NewickFile newTree)\r
     {\r
 \r
+      av = ap.av;\r
       this.type = type;\r
       this.pwtype = pwtype;\r
 \r
-      treeCanvas = new TreeCanvas(av, scrollPane);\r
+      treeCanvas = new TreeCanvas(ap, scrollPane);\r
       scrollPane.setViewportView(treeCanvas);\r
 \r
       av.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
@@ -344,7 +345,10 @@ public class TreePanel extends GTreePanel
          if (true)\r
          {\r
            // make a new frame!\r
-           AlignFrame af = new AlignFrame(al, (ColumnSelection) alAndColsel[1]);\r
+           AlignFrame af = new AlignFrame(al, (ColumnSelection) alAndColsel[1],\r
+                                           AlignFrame.DEFAULT_WIDTH,\r
+                                           AlignFrame.DEFAULT_HEIGHT\r
+);\r
 \r
            //>>>This is a fix for the moment, until a better solution is found!!<<<\r
            // af.getFeatureRenderer().transferSettings(alignFrame.getFeatureRenderer());\r
@@ -353,8 +357,8 @@ public class TreePanel extends GTreePanel
        //                                     msaorder);\r
 \r
            Desktop.addInternalFrame(af, "Original Data for " + this.title,\r
-                                    AlignFrame.NEW_WINDOW_WIDTH,\r
-                                    AlignFrame.NEW_WINDOW_HEIGHT);\r
+                                    AlignFrame.DEFAULT_WIDTH,\r
+                                    AlignFrame.DEFAULT_HEIGHT);\r
          }\r
        }\r
     }\r