added description of alignment quality scores and separated
[jalview.git] / src / jalview / appletgui / FeatureSettings.java
index e01615a..20e4a4d 100755 (executable)
@@ -31,6 +31,9 @@ public class FeatureSettings extends Panel implements ItemListener,
   final AlignmentPanel ap;\r
   final AlignViewport av;\r
   final Frame frame;\r
+  Panel groupPanel;\r
+  Panel featurePanel = new Panel();\r
+  ScrollPane scrollPane;\r
 \r
   public FeatureSettings(AlignViewport av, final AlignmentPanel ap)\r
   {\r
@@ -40,80 +43,167 @@ public class FeatureSettings extends Panel implements ItemListener,
 \r
     setTableData();\r
 \r
+    this.setLayout(new BorderLayout());\r
+    scrollPane = new ScrollPane();\r
+    scrollPane.add(featurePanel);\r
+    add(scrollPane, BorderLayout.CENTER);\r
+    if(groupPanel!=null)\r
+    {\r
+      groupPanel.setLayout(\r
+          new GridLayout(groupPanel.getComponentCount() / 4, 4));\r
+      groupPanel.validate();\r
+\r
+      add(groupPanel, BorderLayout.NORTH);\r
+    }\r
     frame = new Frame();\r
     frame.add(this);\r
-    int height = this.getComponentCount()*50;\r
+    int height = featurePanel.getComponentCount()*50 ;\r
     if (height>400)\r
       height = 400;\r
 \r
-    jalview.bin.JalviewLite.addFrame(frame, "Feature Settings", 200,\r
+    jalview.bin.JalviewLite.addFrame(frame, "Feature Settings", 250,\r
                                      height);\r
   }\r
 \r
   void setTableData()\r
   {\r
+    if(fr.featureGroups==null)\r
+      fr.featureGroups = new Hashtable();\r
+    else\r
+      fr.featureGroups.clear();\r
+\r
     Vector allFeatures = new Vector();\r
-    Vector features;\r
-    Enumeration e;\r
-    SequenceFeature sf;\r
+    SequenceFeature[] tmpfeatures;\r
 \r
     for (int i = 0; i < av.alignment.getHeight(); i++)\r
     {\r
-      features = av.alignment.getSequenceAt(i).getSequenceFeatures();\r
-      if (features == null)\r
+      if (av.alignment.getSequenceAt(i).getSequenceFeatures() == null)\r
         continue;\r
 \r
-      e = features.elements();\r
-      while (e.hasMoreElements())\r
+      tmpfeatures = av.alignment.getSequenceAt(i).getSequenceFeatures();\r
+      int index = 0;\r
+      while (index < tmpfeatures.length)\r
       {\r
-        sf = (SequenceFeature) e.nextElement();\r
-        if (!allFeatures.contains(sf.getType()))\r
+        if(tmpfeatures[index].getFeatureGroup()!=null\r
+           && tmpfeatures[index].getFeatureGroup().length()>0\r
+           && !fr.featureGroups.containsKey(tmpfeatures[index].getFeatureGroup()))\r
+        {\r
+          fr.featureGroups.put(tmpfeatures[index].getFeatureGroup(), new Boolean(true));\r
+          if(groupPanel==null)\r
+          {\r
+            groupPanel = new Panel();\r
+          }\r
+\r
+          Checkbox check = new Checkbox(tmpfeatures[index].getFeatureGroup(), true);\r
+          check.setFont(new Font("Serif", Font.BOLD, 12));\r
+          check.addItemListener(this);\r
+          groupPanel.add(check);\r
+        }\r
+\r
+        if (!allFeatures.contains(tmpfeatures[index].getType()))\r
         {\r
-          allFeatures.addElement(sf.getType());\r
+            allFeatures.addElement(tmpfeatures[index].getType());\r
         }\r
+\r
+\r
+        index ++;\r
       }\r
     }\r
 \r
-    int fSize = allFeatures.size();\r
+    resetTable();\r
+    featurePanel.setLayout(new GridLayout(allFeatures.size(), 2, 10,5));\r
+    featurePanel.validate();\r
+  }\r
 \r
-    String type;\r
-    this.setLayout(new GridLayout(fSize, 2, 10,5));\r
+  void resetTable()\r
+  {\r
+    featurePanel.removeAll();\r
+    Enumeration groups = fr.featureGroups.keys();\r
+    SequenceFeature [] tmpfeatures;\r
+    String group, type;\r
+    Vector checksAdded = new Vector();\r
 \r
-    for (int i = 0; i < fSize; i++)\r
+    while(groups.hasMoreElements())\r
     {\r
-      type = allFeatures.elementAt(i).toString();\r
-      Color col = fr.getColour(type);\r
-      boolean displayed = true;\r
-      if(fr.featuresDisplayed!=null)\r
-        displayed = fr.featuresDisplayed.contains(type);\r
-\r
-      Checkbox check = new Checkbox(type, displayed);\r
-      check.addMouseListener(this);\r
-      check.addMouseMotionListener(this);\r
-      check.setBackground(col);\r
-      check.addItemListener(this);\r
-      add(check);\r
-    }\r
-    validate();\r
+     group = groups.nextElement().toString();\r
+     if ( !( (Boolean) fr.featureGroups.get(group)).booleanValue())\r
+       continue;\r
+\r
+     for (int i = 0; i < av.alignment.getHeight(); i++)\r
+       {\r
+         if (av.alignment.getSequenceAt(i).getSequenceFeatures() == null)\r
+           continue;\r
+\r
+         tmpfeatures = av.alignment.getSequenceAt(i).getSequenceFeatures();\r
+         int index = 0;\r
+         while (index < tmpfeatures.length)\r
+         {\r
+           if (tmpfeatures[index].getFeatureGroup() != null &&\r
+               tmpfeatures[index].getFeatureGroup().equals(group))\r
+           {\r
+             type = tmpfeatures[index].getType();\r
+             if(!checksAdded.contains(type))\r
+             {\r
+               checksAdded.addElement(type);\r
+               Checkbox check = new Checkbox(type, true);\r
+               check.addMouseListener(this);\r
+               check.addMouseMotionListener(this);\r
+               check.setBackground(fr.getColour(type));\r
+               check.addItemListener(this);\r
+               featurePanel.add(check);\r
+             }\r
+           }\r
+           index++;\r
+         }\r
+     }\r
+   }\r
+   featurePanel.validate();\r
+   if(scrollPane!=null)\r
+     scrollPane.validate();\r
   }\r
 \r
   public void itemStateChanged(ItemEvent evt)\r
   {\r
-    Component [] comps = this.getComponents();\r
-    int cSize = comps.length;\r
-\r
-    Object [][] data = new Object[cSize][3];\r
-\r
-    for(int i=0; i<cSize; i++)\r
+    if (evt != null)\r
     {\r
-      Checkbox check = (Checkbox)comps[i];\r
-      data[i][0] = check.getLabel();\r
-      data[i][1] = fr.getColour(check.getLabel());\r
-      data[i][2] = new Boolean(check.getState());\r
+      //Is the source a top level featureGroup?\r
+      Checkbox source = (Checkbox) evt.getSource();\r
+      if (fr.featureGroups.containsKey(source.getLabel()))\r
+      {\r
+        fr.featureGroups.put(source.getLabel(), new Boolean(source.getState()));\r
+        ap.seqPanel.seqCanvas.repaint();\r
+        if (ap.overviewPanel != null)\r
+          ap.overviewPanel.updateOverviewImage();\r
+\r
+        resetTable();\r
+        return;\r
+      }\r
     }\r
 \r
-    fr.setFeaturePriority(data);\r
-    ap.seqPanel.seqCanvas.repaint();\r
+      Component[] comps = featurePanel.getComponents();\r
+      int cSize = comps.length;\r
+\r
+      Object[][] tmp = new Object[cSize][3];\r
+      int tmpSize = 0;\r
+      for (int i = 0; i < cSize; i++)\r
+      {\r
+        Checkbox check = (Checkbox) comps[i];\r
+        if(!check.getState())\r
+          continue;\r
+\r
+        tmp[tmpSize][0] = check.getLabel();\r
+        tmp[tmpSize][1] = fr.getColour(check.getLabel());\r
+        tmp[tmpSize][2] = new Boolean(check.getState());\r
+        tmpSize++;\r
+      }\r
+\r
+      Object[][]data = new Object[tmpSize][3];\r
+      System.arraycopy(tmp, 0, data,0, tmpSize);\r
+\r
+      fr.setFeaturePriority(data);\r
+      ap.seqPanel.seqCanvas.repaint();\r
+      if (ap.overviewPanel != null)\r
+        ap.overviewPanel.updateOverviewImage();\r
   }\r
 \r
   Checkbox selectedCheck;\r
@@ -136,17 +226,18 @@ public class FeatureSettings extends Panel implements ItemListener,
 \r
     int height = evt.getY()+evt.getComponent().getLocation().y;\r
 \r
+\r
     if(height > this.getSize().height)\r
      {\r
-       comp = this.getComponent(this.getComponentCount()-1);\r
+       comp = featurePanel.getComponent(featurePanel.getComponentCount()-1);\r
      }\r
      else if(height < 0)\r
      {\r
-       comp = this.getComponent(0);\r
+       comp = featurePanel.getComponent(0);\r
      }\r
      else\r
      {\r
-       comp = this.getComponentAt(evt.getX(),\r
+       comp = featurePanel.getComponentAt(evt.getX(),\r
                                   evt.getY() +\r
                                   evt.getComponent().getLocation().y);\r
      }\r
@@ -157,16 +248,17 @@ public class FeatureSettings extends Panel implements ItemListener,
     if (selectedCheck != null && target != null && selectedCheck != target)\r
     {\r
       int targetIndex = -1;\r
-      for(int i=0; i<this.getComponentCount(); i++)\r
+      for(int i=0; i<featurePanel.getComponentCount(); i++)\r
       {\r
-          if(target==this.getComponent(i))\r
+          if(target==featurePanel.getComponent(i))\r
           { targetIndex = i; break; }\r
       }\r
 \r
 \r
-      this.remove(selectedCheck);\r
-      this.add(selectedCheck, targetIndex);\r
-      validate();\r
+      featurePanel.remove(selectedCheck);\r
+      featurePanel.add(selectedCheck, targetIndex);\r
+      featurePanel.validate();\r
+      itemStateChanged(null);\r
     }\r
   }\r
 \r