Merge branch 'develop' into features/JAL-2379pcaMemory
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 26 Jan 2017 09:47:42 +0000 (09:47 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 26 Jan 2017 09:47:42 +0000 (09:47 +0000)
Conflicts:
src/jalview/analysis/PCA.java
src/jalview/math/Matrix.java
test/jalview/math/MatrixTest.java

33 files changed:
resources/lang/Messages.properties
src/jalview/analysis/PCA.java
src/jalview/appletgui/APopupMenu.java
src/jalview/appletgui/AlignFrame.java
src/jalview/appletgui/RedundancyPanel.java
src/jalview/appletgui/ScalePanel.java
src/jalview/appletgui/SeqPanel.java
src/jalview/appletgui/SliderPanel.java
src/jalview/datamodel/ColumnSelection.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/Desktop.java
src/jalview/gui/FeatureSettings.java
src/jalview/gui/Jalview2XML.java
src/jalview/gui/PopupMenu.java
src/jalview/gui/RedundancyPanel.java
src/jalview/gui/ScalePanel.java
src/jalview/gui/SeqPanel.java
src/jalview/gui/SliderPanel.java
src/jalview/gui/TreePanel.java
src/jalview/gui/UserDefinedColours.java
src/jalview/gui/WsParamSetManager.java
src/jalview/io/FileFormats.java
src/jalview/io/HTMLOutput.java
src/jalview/io/JalviewFileChooser.java
src/jalview/jbgui/GAlignFrame.java
src/jalview/jbgui/GSliderPanel.java
src/jalview/math/Matrix.java
src/jalview/util/ImageMaker.java
src/jalview/util/ParseHtmlBodyAndLinks.java
src/jalview/ws/rest/params/Alignment.java
test/jalview/datamodel/ColumnSelectionTest.java
test/jalview/io/FileFormatsTest.java
test/jalview/math/MatrixTest.java

index d418c76..1352f0b 100644 (file)
@@ -323,7 +323,7 @@ label.size = Size:
 label.style = Style:
 label.calculating = Calculating....
 label.modify_conservation_visibility = Modify conservation visibility
-label.colour_residues_above_occurence = Colour residues above % occurence
+label.colour_residues_above_occurrence = Colour residues above % occurrence
 label.set_this_label_text = set this label text
 label.sequences_from = Sequences from {0}
 label.successfully_loaded_file  = Successfully loaded file {0}
index 9fc6027..7d6b822 100755 (executable)
@@ -151,7 +151,7 @@ public class PCA implements Runnable
   /**
    * Returns the matrix used in PCA calculation
    * 
-   * @return java.math.Matrix object
+   * @return
    */
 
   public MatrixI getM()
index 8f7a15b..bf985d7 100644 (file)
@@ -93,8 +93,6 @@ public class APopupMenu extends java.awt.PopupMenu implements
 
   protected MenuItem buriedColour = new MenuItem();
 
-  protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();
-
   protected MenuItem userDefinedColour = new MenuItem();
 
   protected MenuItem PIDColour = new MenuItem();
@@ -103,8 +101,14 @@ public class APopupMenu extends java.awt.PopupMenu implements
 
   MenuItem noColourmenuItem = new MenuItem();
 
+  protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();
+
+  MenuItem modifyPID = new MenuItem();
+
   protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
 
+  MenuItem modifyConservation = new MenuItem();
+
   final AlignmentPanel ap;
 
   MenuItem unGroupMenuItem = new MenuItem();
@@ -248,7 +252,9 @@ public class APopupMenu extends java.awt.PopupMenu implements
         if (sg.cs != null)
         {
           abovePIDColour.setState(sg.cs.getThreshold() > 0);
+          modifyPID.setEnabled(abovePIDColour.getState());
           conservationMenuItem.setState(sg.cs.conservationApplied());
+          modifyConservation.setEnabled(conservationMenuItem.getState());
         }
       }
     }
@@ -589,6 +595,14 @@ public class APopupMenu extends java.awt.PopupMenu implements
     {
       noColourmenuItem_actionPerformed();
     }
+    else if (source == modifyConservation)
+    {
+      conservationMenuItem_itemStateChanged();
+    }
+    else if (source == modifyPID)
+    {
+      abovePIDColour_itemStateChanged();
+    }
     else if (source == unGroupMenuItem)
     {
       unGroupMenuItem_actionPerformed();
@@ -902,6 +916,14 @@ public class APopupMenu extends java.awt.PopupMenu implements
     nucleotideMenuItem.addActionListener(this);
     conservationMenuItem.addItemListener(this);
     abovePIDColour.addItemListener(this);
+    modifyPID.setLabel(MessageManager
+            .getString("label.modify_identity_threshold"));
+    modifyPID.addActionListener(this);
+    modifyConservation.setLabel(MessageManager
+            .getString("label.modify_conservation_threshold"));
+    modifyPID.setEnabled(abovePIDColour.getState());
+    modifyConservation.setEnabled(conservationMenuItem.getState());
+    modifyConservation.addActionListener(this);
     colourMenu.setLabel(MessageManager.getString("label.group_colour"));
     showBoxes.setLabel(MessageManager.getString("action.boxes"));
     showBoxes.setState(true);
@@ -956,8 +978,10 @@ public class APopupMenu extends java.awt.PopupMenu implements
     colourMenu.add(nucleotideMenuItem);
     colourMenu.add(userDefinedColour);
     colourMenu.addSeparator();
-    colourMenu.add(abovePIDColour);
     colourMenu.add(conservationMenuItem);
+    colourMenu.add(modifyConservation);
+    colourMenu.add(abovePIDColour);
+    colourMenu.add(modifyPID);
 
     noColourmenuItem.setLabel(MessageManager.getString("label.none"));
     noColourmenuItem.addActionListener(this);
@@ -994,7 +1018,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
     BLOSUM62Colour.setLabel("BLOSUM62");
     BLOSUM62Colour.addActionListener(this);
     conservationMenuItem.setLabel(MessageManager
-            .getString("label.conservation"));
+            .getString("action.by_conservation"));
 
     editMenu.add(copy);
     copy.addActionListener(this);
@@ -1119,11 +1143,11 @@ public class APopupMenu extends java.awt.PopupMenu implements
     else
     // remove PIDColouring
     {
+      SliderPanel.hidePIDSlider();
       sg.cs.setThreshold(0, ap.av.isIgnoreGapsConsensus());
     }
-
+    modifyPID.setEnabled(abovePIDColour.getState());
     refresh();
-
   }
 
   protected void userDefinedColour_actionPerformed()
@@ -1178,9 +1202,10 @@ public class APopupMenu extends java.awt.PopupMenu implements
     else
     // remove ConservationColouring
     {
+      SliderPanel.hideConservationSlider();
       sg.cs.setConservation(null);
     }
-
+    modifyConservation.setEnabled(conservationMenuItem.getState());
     refresh();
   }
 
index 86dc19b..2287979 100644 (file)
@@ -2678,26 +2678,43 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   protected void conservationMenuItem_actionPerformed()
   {
-    viewport.setConservationSelected(conservationMenuItem.getState());
+    boolean selected = conservationMenuItem.getState();
+    modifyConservation.setEnabled(selected);
+    viewport.setConservationSelected(selected);
 
-    viewport.setAbovePIDThreshold(false);
-    abovePIDThreshold.setState(false);
+    // viewport.setAbovePIDThreshold(false);
+    // abovePIDThreshold.setState(false);
 
     changeColour(viewport.getGlobalColourScheme());
 
-    modifyConservation_actionPerformed();
+    if (selected)
+    {
+      modifyConservation_actionPerformed();
+    }
+    else
+    {
+      SliderPanel.hideConservationSlider();
+    }
   }
 
   public void abovePIDThreshold_actionPerformed()
   {
-    viewport.setAbovePIDThreshold(abovePIDThreshold.getState());
-
-    conservationMenuItem.setState(false);
-    viewport.setConservationSelected(false);
+    boolean selected = abovePIDThreshold.getState();
+    modifyPID.setEnabled(selected);
+    viewport.setAbovePIDThreshold(selected);
+    // conservationMenuItem.setState(false);
+    // viewport.setConservationSelected(false);
 
     changeColour(viewport.getGlobalColourScheme());
 
-    modifyPID_actionPerformed();
+    if (selected)
+    {
+      modifyPID_actionPerformed();
+    }
+    else
+    {
+      SliderPanel.hidePIDSlider();
+    }
   }
 
   public void sortPairwiseMenuItem_actionPerformed()
@@ -3519,9 +3536,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     nucleotideColour.addActionListener(this);
     modifyPID.setLabel(MessageManager
             .getString("label.modify_identity_threshold"));
+    modifyPID.setEnabled(abovePIDThreshold.getState());
     modifyPID.addActionListener(this);
     modifyConservation.setLabel(MessageManager
             .getString("label.modify_conservation_threshold"));
+    modifyConservation.setEnabled(conservationMenuItem.getState());
     modifyConservation.addActionListener(this);
     annotationColour.setLabel(MessageManager
             .getString("action.by_annotation"));
index 4aea837..6be416c 100644 (file)
@@ -74,9 +74,10 @@ public class RedundancyPanel extends SliderPanel implements Runnable,
 
     slider.addAdjustmentListener(new AdjustmentListener()
     {
+      @Override
       public void adjustmentValueChanged(AdjustmentEvent evt)
       {
-        valueField.setText(slider.getValue() + "");
+        valueField.setText(String.valueOf(slider.getValue()));
         sliderValueChanged();
       }
     });
@@ -104,6 +105,7 @@ public class RedundancyPanel extends SliderPanel implements Runnable,
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public void run()
   {
     label.setText(MessageManager.getString("label.calculating"));
@@ -172,6 +174,7 @@ public class RedundancyPanel extends SliderPanel implements Runnable,
 
   }
 
+  @Override
   public void applyButton_actionPerformed()
   {
     Vector del = new Vector();
@@ -230,6 +233,7 @@ public class RedundancyPanel extends SliderPanel implements Runnable,
 
   }
 
+  @Override
   public void undoButton_actionPerformed()
   {
     CommandI command = (CommandI) historyList.pop();
@@ -263,31 +267,38 @@ public class RedundancyPanel extends SliderPanel implements Runnable,
     }
   }
 
+  @Override
   public void windowOpened(WindowEvent evt)
   {
   }
 
+  @Override
   public void windowClosing(WindowEvent evt)
   {
     ap.idPanel.idCanvas.setHighlighted(null);
   }
 
+  @Override
   public void windowClosed(WindowEvent evt)
   {
   }
 
+  @Override
   public void windowActivated(WindowEvent evt)
   {
   }
 
+  @Override
   public void windowDeactivated(WindowEvent evt)
   {
   }
 
+  @Override
   public void windowIconified(WindowEvent evt)
   {
   }
 
+  @Override
   public void windowDeiconified(WindowEvent evt)
   {
   }
index 5a156fa..ed07b63 100755 (executable)
@@ -264,72 +264,30 @@ public class ScalePanel extends Panel implements MouseMotionListener,
     av.sendSelection();
   }
 
+  /**
+   * Action on dragging the mouse in the scale panel is to expand or shrink the
+   * selection group range (including any hidden columns that it spans)
+   * 
+   * @param evt
+   */
   @Override
   public void mouseDragged(MouseEvent evt)
   {
     mouseDragging = true;
+    ColumnSelection cs = av.getColumnSelection();
 
     int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
-    if (res < 0)
-    {
-      res = 0;
-    }
-
-    if (av.hasHiddenColumns())
-    {
-      res = av.getColumnSelection().adjustForHiddenColumns(res);
-    }
-
-    if (res > av.getAlignment().getWidth())
-    {
-      res = av.getAlignment().getWidth() - 1;
-    }
-
-    if (res < min)
-    {
-      min = res;
-    }
-
-    if (res > max)
-    {
-      max = res;
-    }
+    res = Math.max(0, res);
+    res = cs.adjustForHiddenColumns(res);
+    res = Math.min(res, av.getAlignment().getWidth() - 1);
+    min = Math.min(res, min);
+    max = Math.max(res, max);
 
     SequenceGroup sg = av.getSelectionGroup();
-
     if (sg != null)
     {
       stretchingGroup = true;
-
-      if (!av.getColumnSelection().contains(res))
-      {
-        av.getColumnSelection().addElement(res);
-      }
-
-      if (res > sg.getStartRes())
-      {
-        sg.setEndRes(res);
-      }
-      if (res < sg.getStartRes())
-      {
-        sg.setStartRes(res);
-      }
-
-      int col;
-      for (int i = min; i <= max; i++)
-      {
-        col = av.getColumnSelection().adjustForHiddenColumns(i);
-
-        if ((col < sg.getStartRes()) || (col > sg.getEndRes()))
-        {
-          av.getColumnSelection().removeElement(col);
-        }
-        else
-        {
-          av.getColumnSelection().addElement(col);
-        }
-      }
-
+      cs.stretchGroup(res, sg, min, max);
       ap.paintAlignment(false);
     }
   }
index 4278744..1debda8 100644 (file)
@@ -1538,7 +1538,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
         SliderPanel.setConservationSlider(ap, stretchGroup.cs,
                 stretchGroup.getName());
       }
-      else
+      if (stretchGroup.cs.getThreshold() > 0)
       {
         SliderPanel.setPIDSliderSource(ap, stretchGroup.cs,
                 stretchGroup.getName());
index 35c2a22..3e6dbe6 100644 (file)
@@ -38,6 +38,8 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.AdjustmentEvent;
 import java.awt.event.AdjustmentListener;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.WindowAdapter;
@@ -71,6 +73,7 @@ public class SliderPanel extends Panel implements ActionListener,
     else
     {
       sp = (SliderPanel) conservationSlider.getComponent(0);
+      sp.valueField.setText(String.valueOf(cs.getConservationInc()));
       sp.cs = cs;
     }
 
@@ -106,6 +109,7 @@ public class SliderPanel extends Panel implements ActionListener,
               conservationSlider.getTitle(), 420, 100);
       conservationSlider.addWindowListener(new WindowAdapter()
       {
+        @Override
         public void windowClosing(WindowEvent e)
         {
           conservationSlider = null;
@@ -122,13 +126,14 @@ public class SliderPanel extends Panel implements ActionListener,
     SliderPanel pid = null;
     if (PIDSlider == null)
     {
-      pid = new SliderPanel(ap, 50, false, cs);
+      pid = new SliderPanel(ap, cs.getThreshold(), false, cs);
       PIDSlider = new Frame();
       PIDSlider.add(pid);
     }
     else
     {
       pid = (SliderPanel) PIDSlider.getComponent(0);
+      pid.valueField.setText(String.valueOf(cs.getThreshold()));
       pid.cs = cs;
     }
     PIDSlider
@@ -165,6 +170,7 @@ public class SliderPanel extends Panel implements ActionListener,
               420, 100);
       PIDSlider.addWindowListener(new WindowAdapter()
       {
+        @Override
         public void windowClosing(WindowEvent e)
         {
           PIDSlider = null;
@@ -174,6 +180,29 @@ public class SliderPanel extends Panel implements ActionListener,
 
   }
 
+  /**
+   * Hides the PID slider panel if it is shown
+   */
+  public static void hidePIDSlider()
+  {
+    if (PIDSlider != null)
+    {
+      PIDSlider.setVisible(false);
+      PIDSlider = null;
+    }
+  }
+
+  /**
+   * Hides the conservation slider panel if it is shown
+   */
+  public static void hideConservationSlider()
+  {
+    if (conservationSlider != null)
+    {
+      conservationSlider.setVisible(false);
+      conservationSlider = null;
+    }
+  }
   public SliderPanel(AlignmentPanel ap, int value, boolean forConserve,
           ColourSchemeI cs)
   {
@@ -200,7 +229,7 @@ public class SliderPanel extends Panel implements ActionListener,
     else
     {
       label.setText(MessageManager
-              .getString("label.colour_residues_above_occurence"));
+              .getString("label.colour_residues_above_occurrence"));
       slider.setMinimum(0);
       slider.setMaximum(100 + slider.getVisibleAmount());
       slider.setBlockIncrement(1);
@@ -261,6 +290,7 @@ public class SliderPanel extends Panel implements ActionListener,
     allGroupsCheck.setEnabled(b);
   }
 
+  @Override
   public void actionPerformed(ActionEvent evt)
   {
     if (evt.getSource() == applyButton)
@@ -277,6 +307,7 @@ public class SliderPanel extends Panel implements ActionListener,
     }
   }
 
+  @Override
   public void adjustmentValueChanged(AdjustmentEvent evt)
   {
     valueField.setText(slider.getValue() + "");
@@ -287,11 +318,11 @@ public class SliderPanel extends Panel implements ActionListener,
   {
     try
     {
-      int i = Integer.parseInt(valueField.getText());
+      int i = Integer.valueOf(valueField.getText());
       slider.setValue(i);
-    } catch (Exception ex)
+    } catch (NumberFormatException ex)
     {
-      valueField.setText(slider.getValue() + "");
+      valueField.setText(String.valueOf(slider.getValue()));
     }
   }
 
@@ -344,6 +375,16 @@ public class SliderPanel extends Panel implements ActionListener,
     valueField.setText("   ");
     valueField.addActionListener(this);
     valueField.setColumns(3);
+    valueField.addFocusListener(new FocusAdapter()
+    {
+      @Override
+      public void focusLost(FocusEvent e)
+      {
+        valueField_actionPerformed();
+        valueChanged(slider.getValue());
+      }
+    });
+    
     label.setFont(new java.awt.Font("Verdana", 0, 11));
     label.setText(MessageManager.getString("label.set_this_label_text"));
     jPanel1.setLayout(borderLayout1);
@@ -381,23 +422,28 @@ public class SliderPanel extends Panel implements ActionListener,
   {
   }
 
+  @Override
   public void mousePressed(MouseEvent evt)
   {
   }
 
+  @Override
   public void mouseReleased(MouseEvent evt)
   {
     ap.paintAlignment(true);
   }
 
+  @Override
   public void mouseClicked(MouseEvent evt)
   {
   }
 
+  @Override
   public void mouseEntered(MouseEvent evt)
   {
   }
 
+  @Override
   public void mouseExited(MouseEvent evt)
   {
   }
index d651c0b..98a7fe2 100644 (file)
@@ -866,6 +866,24 @@ public class ColumnSelection
          */
         region[0] = Math.min(region[0], start);
         region[1] = Math.max(region[1], end);
+
+        /*
+         * also update or remove any subsequent ranges 
+         * that are overlapped
+         */
+        while (i < hiddenColumns.size() - 1)
+        {
+          int[] nextRegion = hiddenColumns.get(i + 1);
+          if (nextRegion[0] > end + 1)
+          {
+            /*
+             * gap to next hidden range - no more to update
+             */
+            break;
+          }
+          region[1] = Math.max(nextRegion[1], end);
+          hiddenColumns.remove(i + 1);
+        }
         return;
       }
     }
@@ -1813,4 +1831,55 @@ public class ColumnSelection
     return changed;
   }
 
+  /**
+   * Adjusts column selections, and the given selection group, to match the
+   * range of a stretch (e.g. mouse drag) operation
+   * <p>
+   * Method refactored from ScalePanel.mouseDragged
+   * 
+   * @param res
+   *          current column position, adjusted for hidden columns
+   * @param sg
+   *          current selection group
+   * @param min
+   *          start position of the stretch group
+   * @param max
+   *          end position of the stretch group
+   */
+  public void stretchGroup(int res, SequenceGroup sg, int min, int max)
+  {
+    if (!contains(res))
+    {
+      addElement(res);
+    }
+
+    if (res > sg.getStartRes())
+    {
+      // expand selection group to the right
+      sg.setEndRes(res);
+    }
+    if (res < sg.getStartRes())
+    {
+      // expand selection group to the left
+      sg.setStartRes(res);
+    }
+
+    /*
+     * expand or shrink column selection to match the
+     * range of the drag operation
+     */
+    for (int col = min; col <= max; col++)
+    {
+      if (col < sg.getStartRes() || col > sg.getEndRes())
+      {
+        // shrinking drag - remove from selection
+        removeElement(col);
+      }
+      else
+      {
+        // expanding drag - add to selection
+        addElement(col);
+      }
+    }
+  }
 }
index 370e649..44a2318 100644 (file)
@@ -894,7 +894,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     padGapsMenuitem.setSelected(av.isPadGaps());
     colourTextMenuItem.setSelected(av.isShowColourText());
     abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
+    modifyPID.setEnabled(abovePIDThreshold.isSelected());
     conservationMenuItem.setSelected(av.getConservationSelected());
+    modifyConservation.setEnabled(conservationMenuItem.isSelected());
     seqLimits.setSelected(av.getShowJVSuffix());
     idRightAlign.setSelected(av.isRightAlignIds());
     centreColumnLabelsMenuItem.setState(av.isCentreColumnLabels());
@@ -3498,12 +3500,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   /**
    * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
    */
   @Override
-  protected void modifyPID_actionPerformed(ActionEvent e)
+  protected void modifyPID_actionPerformed()
   {
     if (viewport.getAbovePIDThreshold()
             && viewport.getGlobalColourScheme() != null)
@@ -3516,12 +3515,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   /**
    * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
    */
   @Override
-  protected void modifyConservation_actionPerformed(ActionEvent e)
+  protected void modifyConservation_actionPerformed()
   {
     if (viewport.getConservationSelected()
             && viewport.getGlobalColourScheme() != null)
@@ -3533,41 +3529,45 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Action on selecting or deselecting (Colour) By Conservation
    */
   @Override
-  protected void conservationMenuItem_actionPerformed(ActionEvent e)
+  protected void conservationMenuItem_actionPerformed()
   {
-    viewport.setConservationSelected(conservationMenuItem.isSelected());
-
-    viewport.setAbovePIDThreshold(false);
-    abovePIDThreshold.setSelected(false);
+    boolean selected = conservationMenuItem.isSelected();
+    modifyConservation.setEnabled(selected);
+    viewport.setConservationSelected(selected);
 
     changeColour(viewport.getGlobalColourScheme());
-
-    modifyConservation_actionPerformed(null);
+    if (selected)
+    {
+      modifyConservation_actionPerformed();
+    }
+    else
+    {
+      SliderPanel.hideConservationSlider();
+    }
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Action on selecting or deselecting (Colour) Above PID Threshold
    */
   @Override
-  public void abovePIDThreshold_actionPerformed(ActionEvent e)
+  public void abovePIDThreshold_actionPerformed()
   {
-    viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
-
-    conservationMenuItem.setSelected(false);
-    viewport.setConservationSelected(false);
+    boolean selected = abovePIDThreshold.isSelected();
+    modifyPID.setEnabled(selected);
+    viewport.setAbovePIDThreshold(selected);
 
     changeColour(viewport.getGlobalColourScheme());
-
-    modifyPID_actionPerformed(null);
+    if (selected)
+    {
+      modifyPID_actionPerformed();
+    }
+    else
+    {
+      SliderPanel.hidePIDSlider();
+    }
   }
 
   /**
index 4ce42dc..0321662 100644 (file)
@@ -1531,8 +1531,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   @Override
   public void saveState_actionPerformed(ActionEvent e)
   {
-    JalviewFileChooser chooser = new JalviewFileChooser(
-            Cache.getProperty("LAST_DIRECTORY"), "jvp", "Jalview Project");
+    JalviewFileChooser chooser = new JalviewFileChooser("jvp",
+            "Jalview Project");
 
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(MessageManager.getString("label.save_state"));
@@ -2185,8 +2185,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   {
     if (v_client != null)
     {
-      JalviewFileChooser chooser = new JalviewFileChooser(
-              Cache.getProperty("LAST_DIRECTORY"), "vdj",// TODO: VAMSAS DOCUMENT EXTENSION is VDJ
+   // TODO: VAMSAS DOCUMENT EXTENSION is VDJ
+      JalviewFileChooser chooser = new JalviewFileChooser("vdj",
               "Vamsas Document");
 
       chooser.setFileView(new JalviewFileView());
index bb5f13c..26f9964 100644 (file)
@@ -748,8 +748,7 @@ public class FeatureSettings extends JPanel implements
 
   void load()
   {
-    JalviewFileChooser chooser = new JalviewFileChooser(
-            Cache.getProperty("LAST_DIRECTORY"), "fc",
+    JalviewFileChooser chooser = new JalviewFileChooser("fc",
             "Sequence Feature Colours");
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(MessageManager
@@ -841,8 +840,7 @@ public class FeatureSettings extends JPanel implements
 
   void save()
   {
-    JalviewFileChooser chooser = new JalviewFileChooser(
-            Cache.getProperty("LAST_DIRECTORY"), "fc",
+    JalviewFileChooser chooser = new JalviewFileChooser("fc",
             "Sequence Feature Colours");
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(MessageManager
index 35db33f..12b46e4 100644 (file)
@@ -129,7 +129,6 @@ import java.util.jar.JarInputStream;
 import java.util.jar.JarOutputStream;
 
 import javax.swing.JInternalFrame;
-import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
 
 import org.exolab.castor.xml.Marshaller;
@@ -3352,6 +3351,7 @@ public class Jalview2XML
           if (cs != null)
           {
             cs.setThreshold(jGroup.getPidThreshold(), true);
+            cs.setConservationInc(jGroup.getConsThreshold());
           }
         }
 
@@ -4422,10 +4422,12 @@ public class Jalview2XML
 
     af.viewport.setShowAnnotation(view.getShowAnnotation());
     af.viewport.setAbovePIDThreshold(view.getPidSelected());
+    af.viewport.setThreshold(view.getPidThreshold());
 
     af.viewport.setColourText(view.getShowColourText());
 
     af.viewport.setConservationSelected(view.getConservationSelected());
+    af.viewport.setIncrement(view.getConsThreshold());
     af.viewport.setShowJVSuffix(view.getShowFullId());
     af.viewport.setRightAlignIds(view.getRightAlignIds());
     af.viewport.setFont(
@@ -4475,7 +4477,6 @@ public class Jalview2XML
 
       if (cs != null)
       {
-        cs.setThreshold(view.getPidThreshold(), true);
         cs.setConsensus(af.viewport.getSequenceConsensusHash());
       }
     }
index e36204c..6a68334 100644 (file)
@@ -110,8 +110,6 @@ public class PopupMenu extends JPopupMenu
 
   protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();
 
-  protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();
-
   protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();
 
   protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();
@@ -124,8 +122,14 @@ public class PopupMenu extends JPopupMenu
 
   JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();
 
+  protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();
+
+  protected JMenuItem modifyPID = new JMenuItem();
+
   protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();
 
+  protected JMenuItem modifyConservation = new JMenuItem();
+
   AlignmentPanel ap;
 
   JMenu sequenceMenu = new JMenu();
@@ -258,7 +262,7 @@ public class PopupMenu extends JPopupMenu
     {
       JMenuItem item = new JMenuItem(ff);
 
-      item.addActionListener(new java.awt.event.ActionListener()
+      item.addActionListener(new ActionListener()
       {
         @Override
         public void actionPerformed(ActionEvent e)
@@ -342,7 +346,7 @@ public class PopupMenu extends JPopupMenu
               menuItem.setText(MessageManager.formatMessage(
                       "label.2d_rna_structure_line",
                       new Object[] { aa.label }));
-              menuItem.addActionListener(new java.awt.event.ActionListener()
+              menuItem.addActionListener(new ActionListener()
               {
                 @Override
                 public void actionPerformed(ActionEvent e)
@@ -370,7 +374,7 @@ public class PopupMenu extends JPopupMenu
               menuItem.setText(MessageManager.formatMessage(
                       "label.2d_rna_sequence_name",
                       new Object[] { seq.getName() }));
-              menuItem.addActionListener(new java.awt.event.ActionListener()
+              menuItem.addActionListener(new ActionListener()
               {
                 @Override
                 public void actionPerformed(ActionEvent e)
@@ -391,7 +395,7 @@ public class PopupMenu extends JPopupMenu
 
       menuItem = new JMenuItem(
               MessageManager.getString("action.hide_sequences"));
-      menuItem.addActionListener(new java.awt.event.ActionListener()
+      menuItem.addActionListener(new ActionListener()
       {
         @Override
         public void actionPerformed(ActionEvent e)
@@ -407,7 +411,7 @@ public class PopupMenu extends JPopupMenu
         menuItem = new JMenuItem(MessageManager.formatMessage(
                 "label.represent_group_with",
                 new Object[] { seq.getName() }));
-        menuItem.addActionListener(new java.awt.event.ActionListener()
+        menuItem.addActionListener(new ActionListener()
         {
           @Override
           public void actionPerformed(ActionEvent e)
@@ -538,13 +542,15 @@ public class PopupMenu extends JPopupMenu
       {
         if (sg.cs.conservationApplied())
         {
-        conservationMenuItem.setSelected(true);
+          conservationMenuItem.setSelected(true);
         }
         if (sg.cs.getThreshold() > 0)
         {
           abovePIDColour.setSelected(true);
         }
       }
+      modifyConservation.setEnabled(conservationMenuItem.isSelected());
+      modifyPID.setEnabled(abovePIDColour.isSelected());
       displayNonconserved.setSelected(sg.getShowNonconserved());
       showText.setSelected(sg.getDisplayText());
       showColourText.setSelected(sg.getColourText());
@@ -668,8 +674,6 @@ public class PopupMenu extends JPopupMenu
 
   }
 
-
-
   /**
    * Add annotation types to 'Show annotations' and/or 'Hide annotations' menus.
    * "All" is added first, followed by a separator. Then add any annotation
@@ -785,7 +789,7 @@ public class PopupMenu extends JPopupMenu
     label = label.substring(1, label.length() - 1); // a, b, c
     final JMenuItem item = new JMenuItem(label);
     item.setToolTipText(calcId);
-    item.addActionListener(new java.awt.event.ActionListener()
+    item.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -967,7 +971,7 @@ public class PopupMenu extends JPopupMenu
     JMenuItem item = new JMenuItem(label);
     item.setToolTipText(MessageManager.formatMessage(
             "label.open_url_param", new Object[] { url }));
-    item.addActionListener(new java.awt.event.ActionListener()
+    item.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1044,7 +1048,7 @@ public class PopupMenu extends JPopupMenu
   {
     groupMenu.setText(MessageManager.getString("label.selection"));
     groupName.setText(MessageManager.getString("label.name"));
-    groupName.addActionListener(new java.awt.event.ActionListener()
+    groupName.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1055,7 +1059,7 @@ public class PopupMenu extends JPopupMenu
     sequenceMenu.setText(MessageManager.getString("label.sequence"));
     sequenceName.setText(MessageManager
             .getString("label.edit_name_description"));
-    sequenceName.addActionListener(new java.awt.event.ActionListener()
+    sequenceName.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1065,7 +1069,7 @@ public class PopupMenu extends JPopupMenu
     });
     chooseAnnotations.setText(MessageManager
             .getString("action.choose_annotations"));
-    chooseAnnotations.addActionListener(new java.awt.event.ActionListener()
+    chooseAnnotations.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1075,7 +1079,7 @@ public class PopupMenu extends JPopupMenu
     });
     sequenceDetails.setText(MessageManager
             .getString("label.sequence_details"));
-    sequenceDetails.addActionListener(new java.awt.event.ActionListener()
+    sequenceDetails.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1085,19 +1089,18 @@ public class PopupMenu extends JPopupMenu
     });
     sequenceSelDetails.setText(MessageManager
             .getString("label.sequence_details"));
-    sequenceSelDetails
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                sequenceSelectionDetails_actionPerformed();
-              }
-            });
+    sequenceSelDetails.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        sequenceSelectionDetails_actionPerformed();
+      }
+    });
     PIDColour.setFocusPainted(false);
     unGroupMenuItem
             .setText(MessageManager.getString("action.remove_group"));
-    unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
+    unGroupMenuItem.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1107,18 +1110,17 @@ public class PopupMenu extends JPopupMenu
     });
     createGroupMenuItem.setText(MessageManager
             .getString("action.create_group"));
-    createGroupMenuItem
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                createGroupMenuItem_actionPerformed();
-              }
-            });
+    createGroupMenuItem.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        createGroupMenuItem_actionPerformed();
+      }
+    });
 
     outline.setText(MessageManager.getString("action.border_colour"));
-    outline.addActionListener(new java.awt.event.ActionListener()
+    outline.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1384,8 +1386,10 @@ public class PopupMenu extends JPopupMenu
     }
 
     colourMenu.addSeparator();
-    colourMenu.add(abovePIDColour);
     colourMenu.add(conservationMenuItem);
+    colourMenu.add(modifyConservation);
+    colourMenu.add(abovePIDColour);
+    colourMenu.add(modifyPID);
     editMenu.add(copy);
     editMenu.add(cut);
     editMenu.add(editSequence);
@@ -1404,7 +1408,7 @@ public class PopupMenu extends JPopupMenu
     jMenu1.add(outline);
     jMenu1.add(displayNonconserved);
     noColourmenuItem.setText(MessageManager.getString("label.none"));
-    noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
+    noColourmenuItem.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1415,7 +1419,7 @@ public class PopupMenu extends JPopupMenu
 
     clustalColour.setText(MessageManager
             .getString("label.clustalx_colours"));
-    clustalColour.addActionListener(new java.awt.event.ActionListener()
+    clustalColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1424,7 +1428,7 @@ public class PopupMenu extends JPopupMenu
       }
     });
     zappoColour.setText(MessageManager.getString("label.zappo"));
-    zappoColour.addActionListener(new java.awt.event.ActionListener()
+    zappoColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1433,7 +1437,7 @@ public class PopupMenu extends JPopupMenu
       }
     });
     taylorColour.setText(MessageManager.getString("label.taylor"));
-    taylorColour.addActionListener(new java.awt.event.ActionListener()
+    taylorColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1443,17 +1447,16 @@ public class PopupMenu extends JPopupMenu
     });
     hydrophobicityColour.setText(MessageManager
             .getString("label.hydrophobicity"));
-    hydrophobicityColour
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                hydrophobicityColour_actionPerformed();
-              }
-            });
+    hydrophobicityColour.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        hydrophobicityColour_actionPerformed();
+      }
+    });
     helixColour.setText(MessageManager.getString("label.helix_propensity"));
-    helixColour.addActionListener(new java.awt.event.ActionListener()
+    helixColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1463,7 +1466,7 @@ public class PopupMenu extends JPopupMenu
     });
     strandColour.setText(MessageManager
             .getString("label.strand_propensity"));
-    strandColour.addActionListener(new java.awt.event.ActionListener()
+    strandColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1472,7 +1475,7 @@ public class PopupMenu extends JPopupMenu
       }
     });
     turnColour.setText(MessageManager.getString("label.turn_propensity"));
-    turnColour.addActionListener(new java.awt.event.ActionListener()
+    turnColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1481,7 +1484,7 @@ public class PopupMenu extends JPopupMenu
       }
     });
     buriedColour.setText(MessageManager.getString("label.buried_index"));
-    buriedColour.addActionListener(new java.awt.event.ActionListener()
+    buriedColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1489,19 +1492,9 @@ public class PopupMenu extends JPopupMenu
         buriedColour_actionPerformed();
       }
     });
-    abovePIDColour.setText(MessageManager
-            .getString("label.above_identity_percentage"));
-    abovePIDColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        abovePIDColour_actionPerformed();
-      }
-    });
     userDefinedColour.setText(MessageManager
             .getString("action.user_defined"));
-    userDefinedColour.addActionListener(new java.awt.event.ActionListener()
+    userDefinedColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1511,7 +1504,7 @@ public class PopupMenu extends JPopupMenu
     });
     PIDColour
             .setText(MessageManager.getString("label.percentage_identity"));
-    PIDColour.addActionListener(new java.awt.event.ActionListener()
+    PIDColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1520,7 +1513,7 @@ public class PopupMenu extends JPopupMenu
       }
     });
     BLOSUM62Colour.setText(MessageManager.getString("label.blosum62"));
-    BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
+    BLOSUM62Colour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1530,33 +1523,87 @@ public class PopupMenu extends JPopupMenu
     });
     purinePyrimidineColour.setText(MessageManager
             .getString("label.purine_pyrimidine"));
-    purinePyrimidineColour
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                purinePyrimidineColour_actionPerformed();
-              }
-            });
+    purinePyrimidineColour.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        purinePyrimidineColour_actionPerformed();
+      }
+    });
 
     /*
-     * covariationColour.addActionListener(new java.awt.event.ActionListener() {
+     * covariationColour.addActionListener(new ActionListener() {
      * public void actionPerformed(ActionEvent e) {
      * covariationColour_actionPerformed(); } });
      */
+    abovePIDColour.setText(MessageManager
+            .getString("label.above_identity_percentage"));
+    abovePIDColour.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        abovePIDColour_actionPerformed();
+      }
+    });
+
+    modifyPID.setText(MessageManager
+            .getString("label.modify_identity_threshold"));
+    modifyPID.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        modifyPID_actionPerformed();
+      }
+    });
 
     conservationMenuItem.setText(MessageManager
             .getString("label.conservation"));
-    conservationMenuItem
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                conservationMenuItem_actionPerformed();
-              }
-            });
+    conservationMenuItem.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        conservationMenuItem_actionPerformed();
+      }
+    });
+
+    modifyConservation.setText(MessageManager
+            .getString("label.modify_conservation_threshold"));
+    modifyConservation.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        modifyConservation_actionPerformed();
+      }
+    });
+  }
+
+  protected void modifyConservation_actionPerformed()
+  {
+    SequenceGroup sg = getGroup();
+    if (sg.cs != null)
+    {
+      SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());
+      SliderPanel.showConservationSlider();
+    }
+  }
+
+  protected void modifyPID_actionPerformed()
+  {
+    SequenceGroup sg = getGroup();
+    if (sg.cs != null)
+    {
+      // int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
+      // .getName());
+      // sg.cs.setThreshold(threshold, ap.av.isIgnoreGapsConsensus());
+      SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
+              .getName());
+      SliderPanel.showPIDSlider();
+    }
   }
 
   /**
@@ -1863,7 +1910,8 @@ public class PopupMenu extends JPopupMenu
       return;
     }
 
-    if (abovePIDColour.isSelected())
+    boolean selected = abovePIDColour.isSelected();
+    if (selected)
     {
       sg.cs.setConsensus(AAFrequency.calculate(
               sg.getSequences(ap.av.getHiddenRepSequences()),
@@ -1880,7 +1928,9 @@ public class PopupMenu extends JPopupMenu
     // remove PIDColouring
     {
       sg.cs.setThreshold(0, ap.av.isIgnoreGapsConsensus());
+      SliderPanel.hidePIDSlider();
     }
+    modifyPID.setEnabled(selected);
 
     refresh();
   }
@@ -1982,7 +2032,8 @@ public class PopupMenu extends JPopupMenu
       return;
     }
 
-    if (conservationMenuItem.isSelected())
+    boolean selected = conservationMenuItem.isSelected();
+    if (selected)
     {
       // JBPNote: Conservation name shouldn't be i18n translated
       Conservation c = new Conservation("Group", sg.getSequences(ap.av
@@ -2001,7 +2052,9 @@ public class PopupMenu extends JPopupMenu
     // remove ConservationColouring
     {
       sg.cs.setConservation(null);
+      SliderPanel.hideConservationSlider();
     }
+    modifyConservation.setEnabled(selected);
 
     refresh();
   }
index a9d2690..cbbcf70 100755 (executable)
@@ -82,6 +82,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
 
     slider.addChangeListener(new ChangeListener()
     {
+      @Override
       public void stateChanged(ChangeEvent evt)
       {
         valueField.setText(slider.getValue() + "");
@@ -105,6 +106,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
             false);
     frame.addInternalFrameListener(new InternalFrameAdapter()
     {
+      @Override
       public void internalFrameClosing(InternalFrameEvent evt)
       {
         ap.getIdPanel().getIdCanvas().setHighlighted(null);
@@ -125,6 +127,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
    * 
    * @return DOCUMENT ME!
    */
+  @Override
   public void run()
   {
     JProgressBar progress = new JProgressBar();
@@ -207,6 +210,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void applyButton_actionPerformed(ActionEvent e)
   {
     Vector del = new Vector();
@@ -271,6 +275,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void undoButton_actionPerformed(ActionEvent e)
   {
     if (historyList == null || historyList.isEmpty())
@@ -297,22 +302,4 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
     }
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
-   */
-  public void valueField_actionPerformed(ActionEvent e)
-  {
-    try
-    {
-      int i = Integer.parseInt(valueField.getText());
-      slider.setValue(i);
-    } catch (Exception ex)
-    {
-      valueField.setText(slider.getValue() + "");
-    }
-  }
-
 }
index 0aa2459..8961f21 100755 (executable)
@@ -326,77 +326,29 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
   }
 
   /**
-   * DOCUMENT ME!
+   * Action on dragging the mouse in the scale panel is to expand or shrink the
+   * selection group range (including any hidden columns that it spans)
    * 
    * @param evt
-   *          DOCUMENT ME!
    */
   @Override
   public void mouseDragged(MouseEvent evt)
   {
     mouseDragging = true;
+    ColumnSelection cs = av.getColumnSelection();
 
     int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
-    if (res < 0)
-    {
-      res = 0;
-    }
-
-    if (av.hasHiddenColumns())
-    {
-      res = av.getColumnSelection().adjustForHiddenColumns(res);
-    }
-
-    if (res >= av.getAlignment().getWidth())
-    {
-      res = av.getAlignment().getWidth() - 1;
-    }
-
-    if (res < min)
-    {
-      min = res;
-    }
-
-    if (res > max)
-    {
-      max = res;
-    }
+    res = Math.max(0, res);
+    res = cs.adjustForHiddenColumns(res);
+    res = Math.min(res, av.getAlignment().getWidth() - 1);
+    min = Math.min(res, min);
+    max = Math.max(res, max);
 
     SequenceGroup sg = av.getSelectionGroup();
-
     if (sg != null)
     {
       stretchingGroup = true;
-
-      if (!av.getColumnSelection().contains(res))
-      {
-        av.getColumnSelection().addElement(res);
-      }
-
-      if (res > sg.getStartRes())
-      {
-        sg.setEndRes(res);
-      }
-      if (res < sg.getStartRes())
-      {
-        sg.setStartRes(res);
-      }
-
-      int col;
-      for (int i = min; i <= max; i++)
-      {
-        col = i; // av.getColumnSelection().adjustForHiddenColumns(i);
-
-        if ((col < sg.getStartRes()) || (col > sg.getEndRes()))
-        {
-          av.getColumnSelection().removeElement(col);
-        }
-        else
-        {
-          av.getColumnSelection().addElement(col);
-        }
-      }
-
+      cs.stretchGroup(res, sg, min, max);
       ap.paintAlignment(false);
     }
   }
@@ -424,6 +376,9 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
   {
   }
 
+  /**
+   * Creates a tooltip when the mouse is over a hidden columns marker
+   */
   @Override
   public void mouseMoved(MouseEvent evt)
   {
@@ -448,11 +403,11 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
           ToolTipManager.sharedInstance().registerComponent(this);
           this.setToolTipText(MessageManager
                   .getString("label.reveal_hidden_columns"));
-          break;
+          repaint();
+          return;
         }
       }
     }
-    repaint();
   }
 
   /**
index 5b87445..4fdb25a 100644 (file)
@@ -1737,7 +1737,7 @@ public class SeqPanel extends JPanel implements MouseListener,
         SliderPanel.setConservationSlider(ap, stretchGroup.cs,
                 stretchGroup.getName());
       }
-      else
+      if (stretchGroup.cs.getThreshold() > 0)
       {
         SliderPanel.setPIDSliderSource(ap, stretchGroup.cs,
                 stretchGroup.getName());
index a381e8b..62ee954 100755 (executable)
@@ -25,15 +25,17 @@ import jalview.jbgui.GSliderPanel;
 import jalview.schemes.ColourSchemeI;
 import jalview.util.MessageManager;
 
-import java.awt.event.ActionEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.beans.PropertyVetoException;
 import java.util.Iterator;
 
 import javax.swing.JInternalFrame;
 import javax.swing.JLayeredPane;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
+import javax.swing.event.InternalFrameAdapter;
+import javax.swing.event.InternalFrameEvent;
 
 /**
  * DOCUMENT ME!
@@ -91,6 +93,7 @@ public class SliderPanel extends GSliderPanel
 
     slider.addChangeListener(new ChangeListener()
     {
+      @Override
       public void stateChanged(ChangeEvent evt)
       {
         valueField.setText(slider.getValue() + "");
@@ -100,6 +103,7 @@ public class SliderPanel extends GSliderPanel
 
     slider.addMouseListener(new MouseAdapter()
     {
+      @Override
       public void mouseReleased(MouseEvent evt)
       {
         ap.paintAlignment(true);
@@ -137,6 +141,7 @@ public class SliderPanel extends GSliderPanel
     else
     {
       sp = (SliderPanel) conservationSlider.getContentPane();
+      sp.valueField.setText(String.valueOf(cs.getConservationInc()));
       sp.cs = cs;
     }
 
@@ -158,27 +163,55 @@ public class SliderPanel extends GSliderPanel
   }
 
   /**
-   * DOCUMENT ME!
+   * Hides the PID slider panel if it is shown
    */
-  public static void showConservationSlider()
+  public static void hidePIDSlider()
   {
-    try
+    if (PIDSlider != null)
     {
-      PIDSlider.setClosed(true);
-      PIDSlider = null;
-    } catch (Exception ex)
+      try
+      {
+        PIDSlider.setClosed(true);
+        PIDSlider = null;
+      } catch (PropertyVetoException ex)
+      {
+      }
+    }
+  }
+
+  /**
+   * Hides the conservation slider panel if it is shown
+   */
+  public static void hideConservationSlider()
+  {
+    if (conservationSlider != null)
     {
+      try
+      {
+        conservationSlider.setClosed(true);
+        conservationSlider = null;
+      } catch (PropertyVetoException ex)
+      {
+      }
     }
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  public static void showConservationSlider()
+  {
+    hidePIDSlider();
 
     if (!conservationSlider.isVisible())
     {
       Desktop.addInternalFrame(conservationSlider,
               conservationSlider.getTitle(), 420, 90, false);
       conservationSlider
-              .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
+              .addInternalFrameListener(new InternalFrameAdapter()
               {
-                public void internalFrameClosed(
-                        javax.swing.event.InternalFrameEvent e)
+                @Override
+                public void internalFrameClosed(InternalFrameEvent e)
                 {
                   conservationSlider = null;
                 }
@@ -216,6 +249,7 @@ public class SliderPanel extends GSliderPanel
     else
     {
       pid = (SliderPanel) PIDSlider.getContentPane();
+      pid.valueField.setText(String.valueOf(cs.getThreshold()));
       pid.cs = cs;
     }
 
@@ -241,28 +275,21 @@ public class SliderPanel extends GSliderPanel
    */
   public static void showPIDSlider()
   {
-    try
-    {
-      conservationSlider.setClosed(true);
-      conservationSlider = null;
-    } catch (Exception ex)
-    {
-    }
+    hideConservationSlider();
 
     if (!PIDSlider.isVisible())
     {
       Desktop.addInternalFrame(PIDSlider, PIDSlider.getTitle(), 420, 90,
               false);
       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
-      PIDSlider
-              .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
-              {
-                public void internalFrameClosed(
-                        javax.swing.event.InternalFrameEvent e)
-                {
-                  PIDSlider = null;
-                }
-              });
+      PIDSlider.addInternalFrameListener(new InternalFrameAdapter()
+      {
+        @Override
+        public void internalFrameClosed(InternalFrameEvent e)
+        {
+          PIDSlider = null;
+        }
+      });
       PIDSlider.setLayer(JLayeredPane.PALETTE_LAYER);
     }
   }
@@ -329,24 +356,6 @@ public class SliderPanel extends GSliderPanel
   /**
    * DOCUMENT ME!
    * 
-   * @param e
-   *          DOCUMENT ME!
-   */
-  public void valueField_actionPerformed(ActionEvent e)
-  {
-    try
-    {
-      int i = Integer.parseInt(valueField.getText());
-      slider.setValue(i);
-    } catch (NumberFormatException ex)
-    {
-      valueField.setText(slider.getValue() + "");
-    }
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
    * @param value
    *          DOCUMENT ME!
    */
@@ -365,6 +374,7 @@ public class SliderPanel extends GSliderPanel
     return Integer.parseInt(valueField.getText());
   }
 
+  @Override
   public void slider_mouseReleased(MouseEvent e)
   {
     if (ap.overviewPanel != null)
index 6fa4493..25f4c1b 100755 (executable)
@@ -749,7 +749,6 @@ public class TreePanel extends GTreePanel
     try
     {
       JalviewFileChooser chooser = new JalviewFileChooser(
-              Cache.getProperty("LAST_DIRECTORY"),
               ImageMaker.EPS_EXTENSION, ImageMaker.EPS_EXTENSION);
       chooser.setFileView(new JalviewFileView());
       chooser.setDialogTitle(MessageManager
@@ -796,7 +795,6 @@ public class TreePanel extends GTreePanel
     try
     {
       JalviewFileChooser chooser = new JalviewFileChooser(
-              Cache.getProperty("LAST_DIRECTORY"),
               ImageMaker.PNG_EXTENSION, ImageMaker.PNG_DESCRIPTION);
 
       chooser.setFileView(new jalview.io.JalviewFileView());
index 0df23e0..6b4bd10 100755 (executable)
@@ -21,7 +21,6 @@
 package jalview.gui;
 
 import jalview.api.structures.JalviewStructureDisplayI;
-import jalview.bin.Cache;
 import jalview.datamodel.SequenceGroup;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
@@ -597,8 +596,7 @@ public class UserDefinedColours extends GUserDefinedColours implements
     upperCaseButtons = new ArrayList<JButton>();
     lowerCaseButtons = new ArrayList<JButton>();
 
-    JalviewFileChooser chooser = new JalviewFileChooser(
-            Cache.getProperty("LAST_DIRECTORY"), "jc",
+    JalviewFileChooser chooser = new JalviewFileChooser("jc",
             "Jalview User Colours");
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(MessageManager
@@ -832,8 +830,7 @@ public class UserDefinedColours extends GUserDefinedColours implements
 
       userColourSchemes.remove(schemeName.getText());
     }
-    JalviewFileChooser chooser = new JalviewFileChooser(
-            Cache.getProperty("LAST_DIRECTORY"), "jc",
+    JalviewFileChooser chooser = new JalviewFileChooser("jc",
             "Jalview User Colours");
 
     chooser.setFileView(new JalviewFileView());
index b260e1b..1aa0803 100644 (file)
@@ -183,8 +183,7 @@ public class WsParamSetManager implements ParamManager
     }
     if (filename == null)
     {
-      JalviewFileChooser chooser = new JalviewFileChooser(
-              Cache.getProperty("LAST_DIRECTORY"), "wsparams",
+      JalviewFileChooser chooser = new JalviewFileChooser("wsparams",
               "Web Service Parameter File");
       chooser.setFileView(new JalviewFileView());
       chooser.setDialogTitle(MessageManager
index 158489e..19a61cf 100644 (file)
@@ -74,7 +74,9 @@ public class FileFormats
    */
   public void registerFileFormat(FileFormatI format)
   {
-    registerFileFormat(format, false);
+    boolean isIdentifiable = format instanceof FileFormat
+            && ((FileFormat) format).isIdentifiable();
+    registerFileFormat(format, isIdentifiable);
   }
 
   protected void registerFileFormat(FileFormatI format,
index b0ca25b..68f3e2c 100755 (executable)
@@ -1,7 +1,6 @@
 package jalview.io;
 
 import jalview.api.AlignExportSettingI;
-import jalview.bin.Cache;
 import jalview.datamodel.AlignmentExportData;
 import jalview.exceptions.NoFileSelectedException;
 import jalview.gui.AlignmentPanel;
@@ -243,8 +242,8 @@ public abstract class HTMLOutput implements Runnable
               pSessionId);
     }
 
-    JalviewFileChooser jvFileChooser = new JalviewFileChooser(
-            Cache.getProperty("LAST_DIRECTORY"), "html", "HTML files");
+    JalviewFileChooser jvFileChooser = new JalviewFileChooser("html",
+            "HTML files");
     jvFileChooser.setFileView(new JalviewFileView());
 
     jvFileChooser.setDialogTitle(MessageManager
index 2a0f8b1..98cd162 100755 (executable)
@@ -21,6 +21,7 @@
 //////////////////////////////////////////////////////////////////
 package jalview.io;
 
+import jalview.bin.Cache;
 import jalview.gui.JvOptionPane;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
@@ -124,16 +125,13 @@ public class JalviewFileChooser extends JFileChooser
   /**
    * Constructor for a single choice of file extension and description
    * 
-   * @param dir
    * @param extension
    * @param desc
    */
-  public JalviewFileChooser(String dir, String extension, String desc)
+  public JalviewFileChooser(String extension, String desc)
   {
-    // TODO inline dir as Cache.getProperty("LAST_DIRECTORY") ? if applet
-    // builds ok
-    this(dir, new String[] { extension }, new String[] { desc }, desc,
-            true);
+    this(Cache.getProperty("LAST_DIRECTORY"), new String[] { extension },
+            new String[] { desc }, desc, true);
   }
 
   JalviewFileChooser(String dir, String[] extensions, String[] descs,
index dc17397..6530d3d 100755 (executable)
@@ -155,6 +155,8 @@ public class GAlignFrame extends JInternalFrame
 
   protected JMenuItem modifyConservation = new JMenuItem();
 
+  protected JMenuItem modifyPID = new JMenuItem();
+
   protected JMenu sortByTreeMenu = new JMenu();
 
   protected JMenu sort = new JMenu();
@@ -1118,7 +1120,7 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        conservationMenuItem_actionPerformed(e);
+        conservationMenuItem_actionPerformed();
       }
     });
     noColourmenuItem.setText(MessageManager.getString("label.none"));
@@ -1189,7 +1191,7 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        abovePIDThreshold_actionPerformed(e);
+        abovePIDThreshold_actionPerformed();
       }
     });
     showSeqFeatures.setText(MessageManager
@@ -1604,14 +1606,14 @@ public class GAlignFrame extends JInternalFrame
 
     });
 
-    JMenuItem modifyPID = new JMenuItem(
+    modifyPID = new JMenuItem(
             MessageManager.getString("label.modify_identity_threshold"));
     modifyPID.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        modifyPID_actionPerformed(e);
+        modifyPID_actionPerformed();
       }
     });
     modifyConservation.setText(MessageManager
@@ -1621,7 +1623,7 @@ public class GAlignFrame extends JInternalFrame
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        modifyConservation_actionPerformed(e);
+        modifyConservation_actionPerformed();
       }
     });
     sortByTreeMenu
@@ -2817,7 +2819,7 @@ public class GAlignFrame extends JInternalFrame
   {
   }
 
-  protected void conservationMenuItem_actionPerformed(ActionEvent e)
+  protected void conservationMenuItem_actionPerformed()
   {
   }
 
@@ -2833,7 +2835,7 @@ public class GAlignFrame extends JInternalFrame
   {
   }
 
-  protected void abovePIDThreshold_actionPerformed(ActionEvent e)
+  protected void abovePIDThreshold_actionPerformed()
   {
   }
 
@@ -2954,11 +2956,11 @@ public class GAlignFrame extends JInternalFrame
   {
   }
 
-  protected void modifyPID_actionPerformed(ActionEvent e)
+  protected void modifyPID_actionPerformed()
   {
   }
 
-  protected void modifyConservation_actionPerformed(ActionEvent e)
+  protected void modifyConservation_actionPerformed()
   {
   }
 
index 1362007..0c79c6c 100755 (executable)
@@ -28,6 +28,9 @@ import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 
@@ -105,6 +108,7 @@ public class GSliderPanel extends JPanel
     slider.setDoubleBuffered(true);
     slider.addMouseListener(new MouseAdapter()
     {
+      @Override
       public void mouseReleased(MouseEvent e)
       {
         slider_mouseReleased(e);
@@ -115,11 +119,20 @@ public class GSliderPanel extends JPanel
     valueField.setPreferredSize(new Dimension(50, 12));
     valueField.setText("");
     valueField.setHorizontalAlignment(SwingConstants.CENTER);
-    valueField.addActionListener(new java.awt.event.ActionListener()
+    valueField.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
-        valueField_actionPerformed(e);
+        valueField_actionPerformed();
+      }
+    });
+    valueField.addFocusListener(new FocusAdapter()
+    {
+      @Override
+      public void focusLost(FocusEvent e)
+      {
+        valueField_actionPerformed();
       }
     });
     label.setFont(new java.awt.Font("Verdana", 0, 11));
@@ -134,6 +147,7 @@ public class GSliderPanel extends JPanel
     applyButton.setText(MessageManager.getString("action.apply"));
     applyButton.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         applyButton_actionPerformed(e);
@@ -145,6 +159,7 @@ public class GSliderPanel extends JPanel
     undoButton.setText(MessageManager.getString("action.undo"));
     undoButton.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         undoButton_actionPerformed(e);
@@ -157,6 +172,7 @@ public class GSliderPanel extends JPanel
             .getString("action.apply_all_groups"));
     allGroupsCheck.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         allGroupsCheck_actionPerformed(e);
@@ -180,13 +196,18 @@ public class GSliderPanel extends JPanel
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Action on changing the slider text field value
    */
-  protected void valueField_actionPerformed(ActionEvent e)
+  protected void valueField_actionPerformed()
   {
+    try
+    {
+      int i = Integer.valueOf(valueField.getText());
+      slider.setValue(i);
+    } catch (NumberFormatException ex)
+    {
+      valueField.setText(String.valueOf(slider.getValue()));
+    }
   }
 
   /**
index 2b2314b..ee74b9b 100755 (executable)
@@ -26,15 +26,12 @@ import jalview.util.MessageManager;
 import java.io.PrintStream;
 
 /**
- * DOCUMENT ME!
- * 
- * @author $author$
- * @version $Revision$
+ * A class to model rectangular matrices of double values and operations on them
  */
 public class Matrix implements MatrixI
 {
   /*
-   * the [row][column] values in the matrix
+   * the cell values in row-major order
    */
   private double[][] value;
 
@@ -48,10 +45,8 @@ public class Matrix implements MatrixI
    */
   protected int cols;
 
-  /** DOCUMENT ME!! */
   protected double[] d; // Diagonal
 
-  /** DOCUMENT ME!! */
   protected double[] e; // off diagonal
 
   /**
@@ -89,10 +84,7 @@ public class Matrix implements MatrixI
   public Matrix(double[][] values)
   {
     this.rows = values.length;
-    if (rows > 0)
-    {
-      this.cols = values[0].length;
-    }
+    this.cols = this.rows == 0 ? 0 : values[0].length;
     this.value = values;
   }
 
@@ -372,7 +364,7 @@ public class Matrix implements MatrixI
 
           for (k = 1; k <= l; k++)
           {
-            double x = addValue(k - 1, j - 1, -(g * getValue(k - 1, i - 1)));
+            addValue(k - 1, j - 1, -(g * getValue(k - 1, i - 1)));
           }
         }
       }
index 8f8af54..fa2533f 100755 (executable)
@@ -20,7 +20,6 @@
  */
 package jalview.util;
 
-import jalview.bin.Cache;
 import jalview.bin.Jalview;
 import jalview.gui.EPSOptions;
 import jalview.gui.IProgressIndicator;
@@ -310,8 +309,7 @@ public class ImageMaker
     {
       return null;
     }
-    return new JalviewFileChooser(Cache.getProperty("LAST_DIRECTORY"),
-            PNG_EXTENSION, PNG_DESCRIPTION);
+    return new JalviewFileChooser(PNG_EXTENSION, PNG_DESCRIPTION);
   }
 
   static JalviewFileChooser getEPSChooser()
@@ -320,8 +318,7 @@ public class ImageMaker
     {
       return null;
     }
-    return new JalviewFileChooser(Cache.getProperty("LAST_DIRECTORY"),
-            EPS_EXTENSION, EPS_DESCRIPTION);
+    return new JalviewFileChooser(EPS_EXTENSION, EPS_DESCRIPTION);
   }
 
   private void setProgressMessage(String message)
@@ -338,7 +335,6 @@ public class ImageMaker
     {
       return null;
     }
-    return new JalviewFileChooser(Cache.getProperty("LAST_DIRECTORY"),
-            SVG_EXTENSION, SVG_DESCRIPTION);
+    return new JalviewFileChooser(SVG_EXTENSION, SVG_DESCRIPTION);
   }
 }
index f1b83b8..139ee19 100644 (file)
@@ -97,12 +97,12 @@ public class ParseHtmlBodyAndLinks
   public ParseHtmlBodyAndLinks(String description, boolean removeHTML,
           String newline)
   {
-    StringBuilder sb = new StringBuilder(description.length());
     if (description == null || description.length() == 0)
     {
       htmlContent = false;
       return;
     }
+    StringBuilder sb = new StringBuilder(description.length());
     if (description.toUpperCase().indexOf("<HTML>") == -1)
     {
       htmlContent = false;
index a8258e2..b85073f 100644 (file)
@@ -108,8 +108,8 @@ public class Alignment extends InputType
   @Override
   public List<String> getURLEncodedParameter()
   {
-    ArrayList<String> prms = new ArrayList<String>();
-    prms.add("format='" + format + "'");
+    List<String> prms = new ArrayList<String>();
+    prms.add("format='" + format.getName() + "'");
     if (type != null)
     {
       prms.add("type='" + type.toString() + "'");
index a9ad4c2..1d819c9 100644 (file)
@@ -205,12 +205,11 @@ public class ColumnSelectionTest
     assertEquals("[5, 5]", Arrays.toString(hidden.get(1)));
 
     // hiding column 4 expands [3, 3] to [3, 4]
-    // not fancy enough to coalesce this into [3, 5] though
+    // and merges to [5, 5] to make [3, 5]
     cs.hideColumns(4);
     hidden = cs.getHiddenColumns();
-    assertEquals(2, hidden.size());
-    assertEquals("[3, 4]", Arrays.toString(hidden.get(0)));
-    assertEquals("[5, 5]", Arrays.toString(hidden.get(1)));
+    assertEquals(1, hidden.size());
+    assertEquals("[3, 5]", Arrays.toString(hidden.get(0)));
 
     // clear hidden columns (note they are added to selected)
     cs.revealAllHiddenColumns();
@@ -761,4 +760,122 @@ public class ColumnSelectionTest
     assertEquals("[5, 7]", Arrays.toString(cs2.getHiddenColumns().get(0)));
     assertEquals("[10, 11]", Arrays.toString(cs2.getHiddenColumns().get(1)));
   }
+
+  /**
+   * Test for the case when a hidden range encloses more one already hidden
+   * range
+   */
+  @Test(groups = { "Functional" })
+  public void testHideColumns_subsumingHidden()
+  {
+    /*
+     * JAL-2370 bug scenario:
+     * two hidden ranges subsumed by a third
+     */
+    ColumnSelection cs = new ColumnSelection();
+    cs.hideColumns(49, 59);
+    cs.hideColumns(69, 79);
+    List<int[]> hidden = cs.getHiddenColumns();
+    assertEquals(2, hidden.size());
+    assertEquals("[49, 59]", Arrays.toString(hidden.get(0)));
+    assertEquals("[69, 79]", Arrays.toString(hidden.get(1)));
+  
+    cs.hideColumns(48, 80);
+    hidden = cs.getHiddenColumns();
+    assertEquals(1, hidden.size());
+    assertEquals("[48, 80]", Arrays.toString(hidden.get(0)));
+
+    /*
+     * another...joining hidden ranges
+     */
+    cs = new ColumnSelection();
+    cs.hideColumns(10, 20);
+    cs.hideColumns(30, 40);
+    cs.hideColumns(50, 60);
+    // hiding 21-49 should merge to one range
+    cs.hideColumns(21, 49);
+    hidden = cs.getHiddenColumns();
+    assertEquals(1, hidden.size());
+    assertEquals("[10, 60]", Arrays.toString(hidden.get(0)));
+
+    /*
+     * another...lef overlap, subsumption, right overlap,
+     * no overlap of existing hidden ranges
+     */
+    cs = new ColumnSelection();
+    cs.hideColumns(10, 20);
+    cs.hideColumns(10, 20);
+    cs.hideColumns(30, 35);
+    cs.hideColumns(40, 50);
+    cs.hideColumns(60, 70);
+
+    cs.hideColumns(15, 45);
+    hidden = cs.getHiddenColumns();
+    assertEquals(2, hidden.size());
+    assertEquals("[10, 50]", Arrays.toString(hidden.get(0)));
+    assertEquals("[60, 70]", Arrays.toString(hidden.get(1)));
+  }
+
+  @Test(groups = { "Functional" })
+  public void testStretchGroup_expand()
+  {
+    /*
+     * test that emulates clicking column 4 (selected)
+     * and dragging right to column 5 (all base 0)
+     */
+    ColumnSelection cs = new ColumnSelection();
+    cs.addElement(4);
+    SequenceGroup sg = new SequenceGroup();
+    sg.setStartRes(4);
+    sg.setEndRes(4);
+    cs.stretchGroup(5, sg, 4, 4);
+    assertEquals(cs.getSelected().size(), 2);
+    assertTrue(cs.contains(4));
+    assertTrue(cs.contains(5));
+    assertEquals(sg.getStartRes(), 4);
+    assertEquals(sg.getEndRes(), 5);
+
+    /*
+     * emulate drag right with columns 10-20 already selected
+     */
+    cs.clear();
+    for (int i = 10; i <= 20; i++)
+    {
+      cs.addElement(i);
+    }
+    assertEquals(cs.getSelected().size(), 11);
+    sg = new SequenceGroup();
+    sg.setStartRes(10);
+    sg.setEndRes(20);
+    cs.stretchGroup(21, sg, 10, 20);
+    assertEquals(cs.getSelected().size(), 12);
+    assertTrue(cs.contains(10));
+    assertTrue(cs.contains(21));
+    assertEquals(sg.getStartRes(), 10);
+    assertEquals(sg.getEndRes(), 21);
+  }
+
+  @Test(groups = { "Functional" })
+  public void testStretchGroup_shrink()
+  {
+    /*
+     * emulate drag left to 19 with columns 10-20 already selected
+     */
+    ColumnSelection cs = new ColumnSelection();
+    for (int i = 10; i <= 20; i++)
+    {
+      cs.addElement(i);
+    }
+    assertEquals(cs.getSelected().size(), 11);
+    SequenceGroup sg = new SequenceGroup();
+    sg.setStartRes(10);
+    sg.setEndRes(20);
+    cs.stretchGroup(19, sg, 10, 20);
+    assertEquals(cs.getSelected().size(), 10);
+    assertTrue(cs.contains(10));
+    assertTrue(cs.contains(19));
+    assertFalse(cs.contains(20));
+    assertEquals(sg.getStartRes(), 10);
+    assertEquals(sg.getEndRes(), 19);
+  }
 }
index 8df228f..ffc844c 100644 (file)
@@ -21,17 +21,21 @@ public class FileFormatsTest
   }
 
   @Test(groups = "Functional")
-  public void testIsDynamic()
+  public void testIsIdentifiable()
   {
     FileFormats formats = FileFormats.getInstance();
-    for (FileFormatI ff : FileFormat.values())
-    {
-      assertFalse(formats.isIdentifiable(ff));
-    }
-    assertTrue(formats.isIdentifiable(null));
+    assertTrue(formats.isIdentifiable(formats.forName(FileFormat.Fasta
+            .getName())));
+    assertTrue(formats.isIdentifiable(formats.forName(FileFormat.MMCif
+            .getName())));
+    assertTrue(formats.isIdentifiable(formats.forName(FileFormat.Jnet
+            .getName())));
+    assertFalse(formats.isIdentifiable(formats.forName(FileFormat.Jalview
+            .getName())));
+    assertFalse(formats.isIdentifiable(null));
 
     /*
-     * remove and re-add a format: it is now considered 'dynamically added'
+     * remove and re-add a format: it is still 'identifiable'
      */
     formats.deregisterFileFormat(FileFormat.Fasta.getName());
     assertNull(formats.forName(FileFormat.Fasta.getName()));
@@ -104,7 +108,7 @@ public class FileFormatsTest
     FileFormats formats = FileFormats.getInstance();
     assertSame(FileFormat.MMCif,
             formats.forName(FileFormat.MMCif.getName()));
-    assertFalse(formats.isIdentifiable(FileFormat.MMCif));
+    assertTrue(formats.isIdentifiable(FileFormat.MMCif));
 
     /*
      * deregister mmCIF format
@@ -114,7 +118,7 @@ public class FileFormatsTest
 
     /*
      * re-register mmCIF format
-     * it is reinstated (but now classed as 'dynamic')
+     * it is reinstated (still 'identifiable')
      */
     formats.registerFileFormat(FileFormat.MMCif);
     assertSame(FileFormat.MMCif,
index bd5614f..961602d 100644 (file)
@@ -1,6 +1,7 @@
 package jalview.math;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.util.Arrays;
@@ -32,8 +33,8 @@ public class MatrixTest
   @Test(groups = "Functional")
   public void testPreMultiply()
   {
-    MatrixI m1 = new Matrix(new double[][] { { 2, 3, 4 } }); // 1x3
-    MatrixI m2 = new Matrix(new double[][] { { 5 }, { 6 }, { 7 } }); // 3x1
+    Matrix m1 = new Matrix(new double[][] { { 2, 3, 4 } }); // 1x3
+    Matrix m2 = new Matrix(new double[][] { { 5 }, { 6 }, { 7 } }); // 3x1
 
     /*
      * 1x3 times 3x1 is 1x1
@@ -169,6 +170,26 @@ public class MatrixTest
     assertEquals(m3.getRow(0)[1], 25d);
   }
 
+  @Test(groups = "Functional")
+  public void testCopy()
+  {
+    Random r = new Random();
+    int rows = 5;
+    int cols = 11;
+    double[][] in = new double[rows][cols];
+
+    for (int i = 0; i < rows; i++)
+    {
+      for (int j = 0; j < cols; j++)
+      {
+        in[i][j] = r.nextDouble();
+      }
+    }
+    Matrix m1 = new Matrix(in);
+    Matrix m2 = (Matrix) m1.copy();
+    assertTrue(matrixEquals(m1, m2));
+  }
+
   /**
    * main method extracted from Matrix
    *