X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FFeatureSettings.java;h=f14ec5141198ad29314a749ae00f5d27fe264838;hb=e02486484d33e20dedb020a34f31f6024d5720a2;hp=47cedd37e2c32cc07b6b305d2f36b14e4ba1da39;hpb=534f42828bef0cd5be55cc77795db1abe5f4a94f;p=jalview.git diff --git a/src/jalview/gui/FeatureSettings.java b/src/jalview/gui/FeatureSettings.java index 47cedd3..f14ec51 100755 --- a/src/jalview/gui/FeatureSettings.java +++ b/src/jalview/gui/FeatureSettings.java @@ -39,6 +39,9 @@ public class FeatureSettings extends JPanel final JInternalFrame frame; JScrollPane scrollPane = new JScrollPane(); JTable table; + JPanel groupPanel; + + boolean alignmentHasFeatures = false; public FeatureSettings(AlignViewport av, final AlignmentPanel ap) { @@ -122,7 +125,14 @@ public class FeatureSettings extends JPanel JPanel bigPanel = new JPanel(new BorderLayout()); bigPanel.add(transPanel, BorderLayout.SOUTH); bigPanel.add(scrollPane, BorderLayout.CENTER); + if(groupPanel!=null) + { + groupPanel.setLayout( + new GridLayout(fr.featureGroups.size() / 4 + 1, 4)); + groupPanel.validate(); + bigPanel.add(groupPanel, BorderLayout.NORTH); + } add(bigPanel, BorderLayout.CENTER); add(buttonPanel, BorderLayout.SOUTH); @@ -131,118 +141,217 @@ public class FeatureSettings extends JPanel void setTableData() { - Vector allFeatures = new Vector(); - Vector features; - Enumeration e; - SequenceFeature sf; + alignmentHasFeatures = false; - for (int i = 0; i < av.alignment.getHeight(); i++) - { - features = av.alignment.getSequenceAt(i).getDatasetSequence(). - getSequenceFeatures(); - if (features == null) - continue; + if (fr.featureGroups == null) + fr.featureGroups = new Hashtable(); - e = features.elements(); - while (e.hasMoreElements()) + Vector allFeatures = new Vector(); + Vector allGroups = new Vector(); + SequenceFeature[] tmpfeatures; + String group; + + for (int i = 0; i < av.alignment.getHeight(); i++) { - sf = (SequenceFeature) e.nextElement(); - if (!allFeatures.contains(sf.getType())) + if (av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures() == null) + continue; + + alignmentHasFeatures = true; + + tmpfeatures = av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures(); + int index = 0; + while (index < tmpfeatures.length) { - allFeatures.addElement(sf.getType()); - } + 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())) + { + allFeatures.addElement(tmpfeatures[index].getType()); + } + index ++; } } - if(allFeatures.size()<1) + + + if(!alignmentHasFeatures) { - try{ - frame.setClosed(true); - }catch(Exception ex){} + try + { frame.setClosed(true); } + catch (Exception ex){} + + JOptionPane.showInternalMessageDialog( + Desktop.desktop, "No features have been added to this alignment!", + "No Sequence Features", JOptionPane.WARNING_MESSAGE); + return; } - int fSize = allFeatures.size(); + resetTable(false); + } - String type; - boolean originalExists = false; - if(originalData!=null) - originalExists = true; - else - originalData = new Object[fSize][3]; + void resetTable(boolean groupsChanged) + { + SequenceFeature [] tmpfeatures; + String group=null, type; + Vector visibleChecks = new Vector(); + //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; + + tmpfeatures = av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures(); + int index = 0; + while (index < tmpfeatures.length) + { + group = tmpfeatures[index].featureGroup; + + 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]; - for(int i=0; i-1; ro--) { - originalData[i][0] = type; - originalData[i][1] = col; - if (fr.featuresDisplayed != null) - originalData[i][2] = new Boolean(fr.featuresDisplayed.contains(type)); - else - originalData[i][2] = new Boolean(true); + type = fr.renderOrder[ro]; + + if(!visibleChecks.contains(type)) + continue; + + data[dataIndex][0] = type; + data[dataIndex][1] = fr.getColour(type); + data[dataIndex][2] = new Boolean(av.featuresDisplayed.containsKey(type)); + dataIndex++; + visibleChecks.removeElement(type); } } - //////////////////////////////////// - //Now build the table - table = new JTable(new FeatureTableModel(data)); - scrollPane.setViewportView(table); - table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12)); - table.setFont(new Font("Verdana", Font.PLAIN, 12)); - table.setDefaultRenderer(Color.class, - new ColorRenderer()); - table.setDefaultEditor(Color.class, - new ColorEditor()); + fSize = visibleChecks.size(); + for(int i=0; i