Merge branch 'develop' into features/JAL-2446NCList
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 15 May 2017 16:02:55 +0000 (17:02 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 15 May 2017 16:02:55 +0000 (17:02 +0100)
src/jalview/gui/StructureChooser.java
src/jalview/jbgui/GStructureChooser.java
src/jalview/renderer/OverviewRenderer.java
src/jalview/viewmodel/AlignmentViewport.java

index ee22ae4..3e516a6 100644 (file)
@@ -53,7 +53,6 @@ import java.util.Vector;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
-import javax.swing.JOptionPane;
 import javax.swing.table.AbstractTableModel;
 
 /**
@@ -542,26 +541,26 @@ public class StructureChooser extends GStructureChooser implements
     if (haveData)
     {
       cmb_filterOption.addItem(new FilterOption("Best Quality",
-              "overall_quality", VIEWS_FILTER));
+              "overall_quality", VIEWS_FILTER, false));
       cmb_filterOption.addItem(new FilterOption("Best Resolution",
-              "resolution", VIEWS_FILTER));
+              "resolution", VIEWS_FILTER, false));
       cmb_filterOption.addItem(new FilterOption("Most Protein Chain",
-              "number_of_protein_chains", VIEWS_FILTER));
+              "number_of_protein_chains", VIEWS_FILTER, false));
       cmb_filterOption.addItem(new FilterOption("Most Bound Molecules",
-              "number_of_bound_molecules", VIEWS_FILTER));
+              "number_of_bound_molecules", VIEWS_FILTER, false));
       cmb_filterOption.addItem(new FilterOption("Most Polymer Residues",
-              "number_of_polymer_residues", VIEWS_FILTER));
+              "number_of_polymer_residues", VIEWS_FILTER, true));
     }
     cmb_filterOption.addItem(new FilterOption("Enter PDB Id", "-",
-            VIEWS_ENTER_ID));
+            VIEWS_ENTER_ID, false));
     cmb_filterOption.addItem(new FilterOption("From File", "-",
-            VIEWS_FROM_FILE));
-    FilterOption cachedOption = new FilterOption("Cached PDB Entries", "-",
-            VIEWS_LOCAL_PDB);
-    cmb_filterOption.addItem(cachedOption);
+            VIEWS_FROM_FILE, false));
 
-    if (/*!haveData &&*/cachedPDBExists)
+    if (cachedPDBExists)
     {
+      FilterOption cachedOption = new FilterOption("Cached PDB Entries",
+              "-", VIEWS_LOCAL_PDB, false);
+      cmb_filterOption.addItem(cachedOption);
       cmb_filterOption.setSelectedItem(cachedOption);
     }
 
index 3a064d2..041fefd 100644 (file)
@@ -33,6 +33,7 @@ import jalview.util.MessageManager;
 
 import java.awt.BorderLayout;
 import java.awt.CardLayout;
+import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.GridLayout;
@@ -54,11 +55,14 @@ import javax.swing.JComboBox;
 import javax.swing.JFrame;
 import javax.swing.JInternalFrame;
 import javax.swing.JLabel;
+import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
 import javax.swing.JTabbedPane;
 import javax.swing.JTable;
 import javax.swing.JTextField;
+import javax.swing.ListCellRenderer;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import javax.swing.event.DocumentEvent;
@@ -488,6 +492,19 @@ public abstract class GStructureChooser extends JPanel implements
     });
 
     cmb_filterOption.addItemListener(this);
+
+    // add CustomComboSeparatorsRenderer to filter option combo-box
+    cmb_filterOption.setRenderer(new CustomComboSeparatorsRenderer(
+            (ListCellRenderer<Object>) cmb_filterOption.getRenderer())
+    {
+      @Override
+      protected boolean addSeparatorAfter(JList list, FilterOption value,
+              int index)
+      {
+        return value.isAddSeparatorAfter();
+      }
+    });
+
     chk_invertFilter.addItemListener(this);
 
     pnl_actions.add(chk_rememberSettings);
@@ -643,11 +660,28 @@ public abstract class GStructureChooser extends JPanel implements
 
     private String view;
 
-    public FilterOption(String name, String value, String view)
+    private boolean addSeparatorAfter;
+
+    /**
+     * Model for structure filter option
+     * 
+     * @param name
+     *          - the name of the Option
+     * @param value
+     *          - the value of the option
+     * @param view
+     *          - the category of the filter option
+     * @param addSeparatorAfter
+     *          - if true, a horizontal separator is rendered immediately after
+     *          this filter option, otherwise
+     */
+    public FilterOption(String name, String value, String view,
+            boolean addSeparatorAfter)
     {
       this.name = name;
       this.value = value;
       this.view = view;
+      this.addSeparatorAfter = addSeparatorAfter;
     }
 
     public String getName()
@@ -685,6 +719,16 @@ public abstract class GStructureChooser extends JPanel implements
     {
       return this.name;
     }
+
+    public boolean isAddSeparatorAfter()
+    {
+      return addSeparatorAfter;
+    }
+
+    public void setAddSeparatorAfter(boolean addSeparatorAfter)
+    {
+      this.addSeparatorAfter = addSeparatorAfter;
+    }
   }
 
   /**
@@ -800,6 +844,54 @@ public abstract class GStructureChooser extends JPanel implements
     return cmb_filterOption;
   }
 
+  /**
+   * Custom ListCellRenderer for adding a separator between different categories
+   * of structure chooser filter option drop-down.
+   * 
+   * @author tcnofoegbu
+   *
+   */
+  public abstract class CustomComboSeparatorsRenderer implements
+          ListCellRenderer<Object>
+  {
+    private ListCellRenderer<Object> regent;
+
+    private JPanel separatorPanel = new JPanel(new BorderLayout());
+
+    private JSeparator jSeparator = new JSeparator();
+
+    public CustomComboSeparatorsRenderer(ListCellRenderer<Object> listCellRenderer)
+    {
+      this.regent = listCellRenderer;
+    }
+
+    @Override
+    public Component getListCellRendererComponent(JList list,
+            Object value,
+            int index, boolean isSelected, boolean cellHasFocus)
+    {
+
+      Component comp = regent.getListCellRendererComponent(list, value,
+              index, isSelected, cellHasFocus);
+      if (index != -1
+              && addSeparatorAfter(list, (FilterOption) value, index))
+      { 
+        separatorPanel.removeAll();
+        separatorPanel.add(comp, BorderLayout.CENTER);
+        separatorPanel.add(jSeparator, BorderLayout.SOUTH);
+        return separatorPanel;
+      }
+      else
+      {
+        return comp;
+      }
+    }
+
+    protected abstract boolean addSeparatorAfter(JList list,
+            FilterOption value,
+            int index);
+  }
+
   protected abstract void stateChanged(ItemEvent e);
 
   protected abstract void ok_ActionPerformed();
@@ -816,4 +908,4 @@ public abstract class GStructureChooser extends JPanel implements
   public abstract void tabRefresh();
 
   public abstract void validateSelections();
-}
+}
\ No newline at end of file
index 69676c8..9291ca6 100644 (file)
@@ -95,20 +95,27 @@ public class OverviewRenderer
                 Math.round((colIndex + 1) * pixelsPerCol) - 1,
                 miniMe.getWidth() - 1);
 
-        // determine the colour based on the sequence and column position
-        rgbcolor = getColumnColourFromSequence(seq,
-                hidden || cols.isHidden(alignmentCol), alignmentCol, finder);
-
-        // fill in the appropriate number of pixels
-        for (int row = pixelRow; row <= endRow; ++row)
+        // don't do expensive colour determination if we're not going to use it
+        // NB this is important to avoid performance issues in the overview
+        // panel
+        if (pixelCol <= endCol)
         {
-          for (int col = pixelCol; col <= endCol; ++col)
+          // determine the colour based on the sequence and column position
+          rgbcolor = getColumnColourFromSequence(seq,
+                  hidden || cols.isHidden(alignmentCol), alignmentCol,
+                  finder);
+
+          // fill in the appropriate number of pixels
+          for (int row = pixelRow; row <= endRow; ++row)
           {
-            miniMe.setRGB(col, row, rgbcolor);
+            for (int col = pixelCol; col <= endCol; ++col)
+            {
+              miniMe.setRGB(col, row, rgbcolor);
+            }
           }
-        }
 
-        pixelCol = endCol + 1;
+          pixelCol = endCol + 1;
+        }
         colIndex++;
       }
       pixelRow = endRow + 1;
index 1e31ebc..cdf0758 100644 (file)
@@ -609,7 +609,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
   protected boolean ignoreGapsInConsensusCalculation = false;
 
-  protected ResidueShaderI residueShading;
+  protected ResidueShaderI residueShading = new ResidueShader();
 
   @Override
   public void setGlobalColourScheme(ColourSchemeI cs)