Merge branch 'develop' into feature/JAL-3390hideUnmappedStructure
[jalview.git] / srcjar / fr / orsay / lri / varna / applications / fragseq / FragSeqGUI.java
diff --git a/srcjar/fr/orsay/lri/varna/applications/fragseq/FragSeqGUI.java b/srcjar/fr/orsay/lri/varna/applications/fragseq/FragSeqGUI.java
new file mode 100644 (file)
index 0000000..db2c3ee
--- /dev/null
@@ -0,0 +1,958 @@
+/*
+ VARNA is a tool for the automated drawing, visualization and annotation of the secondary structure of RNA, designed as a companion software for web servers and databases.
+ Copyright (C) 2008  Kevin Darty, Alain Denise and Yann Ponty.
+ electronic mail : Yann.Ponty@lri.fr
+ paper mail : LRI, bat 490 Université Paris-Sud 91405 Orsay Cedex France
+
+ This file is part of VARNA version 3.1.
+ VARNA version 3.1 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ VARNA version 3.1 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with VARNA version 3.1.
+ If not, see http://www.gnu.org/licenses.
+ */
+package fr.orsay.lri.varna.applications.fragseq;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.dnd.DropTarget;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.dnd.DropTargetListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultListSelectionModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTextPane;
+import javax.swing.JToolBar;
+import javax.swing.JTree;
+import javax.swing.ListSelectionModel;
+import javax.swing.LookAndFeel;
+import javax.swing.SwingUtilities;
+import javax.swing.TransferHandler;
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
+import javax.swing.UnsupportedLookAndFeelException;
+import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.ExpandVetoException;
+import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeSelectionModel;
+
+import fr.orsay.lri.varna.VARNAPanel;
+import fr.orsay.lri.varna.applications.BasicINI;
+import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed;
+import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength;
+import fr.orsay.lri.varna.models.FullBackup;
+
+
+public class FragSeqGUI extends JFrame implements TreeModelListener, MouseListener,DropTargetListener, WindowListener, ComponentListener, ActionListener, TreeSelectionListener {
+
+       private enum Commands
+       {
+               NEW_FOLDER,
+               ADD_PANEL_UP,
+               ADD_PANEL_DOWN,
+               REMOVE_PANEL_UP,
+               REMOVE_PANEL_DOWN,
+               SORT_ID,
+               SORT_FILENAME,
+               REFRESH_ALL,
+               CHANGE_LNF,
+               TEST_XML,
+       };
+       
+       
+       /**
+        * 
+        */
+       private static final long serialVersionUID = -790155708306987257L;
+
+
+               
+       private String _INIFilename = "FragSeqUI.ini";
+       private boolean redrawOnSlide = false;
+       private int dividerWidth = 5;
+       
+       private JPanel _varnaUpperPanels = new JPanel();
+       private JPanel _varnaLowerPanels = new JPanel();
+
+       private JPanel _listPanel = new JPanel();
+       private JPanel _infoPanel = new JPanel();
+       private FragSeqTree _sideList = null;
+
+       
+       private FragSeqTreeModel _treeModel;
+       private JToolBar _toolbar = new JToolBar();
+       private JFileChooser _choice = new JFileChooser();
+       
+       private JScrollPane _listScroller;
+
+       private JList _selectedElems;
+       private JSplitPane _splitLeft;
+       private JSplitPane _splitRight;
+       private JSplitPane _splitVARNA;
+       
+       private JComboBox _lnf; 
+
+
+       public FragSeqGUI() {
+               super("VARNA Explorer");
+               RNAPanelDemoInit();
+       }
+
+       
+       private void RNAPanelDemoInit() 
+       {
+               JFrame.setDefaultLookAndFeelDecorated(true);
+               this.addWindowListener(this);
+           
+               _selectedElems = new JList();
+
+               _lnf = new JComboBox(UIManager.getInstalledLookAndFeels());
+               
+               // Initializing Custom Tree Model
+               _treeModel = new FragSeqTreeModel();
+               _treeModel.addTreeModelListener(this);
+               
+               _sideList = new FragSeqTree(_treeModel);
+               _sideList.addMouseListener(this);
+               _sideList.setLargeModel(true);
+               _sideList.setEditable(true);
+               _sideList.addTreeWillExpandListener(_treeModel);
+               FragSeqCellRenderer renderer = new FragSeqCellRenderer(_sideList,_treeModel);
+               //_sideList.setUI(new CustomTreeUI());
+               _sideList.setCellRenderer(renderer);
+               _sideList.setCellEditor(new FragSeqCellEditor(_sideList,renderer,_treeModel));
+               TreeSelectionModel m = _sideList.getSelectionModel();
+               m.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+               _sideList.setSelectionModel(m);
+               m.addTreeSelectionListener(this);
+               _sideList.setShowsRootHandles(true);
+               _sideList.setDragEnabled(true);
+               _sideList.setRootVisible(false);
+               _sideList.setTransferHandler(new TransferHandler(null) 
+               {
+                       public int getSourceActions(JComponent c) {
+                               return COPY_OR_MOVE;
+                       }
+                       protected Transferable createTransferable(JComponent c) {
+                               JTree tree = (JTree) c;
+                               TreePath tp =tree.getSelectionPath();
+                               if (tp!=null)
+                               {
+                                       DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp.getLastPathComponent();
+                                       if (node.getUserObject() instanceof FragSeqRNASecStrModel) {
+                                               return new Transferable(){
+                                                       public DataFlavor[] getTransferDataFlavors() {
+                                                               DataFlavor[] dt = {FragSeqRNASecStrModel.Flavor};
+                                                               return dt;
+                                                       }
+                                                       public Object getTransferData(DataFlavor df)
+                                                       throws UnsupportedFlavorException, IOException {
+                                                               if (!isDataFlavorSupported(df))
+                                                                       throw new UnsupportedFlavorException(df);
+                                                               DefaultMutableTreeNode node = (DefaultMutableTreeNode) _sideList.getSelectionPath().getLastPathComponent();
+                                                               return node.getUserObject();
+                                                       }
+                                                       public boolean isDataFlavorSupported(DataFlavor df) {
+                                                               return FragSeqRNASecStrModel.Flavor.equals(df);
+                                                       }
+                                               };
+                                       } else  if (node.getUserObject() instanceof FragSeqAnnotationDataModel) {
+                                                       return new Transferable(){
+                                                               public DataFlavor[] getTransferDataFlavors() {
+                                                                       DataFlavor[] dt = { FragSeqAnnotationDataModel.Flavor};
+                                                                       return dt;
+                                                               }
+                                                               public Object getTransferData(DataFlavor df)
+                                                               throws UnsupportedFlavorException, IOException {
+                                                                       if (!isDataFlavorSupported(df))
+                                                                               throw new UnsupportedFlavorException(df);
+                                                                       DefaultMutableTreeNode node = (DefaultMutableTreeNode) _sideList.getSelectionPath().getLastPathComponent();
+                                                                       return node.getUserObject();
+                                                               }
+                                                               public boolean isDataFlavorSupported(DataFlavor df) {
+                                                                       return FragSeqAnnotationDataModel.Flavor.equals(df);
+                                                               }
+                                                       };
+                                               } else {
+                                               return null;
+                                       }
+                               }
+                               return null;
+                       }
+               });
+
+               // Various buttons
+               JButton refreshAllFoldersButton = new JButton("Refresh All");
+               refreshAllFoldersButton.setActionCommand(""+Commands.REFRESH_ALL);
+               refreshAllFoldersButton.addActionListener(this);
+               
+               JButton watchFolderButton = new JButton("Add folder");
+               watchFolderButton.setActionCommand("" +Commands.NEW_FOLDER);
+               watchFolderButton.addActionListener(this);
+               
+               JButton addUpperButton = new JButton("+Up");
+               addUpperButton.setActionCommand(""+Commands.ADD_PANEL_UP);
+               addUpperButton.addActionListener(this);
+               
+               JButton removeUpperButton = new JButton("-Up");
+               removeUpperButton.setActionCommand(""+Commands.REMOVE_PANEL_UP);
+               removeUpperButton.addActionListener(this);
+               
+               JButton addLowerButton = new JButton("+Down");
+               addLowerButton.setActionCommand(""+Commands.ADD_PANEL_DOWN);
+               addLowerButton.addActionListener(this);
+               
+               JButton removeLowerButton = new JButton("-Down");
+               removeLowerButton.setActionCommand(""+Commands.REMOVE_PANEL_DOWN);
+               removeLowerButton.addActionListener(this);
+               
+               JButton changeLNFButton = new JButton("Change");
+               changeLNFButton.setActionCommand(""+Commands.CHANGE_LNF);
+               changeLNFButton.addActionListener(this);
+
+               JButton XMLButton = new JButton("Test XML");
+               XMLButton.setActionCommand(""+Commands.TEST_XML);
+               XMLButton.addActionListener(this);
+
+               _toolbar.setFloatable(false);
+               _toolbar.add(refreshAllFoldersButton);
+               _toolbar.addSeparator();
+               _toolbar.add(addUpperButton);
+               _toolbar.add(removeUpperButton);
+               _toolbar.add(addLowerButton);
+               _toolbar.add(removeLowerButton);
+               _toolbar.addSeparator();
+               _toolbar.add(XMLButton);
+               _toolbar.addSeparator();
+               _toolbar.add(_lnf);
+               _toolbar.add(changeLNFButton);
+               
+               // Scroller for File tree
+           _listScroller = new JScrollPane(_sideList,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
+           _listScroller.setPreferredSize(new Dimension(300, 200));
+           _listScroller.addComponentListener(this);
+
+               
+               _listPanel.setLayout(new BorderLayout());
+               
+               _listPanel.add(_listScroller,BorderLayout.CENTER);
+               _listPanel.add(_selectedElems,BorderLayout.SOUTH);
+               _listPanel.setBorder(BorderFactory.createTitledBorder("Structures"));
+               _listPanel.setPreferredSize(new Dimension(300, 0));
+               
+               _varnaUpperPanels.setLayout(new GridLayout());
+               _varnaUpperPanels.setPreferredSize(new Dimension(800, 600));
+               
+               _varnaLowerPanels.setLayout(new GridLayout());
+               _varnaLowerPanels.setPreferredSize(new Dimension(800, 000));
+               
+           JRadioButton sortFileName = new JRadioButton("Directory");
+           sortFileName.setActionCommand("sortfilename");
+           sortFileName.setSelected(true);
+           sortFileName.setOpaque(false);
+           sortFileName.setActionCommand(""+Commands.SORT_FILENAME);
+           sortFileName.addActionListener(this);
+           JRadioButton sortID = new JRadioButton("ID");
+           sortID.setActionCommand("sortid");
+           sortID.setOpaque(false);
+           sortID.setActionCommand(""+Commands.SORT_ID);
+           sortID.addActionListener(this);
+
+           ButtonGroup group = new ButtonGroup();
+           group.add(sortFileName);
+           group.add(sortID);
+               
+               JToolBar listTools = new JToolBar();
+               listTools.setFloatable(false);
+               listTools.add(watchFolderButton);
+               listTools.addSeparator();
+           listTools.add(new JLabel("Sort by"));
+               listTools.add(sortFileName);
+               listTools.add(sortID);
+
+               JPanel sidePanel = new JPanel();
+               sidePanel.setLayout(new BorderLayout());
+               sidePanel.add(listTools,BorderLayout.NORTH);
+               sidePanel.add(_listPanel,BorderLayout.CENTER);
+               
+               
+               JPanel mainVARNAPanel = new JPanel();
+               mainVARNAPanel.setLayout(new BorderLayout());
+               _splitVARNA = new JSplitPane(JSplitPane.VERTICAL_SPLIT,redrawOnSlide,_varnaUpperPanels,_varnaLowerPanels);
+               _splitVARNA.setDividerSize(dividerWidth);
+               _splitVARNA.setResizeWeight(1.0);
+               _splitLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,redrawOnSlide,sidePanel,_splitVARNA);
+               _splitLeft.setResizeWeight(0.1);
+               _splitLeft.setDividerSize(dividerWidth);
+               _splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,redrawOnSlide,_splitLeft,_infoPanel);
+               _splitRight.setResizeWeight(0.85);
+               _splitRight.setDividerSize(dividerWidth);
+               
+               _infoPanel.setLayout(new GridLayout(0,1));
+               
+               this.restoreConfig();           
+               this.getContentPane().setLayout(new BorderLayout());
+               this.getContentPane().add(_splitRight, BorderLayout.CENTER);
+               this.getContentPane().add(_toolbar, BorderLayout.NORTH);
+               addUpperPanel();
+               addUpperPanel();
+               this.setVisible(true);
+       }
+       
+       public FragSeqGUI getSelf()
+       {
+               return this;
+       }
+       
+       public VARNAHolder createIntegratedPanel(int height)
+       {
+               VARNAHolder vh = new VARNAHolder(this);
+               _varnaPanels.add(vh);
+               return vh;
+       }
+       
+       
+       public void removeUpperPanel()
+       {
+               if (_varnaUpperPanels.getComponentCount()>1)
+               {
+                       VARNAHolder vh = (VARNAHolder) _varnaUpperPanels.getComponent(_varnaUpperPanels.getComponentCount()-1);
+                       _infoPanel.remove(vh.getInfoPane());
+                       _varnaUpperPanels.remove(vh);
+                       _splitLeft.validate();
+                       _splitRight.validate();
+               }
+       }
+
+       public void addUpperPanel()
+       {
+               VARNAHolder vh = createIntegratedPanel(100);
+               _varnaUpperPanels.add(vh);
+               _infoPanel.add(vh.getInfoPane());
+               _splitRight.validate();
+               _splitLeft.validate();
+       }
+
+       
+       public void removeLowerPanel()
+       {
+               if (_varnaLowerPanels.getComponentCount()>0)
+               {
+                       _varnaLowerPanels.remove(_varnaLowerPanels.getComponentCount()-1);
+                       if (_varnaLowerPanels.getComponentCount()==0)
+                       {
+                               _splitVARNA.setDividerLocation(1.0);
+                               _splitVARNA.validate();
+                               _splitVARNA.repaint();
+                       }
+                       _splitLeft.validate();
+               }
+       }
+
+       public void addLowerPanel()
+       {
+               if (_varnaLowerPanels.getComponentCount()==0)
+               {
+                       _splitVARNA.setDividerLocation(0.7);
+                       _splitVARNA.validate();
+               }
+               _varnaLowerPanels.add(createIntegratedPanel(400));
+               _splitLeft.validate();
+       }
+
+
+       public void treeNodesChanged(TreeModelEvent e) {
+              DefaultMutableTreeNode node;
+               node = (DefaultMutableTreeNode)
+                        (e.getTreePath().getLastPathComponent());
+
+               /*
+                * If the event lists children, then the changed
+                * node is the child of the node we have already
+                * gotten.  Otherwise, the changed node and the
+                * specified node are the same.
+                */
+               try {
+                   int index = e.getChildIndices()[0];
+                   node = (DefaultMutableTreeNode)
+                          (node.getChildAt(index));
+               } catch (NullPointerException exc) {}
+
+       }
+       
+       
+
+
+       public void addFolder(String path) {
+               addFolder( path, true); 
+       }
+
+    public void addFolder(String path,
+            boolean shouldBeVisible) 
+    {
+       DefaultMutableTreeNode childNode = _treeModel.addFolder(path);
+       
+               if ((childNode!=null) && shouldBeVisible ) {
+                         System.out.println("  Expanding: "+childNode.getUserObject());
+                         TreePath tp = new TreePath(childNode.getPath());
+                       _sideList.scrollPathToVisible(tp);                      
+                       _sideList.expandRow(_sideList.getRowForPath(tp));
+                       _sideList.updateUI();
+                       _sideList.validate();
+               }
+    }
+
+       public void treeNodesInserted(TreeModelEvent e) {
+               System.out.println(e);
+               
+       }
+
+       public void treeNodesRemoved(TreeModelEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void treeStructureChanged(TreeModelEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void mouseClicked(MouseEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void mousePressed(MouseEvent e) {
+               
+       }
+
+       int index = 0;
+       
+       public void mouseReleased(MouseEvent e) {
+               // TODO Auto-generated method stub
+               if (e.getSource() == this._sideList)
+               {
+                       if (e.getClickCount() == 1)
+                       {
+                               /*TreePath t = _sideList.getSelectionPath();
+                               if (t!=null)
+                               {
+                               DefaultMutableTreeNode node = (DefaultMutableTreeNode) t.getLastPathComponent();
+                               if (node.getUserObject() instanceof FragSeqFileModel)
+                               {
+                                       int row = _sideList.getRowForPath(t);
+                                       System.out.println("[A]"+row);
+                                       if (!_sideList.isExpanded(row))
+                                       {
+                                               try {
+                                                       _sideList.fireTreeWillExpand(t);
+                                                       _sideList.expandPath(t);
+                                               } catch (ExpandVetoException e1) {
+                                                       // TODO Auto-generated catch block
+                                                       e1.printStackTrace();
+                                               }
+                                       }
+                                       else 
+                                       {
+                                               try {
+                                                       _sideList.fireTreeWillCollapse(t);
+                                                       _sideList.collapsePath(t);
+                                               } catch (ExpandVetoException e1) {
+                                                       // TODO Auto-generated catch block
+                                                       e1.printStackTrace();
+                                               }
+                                       }
+                               }
+                               }*/
+                       }
+                       else if (e.getClickCount() == 2)
+                       {
+                               TreePath t = _sideList.getSelectionPath();
+                               if (t!= null)
+                               {
+                                       DefaultMutableTreeNode node = (DefaultMutableTreeNode) t.getLastPathComponent();
+                                       if (node.getUserObject() instanceof FragSeqFileModel)
+                                       {
+                                               if (!_sideList.isExpanded(t))
+                                               {
+                                                       try {
+                                                               _sideList.fireTreeWillExpand(t);
+                                                               _sideList.expandPath(t);
+                                                       } catch (ExpandVetoException e1) {
+                                                               e1.printStackTrace();
+                                                       }
+                                               }
+                                               else 
+                                               {
+                                                       try {
+                                                               _sideList.fireTreeWillCollapse(t);
+                                                               _sideList.collapsePath(t);
+                                                       } catch (ExpandVetoException e1) {
+                                                               e1.printStackTrace();
+                                                       }
+                                               }
+                                       }
+                                       else if (node.getUserObject() instanceof FragSeqModel)
+                                       {
+                                               FragSeqModel model = (FragSeqModel) node.getUserObject();
+                                               
+                                               // Figuring out which panel to add object to...
+                                               int res;
+                                               if (model instanceof FragSeqRNASecStrModel)
+                                               {
+                                                       res = index % (_varnaUpperPanels.getComponentCount()+_varnaLowerPanels.getComponentCount());
+                                               }
+                                               else 
+                                               {
+                                                       res = (index+_varnaUpperPanels.getComponentCount()+_varnaLowerPanels.getComponentCount()-1) % (_varnaUpperPanels.getComponentCount()+_varnaLowerPanels.getComponentCount());
+                                               }
+                                               Component c = null;
+                                               if (res<_varnaUpperPanels.getComponentCount())
+                                               {
+                                                       c = (VARNAHolder)_varnaUpperPanels.getComponent(res);
+                                               }
+                                               else
+                                               {
+                                                       res -= _varnaUpperPanels.getComponentCount();
+                                                       c = (VARNAHolder)_varnaLowerPanels.getComponent(res);
+                                               }
+                                               
+                                               if (c instanceof VARNAHolder)
+                                               {
+                                                       VARNAHolder h = (VARNAHolder) c;
+                                                       if (model instanceof FragSeqRNASecStrModel)
+                                                       {
+                                                               h.setSecStrModel((FragSeqRNASecStrModel)model);
+                                                               index ++;
+                                                       }
+                                                       else if (model instanceof FragSeqAnnotationDataModel)
+                                                       {
+                                                               h.setDataModel((FragSeqAnnotationDataModel)model);
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       
+       
+       
+       class VARNAHolder extends JPanel
+       {
+               VARNAPanel vp;
+               FragSeqRNASecStrModel _m;
+               FragSeqAnnotationDataModel _data;
+               JPanel _infoPanel;
+               JTextPane _infoTxt;
+               
+               
+               public VARNAHolder(DropTargetListener f)
+               {
+                       super();
+                       vp = new VARNAPanel();
+                       vp.addFocusListener(new FocusListener(){
+                               public void focusGained(FocusEvent e) {
+                                       //focus(_m);
+                               }
+                               public void focusLost(FocusEvent e) {
+                               }});
+                       vp.setPreferredSize(new Dimension(800, 400));
+
+                       _infoTxt = new JTextPane(); 
+                       _infoTxt.setPreferredSize(new Dimension(200,0));
+                       _infoTxt.setContentType("text/html");
+
+                       JScrollPane scroll = new JScrollPane(_infoTxt,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
+
+                       _infoPanel = new JPanel();
+                       _infoPanel.setLayout(new BorderLayout());
+                       _infoPanel.setPreferredSize(new Dimension(200,0));
+                       _infoPanel.setBorder(BorderFactory.createTitledBorder("Info"));
+                       _infoPanel.add(scroll,BorderLayout.CENTER);
+                       _infoPanel.validate();
+
+                       this.setLayout(new BorderLayout());
+                       this.setPreferredSize(new Dimension(300,600));
+                       this.setBorder(BorderFactory.createTitledBorder("None"));                       
+                       this.add(vp, BorderLayout.CENTER);
+                       
+                       DropTarget dt = new DropTarget(vp, f);
+               }
+               
+               VARNAPanel getVARNAPanel()
+               {
+                       return vp;
+               }
+               void setSecStrModel(FragSeqRNASecStrModel m)
+               {
+                       _m = m;
+                       vp.showRNAInterpolated(m.getRNA());
+                       setBorder(BorderFactory.createTitledBorder(m.toString()));
+                       _infoTxt.setText(m.getRNA().getHTMLDescription());
+                       _infoPanel.setBorder(BorderFactory.createTitledBorder("Info ("+_m+")"));
+                       vp.requestFocus();
+               }
+               void setDataModel(FragSeqAnnotationDataModel data)
+               {
+                       _data = data;
+                       data.applyTo(vp.getRNA());
+                       vp.repaint();
+                       vp.requestFocus();
+               }
+               FragSeqModel getModel()
+               {
+                       setBorder(BorderFactory.createTitledBorder(_m.toString()));
+                       return _m;
+               }
+               public void setInfoTxt(String s)
+               {
+                       _infoTxt.setText(vp.getRNA().getHTMLDescription());
+                       _infoTxt.validate();
+               }
+               public JPanel getInfoPane()
+               {
+                       return _infoPanel;
+               }
+               
+       }
+       
+
+       private ArrayList<VARNAHolder> _varnaPanels = new ArrayList<VARNAHolder>(); 
+       
+       private VARNAHolder getHolder(Component vp)
+       {
+               if (vp instanceof VARNAHolder)
+               {
+                       int i= _varnaPanels.indexOf(vp);
+                       if (i!=-1)
+                       {
+                               return _varnaPanels.get(i);
+                       }
+               }
+               if (vp instanceof VARNAPanel)
+               {
+                       for (VARNAHolder vh: _varnaPanels)
+                       {
+                               if (vh.getVARNAPanel()==vp)
+                               return vh;
+                       }
+               }
+               return null;
+       }
+
+
+       
+       public void mouseEntered(MouseEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void mouseExited(MouseEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void dragEnter(DropTargetDragEvent arg0) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void dragExit(DropTargetEvent arg0) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void dragOver(DropTargetDragEvent arg0) {
+               
+       }
+
+       public void drop(DropTargetDropEvent arg0) {
+                       try {
+                               
+                               DropTarget o = (DropTarget)arg0.getSource();
+                               if (o.getComponent() instanceof VARNAPanel)
+                               {
+                                       VARNAHolder h = getHolder(o.getComponent());
+                                       if (h!=null)
+                                       {
+                                               System.out.println("[X]");
+                                               Transferable t = arg0.getTransferable();
+                                               if (t.isDataFlavorSupported(FragSeqRNASecStrModel.Flavor))
+                                               {
+                                                       Object data = t.getTransferData(FragSeqRNASecStrModel.Flavor);
+                                                       if (data instanceof FragSeqRNASecStrModel)
+                                                       {
+                                                               h.setSecStrModel((FragSeqRNASecStrModel) data);
+                                                       }
+                                               }
+                                               else if (t.isDataFlavorSupported(FragSeqAnnotationDataModel.Flavor))
+                                               {                                                       
+                                                       System.out.println("[Y]");
+                                                       Object data = t.getTransferData(FragSeqAnnotationDataModel.Flavor);
+                                                       if (data instanceof FragSeqAnnotationDataModel)
+                                                       {
+                                                               FragSeqAnnotationDataModel d = (FragSeqAnnotationDataModel) data;
+                                                               h.setDataModel(d);
+                                                       }
+                                               }
+                                       }
+                               }
+                       } catch (UnsupportedFlavorException e) {
+                               // TODO Auto-generated catch block
+                               e.printStackTrace();
+                       } catch (IOException e) {
+                               // TODO Auto-generated catch block
+                               e.printStackTrace();
+                       } 
+       }
+
+       public void dropActionChanged(DropTargetDragEvent arg0) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void windowOpened(WindowEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void windowClosing(WindowEvent e) {
+               saveConfig();
+               System.exit(0);
+       }
+
+       public void windowClosed(WindowEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void windowIconified(WindowEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void windowDeiconified(WindowEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void windowActivated(WindowEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       public void windowDeactivated(WindowEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+       private void restoreConfig()
+       {
+               BasicINI config = BasicINI.loadINI(_INIFilename);
+       ArrayList<String> vals = config.getItemList("folders");
+               System.out.print("[C]"+vals);
+       
+           for(String path:vals)
+               {
+               System.out.println("Loading folder "+path);
+                 addFolder(path);
+               }
+           _sideList.validate();
+           _listScroller.validate();
+       }
+
+       private void saveConfig()
+       {
+               BasicINI data = new BasicINI();
+               int i=0;
+               for (String folderPath: _treeModel.getFolders())
+               {
+                 data.addItem("folders", "val"+i, folderPath);
+                 i++;
+               }
+               BasicINI.saveINI(data, _INIFilename);
+       }
+
+
+       public void componentResized(ComponentEvent e) {
+               _sideList.validate();
+       }
+
+
+       public void componentMoved(ComponentEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+
+       public void componentShown(ComponentEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+
+       public void componentHidden(ComponentEvent e) {
+               // TODO Auto-generated method stub
+               
+       }
+
+
+       public void actionPerformed(ActionEvent e) {
+               String cmd = e.getActionCommand();
+               System.out.println(cmd);
+               if (cmd.equals(""+Commands.NEW_FOLDER))
+               {
+                       _choice.setDialogTitle("Watch new folder...");
+                       _choice.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+                       _choice.setAcceptAllFileFilterUsed(false);
+                       try {
+                               if (_choice.showOpenDialog(getSelf()) == JFileChooser.APPROVE_OPTION) { 
+                                       addFolder(_choice.getSelectedFile().getCanonicalPath());
+                               }
+                               else {
+                                       System.out.println("No Selection ");
+                               }
+                       } catch (IOException e1) {
+                               e1.printStackTrace();
+                       }
+               }
+               else if (cmd.equals(""+Commands.ADD_PANEL_DOWN))
+               {
+                       addLowerPanel();
+               }
+               else if (cmd.equals(""+Commands.ADD_PANEL_UP))
+               {
+                       addUpperPanel();
+               }
+               else if (cmd.equals(""+Commands.REMOVE_PANEL_DOWN))
+               {
+                       removeLowerPanel();
+               }
+               else if (cmd.equals(""+Commands.REMOVE_PANEL_UP))
+               {
+                       removeUpperPanel();
+               }
+               else if (cmd.equals(""+Commands.SORT_FILENAME))
+               {
+                       _sideList.switchToPath();
+               }
+               else if (cmd.equals(""+Commands.SORT_ID))
+               {
+                       _sideList.switchToID();
+               }
+               else if (cmd.equals(""+Commands.TEST_XML))
+               {
+                       String path = "temp.xml";
+                       VARNAHolder vh = (VARNAHolder) _varnaUpperPanels.getComponent(0);
+                       vh.vp.toXML(path);
+                       try {
+                               FullBackup b = vh.vp.importSession(path);
+                               VARNAHolder vh2 = (VARNAHolder) _varnaUpperPanels.getComponent(1);
+                               vh2.vp.setConfig(b.config);
+                               vh2.vp.showRNAInterpolated(b.rna);
+                               vh2.vp.repaint();
+                       } catch (ExceptionLoadingFailed e1) {
+                               e1.printStackTrace();
+                       }
+               }
+               else if (cmd.equals(""+Commands.CHANGE_LNF))
+               {
+                       try {
+                               
+                               Object o  = _lnf.getModel().getSelectedItem();
+                               System.out.println(o);
+                               UIManager.setLookAndFeel(((LookAndFeelInfo)_lnf.getModel().getSelectedItem()).getClassName());
+                               SwingUtilities.updateComponentTreeUI(this);
+                               this.pack();
+                       } catch (UnsupportedLookAndFeelException e1) {
+                               // TODO Auto-generated catch block
+                               e1.printStackTrace();
+                       } catch (ClassNotFoundException e2) {
+                               // TODO Auto-generated catch block
+                               e2.printStackTrace();
+                       } catch (InstantiationException e3) {
+                               // TODO Auto-generated catch block
+                               e3.printStackTrace();
+                       } catch (IllegalAccessException e4) {
+                               // TODO Auto-generated catch block
+                               e4.printStackTrace();
+                       }
+               }
+               else
+               {
+                       JOptionPane.showMessageDialog(this, "Command '"+cmd+"' not implemented yet.");
+               }
+       }
+
+
+       public void valueChanged(TreeSelectionEvent e) {
+               int[] t = _sideList.getSelectionRows();
+               if (t==null)
+               {
+                       System.out.print("null");
+               }
+               else
+               {
+                       System.out.print("[");
+                       for(int i=0;i<t.length;i++)
+                       {
+                               System.out.print(t[i]+",");
+                       }
+                       System.out.println("]");
+               }
+       }
+
+       
+       public static void main(String[] args) {
+               FragSeqGUI d = new FragSeqGUI();
+               d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+               d.pack();
+               d.setVisible(true);
+       }
+
+
+}
+