+ resetTable(false);\r
+\r
+ validate();\r
+ }\r
+\r
+ void resetTable(boolean groupsChanged)\r
+ {\r
+ SequenceFeature[] tmpfeatures;\r
+ String group = null, type;\r
+ Vector visibleChecks = new Vector();\r
+\r
+ //Find out which features should be visible depending on which groups\r
+ //are selected / deselected\r
+ for (int i = 0; i < af.getViewport().alignment.getHeight(); i++)\r
+ {\r
+\r
+ tmpfeatures = af.getViewport().alignment.getSequenceAt(i).\r
+ getDatasetSequence().getSequenceFeatures();\r
+ if (tmpfeatures == null)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ int index = 0;\r
+ while (index < tmpfeatures.length)\r
+ {\r
+ group = tmpfeatures[index].featureGroup;\r
+\r
+ if (tmpfeatures[index].begin == 0 && tmpfeatures[index].end == 0)\r
+ {\r
+ index++;\r
+ continue;\r
+ }\r
+\r
+ if (group == null || fr.featureGroups.get(group) == null ||\r
+ ( (Boolean) fr.featureGroups.get(group)).booleanValue())\r
+ {\r
+ type = tmpfeatures[index].getType();\r
+ if (!visibleChecks.contains(type))\r
+ {\r
+ visibleChecks.addElement(type);\r
+ }\r
+ }\r
+ index++;\r
+ }\r
+ }\r
+\r
+ int fSize = visibleChecks.size();\r
+ Object[][] data = new Object[fSize][3];\r
+ int dataIndex = 0;\r
+\r
+ if (fr.renderOrder != null)\r
+ {\r
+ //First add the checks in the previous render order,\r
+ //in case the window has been closed and reopened\r
+ for (int ro = fr.renderOrder.length - 1; ro > -1; ro--)\r
+ {\r
+ type = fr.renderOrder[ro];\r
+\r
+ if (!visibleChecks.contains(type))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ data[dataIndex][0] = type;\r
+ data[dataIndex][1] = fr.getColour(type);\r
+ data[dataIndex][2] = new Boolean(af.getViewport().featuresDisplayed.\r
+ containsKey(type));\r
+ dataIndex++;\r
+ visibleChecks.removeElement(type);\r
+ }\r
+ }\r
+\r
+ fSize = visibleChecks.size();\r
+ for (int i = 0; i < fSize; i++)\r
+ {\r
+ //These must be extra features belonging to the group\r
+ //which was just selected\r
+ type = visibleChecks.elementAt(i).toString();\r
+ data[dataIndex][0] = type;\r
+\r
+ data[dataIndex][1] = fr.getColour(type);\r
+ if (data[dataIndex][1] == null)\r
+ {\r
+ //"Colour has been updated in another view!!"\r
+ fr.renderOrder = null;\r
+ return;\r
+ }\r
+\r
+ data[dataIndex][2] = new Boolean(true);\r
+ dataIndex++;\r
+ }\r
+\r
+ if (originalData == null)\r
+ {\r
+ originalData = new Object[data.length][3];\r
+ System.arraycopy(data, 0, originalData, 0, data.length);\r
+ }\r
+\r
+ table.setModel(new FeatureTableModel(data));\r
+ table.getColumnModel().getColumn(0).setPreferredWidth(200);\r
+\r
+ if (groupPanel != null)\r
+ {\r
+ groupPanel.setLayout(\r
+ new GridLayout(fr.featureGroups.size() / 4 + 1, 4));\r
+\r
+ groupPanel.validate();\r
+ bigPanel.add(groupPanel, BorderLayout.NORTH);\r
+ }\r
+\r
+ updateFeatureRenderer(data);\r