Merge branch 'develop' into feature_29/JAL-1372_referenceseq
authorJim Procter <jprocter@dundee.ac.uk>
Fri, 23 Jan 2015 14:06:11 +0000 (14:06 +0000)
committerJim Procter <jprocter@dundee.ac.uk>
Fri, 23 Jan 2015 14:06:11 +0000 (14:06 +0000)
finessing between two branches where bugs are patched twice
Conflicts:
src/jalview/appletgui/ScalePanel.java
src/jalview/appletgui/SeqCanvas.java
src/jalview/datamodel/ColumnSelection.java

14 files changed:
src/jalview/appletgui/AlignFrame.java
src/jalview/appletgui/AlignViewport.java
src/jalview/appletgui/AnnotationColourChooser.java
src/jalview/appletgui/AnnotationColumnChooser.java [new file with mode: 0644]
src/jalview/appletgui/AnnotationRowFilter.java [new file with mode: 0644]
src/jalview/appletgui/ScalePanel.java
src/jalview/appletgui/SeqCanvas.java
src/jalview/appletgui/TitledPanel.java [new file with mode: 0644]
src/jalview/controller/AlignViewController.java
src/jalview/datamodel/ColumnSelection.java
src/jalview/gui/AnnotationColourChooser.java
src/jalview/gui/AnnotationColumnChooser.java
src/jalview/gui/AnnotationRowFilter.java
src/jalview/gui/JvSwingUtils.java

index f4cfc3f..5421050 100644 (file)
@@ -1106,6 +1106,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {
       new AnnotationColourChooser(viewport, alignPanel);
     }
+    else if (source == annotationColumnSelection)
+    {
+      new AnnotationColumnChooser(viewport, alignPanel);
+    }
     else if (source == sortPairwiseMenuItem)
     {
       sortPairwiseMenuItem_actionPerformed();
@@ -3267,6 +3271,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     annotationColour.setLabel(MessageManager
             .getString("action.by_annotation"));
     annotationColour.addActionListener(this);
+
+    annotationColumnSelection.setLabel("Select by Annotation");
+    annotationColumnSelection.addActionListener(this);
+
     invertSequenceMenuItem.setLabel(MessageManager
             .getString("action.invert_sequence_selection"));
     invertColSel.setLabel(MessageManager
@@ -3455,6 +3463,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     selectMenu.add(unGroup);
     selectMenu.add(grpsFromSelection);
     selectMenu.add(deleteGroups);
+    selectMenu.add(annotationColumnSelection);
 
   }
 
@@ -3469,6 +3478,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem annotationColour = new MenuItem();
 
+  MenuItem annotationColumnSelection = new MenuItem();
+
   MenuItem invertColSel = new MenuItem();
 
   Menu menu1 = new Menu();
index 9a15e10..1767164 100644 (file)
  */
 package jalview.appletgui;
 
-import java.util.*;
-
-import java.awt.*;
-
-import jalview.analysis.*;
+import jalview.analysis.NJTree;
 import jalview.api.AlignViewportI;
-import jalview.bin.*;
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import jalview.bin.JalviewLite;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.schemes.ColourSchemeProperty;
+import jalview.schemes.UserColourScheme;
 import jalview.structure.SelectionSource;
 import jalview.structure.VamsasSource;
 import jalview.viewmodel.AlignmentViewport;
 
+import java.awt.Font;
+import java.util.Stack;
+
 public class AlignViewport extends AlignmentViewport implements
         AlignViewportI, SelectionSource, VamsasSource
 {
@@ -94,6 +98,8 @@ public class AlignViewport extends AlignmentViewport implements
 
   Stack redoList = new Stack();
 
+  private AnnotationColumnChooser annotationColumnSelectionState;
+
   public void finalize()
   {
     applet = null;
@@ -648,4 +654,15 @@ public class AlignViewport extends AlignmentViewport implements
     return validCharWidth;
   }
 
+  public AnnotationColumnChooser getAnnotationColumnSelectionState()
+  {
+    return annotationColumnSelectionState;
+  }
+
+  public void setAnnotationColumnSelectionState(
+          AnnotationColumnChooser annotationColumnSelectionState)
+  {
+    this.annotationColumnSelectionState = annotationColumnSelectionState;
+  }
+
 }
index c7b7c6c..cc2e530 100644 (file)
  */
 package jalview.appletgui;
 
-import java.util.*;
-
-import java.awt.*;
-import java.awt.event.*;
-
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import jalview.datamodel.SequenceGroup;
+import jalview.schemes.AnnotationColourGradient;
+import jalview.schemes.ColourSchemeI;
 import jalview.util.MessageManager;
 
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.Checkbox;
+import java.awt.Choice;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.Scrollbar;
+import java.awt.TextField;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.AdjustmentEvent;
+import java.awt.event.AdjustmentListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.Hashtable;
+import java.util.Vector;
+
 public class AnnotationColourChooser extends Panel implements
         ActionListener, AdjustmentListener, ItemListener, MouseListener
 {
@@ -104,9 +123,13 @@ public class AnnotationColourChooser extends Panel implements
     {
       String label = av.getAlignment().getAlignmentAnnotation()[i].label;
       if (!list.contains(label))
+      {
         list.addElement(label);
+      }
       else
+      {
         list.addElement(label + "_" + (index++));
+      }
     }
 
     for (int i = 0; i < list.size(); i++)
@@ -137,7 +160,9 @@ public class AnnotationColourChooser extends Panel implements
         threshold.select(1);
         break;
       default:
-        throw new Error(MessageManager.getString("error.implementation_error_dont_know_thereshold_annotationcolourgradient"));
+        throw new Error(
+                MessageManager
+                        .getString("error.implementation_error_dont_know_thereshold_annotationcolourgradient"));
       }
       thresholdIsMin.setState(acg.thresholdIsMinMax);
       thresholdValue.setText("" + acg.getAnnotationThreshold());
@@ -348,14 +373,14 @@ public class AnnotationColourChooser extends Panel implements
   {
     if (!adjusting)
     {
-      thresholdValue.setText(((float) slider.getValue() / 1000f) + "");
+      thresholdValue.setText((slider.getValue() / 1000f) + "");
       if (currentColours.getState()
               && !(av.getGlobalColourScheme() instanceof AnnotationColourGradient))
       {
         changeColour();
       }
 
-      currentAnnotation.threshold.value = (float) slider.getValue() / 1000f;
+      currentAnnotation.threshold.value = slider.getValue() / 1000f;
       ap.paintAlignment(false);
     }
   }
diff --git a/src/jalview/appletgui/AnnotationColumnChooser.java b/src/jalview/appletgui/AnnotationColumnChooser.java
new file mode 100644 (file)
index 0000000..496d4a4
--- /dev/null
@@ -0,0 +1,913 @@
+package jalview.appletgui;
+
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.ColumnSelection;
+import jalview.gui.JvSwingUtils;
+import jalview.schemes.AnnotationColourGradient;
+import jalview.util.MessageManager;
+import jalview.viewmodel.annotationfilter.AnnotationFilterParameter;
+
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Checkbox;
+import java.awt.Choice;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.TextField;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.AdjustmentEvent;
+import java.awt.event.AdjustmentListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.TextEvent;
+import java.awt.event.TextListener;
+import java.util.Iterator;
+import java.util.Vector;
+
+import net.miginfocom.swing.MigLayout;
+
+public class AnnotationColumnChooser extends AnnotationRowFilter implements
+        ActionListener, AdjustmentListener, ItemListener, MouseListener
+{
+
+  private Choice annotations = new Choice();
+
+  private Panel actionPanel = new Panel();
+
+  private TitledPanel thresholdPanel = new TitledPanel();
+
+  private Panel switchableViewsPanel = new Panel(new CardLayout());
+
+  private CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel
+          .getLayout());
+
+  private Panel noGraphFilterView = new Panel();
+
+  private Panel graphFilterView = new Panel();
+
+  private Panel annotationComboBoxPanel = new Panel();
+
+  private BorderLayout borderLayout1 = new BorderLayout();
+
+  private Choice threshold = new Choice();
+
+  private StructureFilterPanel gStructureFilterPanel;
+
+  private StructureFilterPanel ngStructureFilterPanel;
+
+  private StructureFilterPanel currentStructureFilterPanel;
+
+  private SearchPanel currentSearchPanel;
+
+  private SearchPanel gSearchPanel;
+
+  private SearchPanel ngSearchPanel;
+
+  private FurtherActionPanel currentFurtherActionPanel;
+
+  private FurtherActionPanel gFurtherActionPanel;
+
+  private FurtherActionPanel ngFurtherActionPanel;
+
+  public static final int ACTION_OPTION_SELECT = 1;
+
+  public static int ACTION_OPTION_HIDE = 2;
+
+  public static String NO_GRAPH_VIEW = "0";
+
+  public static String GRAPH_VIEW = "1";
+
+  private int actionOption = ACTION_OPTION_SELECT;
+
+  private ColumnSelection oldColumnSelection;
+
+  public AnnotationColumnChooser()
+  {
+    try
+    {
+      jbInit();
+    } catch (Exception ex)
+    {
+      ex.printStackTrace();
+    }
+  }
+
+  public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap)
+  {
+    super(av, ap);
+    frame = new Frame();
+    frame.add(this);
+    jalview.bin.JalviewLite.addFrame(frame,
+            MessageManager.getString("label.select_by_annotation"), 520,
+            215);
+
+    slider.addAdjustmentListener(this);
+    slider.addMouseListener(this);
+
+    if (av.getAlignment().getAlignmentAnnotation() == null)
+    {
+      return;
+    }
+    setOldColumnSelection(av.getColumnSelection());
+    adjusting = true;
+    Vector list = new Vector();
+    int index = 1;
+    for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
+    {
+      String label = av.getAlignment().getAlignmentAnnotation()[i].label;
+      if (!list.contains(label))
+      {
+        list.addElement(label);
+      }
+      else
+      {
+        list.addElement(label + "_" + (index++));
+      }
+    }
+
+    for (int i = 0; i < list.size(); i++)
+    {
+      annotations.addItem(list.elementAt(i).toString());
+    }
+
+    populateThresholdComboBox(threshold);
+
+    // restore Object state from the previous session if one exists
+    if (av.getAnnotationColumnSelectionState() != null)
+    {
+      currentSearchPanel = av.getAnnotationColumnSelectionState()
+              .getCurrentSearchPanel();
+      currentStructureFilterPanel = av.getAnnotationColumnSelectionState()
+              .getCurrentStructureFilterPanel();
+      annotations.select(av.getAnnotationColumnSelectionState()
+              .getAnnotations().getSelectedIndex());
+      threshold.select(av.getAnnotationColumnSelectionState()
+              .getThreshold().getSelectedIndex());
+      actionOption = av.getAnnotationColumnSelectionState()
+              .getActionOption();
+    }
+
+    try
+    {
+      jbInit();
+    } catch (Exception ex)
+    {
+    }
+    adjusting = false;
+
+    updateView();
+    frame.invalidate();
+    frame.pack();
+  }
+
+  private void jbInit() throws Exception
+  {
+    ok.setLabel(MessageManager.getString("action.ok"));
+
+    cancel.setLabel(MessageManager.getString("action.cancel"));
+
+    thresholdValue.setEnabled(false);
+    thresholdValue.setColumns(7);
+
+    ok.addActionListener(this);
+    cancel.addActionListener(this);
+    annotations.addItemListener(this);
+    thresholdValue.addActionListener(this);
+    threshold.addItemListener(this);
+
+    slider.setBackground(Color.white);
+    slider.setEnabled(false);
+    slider.setPreferredSize(new Dimension(100, 32));
+
+    thresholdPanel.setBackground(Color.white);
+    thresholdPanel.setFont(JvSwingUtils.getLabelFont());
+    thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]"));
+
+    actionPanel.setBackground(Color.white);
+    actionPanel.setFont(JvSwingUtils.getLabelFont());
+
+    graphFilterView.setLayout(new MigLayout("", "[left][right]", "[][]"));
+    graphFilterView.setBackground(Color.white);
+
+    noGraphFilterView.setLayout(new MigLayout("", "[left][right]", "[][]"));
+    noGraphFilterView.setBackground(Color.white);
+
+    annotationComboBoxPanel.setBackground(Color.white);
+    annotationComboBoxPanel.setFont(JvSwingUtils.getLabelFont());
+
+    gSearchPanel = new SearchPanel(this);
+    ngSearchPanel = new SearchPanel(this);
+    gFurtherActionPanel = new FurtherActionPanel(this);
+    ngFurtherActionPanel = new FurtherActionPanel(this);
+    gStructureFilterPanel = new StructureFilterPanel(this);
+    ngStructureFilterPanel = new StructureFilterPanel(this);
+
+    thresholdPanel.setTitle("Threshold Filter");
+    thresholdPanel.add(getThreshold(), "grow");
+    thresholdPanel.add(thresholdValue, "grow, wrap");
+    thresholdPanel.add(slider, "grow, span, wrap");
+
+    actionPanel.add(ok);
+    actionPanel.add(cancel);
+
+    graphFilterView.add(gSearchPanel, "grow, span, wrap");
+    graphFilterView.add(gStructureFilterPanel, "grow, span, wrap");
+    graphFilterView.add(thresholdPanel, "grow, span, wrap");
+    graphFilterView.add(gFurtherActionPanel);
+
+    noGraphFilterView.add(ngSearchPanel, "grow, span, wrap");
+    noGraphFilterView.add(ngStructureFilterPanel, "grow, span, wrap");
+    noGraphFilterView.add(ngFurtherActionPanel);
+
+    annotationComboBoxPanel.add(getAnnotations());
+    switchableViewsPanel.add(noGraphFilterView,
+            AnnotationColumnChooser.NO_GRAPH_VIEW);
+    switchableViewsPanel.add(graphFilterView,
+            AnnotationColumnChooser.GRAPH_VIEW);
+
+    this.setLayout(borderLayout1);
+    this.add(annotationComboBoxPanel, java.awt.BorderLayout.PAGE_START);
+    this.add(switchableViewsPanel, java.awt.BorderLayout.CENTER);
+    this.add(actionPanel, java.awt.BorderLayout.SOUTH);
+
+    selectedAnnotationChanged();
+    this.validate();
+  }
+
+  @SuppressWarnings("unchecked")
+  public void reset()
+  {
+    if (this.getOldColumnSelection() != null)
+    {
+      av.getColumnSelection().clear();
+
+      if (av.getAnnotationColumnSelectionState() != null)
+      {
+        ColumnSelection oldSelection = av
+                .getAnnotationColumnSelectionState()
+                .getOldColumnSelection();
+        if (oldSelection != null && oldSelection.getHiddenColumns() != null
+                && !oldSelection.getHiddenColumns().isEmpty())
+        {
+          for (Iterator<int[]> itr = oldSelection.getHiddenColumns()
+                  .iterator(); itr.hasNext();)
+          {
+            int positions[] = itr.next();
+            av.hideColumns(positions[0], positions[1]);
+          }
+        }
+        av.setColumnSelection(oldSelection);
+      }
+      ap.paintAlignment(true);
+    }
+
+  }
+
+  public void adjustmentValueChanged(AdjustmentEvent evt)
+  {
+    if (!adjusting)
+    {
+      thresholdValue.setText((slider.getValue() / 1000f) + "");
+      valueChanged(!sliderDragging);
+    }
+  }
+
+  protected void addSliderMouseListeners()
+  {
+
+    slider.addMouseListener(new MouseAdapter()
+    {
+      @Override
+      public void mousePressed(MouseEvent e)
+      {
+        sliderDragging = true;
+        super.mousePressed(e);
+      }
+
+      @Override
+      public void mouseDragged(MouseEvent e)
+      {
+        sliderDragging = true;
+        super.mouseDragged(e);
+      }
+
+      @Override
+      public void mouseReleased(MouseEvent evt)
+      {
+        if (sliderDragging)
+        {
+          sliderDragging = false;
+          valueChanged(true);
+        }
+        ap.paintAlignment(true);
+      }
+    });
+  }
+
+  public void valueChanged(boolean updateAllAnnotation)
+  {
+    if (slider.isEnabled())
+    {
+      getCurrentAnnotation().threshold.value = slider.getValue() / 1000f;
+      updateView();
+      ap.paintAlignment(false);
+    }
+  }
+
+  public Choice getThreshold()
+  {
+    return threshold;
+  }
+
+  public void setThreshold(Choice threshold)
+  {
+    this.threshold = threshold;
+  }
+
+  public Choice getAnnotations()
+  {
+    return annotations;
+  }
+
+  public void setAnnotations(Choice annotations)
+  {
+    this.annotations = annotations;
+  }
+
+  @Override
+  public void updateView()
+  {
+    // Check if combobox is still adjusting
+    if (adjusting)
+    {
+      return;
+    }
+
+    AnnotationFilterParameter filterParams = new AnnotationFilterParameter();
+    setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[getAnnotations()
+            .getSelectedIndex()]);
+
+    int selectedThresholdItem = getSelectedThresholdItem(getThreshold()
+            .getSelectedIndex());
+
+    slider.setEnabled(true);
+    thresholdValue.setEnabled(true);
+
+    if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD)
+    {
+      slider.setEnabled(false);
+      thresholdValue.setEnabled(false);
+      thresholdValue.setText("");
+      // build filter params
+    }
+    else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD)
+    {
+      if (getCurrentAnnotation().threshold == null)
+      {
+        getCurrentAnnotation()
+                .setThreshold(
+                        new jalview.datamodel.GraphLine(
+                                (getCurrentAnnotation().graphMax - getCurrentAnnotation().graphMin) / 2f,
+                                "Threshold", Color.black));
+      }
+
+      adjusting = true;
+      float range = getCurrentAnnotation().graphMax * 1000
+              - getCurrentAnnotation().graphMin * 1000;
+
+      slider.setMinimum((int) (getCurrentAnnotation().graphMin * 1000));
+      slider.setMaximum((int) (getCurrentAnnotation().graphMax * 1000));
+      slider.setValue((int) (getCurrentAnnotation().threshold.value * 1000));
+      thresholdValue.setText(getCurrentAnnotation().threshold.value + "");
+      // slider.setMajorTickSpacing((int) (range / 10f));
+      slider.setEnabled(true);
+      thresholdValue.setEnabled(true);
+      adjusting = false;
+
+      // build filter params
+      filterParams
+              .setThresholdType(AnnotationFilterParameter.ThresholdType.NO_THRESHOLD);
+      if (getCurrentAnnotation().graph != AlignmentAnnotation.NO_GRAPH)
+      {
+        filterParams
+                .setThresholdValue(getCurrentAnnotation().threshold.value);
+
+        if (selectedThresholdItem == AnnotationColourGradient.ABOVE_THRESHOLD)
+        {
+          filterParams
+                  .setThresholdType(AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD);
+        }
+        else if (selectedThresholdItem == AnnotationColourGradient.BELOW_THRESHOLD)
+        {
+          filterParams
+                  .setThresholdType(AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD);
+        }
+      }
+    }
+
+    if (currentStructureFilterPanel != null)
+    {
+      if (currentStructureFilterPanel.alphaHelix.getState())
+      {
+        filterParams.setFilterAlphaHelix(true);
+      }
+      if (currentStructureFilterPanel.betaStrand.getState())
+      {
+        filterParams.setFilterBetaSheet(true);
+      }
+      if (currentStructureFilterPanel.turn.getState())
+      {
+        filterParams.setFilterTurn(true);
+      }
+    }
+
+    if (currentSearchPanel != null)
+    {
+
+      if (!currentSearchPanel.searchBox.getText().isEmpty())
+      {
+        currentSearchPanel.description.setEnabled(true);
+        currentSearchPanel.displayName.setEnabled(true);
+        filterParams.setRegexString(currentSearchPanel.searchBox.getText());
+        if (currentSearchPanel.displayName.getState())
+        {
+          filterParams
+                  .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING);
+        }
+        if (currentSearchPanel.description.getState())
+        {
+          filterParams
+                  .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION);
+        }
+      }
+      else
+      {
+        currentSearchPanel.description.setEnabled(false);
+        currentSearchPanel.displayName.setEnabled(false);
+      }
+    }
+
+    av.getColumnSelection().filterAnnotations(
+            getCurrentAnnotation().annotations, filterParams);
+
+    av.showAllHiddenColumns();
+    if (getActionOption() == ACTION_OPTION_HIDE)
+    {
+      av.hideSelectedColumns();
+    }
+
+    filterParams = null;
+    av.setAnnotationColumnSelectionState(this);
+    ap.paintAlignment(true);
+  }
+
+  public ColumnSelection getOldColumnSelection()
+  {
+    return oldColumnSelection;
+  }
+
+  public void setOldColumnSelection(ColumnSelection currentColumnSelection)
+  {
+    if (currentColumnSelection != null)
+    {
+      this.oldColumnSelection = new ColumnSelection(currentColumnSelection);
+    }
+  }
+
+  public FurtherActionPanel getCurrentFutherActionPanel()
+  {
+    return currentFurtherActionPanel;
+  }
+
+  public void setCurrentFutherActionPanel(
+          FurtherActionPanel currentFutherActionPanel)
+  {
+    this.currentFurtherActionPanel = currentFutherActionPanel;
+  }
+
+  public SearchPanel getCurrentSearchPanel()
+  {
+    return currentSearchPanel;
+  }
+
+  public void setCurrentSearchPanel(SearchPanel currentSearchPanel)
+  {
+    this.currentSearchPanel = currentSearchPanel;
+  }
+
+  public int getActionOption()
+  {
+    return actionOption;
+  }
+
+  public void setActionOption(int actionOption)
+  {
+    this.actionOption = actionOption;
+  }
+
+  public StructureFilterPanel getCurrentStructureFilterPanel()
+  {
+    return currentStructureFilterPanel;
+  }
+
+  public void setCurrentStructureFilterPanel(
+          StructureFilterPanel currentStructureFilterPanel)
+  {
+    this.currentStructureFilterPanel = currentStructureFilterPanel;
+  }
+
+  @Override
+  public void itemStateChanged(ItemEvent e)
+  {
+    if (e.getSource() == annotations)
+    {
+      selectedAnnotationChanged();
+    }
+    else if (e.getSource() == threshold)
+    {
+      threshold_actionPerformed(null);
+    }
+  }
+
+  public void selectedAnnotationChanged()
+  {
+    String currentView = AnnotationColumnChooser.NO_GRAPH_VIEW;
+    if (av.getAlignment().getAlignmentAnnotation()[getAnnotations()
+            .getSelectedIndex()].graph != AlignmentAnnotation.NO_GRAPH)
+    {
+      currentView = AnnotationColumnChooser.GRAPH_VIEW;
+    }
+
+    gSearchPanel.syncState();
+    gFurtherActionPanel.syncState();
+    gStructureFilterPanel.syncState();
+
+    ngSearchPanel.syncState();
+    ngFurtherActionPanel.syncState();
+    ngStructureFilterPanel.syncState();
+
+    switchableViewsLayout.show(switchableViewsPanel, currentView);
+    updateView();
+  }
+
+  public class FurtherActionPanel extends Panel implements
+          ItemListener
+  {
+    private AnnotationColumnChooser aColChooser;
+
+    private Choice furtherAction = new Choice();
+
+    public FurtherActionPanel(AnnotationColumnChooser aColChooser)
+    {
+      this.aColChooser = aColChooser;
+      furtherAction.addItem("Select");
+      furtherAction.addItem("Hide");
+      furtherAction.addItemListener(this);
+      syncState();
+
+      // this.setTitle("Filter Actions");
+      // this.setFont(JvSwingUtils.getLabelFont());
+
+      this.add(furtherAction);
+    }
+
+    public void syncState()
+    {
+      if (aColChooser.getActionOption() == AnnotationColumnChooser.ACTION_OPTION_HIDE)
+      {
+        furtherAction.select("Hide");
+      }
+      else
+      {
+        furtherAction.select("Select");
+      }
+    }
+
+    @Override
+    public void itemStateChanged(ItemEvent e)
+    {
+      aColChooser.setCurrentFutherActionPanel(this);
+      if (furtherAction.getSelectedItem().equalsIgnoreCase("Select"))
+      {
+        setActionOption(ACTION_OPTION_SELECT);
+        updateView();
+      }
+      else
+      {
+        setActionOption(ACTION_OPTION_HIDE);
+        updateView();
+      }
+
+    }
+  }
+
+  public class StructureFilterPanel extends TitledPanel implements
+          ItemListener
+  {
+    private AnnotationColumnChooser aColChooser;
+
+    private Checkbox alphaHelix = new Checkbox();
+
+    private Checkbox betaStrand = new Checkbox();
+
+    private Checkbox turn = new Checkbox();
+
+    private Checkbox all = new Checkbox();
+
+    public StructureFilterPanel(AnnotationColumnChooser aColChooser)
+    {
+      this.aColChooser = aColChooser;
+
+      alphaHelix.setLabel(MessageManager.getString("label.alpha_helix"));
+      alphaHelix.setBackground(Color.white);
+
+      alphaHelix.addItemListener(this);
+
+      betaStrand.setLabel(MessageManager.getString("label.beta_strand"));
+      betaStrand.setBackground(Color.white);
+      betaStrand.addItemListener(this);
+
+      turn.setLabel(MessageManager.getString("label.turn"));
+      turn.setBackground(Color.white);
+      turn.addItemListener(this);
+
+      all.setLabel(MessageManager.getString("label.select_all"));
+      all.setBackground(Color.white);
+      all.addItemListener(this);
+
+      this.setBackground(Color.white);
+      this.setTitle("Structure Filter");
+      this.setFont(JvSwingUtils.getLabelFont());
+
+      this.add(all);
+      this.add(alphaHelix);
+      this.add(betaStrand);
+      this.add(turn);
+    }
+
+    public void alphaHelix_actionPerformed()
+    {
+      updateSelectAllState();
+      aColChooser.setCurrentStructureFilterPanel(this);
+      aColChooser.updateView();
+    }
+
+    public void betaStrand_actionPerformed()
+    {
+      updateSelectAllState();
+      aColChooser.setCurrentStructureFilterPanel(this);
+      aColChooser.updateView();
+    }
+
+    public void turn_actionPerformed()
+    {
+      updateSelectAllState();
+      aColChooser.setCurrentStructureFilterPanel(this);
+      aColChooser.updateView();
+    }
+
+    public void all_actionPerformed()
+    {
+      if (all.getState())
+      {
+        alphaHelix.setState(true);
+        betaStrand.setState(true);
+        turn.setState(true);
+      }
+      else
+      {
+        alphaHelix.setState(false);
+        betaStrand.setState(false);
+        turn.setState(false);
+      }
+      aColChooser.setCurrentStructureFilterPanel(this);
+      aColChooser.updateView();
+    }
+
+    public void updateSelectAllState()
+    {
+      if (alphaHelix.getState() && betaStrand.getState() && turn.getState())
+      {
+        all.setState(true);
+      }
+      else
+      {
+        all.setState(false);
+      }
+    }
+
+    public void syncState()
+    {
+      StructureFilterPanel sfp = aColChooser
+              .getCurrentStructureFilterPanel();
+      if (sfp != null)
+      {
+        alphaHelix.setState(sfp.alphaHelix.getState());
+        betaStrand.setState(sfp.betaStrand.getState());
+        turn.setState(sfp.turn.getState());
+        if (sfp.all.getState())
+        {
+          all.setState(true);
+          alphaHelix.setState(true);
+          betaStrand.setState(true);
+          turn.setState(true);
+        }
+      }
+
+    }
+
+    @Override
+    public void itemStateChanged(ItemEvent e)
+    {
+      if (e.getSource() == alphaHelix)
+      {
+        alphaHelix_actionPerformed();
+      }
+      else if (e.getSource() == betaStrand)
+      {
+        betaStrand_actionPerformed();
+      }
+      else if (e.getSource() == turn)
+      {
+        turn_actionPerformed();
+      }
+      else if (e.getSource() == all)
+      {
+        all_actionPerformed();
+      }
+    }
+  }
+
+  public class SearchPanel extends TitledPanel implements ItemListener
+  {
+    private AnnotationColumnChooser aColChooser;
+
+    private Checkbox displayName = new Checkbox();
+
+    private Checkbox description = new Checkbox();
+
+    private TextField searchBox = new TextField(10);
+
+    public SearchPanel(AnnotationColumnChooser aColChooser)
+    {
+
+      this.aColChooser = aColChooser;
+      searchBox.addTextListener(new TextListener()
+      {
+
+        @Override
+        public void textValueChanged(TextEvent e)
+        {
+          searchStringAction();
+
+        }
+
+      });
+
+      displayName.setLabel(MessageManager.getString("label.display_name"));
+      displayName.setEnabled(false);
+      displayName.addItemListener(this);
+
+      description.setLabel(MessageManager.getString("label.description"));
+      description.setEnabled(false);
+      description.addItemListener(this);
+      this.setTitle("Search Filter");
+      this.setFont(JvSwingUtils.getLabelFont());
+
+      syncState();
+      this.add(searchBox);
+      this.add(displayName);
+      this.add(description);
+    }
+
+    public void displayNameCheckboxAction()
+    {
+      aColChooser.setCurrentSearchPanel(this);
+      aColChooser.updateView();
+    }
+
+    public void discriptionCheckboxAction()
+    {
+      aColChooser.setCurrentSearchPanel(this);
+      aColChooser.updateView();
+    }
+
+    public void searchStringAction()
+    {
+      aColChooser.setCurrentSearchPanel(this);
+      aColChooser.updateView();
+    }
+
+    public void syncState()
+    {
+      SearchPanel sp = aColChooser.getCurrentSearchPanel();
+      if (sp != null)
+      {
+        description.setEnabled(sp.description.isEnabled());
+        description.setState(sp.description.getState());
+
+        displayName.setEnabled(sp.displayName.isEnabled());
+        displayName.setState(sp.displayName.getState());
+
+        searchBox.setText(sp.searchBox.getText());
+      }
+    }
+
+    @Override
+    public void itemStateChanged(ItemEvent e)
+    {
+      if (e.getSource() == displayName)
+      {
+        displayNameCheckboxAction();
+      }
+      else if (e.getSource() == description)
+      {
+        discriptionCheckboxAction();
+      }
+
+    }
+  }
+
+  public void actionPerformed(ActionEvent evt)
+  {
+    if (evt.getSource() == thresholdValue)
+    {
+      try
+      {
+        float f = new Float(thresholdValue.getText()).floatValue();
+        slider.setValue((int) (f * 1000));
+        adjustmentValueChanged(null);
+      } catch (NumberFormatException ex)
+      {
+      }
+    }
+
+    else if (evt.getSource() == ok)
+    {
+      ok_actionPerformed(null);
+    }
+    else if (evt.getSource() == cancel)
+    {
+      cancel_actionPerformed(null);
+    }
+    else if (evt.getSource() == thresholdValue)
+    {
+      thresholdValue_actionPerformed(null);
+    }
+    else
+    {
+      updateView();
+    }
+  }
+
+  @Override
+  public void mouseClicked(MouseEvent e)
+  {
+    // TODO Auto-generated method stub
+
+  }
+
+  @Override
+  public void mousePressed(MouseEvent e)
+  {
+    if (e.getSource() == slider)
+    {
+      updateView();
+    }
+
+  }
+
+  @Override
+  public void mouseReleased(MouseEvent e)
+  {
+    if (e.getSource() == slider)
+    {
+      updateView();
+    }
+  }
+
+  @Override
+  public void mouseEntered(MouseEvent e)
+  {
+    if (e.getSource() == slider)
+    {
+      updateView();
+    }
+  }
+
+  @Override
+  public void mouseExited(MouseEvent e)
+  {
+    if (e.getSource() == slider)
+    {
+      updateView();
+    }
+  }
+
+}
diff --git a/src/jalview/appletgui/AnnotationRowFilter.java b/src/jalview/appletgui/AnnotationRowFilter.java
new file mode 100644 (file)
index 0000000..8a0a44a
--- /dev/null
@@ -0,0 +1,198 @@
+package jalview.appletgui;
+
+import jalview.schemes.AnnotationColourGradient;
+import jalview.util.MessageManager;
+
+import java.awt.Button;
+import java.awt.Checkbox;
+import java.awt.Choice;
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.Scrollbar;
+import java.awt.TextField;
+import java.awt.event.ActionEvent;
+import java.util.Vector;
+
+
+
+@SuppressWarnings("serial")
+public abstract class AnnotationRowFilter extends Panel
+{
+  protected AlignViewport av;
+
+  protected AlignmentPanel ap;
+
+  protected int[] annmap;
+
+  protected boolean enableSeqAss = false;
+
+  private jalview.datamodel.AlignmentAnnotation currentAnnotation;
+
+  protected boolean adjusting = false;
+
+  protected Checkbox currentColours = new Checkbox();
+
+  protected Panel minColour = new Panel();
+
+  protected Panel maxColour = new Panel();
+
+  protected Checkbox seqAssociated = new Checkbox();
+
+  protected Checkbox thresholdIsMin = new Checkbox();
+
+  protected Scrollbar slider = new Scrollbar(Scrollbar.HORIZONTAL);
+
+  protected TextField thresholdValue = new TextField(20);
+
+  protected Frame frame;
+
+  protected Button ok = new Button();
+
+  protected Button cancel = new Button();
+
+  /**
+   * enabled if the user is dragging the slider - try to keep updates to a
+   * minimun
+   */
+  protected boolean sliderDragging = false;
+
+
+  public AnnotationRowFilter(AlignViewport av, final AlignmentPanel ap)
+  {
+    this.av = av;
+    this.ap = ap;
+  }
+
+  public AnnotationRowFilter()
+  {
+
+  }
+
+
+  public Vector getAnnotationItems(boolean isSeqAssociated)
+  {
+    Vector list = new Vector();
+    int index = 1;
+    int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length];
+    for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
+    {
+      if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null)
+      {
+        if (isSeqAssociated)
+        {
+          continue;
+        }
+      }
+      else
+      {
+        enableSeqAss = true;
+      }
+      String label = av.getAlignment().getAlignmentAnnotation()[i].label;
+      if (!list.contains(label))
+      {
+        anmap[list.size()] = i;
+        list.add(label);
+
+      }
+      else
+      {
+        if (!isSeqAssociated)
+        {
+          anmap[list.size()] = i;
+          list.add(label + "_" + (index++));
+        }
+      }
+    }
+    this.annmap = new int[list.size()];
+    System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length);
+    return list;
+  }
+
+  protected int getSelectedThresholdItem(int indexValue)
+  {
+    int selectedThresholdItem = -1;
+    if (indexValue == 1)
+    {
+      selectedThresholdItem = AnnotationColourGradient.ABOVE_THRESHOLD;
+    }
+    else if (indexValue == 2)
+    {
+      selectedThresholdItem = AnnotationColourGradient.BELOW_THRESHOLD;
+    }
+    return selectedThresholdItem;
+  }
+
+  public void modelChanged()
+  {
+    seqAssociated.setEnabled(enableSeqAss);
+  }
+
+  public void ok_actionPerformed(ActionEvent e)
+  {
+    updateView();
+    frame.setVisible(false);
+  }
+
+  public void cancel_actionPerformed(ActionEvent e)
+  {
+    reset();
+    ap.paintAlignment(true);
+    frame.setVisible(false);
+  }
+
+  public void thresholdCheck_actionPerformed(ActionEvent e)
+  {
+    updateView();
+  }
+
+  public void annotations_actionPerformed(ActionEvent e)
+  {
+    updateView();
+  }
+
+  public void threshold_actionPerformed(ActionEvent e)
+  {
+    updateView();
+  }
+
+  public void thresholdValue_actionPerformed(ActionEvent e)
+  {
+    try
+    {
+      float f = Float.parseFloat(thresholdValue.getText());
+      slider.setValue((int) (f * 1000));
+      updateView();
+    } catch (NumberFormatException ex)
+    {
+    }
+  }
+
+
+  protected void populateThresholdComboBox(Choice threshold)
+  {
+    threshold.addItem(MessageManager
+            .getString("label.threshold_feature_no_thereshold"));
+    threshold.addItem(MessageManager
+            .getString("label.threshold_feature_above_thereshold"));
+    threshold.addItem(MessageManager
+            .getString("label.threshold_feature_below_thereshold"));
+  }
+
+
+  public jalview.datamodel.AlignmentAnnotation getCurrentAnnotation()
+  {
+    return currentAnnotation;
+  }
+
+  public void setCurrentAnnotation(
+          jalview.datamodel.AlignmentAnnotation currentAnnotation)
+  {
+    this.currentAnnotation = currentAnnotation;
+  }
+
+  public abstract void valueChanged(boolean updateAllAnnotation);
+
+  public abstract void updateView();
+
+  public abstract void reset();
+}
\ No newline at end of file
index f888e3a..2b6f37a 100755 (executable)
@@ -108,7 +108,7 @@ public class ScalePanel extends Panel implements MouseMotionListener,
         });
         pop.add(item);
 
-        if (av.getColumnSelection().hasHiddenColumns())
+        if (av.getColumnSelection().hasManyHiddenColumns())
         {
           item = new MenuItem(MessageManager.getString("action.reveal_all"));
           item.addActionListener(new ActionListener()
index 81e5dae..8dd6290 100755 (executable)
-/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
- * 
- * This file is part of Jalview.
- * 
- * Jalview is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License 
- * as published by the Free Software Foundation, either version 3
- * of the License, or (at your option) any later version.
- *  
- * Jalview is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty 
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
- * PURPOSE.  See the GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.appletgui;
-
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.SearchResults;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
-
-import java.awt.Color;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Image;
-import java.awt.Panel;
-
-public class SeqCanvas extends Panel
-{
-  FeatureRenderer fr;
-
-  SequenceRenderer sr;
-
-  Image img;
-
-  Graphics gg;
-
-  int imgWidth;
-
-  int imgHeight;
-
-  AlignViewport av;
-
-  SearchResults searchResults = null;
-
-  boolean fastPaint = false;
-
-  int cursorX = 0;
-
-  int cursorY = 0;
-
-  public SeqCanvas(AlignViewport av)
-  {
-    this.av = av;
-    fr = new FeatureRenderer(av);
-    sr = new SequenceRenderer(av);
-    PaintRefresher.Register(this, av.getSequenceSetId());
-  }
-
-  public AlignViewport getViewport()
-  {
-    return av;
-  }
-
-  public FeatureRenderer getFeatureRenderer()
-  {
-    return fr;
-  }
-
-  public SequenceRenderer getSequenceRenderer()
-  {
-    return sr;
-  }
-
-  void drawNorthScale(Graphics g, int startx, int endx, int ypos)
-  {
-    int scalestartx = startx - startx % 10 + 10;
-
-    g.setColor(Color.black);
-
-    // NORTH SCALE
-    for (int i = scalestartx; i < endx; i += 10)
-    {
-      int value = i;
-      if (av.hasHiddenColumns())
-      {
-        value = av.getColumnSelection().adjustForHiddenColumns(value);
-      }
-
-      g.drawString(String.valueOf(value), (i - startx - 1) * av.charWidth,
-              ypos - (av.charHeight / 2));
-
-      g.drawLine(((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
-              (ypos + 2) - (av.charHeight / 2),
-              ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
-              ypos - 2);
-    }
-  }
-
-  void drawWestScale(Graphics g, int startx, int endx, int ypos)
-  {
-    FontMetrics fm = getFontMetrics(av.getFont());
-    ypos += av.charHeight;
-    if (av.hasHiddenColumns())
-    {
-      startx = av.getColumnSelection().adjustForHiddenColumns(startx);
-      endx = av.getColumnSelection().adjustForHiddenColumns(endx);
-    }
-
-    int maxwidth = av.getAlignment().getWidth();
-    if (av.hasHiddenColumns())
-    {
-      maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;
-    }
-
-    // WEST SCALE
-    for (int i = 0; i < av.getAlignment().getHeight(); i++)
-    {
-      SequenceI seq = av.getAlignment().getSequenceAt(i);
-      int index = startx;
-      int value = -1;
-
-      while (index < endx)
-      {
-        if (jalview.util.Comparison.isGap(seq.getCharAt(index)))
-        {
-          index++;
-
-          continue;
-        }
-
-        value = av.getAlignment().getSequenceAt(i).findPosition(index);
-
-        break;
-      }
-
-      if (value != -1)
-      {
-        int x = LABEL_WEST - fm.stringWidth(String.valueOf(value))
-                - av.charWidth / 2;
-        g.drawString(value + "", x, (ypos + (i * av.charHeight))
-                - (av.charHeight / 5));
-      }
-    }
-  }
-
-  void drawEastScale(Graphics g, int startx, int endx, int ypos)
-  {
-    ypos += av.charHeight;
-
-    if (av.hasHiddenColumns())
-    {
-      endx = av.getColumnSelection().adjustForHiddenColumns(endx);
-    }
-
-    SequenceI seq;
-    // EAST SCALE
-    for (int i = 0; i < av.getAlignment().getHeight(); i++)
-    {
-      seq = av.getAlignment().getSequenceAt(i);
-      int index = endx;
-      int value = -1;
-
-      while (index > startx)
-      {
-        if (jalview.util.Comparison.isGap(seq.getCharAt(index)))
-        {
-          index--;
-
-          continue;
-        }
-
-        value = seq.findPosition(index);
-
-        break;
-      }
-
-      if (value != -1)
-      {
-        g.drawString(String.valueOf(value), 0, (ypos + (i * av.charHeight))
-                - (av.charHeight / 5));
-      }
-    }
-  }
-
-  int lastsr = 0;
-
-  void fastPaint(int horizontal, int vertical)
-  {
-    if (fastPaint || gg == null)
-    {
-      return;
-    }
-
-    // Its possible on certain browsers that the call to fastpaint
-    // is faster than it can paint, so this check here catches
-    // this possibility
-    if (lastsr + horizontal != av.startRes)
-    {
-      horizontal = av.startRes - lastsr;
-    }
-
-    lastsr = av.startRes;
-
-    fastPaint = true;
-    gg.copyArea(horizontal * av.charWidth, vertical * av.charHeight,
-            imgWidth - horizontal * av.charWidth, imgHeight - vertical
-                    * av.charHeight, -horizontal * av.charWidth, -vertical
-                    * av.charHeight);
-
-    int sr = av.startRes, er = av.endRes, ss = av.startSeq, es = av.endSeq, transX = 0, transY = 0;
-
-    if (horizontal > 0) // scrollbar pulled right, image to the left
-    {
-      transX = (er - sr - horizontal) * av.charWidth;
-      sr = er - horizontal;
-    }
-    else if (horizontal < 0)
-    {
-      er = sr - horizontal;
-    }
-
-    else if (vertical > 0) // scroll down
-    {
-      ss = es - vertical;
-      if (ss < av.startSeq) // ie scrolling too fast, more than a page at a time
-      {
-        ss = av.startSeq;
-      }
-      else
-      {
-        transY = imgHeight - vertical * av.charHeight;
-      }
-    }
-    else if (vertical < 0)
-    {
-      es = ss - vertical;
-      if (es > av.endSeq)
-      {
-        es = av.endSeq;
-      }
-    }
-
-    gg.translate(transX, transY);
-
-    drawPanel(gg, sr, er, ss, es, 0);
-    gg.translate(-transX, -transY);
-
-    repaint();
-
-  }
-
-  /**
-   * Definitions of startx and endx (hopefully): SMJS This is what I'm working
-   * towards! startx is the first residue (starting at 0) to display. endx is
-   * the last residue to display (starting at 0). starty is the first sequence
-   * to display (starting at 0). endy is the last sequence to display (starting
-   * at 0). NOTE 1: The av limits are set in setFont in this class and in the
-   * adjustment listener in SeqPanel when the scrollbars move.
-   */
-  public void update(Graphics g)
-  {
-    paint(g);
-  }
-
-  public void paint(Graphics g)
-  {
-
-    if (img != null
-            && (fastPaint || (getSize().width != g.getClipBounds().width) || (getSize().height != g
-                    .getClipBounds().height)))
-    {
-      g.drawImage(img, 0, 0, this);
-      fastPaint = false;
-      return;
-    }
-
-    if (fastPaint)
-    {
-      g.drawImage(img, 0, 0, this);
-      fastPaint = false;
-      return;
-    }
-
-    // this draws the whole of the alignment
-    imgWidth = this.getSize().width;
-    imgHeight = this.getSize().height;
-
-    imgWidth -= imgWidth % av.charWidth;
-    imgHeight -= imgHeight % av.charHeight;
-
-    if (imgWidth < 1 || imgHeight < 1)
-    {
-      return;
-    }
-
-    if (img == null || imgWidth != img.getWidth(this)
-            || imgHeight != img.getHeight(this))
-    {
-      img = createImage(imgWidth, imgHeight);
-      gg = img.getGraphics();
-      gg.setFont(av.getFont());
-    }
-
-    gg.setColor(Color.white);
-    gg.fillRect(0, 0, imgWidth, imgHeight);
-
-    if (av.getWrapAlignment())
-    {
-      drawWrappedPanel(gg, imgWidth, imgHeight, av.startRes);
-    }
-    else
-    {
-      drawPanel(gg, av.startRes, av.endRes, av.startSeq, av.endSeq, 0);
-    }
-
-    g.drawImage(img, 0, 0, this);
-
-  }
-
-  int LABEL_WEST, LABEL_EAST;
-
-  public int getWrappedCanvasWidth(int cwidth)
-  {
-    cwidth -= cwidth % av.charWidth;
-
-    FontMetrics fm = getFontMetrics(av.getFont());
-
-    LABEL_EAST = 0;
-    LABEL_WEST = 0;
-
-    if (av.scaleRightWrapped)
-    {
-      LABEL_EAST = fm.stringWidth(getMask());
-    }
-
-    if (av.scaleLeftWrapped)
-    {
-      LABEL_WEST = fm.stringWidth(getMask());
-    }
-
-    return (cwidth - LABEL_EAST - LABEL_WEST) / av.charWidth;
-  }
-
-  /**
-   * Generates a string of zeroes.
-   * 
-   * @return String
-   */
-  String getMask()
-  {
-    String mask = "0";
-    int maxWidth = 0;
-    int tmp;
-    AlignmentI alignment = av.getAlignment();
-    for (int i = 0; i < alignment.getHeight(); i++)
-    {
-      tmp = alignment.getSequenceAt(i).getEnd();
-      if (tmp > maxWidth)
-      {
-        maxWidth = tmp;
-      }
-    }
-
-    for (int i = maxWidth; i > 0; i /= 10)
-    {
-      mask += "0";
-    }
-    return mask;
-  }
-
-  public void drawWrappedPanel(Graphics g, int canvasWidth,
-          int canvasHeight, int startRes)
-  {
-    AlignmentI al = av.getAlignment();
-
-    FontMetrics fm = getFontMetrics(av.getFont());
-
-    if (av.scaleRightWrapped)
-    {
-      LABEL_EAST = fm.stringWidth(getMask());
-    }
-
-    if (av.scaleLeftWrapped)
-    {
-      LABEL_WEST = fm.stringWidth(getMask());
-    }
-
-    int hgap = av.charHeight;
-    if (av.scaleAboveWrapped)
-    {
-      hgap += av.charHeight;
-    }
-
-    int cWidth = (canvasWidth - LABEL_EAST - LABEL_WEST) / av.charWidth;
-    int cHeight = av.getAlignment().getHeight() * av.charHeight;
-
-    av.setWrappedWidth(cWidth);
-
-    av.endRes = av.startRes + cWidth;
-
-    int endx;
-    int ypos = hgap;
-
-    int maxwidth = av.getAlignment().getWidth() - 1;
-
-    if (av.hasHiddenColumns())
-    {
-      maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;
-    }
-
-    while ((ypos <= canvasHeight) && (startRes < maxwidth))
-    {
-      endx = startRes + cWidth - 1;
-
-      if (endx > maxwidth)
-      {
-        endx = maxwidth;
-      }
-
-      g.setColor(Color.black);
-
-      if (av.scaleLeftWrapped)
-      {
-        drawWestScale(g, startRes, endx, ypos);
-      }
-
-      if (av.scaleRightWrapped)
-      {
-        g.translate(canvasWidth - LABEL_EAST, 0);
-        drawEastScale(g, startRes, endx, ypos);
-        g.translate(-(canvasWidth - LABEL_EAST), 0);
-      }
-
-      g.translate(LABEL_WEST, 0);
-
-      if (av.scaleAboveWrapped)
-      {
-        drawNorthScale(g, startRes, endx, ypos);
-      }
-      if (av.hasHiddenColumns() && av.showHiddenMarkers)
-      {
-        g.setColor(Color.blue);
-        int res;
-        for (int i = 0; i < av.getColumnSelection().getHiddenColumns()
-                .size(); i++)
-        {
-          res = av.getColumnSelection().findHiddenRegionPosition(i)
-                  - startRes;
-
-          if (res < 0 || res > endx - startRes)
-          {
-            continue;
-          }
-
-          gg.fillPolygon(new int[]
-          { res * av.charWidth - av.charHeight / 4,
-              res * av.charWidth + av.charHeight / 4, res * av.charWidth },
-                  new int[]
-                  { ypos - (av.charHeight / 2), ypos - (av.charHeight / 2),
-                      ypos - (av.charHeight / 2) + 8 }, 3);
-
-        }
-      }
-
-      if (g.getClip() == null)
-      {
-        g.setClip(0, 0, cWidth * av.charWidth, canvasHeight);
-      }
-
-      drawPanel(g, startRes, endx, 0, al.getHeight(), ypos);
-      g.setClip(null);
-
-      if (av.showAnnotation)
-      {
-        g.translate(0, cHeight + ypos + 4);
-        if (annotations == null)
-        {
-          annotations = new AnnotationPanel(av);
-        }
-
-        annotations.drawComponent(g, startRes, endx + 1);
-        g.translate(0, -cHeight - ypos - 4);
-      }
-      g.translate(-LABEL_WEST, 0);
-
-      ypos += cHeight + getAnnotationHeight() + hgap;
-
-      startRes += cWidth;
-    }
-
-  }
-
-  AnnotationPanel annotations;
-
-  int getAnnotationHeight()
-  {
-    if (!av.showAnnotation)
-    {
-      return 0;
-    }
-
-    if (annotations == null)
-    {
-      annotations = new AnnotationPanel(av);
-    }
-
-    return annotations.adjustPanelHeight();
-  }
-
-  void drawPanel(Graphics g1, int startRes, int endRes, int startSeq,
-          int endSeq, int offset)
-  {
-    if (!av.hasHiddenColumns())
-    {
-      draw(g1, startRes, endRes, startSeq, endSeq, offset);
-    }
-    else
-    {
-      java.util.List<int[]> regions = av.getColumnSelection()
-              .getHiddenColumns();
-
-      int screenY = 0;
-      int blockStart = startRes;
-      int blockEnd = endRes;
-
-      for (int i = 0; i < regions.size(); i++)
-      {
-        int[] region = regions.get(i);
-        int hideStart = region[0];
-        int hideEnd = region[1];
-
-        if (hideStart <= blockStart)
-        {
-          blockStart += (hideEnd - hideStart) + 1;
-          continue;
-        }
-
-        blockEnd = hideStart - 1;
-
-        g1.translate(screenY * av.charWidth, 0);
-
-        draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
-
-        if (av.getShowHiddenMarkers())
-        {
-          g1.setColor(Color.blue);
-          g1.drawLine((blockEnd - blockStart + 1) * av.charWidth - 1,
-                  0 + offset, (blockEnd - blockStart + 1) * av.charWidth
-                          - 1, (endSeq - startSeq) * av.charHeight + offset);
-        }
-
-        g1.translate(-screenY * av.charWidth, 0);
-        screenY += blockEnd - blockStart + 1;
-        blockStart = hideEnd + 1;
-      }
-
-      if (screenY <= (endRes - startRes))
-      {
-        blockEnd = blockStart + (endRes - startRes) - screenY;
-        g1.translate(screenY * av.charWidth, 0);
-        draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
-
-        g1.translate(-screenY * av.charWidth, 0);
-      }
-    }
-
-  }
-
-  // int startRes, int endRes, int startSeq, int endSeq, int x, int y,
-  // int x1, int x2, int y1, int y2, int startx, int starty,
-  void draw(Graphics g, int startRes, int endRes, int startSeq, int endSeq,
-          int offset)
-  {
-    g.setFont(av.getFont());
-    sr.prepare(g, av.renderGaps);
-
-    SequenceI nextSeq;
-
-    // / First draw the sequences
-    // ///////////////////////////
-    for (int i = startSeq; i < endSeq; i++)
-    {
-      nextSeq = av.getAlignment().getSequenceAt(i);
-
-      if (nextSeq == null)
-      {
-        continue;
-      }
-
-      sr.drawSequence(nextSeq, av.getAlignment().findAllGroups(nextSeq),
-              startRes, endRes, offset + ((i - startSeq) * av.charHeight));
-
-      if (av.isShowSequenceFeatures())
-      {
-        fr.drawSequence(g, nextSeq, startRes, endRes, offset
-                + ((i - startSeq) * av.charHeight));
-      }
-
-      // / Highlight search Results once all sequences have been drawn
-      // ////////////////////////////////////////////////////////
-      if (searchResults != null)
-      {
-        int[] visibleResults = searchResults.getResults(nextSeq, startRes,
-                endRes);
-        if (visibleResults != null)
-        {
-          for (int r = 0; r < visibleResults.length; r += 2)
-          {
-            sr.drawHighlightedText(nextSeq, visibleResults[r],
-                    visibleResults[r + 1], (visibleResults[r] - startRes)
-                            * av.charWidth, offset
-                            + ((i - startSeq) * av.charHeight));
-          }
-        }
-      }
-
-      if (av.cursorMode && cursorY == i && cursorX >= startRes
-              && cursorX <= endRes)
-      {
-        sr.drawCursor(nextSeq, cursorX,
-                (cursorX - startRes) * av.charWidth, offset
-                        + ((i - startSeq) * av.charHeight));
-      }
-    }
-
-    if (av.getSelectionGroup() != null
-            || av.getAlignment().getGroups().size() > 0)
-    {
-      drawGroupsBoundaries(g, startRes, endRes, startSeq, endSeq, offset);
-    }
-
-  }
-
-  void drawGroupsBoundaries(Graphics g, int startRes, int endRes,
-          int startSeq, int endSeq, int offset)
-  {
-    //
-    // ///////////////////////////////////
-    // Now outline any areas if necessary
-    // ///////////////////////////////////
-    SequenceGroup group = av.getSelectionGroup();
-
-    int sx = -1;
-    int sy = -1;
-    int ex = -1;
-    int groupIndex = -1;
-
-    if ((group == null) && (av.getAlignment().getGroups().size() > 0))
-    {
-      group = av.getAlignment().getGroups().get(0);
-      groupIndex = 0;
-    }
-
-    if (group != null)
-    {
-      do
-      {
-        int oldY = -1;
-        int i = 0;
-        boolean inGroup = false;
-        int top = -1;
-        int bottom = -1;
-        int alHeight = av.getAlignment().getHeight() - 1;
-
-        for (i = startSeq; i < endSeq; i++)
-        {
-          sx = (group.getStartRes() - startRes) * av.charWidth;
-          sy = offset + ((i - startSeq) * av.charHeight);
-          ex = (((group.getEndRes() + 1) - group.getStartRes()) * av.charWidth) - 1;
-
-          if (sx + ex < 0 || sx > imgWidth)
-          {
-            continue;
-          }
-
-          if ((sx <= (endRes - startRes) * av.charWidth)
-                  && group.getSequences(null).contains(
-                          av.getAlignment().getSequenceAt(i)))
-          {
-            if ((bottom == -1)
-                    && (i >= alHeight || !group.getSequences(null)
-                            .contains(
-                                    av.getAlignment().getSequenceAt(i + 1))))
-            {
-              bottom = sy + av.charHeight;
-            }
-
-            if (!inGroup)
-            {
-              if (((top == -1) && (i == 0))
-                      || !group.getSequences(null).contains(
-                              av.getAlignment().getSequenceAt(i - 1)))
-              {
-                top = sy;
-              }
-
-              oldY = sy;
-              inGroup = true;
-
-              if (group == av.getSelectionGroup())
-              {
-                g.setColor(Color.red);
-              }
-              else
-              {
-                g.setColor(group.getOutlineColour());
-              }
-            }
-          }
-          else
-          {
-            if (inGroup)
-            {
-              if (sx >= 0 && sx < imgWidth)
-              {
-                g.drawLine(sx, oldY, sx, sy);
-              }
-
-              if (sx + ex < imgWidth)
-              {
-                g.drawLine(sx + ex, oldY, sx + ex, sy);
-              }
-
-              if (sx < 0)
-              {
-                ex += sx;
-                sx = 0;
-              }
-
-              if (sx + ex > imgWidth)
-              {
-                ex = imgWidth;
-              }
-
-              else if (sx + ex >= (endRes - startRes + 1) * av.charWidth)
-              {
-                ex = (endRes - startRes + 1) * av.charWidth;
-              }
-
-              if (top != -1)
-              {
-                g.drawLine(sx, top, sx + ex, top);
-                top = -1;
-              }
-
-              if (bottom != -1)
-              {
-                g.drawLine(sx, bottom, sx + ex, bottom);
-                bottom = -1;
-              }
-
-              inGroup = false;
-            }
-          }
-        }
-
-        if (inGroup)
-        {
-          sy = offset + ((i - startSeq) * av.charHeight);
-          if (sx >= 0 && sx < imgWidth)
-          {
-            g.drawLine(sx, oldY, sx, sy);
-          }
-
-          if (sx + ex < imgWidth)
-          {
-            g.drawLine(sx + ex, oldY, sx + ex, sy);
-          }
-
-          if (sx < 0)
-          {
-            ex += sx;
-            sx = 0;
-          }
-
-          if (sx + ex > imgWidth)
-          {
-            ex = imgWidth;
-          }
-          else if (sx + ex >= (endRes - startRes + 1) * av.charWidth)
-          {
-            ex = (endRes - startRes + 1) * av.charWidth;
-          }
-
-          if (top != -1)
-          {
-            g.drawLine(sx, top, sx + ex, top);
-            top = -1;
-          }
-
-          if (bottom != -1)
-          {
-            g.drawLine(sx, bottom - 1, sx + ex, bottom - 1);
-            bottom = -1;
-          }
-
-          inGroup = false;
-        }
-
-        groupIndex++;
-
-        if (groupIndex >= av.getAlignment().getGroups().size())
-        {
-          break;
-        }
-
-        group = av.getAlignment().getGroups()
-                .get(groupIndex);
-      } while (groupIndex < av.getAlignment().getGroups().size());
-
-    }
-  }
-
-  public void highlightSearchResults(SearchResults results)
-  {
-    searchResults = results;
-
-    repaint();
-  }
-
-}
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)\r
+ * Copyright (C) 2014 The Jalview Authors\r
+ * \r
+ * This file is part of Jalview.\r
+ * \r
+ * Jalview is free software: you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License \r
+ * as published by the Free Software Foundation, either version 3\r
+ * of the License, or (at your option) any later version.\r
+ *  \r
+ * Jalview is distributed in the hope that it will be useful, but \r
+ * WITHOUT ANY WARRANTY; without even the implied warranty \r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
+ * PURPOSE.  See the GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
+ * The Jalview Authors are detailed in the 'AUTHORS' file.\r
+ */\r
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.AlignmentI;\r
+import jalview.datamodel.SearchResults;\r
+import jalview.datamodel.SequenceGroup;\r
+import jalview.datamodel.SequenceI;\r
+\r
+import java.awt.Color;\r
+import java.awt.FontMetrics;\r
+import java.awt.Graphics;\r
+import java.awt.Image;\r
+import java.awt.Panel;\r
+\r
+public class SeqCanvas extends Panel\r
+{\r
+  FeatureRenderer fr;\r
+\r
+  SequenceRenderer sr;\r
+\r
+  Image img;\r
+\r
+  Graphics gg;\r
+\r
+  int imgWidth;\r
+\r
+  int imgHeight;\r
+\r
+  AlignViewport av;\r
+\r
+  SearchResults searchResults = null;\r
+\r
+  boolean fastPaint = false;\r
+\r
+  int cursorX = 0;\r
+\r
+  int cursorY = 0;\r
+\r
+  public SeqCanvas(AlignViewport av)\r
+  {\r
+    this.av = av;\r
+    fr = new FeatureRenderer(av);\r
+    sr = new SequenceRenderer(av);\r
+    PaintRefresher.Register(this, av.getSequenceSetId());\r
+  }\r
+\r
+  public AlignViewport getViewport()\r
+  {\r
+    return av;\r
+  }\r
+\r
+  public FeatureRenderer getFeatureRenderer()\r
+  {\r
+    return fr;\r
+  }\r
+\r
+  public SequenceRenderer getSequenceRenderer()\r
+  {\r
+    return sr;\r
+  }\r
+\r
+  void drawNorthScale(Graphics g, int startx, int endx, int ypos)\r
+  {\r
+    int scalestartx = startx - startx % 10 + 10;\r
+\r
+    g.setColor(Color.black);\r
+\r
+    // NORTH SCALE\r
+    for (int i = scalestartx; i < endx; i += 10)\r
+    {\r
+      int value = i;\r
+      if (av.hasHiddenColumns())\r
+      {\r
+        value = av.getColumnSelection().adjustForHiddenColumns(value);\r
+      }\r
+\r
+      g.drawString(String.valueOf(value), (i - startx - 1) * av.charWidth,\r
+              ypos - (av.charHeight / 2));\r
+\r
+      g.drawLine(((i - startx - 1) * av.charWidth) + (av.charWidth / 2),\r
+              (ypos + 2) - (av.charHeight / 2),\r
+              ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),\r
+              ypos - 2);\r
+    }\r
+  }\r
+\r
+  void drawWestScale(Graphics g, int startx, int endx, int ypos)\r
+  {\r
+    FontMetrics fm = getFontMetrics(av.getFont());\r
+    ypos += av.charHeight;\r
+    if (av.hasHiddenColumns())\r
+    {\r
+      startx = av.getColumnSelection().adjustForHiddenColumns(startx);\r
+      endx = av.getColumnSelection().adjustForHiddenColumns(endx);\r
+    }\r
+\r
+    int maxwidth = av.getAlignment().getWidth();\r
+    if (av.hasHiddenColumns())\r
+    {\r
+      maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;\r
+    }\r
+\r
+    // WEST SCALE\r
+    for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
+    {\r
+      SequenceI seq = av.getAlignment().getSequenceAt(i);\r
+      int index = startx;\r
+      int value = -1;\r
+\r
+      while (index < endx)\r
+      {\r
+        if (jalview.util.Comparison.isGap(seq.getCharAt(index)))\r
+        {\r
+          index++;\r
+\r
+          continue;\r
+        }\r
+\r
+        value = av.getAlignment().getSequenceAt(i).findPosition(index);\r
+\r
+        break;\r
+      }\r
+\r
+      if (value != -1)\r
+      {\r
+        int x = LABEL_WEST - fm.stringWidth(String.valueOf(value))\r
+                - av.charWidth / 2;\r
+        g.drawString(value + "", x, (ypos + (i * av.charHeight))\r
+                - (av.charHeight / 5));\r
+      }\r
+    }\r
+  }\r
+\r
+  void drawEastScale(Graphics g, int startx, int endx, int ypos)\r
+  {\r
+    ypos += av.charHeight;\r
+\r
+    if (av.hasHiddenColumns())\r
+    {\r
+      endx = av.getColumnSelection().adjustForHiddenColumns(endx);\r
+    }\r
+\r
+    SequenceI seq;\r
+    // EAST SCALE\r
+    for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
+    {\r
+      seq = av.getAlignment().getSequenceAt(i);\r
+      int index = endx;\r
+      int value = -1;\r
+\r
+      while (index > startx)\r
+      {\r
+        if (jalview.util.Comparison.isGap(seq.getCharAt(index)))\r
+        {\r
+          index--;\r
+\r
+          continue;\r
+        }\r
+\r
+        value = seq.findPosition(index);\r
+\r
+        break;\r
+      }\r
+\r
+      if (value != -1)\r
+      {\r
+        g.drawString(String.valueOf(value), 0, (ypos + (i * av.charHeight))\r
+                - (av.charHeight / 5));\r
+      }\r
+    }\r
+  }\r
+\r
+  int lastsr = 0;\r
+\r
+  void fastPaint(int horizontal, int vertical)\r
+  {\r
+    if (fastPaint || gg == null)\r
+    {\r
+      return;\r
+    }\r
+\r
+    // Its possible on certain browsers that the call to fastpaint\r
+    // is faster than it can paint, so this check here catches\r
+    // this possibility\r
+    if (lastsr + horizontal != av.startRes)\r
+    {\r
+      horizontal = av.startRes - lastsr;\r
+    }\r
+\r
+    lastsr = av.startRes;\r
+\r
+    fastPaint = true;\r
+    gg.copyArea(horizontal * av.charWidth, vertical * av.charHeight,\r
+            imgWidth - horizontal * av.charWidth, imgHeight - vertical\r
+                    * av.charHeight, -horizontal * av.charWidth, -vertical\r
+                    * av.charHeight);\r
+\r
+    int sr = av.startRes, er = av.endRes, ss = av.startSeq, es = av.endSeq, transX = 0, transY = 0;\r
+\r
+    if (horizontal > 0) // scrollbar pulled right, image to the left\r
+    {\r
+      transX = (er - sr - horizontal) * av.charWidth;\r
+      sr = er - horizontal;\r
+    }\r
+    else if (horizontal < 0)\r
+    {\r
+      er = sr - horizontal;\r
+    }\r
+\r
+    else if (vertical > 0) // scroll down\r
+    {\r
+      ss = es - vertical;\r
+      if (ss < av.startSeq) // ie scrolling too fast, more than a page at a time\r
+      {\r
+        ss = av.startSeq;\r
+      }\r
+      else\r
+      {\r
+        transY = imgHeight - vertical * av.charHeight;\r
+      }\r
+    }\r
+    else if (vertical < 0)\r
+    {\r
+      es = ss - vertical;\r
+      if (es > av.endSeq)\r
+      {\r
+        es = av.endSeq;\r
+      }\r
+    }\r
+\r
+    gg.translate(transX, transY);\r
+\r
+    drawPanel(gg, sr, er, ss, es, 0);\r
+    gg.translate(-transX, -transY);\r
+\r
+    repaint();\r
+\r
+  }\r
+\r
+  /**\r
+   * Definitions of startx and endx (hopefully): SMJS This is what I'm working\r
+   * towards! startx is the first residue (starting at 0) to display. endx is\r
+   * the last residue to display (starting at 0). starty is the first sequence\r
+   * to display (starting at 0). endy is the last sequence to display (starting\r
+   * at 0). NOTE 1: The av limits are set in setFont in this class and in the\r
+   * adjustment listener in SeqPanel when the scrollbars move.\r
+   */\r
+  public void update(Graphics g)\r
+  {\r
+    paint(g);\r
+  }\r
+\r
+  public void paint(Graphics g)\r
+  {\r
+\r
+    if (img != null\r
+            && (fastPaint || (getSize().width != g.getClipBounds().width) || (getSize().height != g\r
+                    .getClipBounds().height)))\r
+    {\r
+      g.drawImage(img, 0, 0, this);\r
+      fastPaint = false;\r
+      return;\r
+    }\r
+\r
+    if (fastPaint)\r
+    {\r
+      g.drawImage(img, 0, 0, this);\r
+      fastPaint = false;\r
+      return;\r
+    }\r
+\r
+    // this draws the whole of the alignment\r
+    imgWidth = this.getSize().width;\r
+    imgHeight = this.getSize().height;\r
+\r
+    imgWidth -= imgWidth % av.charWidth;\r
+    imgHeight -= imgHeight % av.charHeight;\r
+\r
+    if (imgWidth < 1 || imgHeight < 1)\r
+    {\r
+      return;\r
+    }\r
+\r
+    if (img == null || imgWidth != img.getWidth(this)\r
+            || imgHeight != img.getHeight(this))\r
+    {\r
+      img = createImage(imgWidth, imgHeight);\r
+      gg = img.getGraphics();\r
+      gg.setFont(av.getFont());\r
+    }\r
+\r
+    gg.setColor(Color.white);\r
+    gg.fillRect(0, 0, imgWidth, imgHeight);\r
+\r
+    if (av.getWrapAlignment())\r
+    {\r
+      drawWrappedPanel(gg, imgWidth, imgHeight, av.startRes);\r
+    }\r
+    else\r
+    {\r
+      drawPanel(gg, av.startRes, av.endRes, av.startSeq, av.endSeq, 0);\r
+    }\r
+\r
+    g.drawImage(img, 0, 0, this);\r
+\r
+  }\r
+\r
+  int LABEL_WEST, LABEL_EAST;\r
+\r
+  public int getWrappedCanvasWidth(int cwidth)\r
+  {\r
+    cwidth -= cwidth % av.charWidth;\r
+\r
+    FontMetrics fm = getFontMetrics(av.getFont());\r
+\r
+    LABEL_EAST = 0;\r
+    LABEL_WEST = 0;\r
+\r
+    if (av.scaleRightWrapped)\r
+    {\r
+      LABEL_EAST = fm.stringWidth(getMask());\r
+    }\r
+\r
+    if (av.scaleLeftWrapped)\r
+    {\r
+      LABEL_WEST = fm.stringWidth(getMask());\r
+    }\r
+\r
+    return (cwidth - LABEL_EAST - LABEL_WEST) / av.charWidth;\r
+  }\r
+\r
+  /**\r
+   * Generates a string of zeroes.\r
+   * \r
+   * @return String\r
+   */\r
+  String getMask()\r
+  {\r
+    String mask = "0";\r
+    int maxWidth = 0;\r
+    int tmp;\r
+    AlignmentI alignment = av.getAlignment();\r
+    for (int i = 0; i < alignment.getHeight(); i++)\r
+    {\r
+      tmp = alignment.getSequenceAt(i).getEnd();\r
+      if (tmp > maxWidth)\r
+      {\r
+        maxWidth = tmp;\r
+      }\r
+    }\r
+\r
+    for (int i = maxWidth; i > 0; i /= 10)\r
+    {\r
+      mask += "0";\r
+    }\r
+    return mask;\r
+  }\r
+\r
+  public void drawWrappedPanel(Graphics g, int canvasWidth,\r
+          int canvasHeight, int startRes)\r
+  {\r
+    AlignmentI al = av.getAlignment();\r
+\r
+    FontMetrics fm = getFontMetrics(av.getFont());\r
+\r
+    if (av.scaleRightWrapped)\r
+    {\r
+      LABEL_EAST = fm.stringWidth(getMask());\r
+    }\r
+\r
+    if (av.scaleLeftWrapped)\r
+    {\r
+      LABEL_WEST = fm.stringWidth(getMask());\r
+    }\r
+\r
+    int hgap = av.charHeight;\r
+    if (av.scaleAboveWrapped)\r
+    {\r
+      hgap += av.charHeight;\r
+    }\r
+\r
+    int cWidth = (canvasWidth - LABEL_EAST - LABEL_WEST) / av.charWidth;\r
+    int cHeight = av.getAlignment().getHeight() * av.charHeight;\r
+\r
+    av.setWrappedWidth(cWidth);\r
+\r
+    av.endRes = av.startRes + cWidth;\r
+\r
+    int endx;\r
+    int ypos = hgap;\r
+\r
+    int maxwidth = av.getAlignment().getWidth() - 1;\r
+\r
+    if (av.hasHiddenColumns())\r
+    {\r
+      maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;\r
+    }\r
+\r
+    while ((ypos <= canvasHeight) && (startRes < maxwidth))\r
+    {\r
+      endx = startRes + cWidth - 1;\r
+\r
+      if (endx > maxwidth)\r
+      {\r
+        endx = maxwidth;\r
+      }\r
+\r
+      g.setColor(Color.black);\r
+\r
+      if (av.scaleLeftWrapped)\r
+      {\r
+        drawWestScale(g, startRes, endx, ypos);\r
+      }\r
+\r
+      if (av.scaleRightWrapped)\r
+      {\r
+        g.translate(canvasWidth - LABEL_EAST, 0);\r
+        drawEastScale(g, startRes, endx, ypos);\r
+        g.translate(-(canvasWidth - LABEL_EAST), 0);\r
+      }\r
+\r
+      g.translate(LABEL_WEST, 0);\r
+\r
+      if (av.scaleAboveWrapped)\r
+      {\r
+        drawNorthScale(g, startRes, endx, ypos);\r
+      }\r
+      if (av.hasHiddenColumns() && av.showHiddenMarkers)\r
+      {\r
+        g.setColor(Color.blue);\r
+        int res;\r
+        for (int i = 0; i < av.getColumnSelection().getHiddenColumns()\r
+                .size(); i++)\r
+        {\r
+          res = av.getColumnSelection().findHiddenRegionPosition(i)\r
+                  - startRes;\r
+\r
+          if (res < 0 || res > endx - startRes)\r
+          {\r
+            continue;\r
+          }\r
+\r
+          gg.fillPolygon(new int[]\r
+          { res * av.charWidth - av.charHeight / 4,\r
+              res * av.charWidth + av.charHeight / 4, res * av.charWidth },\r
+                  new int[]\r
+                  { ypos - (av.charHeight / 2), ypos - (av.charHeight / 2),\r
+                      ypos - (av.charHeight / 2) + 8 }, 3);\r
+\r
+        }\r
+      }\r
+\r
+      if (g.getClip() == null)\r
+      {\r
+        g.setClip(0, 0, cWidth * av.charWidth, canvasHeight);\r
+      }\r
+\r
+      drawPanel(g, startRes, endx, 0, al.getHeight(), ypos);\r
+      g.setClip(null);\r
+\r
+      if (av.showAnnotation)\r
+      {\r
+        g.translate(0, cHeight + ypos + 4);\r
+        if (annotations == null)\r
+        {\r
+          annotations = new AnnotationPanel(av);\r
+        }\r
+\r
+        annotations.drawComponent(g, startRes, endx + 1);\r
+        g.translate(0, -cHeight - ypos - 4);\r
+      }\r
+      g.translate(-LABEL_WEST, 0);\r
+\r
+      ypos += cHeight + getAnnotationHeight() + hgap;\r
+\r
+      startRes += cWidth;\r
+    }\r
+\r
+  }\r
+\r
+  AnnotationPanel annotations;\r
+\r
+  int getAnnotationHeight()\r
+  {\r
+    if (!av.showAnnotation)\r
+    {\r
+      return 0;\r
+    }\r
+\r
+    if (annotations == null)\r
+    {\r
+      annotations = new AnnotationPanel(av);\r
+    }\r
+\r
+    return annotations.adjustPanelHeight();\r
+  }\r
+\r
+  void drawPanel(Graphics g1, int startRes, int endRes, int startSeq,\r
+          int endSeq, int offset)\r
+  {\r
+\r
+\r
+    if (!av.hasHiddenColumns())\r
+    {\r
+      draw(g1, startRes, endRes, startSeq, endSeq, offset);\r
+    }\r
+    else\r
+    {\r
+\r
+      int screenY = 0;\r
+      int blockStart = startRes;\r
+      int blockEnd = endRes;\r
+\r
+      if (av.hasHiddenColumns())\r
+      {\r
+        for (int[] region : av.getColumnSelection().getHiddenColumns())\r
+        {\r
+          int hideStart = region[0];\r
+          int hideEnd = region[1];\r
+\r
+          if (hideStart <= blockStart)\r
+          {\r
+            blockStart += (hideEnd - hideStart) + 1;\r
+            continue;\r
+          }\r
+\r
+          blockEnd = hideStart - 1;\r
+\r
+          g1.translate(screenY * av.charWidth, 0);\r
+\r
+          draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);\r
+\r
+          if (av.getShowHiddenMarkers())\r
+          {\r
+            g1.setColor(Color.blue);\r
+            g1.drawLine((blockEnd - blockStart + 1) * av.charWidth - 1,\r
+                    0 + offset, (blockEnd - blockStart + 1) * av.charWidth\r
+                            - 1, (endSeq - startSeq) * av.charHeight\r
+                            + offset);\r
+          }\r
+\r
+          g1.translate(-screenY * av.charWidth, 0);\r
+          screenY += blockEnd - blockStart + 1;\r
+          blockStart = hideEnd + 1;\r
+        }\r
+      }\r
+      if (screenY <= (endRes - startRes))\r
+      {\r
+        blockEnd = blockStart + (endRes - startRes) - screenY;\r
+        g1.translate(screenY * av.charWidth, 0);\r
+        draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);\r
+\r
+        g1.translate(-screenY * av.charWidth, 0);\r
+      }\r
+    }\r
+\r
+  }\r
+\r
+  // int startRes, int endRes, int startSeq, int endSeq, int x, int y,\r
+  // int x1, int x2, int y1, int y2, int startx, int starty,\r
+  void draw(Graphics g, int startRes, int endRes, int startSeq, int endSeq,\r
+          int offset)\r
+  {\r
+    g.setFont(av.getFont());\r
+    sr.prepare(g, av.renderGaps);\r
+\r
+    SequenceI nextSeq;\r
+\r
+    // / First draw the sequences\r
+    // ///////////////////////////\r
+    for (int i = startSeq; i < endSeq; i++)\r
+    {\r
+      nextSeq = av.getAlignment().getSequenceAt(i);\r
+\r
+      if (nextSeq == null)\r
+      {\r
+        continue;\r
+      }\r
+\r
+      sr.drawSequence(nextSeq, av.getAlignment().findAllGroups(nextSeq),\r
+              startRes, endRes, offset + ((i - startSeq) * av.charHeight));\r
+\r
+      if (av.isShowSequenceFeatures())\r
+      {\r
+        fr.drawSequence(g, nextSeq, startRes, endRes, offset\r
+                + ((i - startSeq) * av.charHeight));\r
+      }\r
+\r
+      // / Highlight search Results once all sequences have been drawn\r
+      // ////////////////////////////////////////////////////////\r
+      if (searchResults != null)\r
+      {\r
+        int[] visibleResults = searchResults.getResults(nextSeq, startRes,\r
+                endRes);\r
+        if (visibleResults != null)\r
+        {\r
+          for (int r = 0; r < visibleResults.length; r += 2)\r
+          {\r
+            sr.drawHighlightedText(nextSeq, visibleResults[r],\r
+                    visibleResults[r + 1], (visibleResults[r] - startRes)\r
+                            * av.charWidth, offset\r
+                            + ((i - startSeq) * av.charHeight));\r
+          }\r
+        }\r
+      }\r
+\r
+      if (av.cursorMode && cursorY == i && cursorX >= startRes\r
+              && cursorX <= endRes)\r
+      {\r
+        sr.drawCursor(nextSeq, cursorX,\r
+                (cursorX - startRes) * av.charWidth, offset\r
+                        + ((i - startSeq) * av.charHeight));\r
+      }\r
+    }\r
+\r
+    if (av.getSelectionGroup() != null\r
+            || av.getAlignment().getGroups().size() > 0)\r
+    {\r
+      drawGroupsBoundaries(g, startRes, endRes, startSeq, endSeq, offset);\r
+    }\r
+\r
+  }\r
+\r
+  void drawGroupsBoundaries(Graphics g, int startRes, int endRes,\r
+          int startSeq, int endSeq, int offset)\r
+  {\r
+    //\r
+    // ///////////////////////////////////\r
+    // Now outline any areas if necessary\r
+    // ///////////////////////////////////\r
+    SequenceGroup group = av.getSelectionGroup();\r
+\r
+    int sx = -1;\r
+    int sy = -1;\r
+    int ex = -1;\r
+    int groupIndex = -1;\r
+\r
+    if ((group == null) && (av.getAlignment().getGroups().size() > 0))\r
+    {\r
+      group = av.getAlignment().getGroups().get(0);\r
+      groupIndex = 0;\r
+    }\r
+\r
+    if (group != null)\r
+    {\r
+      do\r
+      {\r
+        int oldY = -1;\r
+        int i = 0;\r
+        boolean inGroup = false;\r
+        int top = -1;\r
+        int bottom = -1;\r
+        int alHeight = av.getAlignment().getHeight() - 1;\r
+\r
+        for (i = startSeq; i < endSeq; i++)\r
+        {\r
+          sx = (group.getStartRes() - startRes) * av.charWidth;\r
+          sy = offset + ((i - startSeq) * av.charHeight);\r
+          ex = (((group.getEndRes() + 1) - group.getStartRes()) * av.charWidth) - 1;\r
+\r
+          if (sx + ex < 0 || sx > imgWidth)\r
+          {\r
+            continue;\r
+          }\r
+\r
+          if ((sx <= (endRes - startRes) * av.charWidth)\r
+                  && group.getSequences(null).contains(\r
+                          av.getAlignment().getSequenceAt(i)))\r
+          {\r
+            if ((bottom == -1)\r
+                    && (i >= alHeight || !group.getSequences(null)\r
+                            .contains(\r
+                                    av.getAlignment().getSequenceAt(i + 1))))\r
+            {\r
+              bottom = sy + av.charHeight;\r
+            }\r
+\r
+            if (!inGroup)\r
+            {\r
+              if (((top == -1) && (i == 0))\r
+                      || !group.getSequences(null).contains(\r
+                              av.getAlignment().getSequenceAt(i - 1)))\r
+              {\r
+                top = sy;\r
+              }\r
+\r
+              oldY = sy;\r
+              inGroup = true;\r
+\r
+              if (group == av.getSelectionGroup())\r
+              {\r
+                g.setColor(Color.red);\r
+              }\r
+              else\r
+              {\r
+                g.setColor(group.getOutlineColour());\r
+              }\r
+            }\r
+          }\r
+          else\r
+          {\r
+            if (inGroup)\r
+            {\r
+              if (sx >= 0 && sx < imgWidth)\r
+              {\r
+                g.drawLine(sx, oldY, sx, sy);\r
+              }\r
+\r
+              if (sx + ex < imgWidth)\r
+              {\r
+                g.drawLine(sx + ex, oldY, sx + ex, sy);\r
+              }\r
+\r
+              if (sx < 0)\r
+              {\r
+                ex += sx;\r
+                sx = 0;\r
+              }\r
+\r
+              if (sx + ex > imgWidth)\r
+              {\r
+                ex = imgWidth;\r
+              }\r
+\r
+              else if (sx + ex >= (endRes - startRes + 1) * av.charWidth)\r
+              {\r
+                ex = (endRes - startRes + 1) * av.charWidth;\r
+              }\r
+\r
+              if (top != -1)\r
+              {\r
+                g.drawLine(sx, top, sx + ex, top);\r
+                top = -1;\r
+              }\r
+\r
+              if (bottom != -1)\r
+              {\r
+                g.drawLine(sx, bottom, sx + ex, bottom);\r
+                bottom = -1;\r
+              }\r
+\r
+              inGroup = false;\r
+            }\r
+          }\r
+        }\r
+\r
+        if (inGroup)\r
+        {\r
+          sy = offset + ((i - startSeq) * av.charHeight);\r
+          if (sx >= 0 && sx < imgWidth)\r
+          {\r
+            g.drawLine(sx, oldY, sx, sy);\r
+          }\r
+\r
+          if (sx + ex < imgWidth)\r
+          {\r
+            g.drawLine(sx + ex, oldY, sx + ex, sy);\r
+          }\r
+\r
+          if (sx < 0)\r
+          {\r
+            ex += sx;\r
+            sx = 0;\r
+          }\r
+\r
+          if (sx + ex > imgWidth)\r
+          {\r
+            ex = imgWidth;\r
+          }\r
+          else if (sx + ex >= (endRes - startRes + 1) * av.charWidth)\r
+          {\r
+            ex = (endRes - startRes + 1) * av.charWidth;\r
+          }\r
+\r
+          if (top != -1)\r
+          {\r
+            g.drawLine(sx, top, sx + ex, top);\r
+            top = -1;\r
+          }\r
+\r
+          if (bottom != -1)\r
+          {\r
+            g.drawLine(sx, bottom - 1, sx + ex, bottom - 1);\r
+            bottom = -1;\r
+          }\r
+\r
+          inGroup = false;\r
+        }\r
+\r
+        groupIndex++;\r
+\r
+        if (groupIndex >= av.getAlignment().getGroups().size())\r
+        {\r
+          break;\r
+        }\r
+\r
+        group = av.getAlignment().getGroups()\r
+                .get(groupIndex);\r
+      } while (groupIndex < av.getAlignment().getGroups().size());\r
+\r
+    }\r
+  }\r
+\r
+  public void highlightSearchResults(SearchResults results)\r
+  {\r
+    searchResults = results;\r
+\r
+    repaint();\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/TitledPanel.java b/src/jalview/appletgui/TitledPanel.java
new file mode 100644 (file)
index 0000000..1ae36f4
--- /dev/null
@@ -0,0 +1,75 @@
+package jalview.appletgui;
+
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Label;
+import java.awt.Panel;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+public class TitledPanel extends Panel
+{
+
+  private String title;
+
+  private Insets insets = new Insets(10, 10, 10, 10);
+
+  public TitledPanel()
+  {
+    this("");
+  }
+
+  public TitledPanel(String title)
+  {
+    this.setTitle(title);
+  }
+
+  public Insets getInsets()
+  {
+    return insets;
+  }
+
+  public void paint(Graphics g)
+  {
+    super.paint(g);
+    g.setColor(getForeground());
+    g.drawRect(5, 5, getWidth() - 10, getHeight() - 10);
+    int width = g.getFontMetrics().stringWidth(getTitle());
+    g.setColor(getBackground());
+    g.fillRect(10, 0, width, 10);
+    g.setColor(getForeground());
+    g.drawString(getTitle(), 10, 10);
+  }
+
+  public static void main(String[] args)
+  {
+    Frame f = new Frame("TitledPanel Tester");
+
+    TitledPanel p = new TitledPanel("Title of Panel");
+    p.add(new Label("Label 1"));
+    p.add(new Label("Label 2"));
+    p.add(new Label("Label 3"));
+    f.add(p);
+
+    f.addWindowListener(new WindowAdapter()
+    {
+      public void windowClosing(WindowEvent e)
+      {
+        System.exit(0);
+      }
+    });
+    f.setBounds(300, 300, 300, 300);
+    f.setVisible(true);
+  }
+
+  public String getTitle()
+  {
+    return title;
+  }
+
+  public void setTitle(String title)
+  {
+    this.title = title;
+  }
+}
\ No newline at end of file
index 7b42a30..4d734c7 100644 (file)
@@ -28,15 +28,12 @@ import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureRenderer;
 import jalview.commands.OrderCommand;
 import jalview.datamodel.AlignmentI;
-import jalview.datamodel.Annotation;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.util.MessageManager;
-import jalview.viewmodel.annotationfilter.AnnotationFilterParameter;
-import jalview.viewmodel.annotationfilter.AnnotationFilterParameter.SearchableAnnotationField;
 
 import java.awt.Color;
 import java.util.ArrayList;
@@ -305,90 +302,7 @@ public class AlignViewController implements AlignViewControllerI
     }
   }
 
-  public static boolean filterAnnotations(Annotation[] annotations,
-          AnnotationFilterParameter filterParams, ColumnSelection cs)
-  {
-    cs.revealAllHiddenColumns();
-    cs.clear();
-    int count = 0;
-    do
-    {
-      if (annotations[count] != null)
-      {
-
-        boolean itemMatched = false;
-
-        if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD
-                && annotations[count].value > filterParams
-                        .getThresholdValue())
-        {
-          itemMatched = true;
-        }
-        if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD
-                && annotations[count].value < filterParams
-                        .getThresholdValue())
-        {
-          itemMatched = true;
-        }
-
-        if (filterParams.isFilterAlphaHelix()
-                && annotations[count].secondaryStructure == 'H')
-        {
-          itemMatched = true;
-        }
-
-        if (filterParams.isFilterBetaSheet()
-                && annotations[count].secondaryStructure == 'E')
-        {
-          itemMatched = true;
-        }
-
-        if (filterParams.isFilterTurn()
-                && annotations[count].secondaryStructure == 'S')
-        {
-          itemMatched = true;
-        }
 
-        String regexSearchString = filterParams.getRegexString();
-        if (regexSearchString != null
-                && !filterParams.getRegexSearchFields().isEmpty())
-        {
-          List<SearchableAnnotationField> fields = filterParams
-                  .getRegexSearchFields();
-          try
-          {
-            if (fields.contains(SearchableAnnotationField.DISPLAY_STRING)
-                    && annotations[count].displayCharacter
-                            .matches(regexSearchString))
-            {
-              itemMatched = true;
-            }
-          } catch (java.util.regex.PatternSyntaxException pse)
-          {
-            if (annotations[count].displayCharacter
-                    .equals(regexSearchString))
-            {
-              itemMatched = true;
-            }
-          }
-          if (fields.contains(SearchableAnnotationField.DESCRIPTION)
-                  && annotations[count].description != null
-                  && annotations[count].description
-                          .matches(regexSearchString))
-          {
-            itemMatched = true;
-          }
-        }
-
-        if (itemMatched)
-        {
-          cs.addElement(count);
-        }
-      }
-      count++;
-    } while (count < annotations.length);
-    return false;
-  }
 
   @Override
   public void sortAlignmentByFeatureDensity(String[] typ)
index f1c6cc4..6acca32 100644 (file)
 package jalview.datamodel;
 
 import jalview.util.ShiftList;
+import jalview.viewmodel.annotationfilter.AnnotationFilterParameter;
+import jalview.viewmodel.annotationfilter.AnnotationFilterParameter.SearchableAnnotationField;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Vector;
@@ -477,16 +480,13 @@ public class ColumnSelection
   }
 
   /**
-   * This Method is used to return all the HiddenColumn regions less than the
-   * given index.
-   * 
-   * @param end
-   *          int
-   * @return Vector
+   * This Method is used to return all the HiddenColumn regions
+   * @return empty list or List of hidden column intervals
    */
   public List<int[]> getHiddenColumns()
   {
-    return hiddenColumns;
+    return hiddenColumns == null ? Arrays.asList(new int[]
+    {}) : hiddenColumns;
   }
 
   /**
@@ -1283,6 +1283,15 @@ public class ColumnSelection
   {
     return hiddenColumns != null && hiddenColumns.size() > 0;
   }
+  
+  /**
+   * 
+   * @return true if there are more than one set of columns hidden
+   */
+  public boolean hasManyHiddenColumns()
+  {
+    return hiddenColumns != null && hiddenColumns.size() > 1;
+  }
 
   /**
    * mark the columns corresponding to gap characters as hidden in the column
@@ -1298,4 +1307,89 @@ public class ColumnSelection
       hideColumns(r[0], r[1]);
     }
   }
+  
+  public boolean filterAnnotations(Annotation[] annotations,
+          AnnotationFilterParameter filterParams)
+  {
+    this.revealAllHiddenColumns();
+    this.clear();
+    int count = 0;
+    do
+    {
+      if (annotations[count] != null)
+      {
+
+        boolean itemMatched = false;
+
+        if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD
+                && annotations[count].value >= filterParams
+                        .getThresholdValue())
+        {
+          itemMatched = true;
+        }
+        if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD
+                && annotations[count].value <= filterParams
+                        .getThresholdValue())
+        {
+          itemMatched = true;
+        }
+
+        if (filterParams.isFilterAlphaHelix()
+                && annotations[count].secondaryStructure == 'H')
+        {
+          itemMatched = true;
+        }
+
+        if (filterParams.isFilterBetaSheet()
+                && annotations[count].secondaryStructure == 'E')
+        {
+          itemMatched = true;
+        }
+
+        if (filterParams.isFilterTurn()
+                && annotations[count].secondaryStructure == 'S')
+        {
+          itemMatched = true;
+        }
+
+        String regexSearchString = filterParams.getRegexString();
+        if (regexSearchString != null
+                && !filterParams.getRegexSearchFields().isEmpty())
+        {
+          List<SearchableAnnotationField> fields = filterParams
+                  .getRegexSearchFields();
+          try
+          {
+            if (fields.contains(SearchableAnnotationField.DISPLAY_STRING)
+                    && annotations[count].displayCharacter
+                            .matches(regexSearchString))
+            {
+              itemMatched = true;
+            }
+          } catch (java.util.regex.PatternSyntaxException pse)
+          {
+            if (annotations[count].displayCharacter
+                    .equals(regexSearchString))
+            {
+              itemMatched = true;
+            }
+          }
+          if (fields.contains(SearchableAnnotationField.DESCRIPTION)
+                  && annotations[count].description != null
+                  && annotations[count].description
+                          .matches(regexSearchString))
+          {
+            itemMatched = true;
+          }
+        }
+
+        if (itemMatched)
+        {
+          this.addElement(count);
+        }
+      }
+      count++;
+    } while (count < annotations.length);
+    return false;
+  }
 }
index 3c6fd88..2ad0bd2 100644 (file)
@@ -63,9 +63,6 @@ public class AnnotationColourChooser extends AnnotationRowFilter
 
   JButton defColours = new JButton();
 
-  JButton ok = new JButton();
-
-  JButton cancel = new JButton();
 
   JPanel jPanel1 = new JPanel();
 
index 9f3aa7b..00c4217 100644 (file)
@@ -1,6 +1,5 @@
 package jalview.gui;
 
-import jalview.controller.AlignViewController;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.ColumnSelection;
 import jalview.schemes.AnnotationColourGradient;
@@ -18,7 +17,6 @@ import java.awt.event.ItemListener;
 import java.util.Iterator;
 
 import javax.swing.ButtonGroup;
-import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JInternalFrame;
@@ -39,9 +37,9 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements
 
   private JComboBox<String> annotations;
 
-  private JButton ok = new JButton();
-
-  private JButton cancel = new JButton();
+  // private JButton ok = new JButton();
+  //
+  // private JButton cancel = new JButton();
 
   private JPanel actionPanel = new JPanel();
 
@@ -51,7 +49,6 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements
 
   private CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel
           .getLayout());
-
   private JPanel noGraphFilterView = new JPanel();
 
   private JPanel graphFilterView = new JPanel();
@@ -437,9 +434,8 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements
       }
     }
 
-    AlignViewController.filterAnnotations(
-            getCurrentAnnotation().annotations, filterParams,
-            av.getColumnSelection());
+    av.getColumnSelection().filterAnnotations(
+            getCurrentAnnotation().annotations, filterParams);
 
     av.showAllHiddenColumns();
     if (getActionOption() == ACTION_OPTION_HIDE)
index c0eea38..21c91d8 100644 (file)
@@ -11,6 +11,7 @@ import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.Vector;
 
+import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JInternalFrame;
@@ -50,6 +51,11 @@ public abstract class AnnotationRowFilter extends JPanel
   protected JTextField thresholdValue = new JTextField(20);
 
   protected JInternalFrame frame;
+
+  protected JButton ok = new JButton();
+
+  protected JButton cancel = new JButton();
+
   /**
    * enabled if the user is dragging the slider - try to keep updates to a
    * minimun
index c404e2f..b4e0e00 100644 (file)
@@ -226,14 +226,10 @@ public final class JvSwingUtils
     setColorAndFont(comp);
   }
 
-  // public static void jvInitComponent(JComponent comp, String name){
-  // setColorAndFont(comp);
-  // comp.setText(MessageManager.getString("label.select_all"));
-  // }
-
   private static void setColorAndFont(JComponent comp)
   {
     comp.setBackground(Color.white);
     comp.setFont(JvSwingUtils.getLabelFont());
   }
+
 }