X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FFeatureSettings.java;fp=src%2Fjalview%2Fappletgui%2FFeatureSettings.java;h=9d2f601aad50435f1814b57d7144707c57ad31e2;hb=37dc43b2c777c1bf999117252f01aaad1e6c276c;hp=1b9fbf9db0c479ce77cb9b60c942c0def6c21117;hpb=f2779aae6cd89facf15b81e053179e15e0315546;p=jalview.git diff --git a/src/jalview/appletgui/FeatureSettings.java b/src/jalview/appletgui/FeatureSettings.java index 1b9fbf9..9d2f601 100755 --- a/src/jalview/appletgui/FeatureSettings.java +++ b/src/jalview/appletgui/FeatureSettings.java @@ -58,8 +58,10 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Arrays; import java.util.Enumeration; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Vector; public class FeatureSettings extends Panel implements ItemListener, @@ -106,6 +108,7 @@ public class FeatureSettings extends Panel implements ItemListener, { fr.findAllFeatures(true); // was default - now true to make all visible } + groupPanel = new Panel(); discoverAllFeatureData(); @@ -133,17 +136,15 @@ public class FeatureSettings extends Panel implements ItemListener, add(lowerPanel, BorderLayout.SOUTH); - if (groupPanel != null) - { - groupPanel.setLayout(new GridLayout( - (fr.getFeatureGroupsSize()) / 4 + 1, 4)); // JBPNote - this was - // scaled on number of - // visible groups. seems - // broken - groupPanel.validate(); + groupPanel.setLayout(new GridLayout( + (fr.getFeatureGroupsSize()) / 4 + 1, 4)); // JBPNote - this was + // scaled on number of + // visible groups. seems + // broken + groupPanel.validate(); + + add(groupPanel, BorderLayout.NORTH); - add(groupPanel, BorderLayout.NORTH); - } frame = new Frame(); frame.add(this); final FeatureSettings me = this; @@ -326,44 +327,43 @@ public class FeatureSettings extends Panel implements ItemListener, if (fr.getAllFeatureColours() != null && fr.getAllFeatureColours().size() > 0) { - rebuildGroups(); + // rebuildGroups(); } resetTable(false); } /** - * rebuilds the group panel + * Answers the visibility of the given group, and adds a checkbox for it if + * there is not one already */ - public void rebuildGroups() + public boolean checkGroupState(String group) { - boolean rdrw = false; - if (groupPanel == null) - { - groupPanel = new Panel(); - } - else - { - rdrw = true; - groupPanel.removeAll(); - } - // TODO: JAL-964 - smoothly incorporate new group entries if panel already - // displayed and new groups present - for (String group : fr.getFeatureGroups()) - { - boolean vis = fr.checkGroupVisibility(group, false); - Checkbox check = new MyCheckbox(group, vis, false); - check.addMouseListener(this); - check.setFont(new Font("Serif", Font.BOLD, 12)); - check.addItemListener(groupItemListener); - // note - visibility seems to correlate with displayed. ???wtf ?? - check.setVisible(vis); - groupPanel.add(check); - } - if (rdrw) + boolean visible = fr.checkGroupVisibility(group, true); + + /* + * is there already a checkbox for this group? + */ + for (int g = 0; g < groupPanel.getComponentCount(); g++) { - groupPanel.validate(); + if (((Checkbox) groupPanel.getComponent(g)).getLabel().equals(group)) + { + ((Checkbox) groupPanel.getComponent(g)).setState(visible); + return visible; + } } + + /* + * add a new checkbox + */ + Checkbox check = new MyCheckbox(group, visible, false); + check.addMouseListener(this); + check.setFont(new Font("Serif", Font.BOLD, 12)); + check.addItemListener(groupItemListener); + groupPanel.add(check); + + groupPanel.validate(); + return visible; } // This routine adds and removes checkboxes depending on @@ -373,7 +373,9 @@ public class FeatureSettings extends Panel implements ItemListener, SequenceFeature[] tmpfeatures; String group = null, type; Vector visibleChecks = new Vector(); + Set foundGroups = new HashSet(); AlignmentI alignment = av.getAlignment(); + for (int i = 0; i < alignment.getHeight(); i++) { if (alignment.getSequenceAt(i).getSequenceFeatures() == null) @@ -386,8 +388,9 @@ public class FeatureSettings extends Panel implements ItemListener, while (index < tmpfeatures.length) { group = tmpfeatures[index].featureGroup; + foundGroups.add(group); - if (group == null || fr.checkGroupVisibility(group, true)) + if (group == null || checkGroupState(group)) { type = tmpfeatures[index].getType(); if (!visibleChecks.contains(type)) @@ -399,6 +402,11 @@ public class FeatureSettings extends Panel implements ItemListener, } } + /* + * remove any checkboxes for groups not present + */ + pruneGroups(foundGroups); + Component[] comps; int cSize = featurePanel.getComponentCount(); MyCheckbox check; @@ -458,6 +466,25 @@ public class FeatureSettings extends Panel implements ItemListener, } /** + * Remove from the groups panel any checkboxes for groups that are not in the + * foundGroups set. This enables removing a group from the display when the + * last feature in that group is deleted. + * + * @param foundGroups + */ + protected void pruneGroups(Set foundGroups) + { + for (int g = 0; g < groupPanel.getComponentCount(); g++) + { + Checkbox checkbox = (Checkbox) groupPanel.getComponent(g); + if (!foundGroups.contains(checkbox.getLabel())) + { + groupPanel.remove(checkbox); + } + } + } + + /** * update the checklist of feature types with the given type * * @param groupsChanged