X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FFeatureSettings.java;h=f14ec5141198ad29314a749ae00f5d27fe264838;hb=e02486484d33e20dedb020a34f31f6024d5720a2;hp=7c95ed78e19dd96e5aa029bfcd0292b057dcd16d;hpb=c0bf7be8f74d296a751836ee33bc328e2ff6d1b5;p=jalview.git diff --git a/src/jalview/gui/FeatureSettings.java b/src/jalview/gui/FeatureSettings.java index 7c95ed7..f14ec51 100755 --- a/src/jalview/gui/FeatureSettings.java +++ b/src/jalview/gui/FeatureSettings.java @@ -35,13 +35,14 @@ public class FeatureSettings extends JPanel final FeatureRenderer fr; final AlignmentPanel ap; final AlignViewport av; - Hashtable allFeatures; Object [][] originalData; final JInternalFrame frame; JScrollPane scrollPane = new JScrollPane(); JTable table; JPanel groupPanel; + boolean alignmentHasFeatures = false; + public FeatureSettings(AlignViewport av, final AlignmentPanel ap) { this.ap = ap; @@ -127,7 +128,8 @@ public class FeatureSettings extends JPanel if(groupPanel!=null) { groupPanel.setLayout( - new GridLayout(groupPanel.getComponentCount()/3, 4)); + new GridLayout(fr.featureGroups.size() / 4 + 1, 4)); + groupPanel.validate(); bigPanel.add(groupPanel, BorderLayout.NORTH); } @@ -139,62 +141,78 @@ public class FeatureSettings extends JPanel void setTableData() { + alignmentHasFeatures = false; + if (fr.featureGroups == null) fr.featureGroups = new Hashtable(); - else - fr.featureGroups.clear(); - allFeatures = new Hashtable(); - SequenceFeature[] features; + Vector allFeatures = new Vector(); + Vector allGroups = new Vector(); + SequenceFeature[] tmpfeatures; + String group; - for (int i = 0; i < av.alignment.getHeight(); i++) - { - features = av.alignment.getSequenceAt(i).getDatasetSequence(). - getSequenceFeatures(); + for (int i = 0; i < av.alignment.getHeight(); i++) + { + if (av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures() == null) + continue; - if (features == null) - continue; + alignmentHasFeatures = true; - int index = 0; - while (index < features.length) - { - if(features[index].getFeatureGroup()!=null - && !fr.featureGroups.containsKey(features[index].getFeatureGroup())) + tmpfeatures = av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures(); + int index = 0; + while (index < tmpfeatures.length) + { + if(tmpfeatures[index].getFeatureGroup()!=null) + { + group = tmpfeatures[index].featureGroup; + if(!allGroups.contains(group)) + { + allGroups.addElement(group); + + boolean visible = true; + if (fr.featureGroups.containsKey(group)) + { + visible = ( (Boolean) fr.featureGroups.get(group)).booleanValue(); + } + + fr.featureGroups.put(group, new Boolean(visible)); + + if (groupPanel == null) + { + groupPanel = new JPanel(); + } + + final JCheckBox check = new JCheckBox(group, visible); + check.setFont(new Font("Serif", Font.BOLD, 12)); + check.addItemListener(new ItemListener() + { + public void itemStateChanged(ItemEvent evt) + { + fr.featureGroups.put(check.getText(), + new Boolean(check.isSelected())); + ap.seqPanel.seqCanvas.repaint(); + if (ap.overviewPanel != null) + ap.overviewPanel.updateOverviewImage(); + + resetTable(true); + } + }); + groupPanel.add(check); + + } + + } + + if (!allFeatures.contains(tmpfeatures[index].getType())) { - fr.featureGroups.put(features[index].getFeatureGroup(), new Boolean(true)); - if(groupPanel==null) - groupPanel = new JPanel(); - - final JCheckBox check = new JCheckBox(features[index].getFeatureGroup(), true); - check.setFont(new Font("Serif", Font.BOLD, 12)); - check.addItemListener(new ItemListener() - { - public void itemStateChanged(ItemEvent evt) - { - if (fr.featureGroups.containsKey(check.getText())) - { - fr.featureGroups.put(check.getText(), - new Boolean(check.isSelected())); - ap.seqPanel.seqCanvas.repaint(); - if (ap.overviewPanel != null) - ap.overviewPanel.updateOverviewImage(); - } - resetTable(); - } - }); - groupPanel.add(check); + allFeatures.addElement(tmpfeatures[index].getType()); } - if (!allFeatures.contains(features[index].getType())) - { - if(features[index].featureGroup!=null) - allFeatures.put(features[index].getType(), features[index].featureGroup); - else - allFeatures.put(features[index].getType(), "NOGROUP"); - } - index++; + index ++; } } - if(allFeatures.size()<1) + + + if(!alignmentHasFeatures) { try { frame.setClosed(true); } @@ -207,60 +225,81 @@ public class FeatureSettings extends JPanel return; } - resetTable(); + resetTable(false); } - void resetTable() + void resetTable(boolean groupsChanged) { - int fSize = allFeatures.size(); + SequenceFeature [] tmpfeatures; + String group=null, type; + Vector visibleChecks = new Vector(); - String type; - boolean originalExists = false; - if (originalData != null) - originalExists = true; - else - originalData = new Object[fSize][3]; + //Find out which features should be visible depending on which groups + //are selected / deselected + for (int i = 0; i < av.alignment.getHeight(); i++) + { + if (av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures() == null) + continue; - Object[][] tmp = new Object[fSize][3]; - int tmpIndex = 0; + tmpfeatures = av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures(); + int index = 0; + while (index < tmpfeatures.length) + { + group = tmpfeatures[index].featureGroup; - Enumeration en = allFeatures.keys(); - int i=0; - while(en.hasMoreElements()) - { - type = en.nextElement().toString(); - Color col = fr.getColour(type); + if (group==null || fr.featureGroups.get(group)==null || + ((Boolean) fr.featureGroups.get(group)).booleanValue()) + { + type = tmpfeatures[index].getType(); + if(!visibleChecks.contains(type) ) + { + visibleChecks.addElement(type); + } + } + index++; + } + } + + int fSize = visibleChecks.size(); + Object [][] data = new Object[fSize][3]; + int dataIndex = 0; - //This will ignore any features which are in groups not shown - Object visibleGroup = fr.featureGroups.get(allFeatures.get(type)); - if(visibleGroup == null - || ((Boolean)(visibleGroup)).booleanValue()) + if(fr.renderOrder!=null) + { + //First add the checks in the previous render order, + //in case the window has been closed and reopened + for(int ro=fr.renderOrder.length-1; ro>-1; ro--) { - tmp[tmpIndex][0] = type; - tmp[tmpIndex][1] = col; - if (av.featuresDisplayed != null) - tmp[tmpIndex][2] = new Boolean(av.featuresDisplayed.containsKey(type)); - else - tmp[tmpIndex][2] = new Boolean(true); - - tmpIndex++; - } + type = fr.renderOrder[ro]; + if(!visibleChecks.contains(type)) + continue; - if (!originalExists) - { - originalData[i][0] = type; - originalData[i][1] = col; - if (av.featuresDisplayed != null) - originalData[i][2] = new Boolean(av.featuresDisplayed.contains(type)); - else - originalData[i][2] = new Boolean(true); + data[dataIndex][0] = type; + data[dataIndex][1] = fr.getColour(type); + data[dataIndex][2] = new Boolean(av.featuresDisplayed.containsKey(type)); + dataIndex++; + visibleChecks.removeElement(type); } - i++; } - Object [][]data = new Object[tmpIndex][3]; - System.arraycopy(tmp, 0, data,0, tmpIndex); + fSize = visibleChecks.size(); + for(int i=0; i