validate groupPanel
[jalview.git] / src / jalview / gui / FeatureSettings.java
index 7dae703..c19ae5b 100755 (executable)
@@ -28,219 +28,295 @@ import java.awt.event.*;
 import javax.swing.table.*;\r
 import java.io.*;\r
 import jalview.io.JalviewFileChooser;\r
+import java.awt.BorderLayout;\r
+import java.awt.Font;\r
+import java.awt.Color;\r
 \r
 public class FeatureSettings extends JPanel\r
 {\r
+  DasSourceBrowser dassourceBrowser;\r
+  JPanel settingsPane = new JPanel();\r
+  JPanel dasSettingsPane = new JPanel();\r
 \r
   final FeatureRenderer fr;\r
-  final AlignmentPanel ap;\r
-  final AlignViewport av;\r
+  final AlignFrame af;\r
   Object [][] originalData;\r
   final JInternalFrame frame;\r
   JScrollPane scrollPane = new JScrollPane();\r
   JTable table;\r
+  JPanel groupPanel;\r
+  JSlider transparency = new JSlider();\r
 \r
-  public FeatureSettings(AlignViewport av, final AlignmentPanel ap)\r
+  JPanel transPanel = new JPanel(new FlowLayout());\r
+\r
+  public FeatureSettings(AlignFrame af)\r
   {\r
-    this.ap = ap;\r
-    this.av = av;\r
-    fr = ap.seqPanel.seqCanvas.getFeatureRenderer();\r
-    av.alignment.getSequences();\r
+    this.af = af;\r
+    fr = af.getFeatureRenderer();\r
+\r
+    transparency.setMaximum( 100 - (int)(fr.transparency*100) ) ;\r
+\r
+   try\r
+   {\r
+     jbInit();\r
+   }\r
+   catch (Exception ex)\r
+   {\r
+     ex.printStackTrace();\r
+   }\r
+\r
+   table = new JTable();\r
+   table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12));\r
+   table.setFont(new Font("Verdana", Font.PLAIN, 12));\r
+   table.setDefaultRenderer(Color.class,\r
+                            new ColorRenderer());\r
+\r
+   table.setDefaultEditor(Color.class,\r
+                          new ColorEditor());\r
+\r
+   table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
+\r
+   table.addMouseListener(new MouseAdapter()\r
+   {\r
+     public void mousePressed(MouseEvent evt)\r
+     {\r
+       selectedRow = table.rowAtPoint(evt.getPoint());\r
+     }\r
+   });\r
+\r
+   table.addMouseMotionListener(new MouseMotionAdapter()\r
+   {\r
+     public void mouseDragged(MouseEvent evt)\r
+     {\r
+       int newRow = table.rowAtPoint(evt.getPoint());\r
+       if (newRow != selectedRow\r
+           && selectedRow != -1\r
+           && newRow != -1)\r
+       {\r
+         Object[] temp = new Object[3];\r
+         temp[0] = table.getValueAt(selectedRow, 0);\r
+         temp[1] = table.getValueAt(selectedRow, 1);\r
+         temp[2] = table.getValueAt(selectedRow, 2);\r
+\r
+         table.setValueAt(table.getValueAt(newRow, 0), selectedRow, 0);\r
+         table.setValueAt(table.getValueAt(newRow, 1), selectedRow, 1);\r
+         table.setValueAt(table.getValueAt(newRow, 2), selectedRow, 2);\r
+\r
+         table.setValueAt(temp[0], newRow, 0);\r
+         table.setValueAt(temp[1], newRow, 1);\r
+         table.setValueAt(temp[2], newRow, 2);\r
+\r
+         selectedRow = newRow;\r
+       }\r
+     }\r
+   });\r
+\r
+   scrollPane.setViewportView(table);\r
+\r
+    dassourceBrowser = new DasSourceBrowser();\r
+    dasSettingsPane.add(dassourceBrowser, BorderLayout.CENTER);\r
+\r
+\r
+\r
+    if (af.getViewport().featuresDisplayed == null || fr.renderOrder==null)\r
+       fr.findAllFeatures();\r
+\r
+    setTableData();\r
+\r
     frame = new JInternalFrame();\r
     frame.setContentPane(this);\r
-    Desktop.addInternalFrame(frame, "Sequence Feature Settings", 400, 300);\r
+    Desktop.addInternalFrame(frame, "Sequence Feature Settings", 400, 450);\r
+    frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
+  }\r
 \r
-    setTableData();\r
+  synchronized public void setTableData()\r
+  {\r
+    if (fr.featureGroups == null)\r
+      fr.featureGroups = new Hashtable();\r
 \r
-    final JSlider transparency = new JSlider(0, 70, 0);\r
-    transparency.addChangeListener(new ChangeListener()\r
+    Vector allFeatures = new Vector();\r
+    Vector allGroups = new Vector();\r
+    SequenceFeature[] tmpfeatures;\r
+    String group;\r
+\r
+    for (int i = 0; i < af.getViewport().alignment.getHeight(); i++)\r
     {\r
-      public void stateChanged(ChangeEvent evt)\r
-      {\r
-        fr.setTransparency( (float) (100 - transparency.getValue()) / 100f);\r
-        ap.repaint();\r
-      }\r
-    });\r
+      if (af.getViewport().alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures() == null)\r
+        continue;\r
 \r
-    JPanel transPanel = new JPanel(new FlowLayout());\r
-    transPanel.add(new JLabel("Transparency"));\r
-    transPanel.add(transparency);\r
+      tmpfeatures = af.getViewport().alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();\r
 \r
-    //////////////////////////////////////////////\r
-    //We're going to need those OK cancel buttons\r
-    JPanel buttonPanel = new JPanel(new FlowLayout());\r
-    JButton button = new JButton("OK");\r
-    button.addActionListener(new ActionListener()\r
-    {\r
-      public void actionPerformed(ActionEvent evt)\r
+      int index = 0;\r
+      while (index < tmpfeatures.length)\r
       {\r
-        try\r
+        if(tmpfeatures[index].begin == 0 && tmpfeatures[index].end ==0)\r
         {\r
-          frame.setClosed(true);\r
+          index++;\r
+          continue;\r
         }\r
-        catch (Exception exe)\r
-        {}\r
-      }\r
-    });\r
-    buttonPanel.add(button);\r
-    button = new JButton("Cancel");\r
-    button.addActionListener(new ActionListener()\r
-    {\r
-      public void actionPerformed(ActionEvent evt)\r
-      {\r
-        try\r
+\r
+        if(tmpfeatures[index].getFeatureGroup()!=null)\r
         {\r
-          updateFeatureRenderer(originalData);\r
-          frame.setClosed(true);\r
-        }\r
-        catch (Exception exe)\r
-        {}\r
-      }\r
-    });\r
-    buttonPanel.add(button);\r
+          group = tmpfeatures[index].featureGroup;\r
+          if(!allGroups.contains(group))\r
+           {\r
+             allGroups.addElement(group);\r
 \r
-    button = new JButton("Load Colours");\r
-    button.addActionListener(new ActionListener()\r
-    {\r
-      public void actionPerformed(ActionEvent evt)\r
-      {\r
-        load();\r
-      }\r
-    });\r
-    buttonPanel.add(button);\r
-    button = new JButton("Save Colours");\r
-    button.addActionListener(new ActionListener()\r
-    {\r
-      public void actionPerformed(ActionEvent evt)\r
-      {\r
-        save();\r
-      }\r
-    });\r
-    buttonPanel.add(button);\r
+             boolean visible = true;\r
+             if (fr.featureGroups.containsKey(group))\r
+             {\r
+               visible = ( (Boolean) fr.featureGroups.get(group)).booleanValue();\r
+             }\r
 \r
-    this.setLayout(new BorderLayout());\r
-    JPanel bigPanel = new JPanel(new BorderLayout());\r
-    bigPanel.add(transPanel, BorderLayout.SOUTH);\r
-    bigPanel.add(scrollPane, BorderLayout.CENTER);\r
+               if (groupPanel == null)\r
+               {\r
+                 groupPanel = new JPanel();\r
+               }\r
 \r
-    add(bigPanel, BorderLayout.CENTER);\r
-    add(buttonPanel, BorderLayout.SOUTH);\r
+               boolean alreadyAdded = false;\r
+               for(int g=0; g<groupPanel.getComponentCount(); g++)\r
+               {\r
+                 if(((JCheckBox)groupPanel.getComponent(g))\r
+                    .getText().equals(group))\r
+                 {\r
+                   alreadyAdded = true;\r
+                   break;\r
+                 }\r
+               }\r
+\r
+               if(alreadyAdded)\r
+                 continue;\r
+\r
+               fr.featureGroups.put(group, new Boolean(visible));\r
+\r
+               final JCheckBox check = new JCheckBox(group, visible);\r
+               check.setFont(new Font("Serif", Font.BOLD, 12));\r
+               check.addItemListener(new ItemListener()\r
+               {\r
+                 public void itemStateChanged(ItemEvent evt)\r
+                 {\r
+                   fr.featureGroups.put(check.getText(),\r
+                                        new Boolean(check.isSelected()));\r
+                   af.alignPanel.seqPanel.seqCanvas.repaint();\r
+                   if (af.alignPanel.overviewPanel != null)\r
+                     af.alignPanel.overviewPanel.updateOverviewImage();\r
+\r
+                   resetTable(true);\r
+                 }\r
+               });\r
+               groupPanel.add(check);\r
+             }\r
+       }\r
+\r
+       if (!allFeatures.contains(tmpfeatures[index].getType()))\r
+       {\r
+           allFeatures.addElement(tmpfeatures[index].getType());\r
+       }\r
+       index ++;\r
+    }\r
+  }\r
 \r
+     resetTable(false);\r
 \r
+     validate();\r
   }\r
 \r
-  void setTableData()\r
+\r
+  void resetTable(boolean groupsChanged)\r
   {\r
-    Vector allFeatures = new Vector();\r
-    Vector features;\r
-    Enumeration e;\r
-    SequenceFeature sf;\r
+   SequenceFeature [] tmpfeatures;\r
+   String group=null, type;\r
+   Vector visibleChecks = new Vector();\r
 \r
-    for(int i=0; i< av.alignment.getHeight(); i++)\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
-       features = av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();\r
-       if(features==null)\r
-         continue;\r
 \r
-       e = features.elements();\r
-       while(e.hasMoreElements())\r
-       {\r
-         sf = (SequenceFeature)e.nextElement();\r
-         if(!allFeatures.contains(sf.getType()))\r
-         {\r
-           allFeatures.addElement(sf.getType());\r
-         }\r
-       }\r
-    }\r
-    if(allFeatures.size()<1)\r
-     {\r
-       try{\r
-         frame.setClosed(true);\r
-       }catch(Exception ex){}\r
-       return;\r
-     }\r
+        tmpfeatures = af.getViewport().alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();\r
+        if (tmpfeatures == null)\r
+          continue;\r
 \r
-    int fSize = allFeatures.size();\r
+        int index = 0;\r
+        while (index < tmpfeatures.length)\r
+        {\r
+          group = tmpfeatures[index].featureGroup;\r
 \r
-    String type;\r
-    boolean originalExists = false;\r
-    if(originalData!=null)\r
-      originalExists = true;\r
-    else\r
-      originalData = new Object[fSize][3];\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
-    for(int i=0; i<fSize; i++)\r
+    int dataIndex = 0;\r
+\r
+    if(fr.renderOrder!=null)\r
     {\r
-      type = allFeatures.elementAt(i).toString();\r
-      Color col = fr.getColour(type);\r
-      data[i][0]=type;\r
-      data[i][1]=col;\r
-      if(fr.featuresDisplayed!=null)\r
-         data[i][2] = new Boolean(fr.featuresDisplayed.contains(type));\r
-      else\r
-        data[i][2] = new Boolean(true);\r
-\r
-      if(!originalExists)\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
-        originalData[i][0] = type;\r
-        originalData[i][1] = col;\r
-        if (fr.featuresDisplayed != null)\r
-          originalData[i][2] = new Boolean(fr.featuresDisplayed.contains(type));\r
-        else\r
-          originalData[i][2] = new Boolean(true);\r
+           type = fr.renderOrder[ro];\r
+\r
+           if(!visibleChecks.contains(type))\r
+             continue;\r
+\r
+           data[dataIndex][0] = type;\r
+           data[dataIndex][1] = fr.getColour(type);\r
+           data[dataIndex][2] = new Boolean(af.getViewport().featuresDisplayed.containsKey(type));\r
+           dataIndex++;\r
+           visibleChecks.removeElement(type);\r
       }\r
     }\r
-    ////////////////////////////////////\r
-        //Now build the table\r
-        table = new JTable(new FeatureTableModel(data));\r
-        scrollPane.setViewportView(table);\r
-        table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12));\r
-        table.setFont(new Font("Verdana", Font.PLAIN, 12));\r
-        table.setDefaultRenderer(Color.class,\r
-                             new ColorRenderer());\r
-\r
-        table.setDefaultEditor(Color.class,\r
-                          new ColorEditor());\r
 \r
-        table.getColumnModel().getColumn(0).setPreferredWidth(200);\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
+      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.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
+    table.setModel(new FeatureTableModel(data));\r
+    table.getColumnModel().getColumn(0).setPreferredWidth(200);\r
 \r
-        table.addMouseListener(new MouseAdapter()\r
-            {\r
-              public void mousePressed(MouseEvent evt)\r
-              {\r
-                selectedRow = table.rowAtPoint(evt.getPoint());\r
-              }\r
-            });\r
 \r
-        table.addMouseMotionListener(new MouseMotionAdapter()\r
-            {\r
-              public void mouseDragged(MouseEvent evt)\r
-              {\r
-                int newRow = table.rowAtPoint(evt.getPoint());\r
-                if(newRow!=selectedRow\r
-                   && selectedRow!=-1\r
-                   && newRow!=-1)\r
-                {\r
-                  Object[] temp = new Object[3];\r
-                  temp[0] = table.getValueAt(selectedRow, 0);\r
-                  temp[1] = table.getValueAt(selectedRow, 1);\r
-                  temp[2] = table.getValueAt(selectedRow, 2);\r
-\r
-                  table.setValueAt(table.getValueAt(newRow, 0), selectedRow, 0);\r
-                  table.setValueAt(table.getValueAt(newRow, 1), selectedRow, 1);\r
-                  table.setValueAt(table.getValueAt(newRow, 2), selectedRow, 2);\r
-\r
-                  table.setValueAt(temp[0], newRow, 0);\r
-                  table.setValueAt(temp[1], newRow, 1);\r
-                  table.setValueAt(temp[2], newRow, 2);\r
-\r
-                  selectedRow = newRow;\r
-                }\r
-              }\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
 \r
   }\r
 \r
@@ -276,11 +352,11 @@ public class FeatureSettings extends JPanel
          }\r
 \r
          setTableData();\r
-         ap.repaint();\r
+         af.alignPanel.repaint();\r
        }\r
        catch (Exception ex)\r
        {\r
-         System.out.println("Error loading User ColourFile\n" + ex);\r
+         System.out.println("Error loading User Colour File\n" + ex);\r
        }\r
      }\r
   }\r
@@ -309,8 +385,6 @@ public class FeatureSettings extends JPanel
             Enumeration e = fr.featureColours.keys();\r
            while(e.hasMoreElements())\r
            {\r
-\r
-\r
                 jalview.binding.Colour col = new jalview.binding.Colour();\r
                 col.setName(e.nextElement().toString());\r
                 col.setRGB(jalview.util.Format.getHexString(\r
@@ -326,17 +400,197 @@ public class FeatureSettings extends JPanel
             ex.printStackTrace();\r
         }\r
     }\r
+  }\r
+\r
+  public void invertSelection()\r
+  {\r
+    for(int i=0; i<table.getRowCount(); i++)\r
+    {\r
+      Boolean value = (Boolean)table.getValueAt(i,2);\r
+\r
+      table.setValueAt(\r
+          new Boolean(!value.booleanValue()),\r
+                       i,2);\r
+    }\r
+  }\r
+\r
+  public void close()\r
+  {\r
+    try\r
+    {\r
+      frame.setClosed(true);\r
+    }\r
+    catch (Exception exe)\r
+    {}\r
 \r
   }\r
 \r
   public void updateFeatureRenderer(Object [][] data)\r
   {\r
     fr.setFeaturePriority( data );\r
-    ap.repaint();\r
+    af.alignPanel.repaint();\r
+\r
+    if(af.alignPanel.overviewPanel!=null)\r
+      af.alignPanel.overviewPanel.updateOverviewImage();\r
   }\r
 \r
   int selectedRow =-1;\r
+  JTabbedPane tabbedPane = new JTabbedPane();\r
+  BorderLayout borderLayout1 = new BorderLayout();\r
+  BorderLayout borderLayout2 = new BorderLayout();\r
+  BorderLayout borderLayout3 = new BorderLayout();\r
+  JPanel bigPanel = new JPanel();\r
+  BorderLayout borderLayout4 = new BorderLayout();\r
+  JButton invert = new JButton();\r
+  JPanel buttonPanel = new JPanel();\r
+  JButton cancel = new JButton();\r
+  JButton ok = new JButton();\r
+  JButton loadColours = new JButton();\r
+  JButton saveColours = new JButton();\r
+  JPanel dasButtonPanel = new JPanel();\r
+  JButton fetchDAS = new JButton();\r
+  JButton saveDAS = new JButton();\r
+  private void jbInit()\r
+      throws Exception\r
+  {\r
+    this.setLayout(borderLayout1);\r
+    settingsPane.setLayout(borderLayout2);\r
+    dasSettingsPane.setLayout(borderLayout3);\r
+    bigPanel.setLayout(borderLayout4);\r
+    invert.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
+    invert.setText("Invert Selection");\r
+    invert.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        invertSelection();\r
+      }\r
+    });\r
+    cancel.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
+    cancel.setText("Cancel");\r
+    cancel.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+          updateFeatureRenderer(originalData);\r
+          close();\r
+      }\r
+    });\r
+    ok.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
+    ok.setText("OK");\r
+    ok.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        close();\r
+      }\r
+    });\r
+    loadColours.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
+    loadColours.setText("Load Colours");\r
+    loadColours.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        load();\r
+      }\r
+    });\r
+    saveColours.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
+    saveColours.setText("Save Colours");\r
+    saveColours.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        save();\r
+      }\r
+    });\r
+    transparency.addChangeListener(new ChangeListener()\r
+    {\r
+      public void stateChanged(ChangeEvent evt)\r
+      {\r
+        fr.setTransparency( (float) (100 - transparency.getValue()) / 100f);\r
+        af.alignPanel.repaint();\r
+      }\r
+    });\r
+\r
+\r
+    transparency.setMaximum(70);\r
+    fetchDAS.setText("Fetch DAS Features");\r
+    fetchDAS.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        fetchDAS_actionPerformed(e);\r
+      }\r
+    });\r
+    saveDAS.setText("Save as default");\r
+    saveDAS.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        saveDAS_actionPerformed(e);\r
+      }\r
+    });\r
+    dasButtonPanel.setBorder(BorderFactory.createEtchedBorder());\r
+    dasSettingsPane.setBorder(null);\r
+    this.add(tabbedPane, java.awt.BorderLayout.CENTER);\r
+    tabbedPane.addTab("Display Settings", settingsPane );\r
+    tabbedPane.addTab("DAS Settings", dasSettingsPane);\r
+    bigPanel.add(transPanel, java.awt.BorderLayout.SOUTH);\r
+    transPanel.add(transparency);\r
+    transPanel.add(invert);\r
+    buttonPanel.add(ok);\r
+    buttonPanel.add(cancel);\r
+    buttonPanel.add(loadColours);\r
+    buttonPanel.add(saveColours);\r
+    bigPanel.add(scrollPane, java.awt.BorderLayout.CENTER);\r
+    dasSettingsPane.add(dasButtonPanel, java.awt.BorderLayout.SOUTH);\r
+    dasButtonPanel.add(fetchDAS);\r
+    dasButtonPanel.add(saveDAS);\r
+    settingsPane.add(bigPanel, java.awt.BorderLayout.CENTER);\r
+    settingsPane.add(buttonPanel, java.awt.BorderLayout.SOUTH);\r
+  }\r
+\r
+  public void fetchDAS_actionPerformed(ActionEvent e)\r
+  {\r
+    Vector selectedSources = dassourceBrowser.getSelectedSources();\r
+\r
+    SequenceI [] dataset, seqs ;\r
+    int iSize;\r
 \r
+    if(af.getViewport().getSelectionGroup()!=null\r
+      && af.getViewport().getSelectionGroup().getSize(false)>0)\r
+    {\r
+      iSize = af.getViewport().getSelectionGroup().getSize(false);\r
+      dataset = new SequenceI[iSize];\r
+      seqs = af.getViewport().getSelectionGroup().\r
+          getSequencesInOrder(\r
+              af.getViewport().getAlignment());\r
+    }\r
+    else\r
+    {\r
+       iSize = af.getViewport().getAlignment().getHeight();\r
+       seqs = af.getViewport().getAlignment().getSequencesArray();\r
+    }\r
+\r
+    dataset = new SequenceI[iSize];\r
+    for (int i = 0; i < iSize; i++)\r
+    {\r
+      dataset[i] = seqs[i].getDatasetSequence();\r
+    }\r
+\r
+    new jalview.io.DasSequenceFeatureFetcher(\r
+        dataset,\r
+        af,\r
+        selectedSources);\r
+\r
+    af.getViewport().setShowSequenceFeatures(true);\r
+    af.showSeqFeatures.setSelected(true);\r
+  }\r
+\r
+  public void saveDAS_actionPerformed(ActionEvent e)\r
+  {\r
+    dassourceBrowser.saveProperties(jalview.bin.Cache.applicationProperties);\r
+  }\r
 \r
   /////////////////////////////////////////////////////////////////////////\r
   // http://java.sun.com/docs/books/tutorial/uiswing/components/table.html\r
@@ -357,6 +611,11 @@ public class FeatureSettings extends JPanel
             return data;\r
           }\r
 \r
+          public void setData(Object[][] data)\r
+          {\r
+            this.data = data;\r
+          }\r
+\r
           public int getColumnCount() {\r
               return columnNames.length;\r
           }\r