Hidden representatives moved from sequence to viewport
[jalview.git] / src / jalview / gui / FeatureSettings.java
index f14ec51..a3a2396 100755 (executable)
@@ -1,6 +1,6 @@
 /*\r
  * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
  *\r
  * This program is free software; you can redistribute it and/or\r
  * modify it under the terms of the GNU General Public License\r
@@ -28,121 +28,110 @@ 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
+  jalview.io.DasSequenceFeatureFetcher dasFeatureFetcher;\r
+  JPanel settingsPane = new JPanel();\r
+  JPanel dasSettingsPane = new JPanel();\r
 \r
   final FeatureRenderer fr;\r
-  final AlignmentPanel ap;\r
-  final AlignViewport av;\r
+  public 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
-  boolean alignmentHasFeatures = false;\r
+  JPanel transPanel = new JPanel(new FlowLayout());\r
 \r
-  public FeatureSettings(AlignViewport av, final AlignmentPanel ap)\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
-    frame = new JInternalFrame();\r
-    frame.setContentPane(this);\r
-    Desktop.addInternalFrame(frame, "Sequence Feature Settings", 400, 300);\r
+    this.af = af;\r
+    fr = af.getFeatureRenderer();\r
 \r
-    setTableData();\r
+    transparency.setMaximum( 100 - (int)(fr.transparency*100) ) ;\r
 \r
-    final JSlider transparency = new JSlider(0, 70, 0);\r
-    transparency.addChangeListener(new ChangeListener()\r
-    {\r
-      public void stateChanged(ChangeEvent evt)\r
-      {\r
-        fr.setTransparency( (float) (100 - transparency.getValue()) / 100f);\r
-        ap.repaint();\r
-      }\r
-    });\r
+   try\r
+   {\r
+     jbInit();\r
+   }\r
+   catch (Exception ex)\r
+   {\r
+     ex.printStackTrace();\r
+   }\r
 \r
-    JPanel transPanel = new JPanel(new FlowLayout());\r
-    transPanel.add(new JLabel("Transparency"));\r
-    transPanel.add(transparency);\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
-    //////////////////////////////////////////////\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
-      {\r
-        try\r
-        {\r
-          frame.setClosed(true);\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
-          updateFeatureRenderer(originalData);\r
-          frame.setClosed(true);\r
-        }\r
-        catch (Exception exe)\r
-        {}\r
-      }\r
-    });\r
-    buttonPanel.add(button);\r
+   table.setDefaultEditor(Color.class,\r
+                          new ColorEditor());\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
+   table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\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.setLayout(\r
-          new GridLayout(fr.featureGroups.size() / 4 + 1, 4));\r
+   table.addMouseListener(new MouseAdapter()\r
+   {\r
+     public void mousePressed(MouseEvent evt)\r
+     {\r
+       selectedRow = table.rowAtPoint(evt.getPoint());\r
+     }\r
+   });\r
 \r
-      groupPanel.validate();\r
-      bigPanel.add(groupPanel, BorderLayout.NORTH);\r
-    }\r
-    add(bigPanel, BorderLayout.CENTER);\r
-    add(buttonPanel, BorderLayout.SOUTH);\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, 450);\r
+    frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
   }\r
 \r
-  void setTableData()\r
+  synchronized public void setTableData()\r
   {\r
-    alignmentHasFeatures = false;\r
-\r
     if (fr.featureGroups == null)\r
       fr.featureGroups = new Hashtable();\r
 \r
@@ -151,17 +140,22 @@ public class FeatureSettings extends JPanel
     SequenceFeature[] tmpfeatures;\r
     String group;\r
 \r
-    for (int i = 0; i < av.alignment.getHeight(); i++)\r
+    for (int i = 0; i < af.getViewport().alignment.getHeight(); i++)\r
     {\r
-      if (av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures() == null)\r
+      if (af.getViewport().alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures() == null)\r
         continue;\r
 \r
-      alignmentHasFeatures = true;\r
+      tmpfeatures = af.getViewport().alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();\r
 \r
-      tmpfeatures = av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();\r
       int index = 0;\r
       while (index < tmpfeatures.length)\r
       {\r
+        if(tmpfeatures[index].begin == 0 && tmpfeatures[index].end ==0)\r
+        {\r
+          index++;\r
+          continue;\r
+        }\r
+\r
         if(tmpfeatures[index].getFeatureGroup()!=null)\r
         {\r
           group = tmpfeatures[index].featureGroup;\r
@@ -175,32 +169,44 @@ public class FeatureSettings extends JPanel
                visible = ( (Boolean) fr.featureGroups.get(group)).booleanValue();\r
              }\r
 \r
-             fr.featureGroups.put(group, new Boolean(visible));\r
-\r
-             if (groupPanel == null)\r
-             {\r
-               groupPanel = new JPanel();\r
-             }\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
+               if (groupPanel == null)\r
                {\r
-                 fr.featureGroups.put(check.getText(),\r
-                                      new Boolean(check.isSelected()));\r
-                 ap.seqPanel.seqCanvas.repaint();\r
-                 if (ap.overviewPanel != null)\r
-                   ap.overviewPanel.updateOverviewImage();\r
+                 groupPanel = new JPanel();\r
+               }\r
 \r
-                 resetTable(true);\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
-             groupPanel.add(check);\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
@@ -211,23 +217,12 @@ public class FeatureSettings extends JPanel
     }\r
   }\r
 \r
-\r
-    if(!alignmentHasFeatures)\r
-     {\r
-       try\r
-       { frame.setClosed(true);  }\r
-       catch (Exception ex){}\r
-\r
-       JOptionPane.showInternalMessageDialog(\r
-           Desktop.desktop, "No features have been added to this alignment!",\r
-           "No Sequence Features", JOptionPane.WARNING_MESSAGE);\r
-\r
-       return;\r
-     }\r
-\r
      resetTable(false);\r
+\r
+     validate();\r
   }\r
 \r
+\r
   void resetTable(boolean groupsChanged)\r
   {\r
    SequenceFeature [] tmpfeatures;\r
@@ -236,17 +231,24 @@ public class FeatureSettings extends JPanel
 \r
    //Find out which features should be visible depending on which groups\r
    //are selected / deselected\r
-    for (int i = 0; i < av.alignment.getHeight(); i++)\r
+    for (int i = 0; i < af.getViewport().alignment.getHeight(); i++)\r
     {\r
-        if (av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures() == null)\r
+\r
+        tmpfeatures = af.getViewport().alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();\r
+        if (tmpfeatures == null)\r
           continue;\r
 \r
-        tmpfeatures = av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();\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
@@ -277,7 +279,7 @@ public class FeatureSettings extends JPanel
 \r
            data[dataIndex][0] = type;\r
            data[dataIndex][1] = fr.getColour(type);\r
-           data[dataIndex][2] = new Boolean(av.featuresDisplayed.containsKey(type));\r
+           data[dataIndex][2] = new Boolean(af.getViewport().featuresDisplayed.containsKey(type));\r
            dataIndex++;\r
            visibleChecks.removeElement(type);\r
       }\r
@@ -290,7 +292,15 @@ public class FeatureSettings extends JPanel
       //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
@@ -301,54 +311,18 @@ public class FeatureSettings extends JPanel
       System.arraycopy(data,0,originalData,0,data.length);\r
     }\r
 \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.setModel(new FeatureTableModel(data));\r
     table.getColumnModel().getColumn(0).setPreferredWidth(200);\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
+    if (groupPanel != null)\r
+    {\r
+      groupPanel.setLayout(\r
+          new GridLayout(fr.featureGroups.size() / 4 + 1, 4));\r
 \r
-              selectedRow = newRow;\r
-            }\r
-          }\r
-    });\r
+      groupPanel.validate();\r
+      bigPanel.add(groupPanel, BorderLayout.NORTH);\r
+    }\r
 \r
     updateFeatureRenderer(data);\r
 \r
@@ -386,11 +360,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
@@ -419,8 +393,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
@@ -436,20 +408,224 @@ 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(ap.overviewPanel!=null)\r
-      ap.overviewPanel.updateOverviewImage();\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
+  JButton cancelDAS = 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
+    cancelDAS.setEnabled(false);\r
+    cancelDAS.setText("Cancel Fetch");\r
+    cancelDAS.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        cancelDAS_actionPerformed(e);\r
+      }\r
+    });\r
+    this.add(tabbedPane, java.awt.BorderLayout.CENTER);\r
+    tabbedPane.addTab("Feature 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(cancelDAS);\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
+    fetchDAS.setEnabled(false);\r
+    cancelDAS.setEnabled(true);\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()>0)\r
+    {\r
+      iSize = af.getViewport().getSelectionGroup().getSize();\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
+    dasFeatureFetcher =\r
+        new jalview.io.DasSequenceFeatureFetcher(\r
+        dataset,\r
+        this,\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
+  public void complete()\r
+  {\r
+    fetchDAS.setEnabled(true);\r
+    cancelDAS.setEnabled(false);\r
+  }\r
+\r
+  public void cancelDAS_actionPerformed(ActionEvent e)\r
+  {\r
+    dasFeatureFetcher.cancel();\r
+    fetchDAS.setEnabled(true);\r
+    cancelDAS.setEnabled(false);\r
+  }\r
 \r
   /////////////////////////////////////////////////////////////////////////\r
   // http://java.sun.com/docs/books/tutorial/uiswing/components/table.html\r