Reveal
[jalview.git] / src / jalview / gui / FeatureSettings.java
index eb74454..7c95ed7 100755 (executable)
@@ -35,6 +35,7 @@ public class FeatureSettings extends JPanel
   final FeatureRenderer fr;\r
   final AlignmentPanel ap;\r
   final AlignViewport av;\r
+  Hashtable allFeatures;\r
   Object [][] originalData;\r
   final JInternalFrame frame;\r
   JScrollPane scrollPane = new JScrollPane();\r
@@ -124,8 +125,12 @@ public class FeatureSettings extends JPanel
     bigPanel.add(transPanel, BorderLayout.SOUTH);\r
     bigPanel.add(scrollPane, BorderLayout.CENTER);\r
     if(groupPanel!=null)\r
+    {\r
+      groupPanel.setLayout(\r
+          new GridLayout(groupPanel.getComponentCount()/3, 4));\r
+      groupPanel.validate();\r
       bigPanel.add(groupPanel, BorderLayout.NORTH);\r
-\r
+    }\r
     add(bigPanel, BorderLayout.CENTER);\r
     add(buttonPanel, BorderLayout.SOUTH);\r
 \r
@@ -139,30 +144,28 @@ public class FeatureSettings extends JPanel
     else\r
       fr.featureGroups.clear();\r
 \r
-    Vector allFeatures = new Vector();\r
-    Vector features;\r
-    Enumeration e;\r
-    SequenceFeature sf;\r
+    allFeatures = new Hashtable();\r
+    SequenceFeature[] features;\r
 \r
   for (int i = 0; i < av.alignment.getHeight(); i++)\r
   {\r
     features = av.alignment.getSequenceAt(i).getDatasetSequence().\r
         getSequenceFeatures();\r
+\r
     if (features == null)\r
       continue;\r
 \r
-    e = features.elements();\r
-    while (e.hasMoreElements())\r
+    int index = 0;\r
+    while (index < features.length)\r
     {\r
-      sf = (SequenceFeature) e.nextElement();\r
-      if(sf.getFeatureGroup()!=null\r
-          && !fr.featureGroups.containsKey(sf.getFeatureGroup()))\r
+      if(features[index].getFeatureGroup()!=null\r
+          && !fr.featureGroups.containsKey(features[index].getFeatureGroup()))\r
        {\r
-         fr.featureGroups.put(sf.getFeatureGroup(), new Boolean(true));\r
+         fr.featureGroups.put(features[index].getFeatureGroup(), new Boolean(true));\r
          if(groupPanel==null)\r
             groupPanel = new JPanel();\r
 \r
-          final JCheckBox check = new JCheckBox(sf.getFeatureGroup(), true);\r
+          final JCheckBox check = new JCheckBox(features[index].getFeatureGroup(), true);\r
           check.setFont(new Font("Serif", Font.BOLD, 12));\r
           check.addItemListener(new ItemListener()\r
               {\r
@@ -176,15 +179,19 @@ public class FeatureSettings extends JPanel
                     if (ap.overviewPanel != null)\r
                       ap.overviewPanel.updateOverviewImage();\r
                   }\r
-\r
+                  resetTable();\r
                 }\r
               });\r
           groupPanel.add(check);\r
        }\r
-      if (!allFeatures.contains(sf.getType()))\r
+      if (!allFeatures.contains(features[index].getType()))\r
       {\r
-        allFeatures.addElement(sf.getType());\r
+        if(features[index].featureGroup!=null)\r
+          allFeatures.put(features[index].getType(), features[index].featureGroup);\r
+        else\r
+          allFeatures.put(features[index].getType(), "NOGROUP");\r
       }\r
+      index++;\r
     }\r
   }\r
     if(allFeatures.size()<1)\r
@@ -200,87 +207,111 @@ public class FeatureSettings extends JPanel
        return;\r
      }\r
 \r
+     resetTable();\r
+  }\r
+\r
+  void resetTable()\r
+  {\r
     int fSize = allFeatures.size();\r
 \r
     String type;\r
     boolean originalExists = false;\r
-    if(originalData!=null)\r
+    if (originalData != null)\r
       originalExists = true;\r
     else\r
       originalData = new Object[fSize][3];\r
 \r
-    Object [][] data = new Object[fSize][3];\r
-    for(int i=0; i<fSize; i++)\r
+    Object[][] tmp = new Object[fSize][3];\r
+    int tmpIndex = 0;\r
+\r
+    Enumeration en = allFeatures.keys();\r
+    int i=0;\r
+    while(en.hasMoreElements())\r
     {\r
-      type = allFeatures.elementAt(i).toString();\r
+      type = en.nextElement().toString();\r
       Color col = fr.getColour(type);\r
-      data[i][0]=type;\r
-      data[i][1]=col;\r
-      if(fr.featuresDisplayed!=null)\r
-         data[i][2] = new Boolean(fr.featuresDisplayed.contains(type));\r
-      else\r
-        data[i][2] = new Boolean(true);\r
-\r
-      if(!originalExists)\r
+\r
+      //This will ignore any features which are in groups not shown\r
+     Object visibleGroup =  fr.featureGroups.get(allFeatures.get(type));\r
+     if(visibleGroup == null\r
+           || ((Boolean)(visibleGroup)).booleanValue())\r
+      {\r
+        tmp[tmpIndex][0] = type;\r
+        tmp[tmpIndex][1] = col;\r
+        if (av.featuresDisplayed != null)\r
+          tmp[tmpIndex][2] = new Boolean(av.featuresDisplayed.containsKey(type));\r
+        else\r
+          tmp[tmpIndex][2] = new Boolean(true);\r
+\r
+        tmpIndex++;\r
+      }\r
+\r
+\r
+      if (!originalExists)\r
       {\r
         originalData[i][0] = type;\r
         originalData[i][1] = col;\r
-        if (fr.featuresDisplayed != null)\r
-          originalData[i][2] = new Boolean(fr.featuresDisplayed.contains(type));\r
+        if (av.featuresDisplayed != null)\r
+          originalData[i][2] = new Boolean(av.featuresDisplayed.contains(type));\r
         else\r
           originalData[i][2] = new Boolean(true);\r
       }\r
+      i++;\r
     }\r
-    ////////////////////////////////////\r
-        //Now build the table\r
-        table = new JTable(new FeatureTableModel(data));\r
-        scrollPane.setViewportView(table);\r
-        table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12));\r
-        table.setFont(new Font("Verdana", Font.PLAIN, 12));\r
-        table.setDefaultRenderer(Color.class,\r
-                             new ColorRenderer());\r
 \r
-        table.setDefaultEditor(Color.class,\r
-                          new ColorEditor());\r
+    Object [][]data = new Object[tmpIndex][3];\r
+    System.arraycopy(tmp, 0, data,0, tmpIndex);\r
 \r
-        table.getColumnModel().getColumn(0).setPreferredWidth(200);\r
+    table = new JTable(new FeatureTableModel(data));\r
+    scrollPane.setViewportView(table);\r
+    table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12));\r
+    table.setFont(new Font("Verdana", Font.PLAIN, 12));\r
+    table.setDefaultRenderer(Color.class,\r
+                         new ColorRenderer());\r
 \r
-        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
+    table.setDefaultEditor(Color.class,\r
+                      new ColorEditor());\r
 \r
-        table.addMouseListener(new MouseAdapter()\r
-            {\r
-              public void mousePressed(MouseEvent evt)\r
-              {\r
-                selectedRow = table.rowAtPoint(evt.getPoint());\r
-              }\r
-            });\r
+    table.getColumnModel().getColumn(0).setPreferredWidth(200);\r
+\r
+    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
 \r
-        table.addMouseMotionListener(new MouseMotionAdapter()\r
+    table.addMouseListener(new MouseAdapter()\r
+        {\r
+          public void mousePressed(MouseEvent evt)\r
+          {\r
+            selectedRow = table.rowAtPoint(evt.getPoint());\r
+          }\r
+        });\r
+\r
+    table.addMouseMotionListener(new MouseMotionAdapter()\r
+        {\r
+          public void mouseDragged(MouseEvent evt)\r
+          {\r
+            int newRow = table.rowAtPoint(evt.getPoint());\r
+            if(newRow!=selectedRow\r
+               && selectedRow!=-1\r
+               && newRow!=-1)\r
             {\r
-              public void mouseDragged(MouseEvent evt)\r
-              {\r
-                int newRow = table.rowAtPoint(evt.getPoint());\r
-                if(newRow!=selectedRow\r
-                   && selectedRow!=-1\r
-                   && newRow!=-1)\r
-                {\r
-                  Object[] temp = new Object[3];\r
-                  temp[0] = table.getValueAt(selectedRow, 0);\r
-                  temp[1] = table.getValueAt(selectedRow, 1);\r
-                  temp[2] = table.getValueAt(selectedRow, 2);\r
+              Object[] temp = new Object[3];\r
+              temp[0] = table.getValueAt(selectedRow, 0);\r
+              temp[1] = table.getValueAt(selectedRow, 1);\r
+              temp[2] = table.getValueAt(selectedRow, 2);\r
 \r
-                  table.setValueAt(table.getValueAt(newRow, 0), selectedRow, 0);\r
-                  table.setValueAt(table.getValueAt(newRow, 1), selectedRow, 1);\r
-                  table.setValueAt(table.getValueAt(newRow, 2), selectedRow, 2);\r
+              table.setValueAt(table.getValueAt(newRow, 0), selectedRow, 0);\r
+              table.setValueAt(table.getValueAt(newRow, 1), selectedRow, 1);\r
+              table.setValueAt(table.getValueAt(newRow, 2), selectedRow, 2);\r
 \r
-                  table.setValueAt(temp[0], newRow, 0);\r
-                  table.setValueAt(temp[1], newRow, 1);\r
-                  table.setValueAt(temp[2], newRow, 2);\r
+              table.setValueAt(temp[0], newRow, 0);\r
+              table.setValueAt(temp[1], newRow, 1);\r
+              table.setValueAt(temp[2], newRow, 2);\r
 \r
-                  selectedRow = newRow;\r
-                }\r
-              }\r
-        });\r
+              selectedRow = newRow;\r
+            }\r
+          }\r
+    });\r
+\r
+    updateFeatureRenderer(data);\r
 \r
   }\r
 \r