JAL-3026 srcjar files for VARNA and log4j
[jalview.git] / srcjar / fr / orsay / lri / varna / applications / fragseq / FragSeqGUI.java
1 /*
2  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.
3  Copyright (C) 2008  Kevin Darty, Alain Denise and Yann Ponty.
4  electronic mail : Yann.Ponty@lri.fr
5  paper mail : LRI, bat 490 Université Paris-Sud 91405 Orsay Cedex France
6
7  This file is part of VARNA version 3.1.
8  VARNA version 3.1 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
9  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
10
11  VARNA version 3.1 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  See the GNU General Public License for more details.
14
15  You should have received a copy of the GNU General Public License along with VARNA version 3.1.
16  If not, see http://www.gnu.org/licenses.
17  */
18 package fr.orsay.lri.varna.applications.fragseq;
19
20 import java.awt.BorderLayout;
21 import java.awt.Color;
22 import java.awt.Component;
23 import java.awt.Dimension;
24 import java.awt.GridLayout;
25 import java.awt.datatransfer.DataFlavor;
26 import java.awt.datatransfer.Transferable;
27 import java.awt.datatransfer.UnsupportedFlavorException;
28 import java.awt.dnd.DropTarget;
29 import java.awt.dnd.DropTargetDragEvent;
30 import java.awt.dnd.DropTargetDropEvent;
31 import java.awt.dnd.DropTargetEvent;
32 import java.awt.dnd.DropTargetListener;
33 import java.awt.event.ActionEvent;
34 import java.awt.event.ActionListener;
35 import java.awt.event.ComponentEvent;
36 import java.awt.event.ComponentListener;
37 import java.awt.event.FocusEvent;
38 import java.awt.event.FocusListener;
39 import java.awt.event.MouseEvent;
40 import java.awt.event.MouseListener;
41 import java.awt.event.WindowEvent;
42 import java.awt.event.WindowListener;
43 import java.io.IOException;
44 import java.util.ArrayList;
45
46 import javax.swing.BorderFactory;
47 import javax.swing.ButtonGroup;
48 import javax.swing.DefaultListSelectionModel;
49 import javax.swing.JButton;
50 import javax.swing.JComboBox;
51 import javax.swing.JComponent;
52 import javax.swing.JFileChooser;
53 import javax.swing.JFrame;
54 import javax.swing.JLabel;
55 import javax.swing.JList;
56 import javax.swing.JOptionPane;
57 import javax.swing.JPanel;
58 import javax.swing.JRadioButton;
59 import javax.swing.JScrollPane;
60 import javax.swing.JSplitPane;
61 import javax.swing.JTextPane;
62 import javax.swing.JToolBar;
63 import javax.swing.JTree;
64 import javax.swing.ListSelectionModel;
65 import javax.swing.LookAndFeel;
66 import javax.swing.SwingUtilities;
67 import javax.swing.TransferHandler;
68 import javax.swing.UIManager;
69 import javax.swing.UIManager.LookAndFeelInfo;
70 import javax.swing.UnsupportedLookAndFeelException;
71 import javax.swing.event.TreeModelEvent;
72 import javax.swing.event.TreeModelListener;
73 import javax.swing.event.TreeSelectionEvent;
74 import javax.swing.event.TreeSelectionListener;
75 import javax.swing.tree.DefaultMutableTreeNode;
76 import javax.swing.tree.ExpandVetoException;
77 import javax.swing.tree.TreePath;
78 import javax.swing.tree.TreeSelectionModel;
79
80 import fr.orsay.lri.varna.VARNAPanel;
81 import fr.orsay.lri.varna.applications.BasicINI;
82 import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed;
83 import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength;
84 import fr.orsay.lri.varna.models.FullBackup;
85
86
87 public class FragSeqGUI extends JFrame implements TreeModelListener, MouseListener,DropTargetListener, WindowListener, ComponentListener, ActionListener, TreeSelectionListener {
88
89         private enum Commands
90         {
91                 NEW_FOLDER,
92                 ADD_PANEL_UP,
93                 ADD_PANEL_DOWN,
94                 REMOVE_PANEL_UP,
95                 REMOVE_PANEL_DOWN,
96                 SORT_ID,
97                 SORT_FILENAME,
98                 REFRESH_ALL,
99                 CHANGE_LNF,
100                 TEST_XML,
101         };
102         
103         
104         /**
105          * 
106          */
107         private static final long serialVersionUID = -790155708306987257L;
108
109
110                 
111         private String _INIFilename = "FragSeqUI.ini";
112         private boolean redrawOnSlide = false;
113         private int dividerWidth = 5;
114         
115         private JPanel _varnaUpperPanels = new JPanel();
116         private JPanel _varnaLowerPanels = new JPanel();
117
118         private JPanel _listPanel = new JPanel();
119         private JPanel _infoPanel = new JPanel();
120         private FragSeqTree _sideList = null;
121
122         
123         private FragSeqTreeModel _treeModel;
124         private JToolBar _toolbar = new JToolBar();
125         private JFileChooser _choice = new JFileChooser();
126         
127         private JScrollPane _listScroller;
128
129         private JList _selectedElems;
130         private JSplitPane _splitLeft;
131         private JSplitPane _splitRight;
132         private JSplitPane _splitVARNA;
133         
134         private JComboBox _lnf; 
135
136
137         public FragSeqGUI() {
138                 super("VARNA Explorer");
139                 RNAPanelDemoInit();
140         }
141
142         
143         private void RNAPanelDemoInit() 
144         {
145                 JFrame.setDefaultLookAndFeelDecorated(true);
146                 this.addWindowListener(this);
147             
148                 _selectedElems = new JList();
149
150                 _lnf = new JComboBox(UIManager.getInstalledLookAndFeels());
151                 
152                 // Initializing Custom Tree Model
153                 _treeModel = new FragSeqTreeModel();
154                 _treeModel.addTreeModelListener(this);
155                 
156                 _sideList = new FragSeqTree(_treeModel);
157                 _sideList.addMouseListener(this);
158                 _sideList.setLargeModel(true);
159                 _sideList.setEditable(true);
160                 _sideList.addTreeWillExpandListener(_treeModel);
161                 FragSeqCellRenderer renderer = new FragSeqCellRenderer(_sideList,_treeModel);
162                 //_sideList.setUI(new CustomTreeUI());
163                 _sideList.setCellRenderer(renderer);
164                 _sideList.setCellEditor(new FragSeqCellEditor(_sideList,renderer,_treeModel));
165                 TreeSelectionModel m = _sideList.getSelectionModel();
166                 m.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
167                 _sideList.setSelectionModel(m);
168                 m.addTreeSelectionListener(this);
169                 _sideList.setShowsRootHandles(true);
170                 _sideList.setDragEnabled(true);
171                 _sideList.setRootVisible(false);
172                 _sideList.setTransferHandler(new TransferHandler(null) 
173                 {
174                         public int getSourceActions(JComponent c) {
175                                 return COPY_OR_MOVE;
176                         }
177                         protected Transferable createTransferable(JComponent c) {
178                                 JTree tree = (JTree) c;
179                                 TreePath tp =tree.getSelectionPath();
180                                 if (tp!=null)
181                                 {
182                                         DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp.getLastPathComponent();
183                                         if (node.getUserObject() instanceof FragSeqRNASecStrModel) {
184                                                 return new Transferable(){
185                                                         public DataFlavor[] getTransferDataFlavors() {
186                                                                 DataFlavor[] dt = {FragSeqRNASecStrModel.Flavor};
187                                                                 return dt;
188                                                         }
189                                                         public Object getTransferData(DataFlavor df)
190                                                         throws UnsupportedFlavorException, IOException {
191                                                                 if (!isDataFlavorSupported(df))
192                                                                         throw new UnsupportedFlavorException(df);
193                                                                 DefaultMutableTreeNode node = (DefaultMutableTreeNode) _sideList.getSelectionPath().getLastPathComponent();
194                                                                 return node.getUserObject();
195                                                         }
196                                                         public boolean isDataFlavorSupported(DataFlavor df) {
197                                                                 return FragSeqRNASecStrModel.Flavor.equals(df);
198                                                         }
199                                                 };
200                                         } else  if (node.getUserObject() instanceof FragSeqAnnotationDataModel) {
201                                                         return new Transferable(){
202                                                                 public DataFlavor[] getTransferDataFlavors() {
203                                                                         DataFlavor[] dt = { FragSeqAnnotationDataModel.Flavor};
204                                                                         return dt;
205                                                                 }
206                                                                 public Object getTransferData(DataFlavor df)
207                                                                 throws UnsupportedFlavorException, IOException {
208                                                                         if (!isDataFlavorSupported(df))
209                                                                                 throw new UnsupportedFlavorException(df);
210                                                                         DefaultMutableTreeNode node = (DefaultMutableTreeNode) _sideList.getSelectionPath().getLastPathComponent();
211                                                                         return node.getUserObject();
212                                                                 }
213                                                                 public boolean isDataFlavorSupported(DataFlavor df) {
214                                                                         return FragSeqAnnotationDataModel.Flavor.equals(df);
215                                                                 }
216                                                         };
217                                                 } else {
218                                                 return null;
219                                         }
220                                 }
221                                 return null;
222                         }
223                 });
224
225                 // Various buttons
226                 JButton refreshAllFoldersButton = new JButton("Refresh All");
227                 refreshAllFoldersButton.setActionCommand(""+Commands.REFRESH_ALL);
228                 refreshAllFoldersButton.addActionListener(this);
229                 
230                 JButton watchFolderButton = new JButton("Add folder");
231                 watchFolderButton.setActionCommand("" +Commands.NEW_FOLDER);
232                 watchFolderButton.addActionListener(this);
233                 
234                 JButton addUpperButton = new JButton("+Up");
235                 addUpperButton.setActionCommand(""+Commands.ADD_PANEL_UP);
236                 addUpperButton.addActionListener(this);
237                 
238                 JButton removeUpperButton = new JButton("-Up");
239                 removeUpperButton.setActionCommand(""+Commands.REMOVE_PANEL_UP);
240                 removeUpperButton.addActionListener(this);
241                 
242                 JButton addLowerButton = new JButton("+Down");
243                 addLowerButton.setActionCommand(""+Commands.ADD_PANEL_DOWN);
244                 addLowerButton.addActionListener(this);
245                 
246                 JButton removeLowerButton = new JButton("-Down");
247                 removeLowerButton.setActionCommand(""+Commands.REMOVE_PANEL_DOWN);
248                 removeLowerButton.addActionListener(this);
249                 
250                 JButton changeLNFButton = new JButton("Change");
251                 changeLNFButton.setActionCommand(""+Commands.CHANGE_LNF);
252                 changeLNFButton.addActionListener(this);
253
254                 JButton XMLButton = new JButton("Test XML");
255                 XMLButton.setActionCommand(""+Commands.TEST_XML);
256                 XMLButton.addActionListener(this);
257
258                 _toolbar.setFloatable(false);
259                 _toolbar.add(refreshAllFoldersButton);
260                 _toolbar.addSeparator();
261                 _toolbar.add(addUpperButton);
262                 _toolbar.add(removeUpperButton);
263                 _toolbar.add(addLowerButton);
264                 _toolbar.add(removeLowerButton);
265                 _toolbar.addSeparator();
266                 _toolbar.add(XMLButton);
267                 _toolbar.addSeparator();
268                 _toolbar.add(_lnf);
269                 _toolbar.add(changeLNFButton);
270                 
271                 // Scroller for File tree
272             _listScroller = new JScrollPane(_sideList,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
273             _listScroller.setPreferredSize(new Dimension(300, 200));
274             _listScroller.addComponentListener(this);
275
276                 
277                 _listPanel.setLayout(new BorderLayout());
278                 
279                 _listPanel.add(_listScroller,BorderLayout.CENTER);
280                 _listPanel.add(_selectedElems,BorderLayout.SOUTH);
281                 _listPanel.setBorder(BorderFactory.createTitledBorder("Structures"));
282                 _listPanel.setPreferredSize(new Dimension(300, 0));
283                 
284                 _varnaUpperPanels.setLayout(new GridLayout());
285                 _varnaUpperPanels.setPreferredSize(new Dimension(800, 600));
286                 
287                 _varnaLowerPanels.setLayout(new GridLayout());
288                 _varnaLowerPanels.setPreferredSize(new Dimension(800, 000));
289                 
290             JRadioButton sortFileName = new JRadioButton("Directory");
291             sortFileName.setActionCommand("sortfilename");
292             sortFileName.setSelected(true);
293             sortFileName.setOpaque(false);
294             sortFileName.setActionCommand(""+Commands.SORT_FILENAME);
295             sortFileName.addActionListener(this);
296             JRadioButton sortID = new JRadioButton("ID");
297             sortID.setActionCommand("sortid");
298             sortID.setOpaque(false);
299             sortID.setActionCommand(""+Commands.SORT_ID);
300             sortID.addActionListener(this);
301
302             ButtonGroup group = new ButtonGroup();
303             group.add(sortFileName);
304             group.add(sortID);
305                 
306                 JToolBar listTools = new JToolBar();
307                 listTools.setFloatable(false);
308                 listTools.add(watchFolderButton);
309                 listTools.addSeparator();
310             listTools.add(new JLabel("Sort by"));
311                 listTools.add(sortFileName);
312                 listTools.add(sortID);
313
314                 JPanel sidePanel = new JPanel();
315                 sidePanel.setLayout(new BorderLayout());
316                 sidePanel.add(listTools,BorderLayout.NORTH);
317                 sidePanel.add(_listPanel,BorderLayout.CENTER);
318                 
319                 
320                 JPanel mainVARNAPanel = new JPanel();
321                 mainVARNAPanel.setLayout(new BorderLayout());
322                 _splitVARNA = new JSplitPane(JSplitPane.VERTICAL_SPLIT,redrawOnSlide,_varnaUpperPanels,_varnaLowerPanels);
323                 _splitVARNA.setDividerSize(dividerWidth);
324                 _splitVARNA.setResizeWeight(1.0);
325                 _splitLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,redrawOnSlide,sidePanel,_splitVARNA);
326                 _splitLeft.setResizeWeight(0.1);
327                 _splitLeft.setDividerSize(dividerWidth);
328                 _splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,redrawOnSlide,_splitLeft,_infoPanel);
329                 _splitRight.setResizeWeight(0.85);
330                 _splitRight.setDividerSize(dividerWidth);
331                 
332                 _infoPanel.setLayout(new GridLayout(0,1));
333                 
334                 this.restoreConfig();           
335                 this.getContentPane().setLayout(new BorderLayout());
336                 this.getContentPane().add(_splitRight, BorderLayout.CENTER);
337                 this.getContentPane().add(_toolbar, BorderLayout.NORTH);
338                 addUpperPanel();
339                 addUpperPanel();
340                 this.setVisible(true);
341         }
342         
343         public FragSeqGUI getSelf()
344         {
345                 return this;
346         }
347         
348         public VARNAHolder createIntegratedPanel(int height)
349         {
350                 VARNAHolder vh = new VARNAHolder(this);
351                 _varnaPanels.add(vh);
352                 return vh;
353         }
354         
355         
356         public void removeUpperPanel()
357         {
358                 if (_varnaUpperPanels.getComponentCount()>1)
359                 {
360                         VARNAHolder vh = (VARNAHolder) _varnaUpperPanels.getComponent(_varnaUpperPanels.getComponentCount()-1);
361                         _infoPanel.remove(vh.getInfoPane());
362                         _varnaUpperPanels.remove(vh);
363                         _splitLeft.validate();
364                         _splitRight.validate();
365                 }
366         }
367
368         public void addUpperPanel()
369         {
370                 VARNAHolder vh = createIntegratedPanel(100);
371                 _varnaUpperPanels.add(vh);
372                 _infoPanel.add(vh.getInfoPane());
373                 _splitRight.validate();
374                 _splitLeft.validate();
375         }
376
377         
378         public void removeLowerPanel()
379         {
380                 if (_varnaLowerPanels.getComponentCount()>0)
381                 {
382                         _varnaLowerPanels.remove(_varnaLowerPanels.getComponentCount()-1);
383                         if (_varnaLowerPanels.getComponentCount()==0)
384                         {
385                                 _splitVARNA.setDividerLocation(1.0);
386                                 _splitVARNA.validate();
387                                 _splitVARNA.repaint();
388                         }
389                         _splitLeft.validate();
390                 }
391         }
392
393         public void addLowerPanel()
394         {
395                 if (_varnaLowerPanels.getComponentCount()==0)
396                 {
397                         _splitVARNA.setDividerLocation(0.7);
398                         _splitVARNA.validate();
399                 }
400                 _varnaLowerPanels.add(createIntegratedPanel(400));
401                 _splitLeft.validate();
402         }
403
404
405         public void treeNodesChanged(TreeModelEvent e) {
406                DefaultMutableTreeNode node;
407                 node = (DefaultMutableTreeNode)
408                          (e.getTreePath().getLastPathComponent());
409
410                 /*
411                  * If the event lists children, then the changed
412                  * node is the child of the node we have already
413                  * gotten.  Otherwise, the changed node and the
414                  * specified node are the same.
415                  */
416                 try {
417                     int index = e.getChildIndices()[0];
418                     node = (DefaultMutableTreeNode)
419                            (node.getChildAt(index));
420                 } catch (NullPointerException exc) {}
421
422         }
423         
424         
425
426
427         public void addFolder(String path) {
428                 addFolder( path, true); 
429         }
430
431     public void addFolder(String path,
432             boolean shouldBeVisible) 
433     {
434         DefaultMutableTreeNode childNode = _treeModel.addFolder(path);
435         
436                 if ((childNode!=null) && shouldBeVisible ) {
437                           System.out.println("  Expanding: "+childNode.getUserObject());
438                           TreePath tp = new TreePath(childNode.getPath());
439                         _sideList.scrollPathToVisible(tp);                      
440                         _sideList.expandRow(_sideList.getRowForPath(tp));
441                         _sideList.updateUI();
442                         _sideList.validate();
443                 }
444     }
445
446         public void treeNodesInserted(TreeModelEvent e) {
447                 System.out.println(e);
448                 
449         }
450
451         public void treeNodesRemoved(TreeModelEvent e) {
452                 // TODO Auto-generated method stub
453                 
454         }
455
456         public void treeStructureChanged(TreeModelEvent e) {
457                 // TODO Auto-generated method stub
458                 
459         }
460
461         public void mouseClicked(MouseEvent e) {
462                 // TODO Auto-generated method stub
463                 
464         }
465
466         public void mousePressed(MouseEvent e) {
467                 
468         }
469
470         int index = 0;
471         
472         public void mouseReleased(MouseEvent e) {
473                 // TODO Auto-generated method stub
474                 if (e.getSource() == this._sideList)
475                 {
476                         if (e.getClickCount() == 1)
477                         {
478                                 /*TreePath t = _sideList.getSelectionPath();
479                                 if (t!=null)
480                                 {
481                                 DefaultMutableTreeNode node = (DefaultMutableTreeNode) t.getLastPathComponent();
482                                 if (node.getUserObject() instanceof FragSeqFileModel)
483                                 {
484                                         int row = _sideList.getRowForPath(t);
485                                         System.out.println("[A]"+row);
486                                         if (!_sideList.isExpanded(row))
487                                         {
488                                                 try {
489                                                         _sideList.fireTreeWillExpand(t);
490                                                         _sideList.expandPath(t);
491                                                 } catch (ExpandVetoException e1) {
492                                                         // TODO Auto-generated catch block
493                                                         e1.printStackTrace();
494                                                 }
495                                         }
496                                         else 
497                                         {
498                                                 try {
499                                                         _sideList.fireTreeWillCollapse(t);
500                                                         _sideList.collapsePath(t);
501                                                 } catch (ExpandVetoException e1) {
502                                                         // TODO Auto-generated catch block
503                                                         e1.printStackTrace();
504                                                 }
505                                         }
506                                 }
507                                 }*/
508                         }
509                         else if (e.getClickCount() == 2)
510                         {
511                                 TreePath t = _sideList.getSelectionPath();
512                                 if (t!= null)
513                                 {
514                                         DefaultMutableTreeNode node = (DefaultMutableTreeNode) t.getLastPathComponent();
515                                         if (node.getUserObject() instanceof FragSeqFileModel)
516                                         {
517                                                 if (!_sideList.isExpanded(t))
518                                                 {
519                                                         try {
520                                                                 _sideList.fireTreeWillExpand(t);
521                                                                 _sideList.expandPath(t);
522                                                         } catch (ExpandVetoException e1) {
523                                                                 e1.printStackTrace();
524                                                         }
525                                                 }
526                                                 else 
527                                                 {
528                                                         try {
529                                                                 _sideList.fireTreeWillCollapse(t);
530                                                                 _sideList.collapsePath(t);
531                                                         } catch (ExpandVetoException e1) {
532                                                                 e1.printStackTrace();
533                                                         }
534                                                 }
535                                         }
536                                         else if (node.getUserObject() instanceof FragSeqModel)
537                                         {
538                                                 FragSeqModel model = (FragSeqModel) node.getUserObject();
539                                                 
540                                                 // Figuring out which panel to add object to...
541                                                 int res;
542                                                 if (model instanceof FragSeqRNASecStrModel)
543                                                 {
544                                                         res = index % (_varnaUpperPanels.getComponentCount()+_varnaLowerPanels.getComponentCount());
545                                                 }
546                                                 else 
547                                                 {
548                                                         res = (index+_varnaUpperPanels.getComponentCount()+_varnaLowerPanels.getComponentCount()-1) % (_varnaUpperPanels.getComponentCount()+_varnaLowerPanels.getComponentCount());
549                                                 }
550                                                 Component c = null;
551                                                 if (res<_varnaUpperPanels.getComponentCount())
552                                                 {
553                                                         c = (VARNAHolder)_varnaUpperPanels.getComponent(res);
554                                                 }
555                                                 else
556                                                 {
557                                                         res -= _varnaUpperPanels.getComponentCount();
558                                                         c = (VARNAHolder)_varnaLowerPanels.getComponent(res);
559                                                 }
560                                                 
561                                                 if (c instanceof VARNAHolder)
562                                                 {
563                                                         VARNAHolder h = (VARNAHolder) c;
564                                                         if (model instanceof FragSeqRNASecStrModel)
565                                                         {
566                                                                 h.setSecStrModel((FragSeqRNASecStrModel)model);
567                                                                 index ++;
568                                                         }
569                                                         else if (model instanceof FragSeqAnnotationDataModel)
570                                                         {
571                                                                 h.setDataModel((FragSeqAnnotationDataModel)model);
572                                                         }
573                                                 }
574                                         }
575                                 }
576                         }
577                 }
578         }
579
580         
581         
582         
583         class VARNAHolder extends JPanel
584         {
585                 VARNAPanel vp;
586                 FragSeqRNASecStrModel _m;
587                 FragSeqAnnotationDataModel _data;
588                 JPanel _infoPanel;
589                 JTextPane _infoTxt;
590                 
591                 
592                 public VARNAHolder(DropTargetListener f)
593                 {
594                         super();
595                         vp = new VARNAPanel();
596                         vp.addFocusListener(new FocusListener(){
597                                 public void focusGained(FocusEvent e) {
598                                         //focus(_m);
599                                 }
600                                 public void focusLost(FocusEvent e) {
601                                 }});
602                         vp.setPreferredSize(new Dimension(800, 400));
603
604                         _infoTxt = new JTextPane(); 
605                         _infoTxt.setPreferredSize(new Dimension(200,0));
606                         _infoTxt.setContentType("text/html");
607
608                         JScrollPane scroll = new JScrollPane(_infoTxt,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
609
610                         _infoPanel = new JPanel();
611                         _infoPanel.setLayout(new BorderLayout());
612                         _infoPanel.setPreferredSize(new Dimension(200,0));
613                         _infoPanel.setBorder(BorderFactory.createTitledBorder("Info"));
614                         _infoPanel.add(scroll,BorderLayout.CENTER);
615                         _infoPanel.validate();
616
617                         this.setLayout(new BorderLayout());
618                         this.setPreferredSize(new Dimension(300,600));
619                         this.setBorder(BorderFactory.createTitledBorder("None"));                       
620                         this.add(vp, BorderLayout.CENTER);
621                         
622                         DropTarget dt = new DropTarget(vp, f);
623                 }
624                 
625                 VARNAPanel getVARNAPanel()
626                 {
627                         return vp;
628                 }
629                 void setSecStrModel(FragSeqRNASecStrModel m)
630                 {
631                         _m = m;
632                         vp.showRNAInterpolated(m.getRNA());
633                         setBorder(BorderFactory.createTitledBorder(m.toString()));
634                         _infoTxt.setText(m.getRNA().getHTMLDescription());
635                         _infoPanel.setBorder(BorderFactory.createTitledBorder("Info ("+_m+")"));
636                         vp.requestFocus();
637                 }
638                 void setDataModel(FragSeqAnnotationDataModel data)
639                 {
640                         _data = data;
641                         data.applyTo(vp.getRNA());
642                         vp.repaint();
643                         vp.requestFocus();
644                 }
645                 FragSeqModel getModel()
646                 {
647                         setBorder(BorderFactory.createTitledBorder(_m.toString()));
648                         return _m;
649                 }
650                 public void setInfoTxt(String s)
651                 {
652                         _infoTxt.setText(vp.getRNA().getHTMLDescription());
653                         _infoTxt.validate();
654                 }
655                 public JPanel getInfoPane()
656                 {
657                         return _infoPanel;
658                 }
659                 
660         }
661         
662
663         private ArrayList<VARNAHolder> _varnaPanels = new ArrayList<VARNAHolder>(); 
664         
665         private VARNAHolder getHolder(Component vp)
666         {
667                 if (vp instanceof VARNAHolder)
668                 {
669                         int i= _varnaPanels.indexOf(vp);
670                         if (i!=-1)
671                         {
672                                 return _varnaPanels.get(i);
673                         }
674                 }
675                 if (vp instanceof VARNAPanel)
676                 {
677                         for (VARNAHolder vh: _varnaPanels)
678                         {
679                                 if (vh.getVARNAPanel()==vp)
680                                 return vh;
681                         }
682                 }
683                 return null;
684         }
685
686
687         
688         public void mouseEntered(MouseEvent e) {
689                 // TODO Auto-generated method stub
690                 
691         }
692
693         public void mouseExited(MouseEvent e) {
694                 // TODO Auto-generated method stub
695                 
696         }
697
698         public void dragEnter(DropTargetDragEvent arg0) {
699                 // TODO Auto-generated method stub
700                 
701         }
702
703         public void dragExit(DropTargetEvent arg0) {
704                 // TODO Auto-generated method stub
705                 
706         }
707
708         public void dragOver(DropTargetDragEvent arg0) {
709                 
710         }
711
712         public void drop(DropTargetDropEvent arg0) {
713                         try {
714                                 
715                                 DropTarget o = (DropTarget)arg0.getSource();
716                                 if (o.getComponent() instanceof VARNAPanel)
717                                 {
718                                         VARNAHolder h = getHolder(o.getComponent());
719                                         if (h!=null)
720                                         {
721                                                 System.out.println("[X]");
722                                                 Transferable t = arg0.getTransferable();
723                                                 if (t.isDataFlavorSupported(FragSeqRNASecStrModel.Flavor))
724                                                 {
725                                                         Object data = t.getTransferData(FragSeqRNASecStrModel.Flavor);
726                                                         if (data instanceof FragSeqRNASecStrModel)
727                                                         {
728                                                                 h.setSecStrModel((FragSeqRNASecStrModel) data);
729                                                         }
730                                                 }
731                                                 else if (t.isDataFlavorSupported(FragSeqAnnotationDataModel.Flavor))
732                                                 {                                                       
733                                                         System.out.println("[Y]");
734                                                         Object data = t.getTransferData(FragSeqAnnotationDataModel.Flavor);
735                                                         if (data instanceof FragSeqAnnotationDataModel)
736                                                         {
737                                                                 FragSeqAnnotationDataModel d = (FragSeqAnnotationDataModel) data;
738                                                                 h.setDataModel(d);
739                                                         }
740                                                 }
741                                         }
742                                 }
743                         } catch (UnsupportedFlavorException e) {
744                                 // TODO Auto-generated catch block
745                                 e.printStackTrace();
746                         } catch (IOException e) {
747                                 // TODO Auto-generated catch block
748                                 e.printStackTrace();
749                         } 
750         }
751
752         public void dropActionChanged(DropTargetDragEvent arg0) {
753                 // TODO Auto-generated method stub
754                 
755         }
756
757         public void windowOpened(WindowEvent e) {
758                 // TODO Auto-generated method stub
759                 
760         }
761
762         public void windowClosing(WindowEvent e) {
763                 saveConfig();
764                 System.exit(0);
765         }
766
767         public void windowClosed(WindowEvent e) {
768                 // TODO Auto-generated method stub
769                 
770         }
771
772         public void windowIconified(WindowEvent e) {
773                 // TODO Auto-generated method stub
774                 
775         }
776
777         public void windowDeiconified(WindowEvent e) {
778                 // TODO Auto-generated method stub
779                 
780         }
781
782         public void windowActivated(WindowEvent e) {
783                 // TODO Auto-generated method stub
784                 
785         }
786
787         public void windowDeactivated(WindowEvent e) {
788                 // TODO Auto-generated method stub
789                 
790         }
791
792         private void restoreConfig()
793         {
794                 BasicINI config = BasicINI.loadINI(_INIFilename);
795         ArrayList<String> vals = config.getItemList("folders");
796                 System.out.print("[C]"+vals);
797         
798             for(String path:vals)
799                 {
800                 System.out.println("Loading folder "+path);
801                   addFolder(path);
802                 }
803             _sideList.validate();
804             _listScroller.validate();
805         }
806
807         private void saveConfig()
808         {
809                 BasicINI data = new BasicINI();
810                 int i=0;
811                 for (String folderPath: _treeModel.getFolders())
812                 {
813                   data.addItem("folders", "val"+i, folderPath);
814                   i++;
815                 }
816                 BasicINI.saveINI(data, _INIFilename);
817         }
818
819
820         public void componentResized(ComponentEvent e) {
821                 _sideList.validate();
822         }
823
824
825         public void componentMoved(ComponentEvent e) {
826                 // TODO Auto-generated method stub
827                 
828         }
829
830
831         public void componentShown(ComponentEvent e) {
832                 // TODO Auto-generated method stub
833                 
834         }
835
836
837         public void componentHidden(ComponentEvent e) {
838                 // TODO Auto-generated method stub
839                 
840         }
841
842
843         public void actionPerformed(ActionEvent e) {
844                 String cmd = e.getActionCommand();
845                 System.out.println(cmd);
846                 if (cmd.equals(""+Commands.NEW_FOLDER))
847                 {
848                         _choice.setDialogTitle("Watch new folder...");
849                         _choice.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
850                         _choice.setAcceptAllFileFilterUsed(false);
851                         try {
852                                 if (_choice.showOpenDialog(getSelf()) == JFileChooser.APPROVE_OPTION) { 
853                                         addFolder(_choice.getSelectedFile().getCanonicalPath());
854                                 }
855                                 else {
856                                         System.out.println("No Selection ");
857                                 }
858                         } catch (IOException e1) {
859                                 e1.printStackTrace();
860                         }
861                 }
862                 else if (cmd.equals(""+Commands.ADD_PANEL_DOWN))
863                 {
864                         addLowerPanel();
865                 }
866                 else if (cmd.equals(""+Commands.ADD_PANEL_UP))
867                 {
868                         addUpperPanel();
869                 }
870                 else if (cmd.equals(""+Commands.REMOVE_PANEL_DOWN))
871                 {
872                         removeLowerPanel();
873                 }
874                 else if (cmd.equals(""+Commands.REMOVE_PANEL_UP))
875                 {
876                         removeUpperPanel();
877                 }
878                 else if (cmd.equals(""+Commands.SORT_FILENAME))
879                 {
880                         _sideList.switchToPath();
881                 }
882                 else if (cmd.equals(""+Commands.SORT_ID))
883                 {
884                         _sideList.switchToID();
885                 }
886                 else if (cmd.equals(""+Commands.TEST_XML))
887                 {
888                         String path = "temp.xml";
889                         VARNAHolder vh = (VARNAHolder) _varnaUpperPanels.getComponent(0);
890                         vh.vp.toXML(path);
891                         try {
892                                 FullBackup b = vh.vp.importSession(path);
893                                 VARNAHolder vh2 = (VARNAHolder) _varnaUpperPanels.getComponent(1);
894                                 vh2.vp.setConfig(b.config);
895                                 vh2.vp.showRNAInterpolated(b.rna);
896                                 vh2.vp.repaint();
897                         } catch (ExceptionLoadingFailed e1) {
898                                 e1.printStackTrace();
899                         }
900                 }
901                 else if (cmd.equals(""+Commands.CHANGE_LNF))
902                 {
903                         try {
904                                 
905                                 Object o  = _lnf.getModel().getSelectedItem();
906                                 System.out.println(o);
907                                 UIManager.setLookAndFeel(((LookAndFeelInfo)_lnf.getModel().getSelectedItem()).getClassName());
908                                 SwingUtilities.updateComponentTreeUI(this);
909                                 this.pack();
910                         } catch (UnsupportedLookAndFeelException e1) {
911                                 // TODO Auto-generated catch block
912                                 e1.printStackTrace();
913                         } catch (ClassNotFoundException e2) {
914                                 // TODO Auto-generated catch block
915                                 e2.printStackTrace();
916                         } catch (InstantiationException e3) {
917                                 // TODO Auto-generated catch block
918                                 e3.printStackTrace();
919                         } catch (IllegalAccessException e4) {
920                                 // TODO Auto-generated catch block
921                                 e4.printStackTrace();
922                         }
923                 }
924                 else
925                 {
926                         JOptionPane.showMessageDialog(this, "Command '"+cmd+"' not implemented yet.");
927                 }
928         }
929
930
931         public void valueChanged(TreeSelectionEvent e) {
932                 int[] t = _sideList.getSelectionRows();
933                 if (t==null)
934                 {
935                         System.out.print("null");
936                 }
937                 else
938                 {
939                         System.out.print("[");
940                         for(int i=0;i<t.length;i++)
941                         {
942                                 System.out.print(t[i]+",");
943                         }
944                         System.out.println("]");
945                 }
946         }
947
948         
949         public static void main(String[] args) {
950                 FragSeqGUI d = new FragSeqGUI();
951                 d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
952                 d.pack();
953                 d.setVisible(true);
954         }
955
956
957 }
958