JAL-842: some bugfixes;
[jalview.git] / src / jalview / gui / AppVarnaBinding.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
3  * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * 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  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package jalview.gui;
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.Font;
25 import java.awt.GridLayout;
26 import java.awt.datatransfer.DataFlavor;
27 import java.awt.datatransfer.Transferable;
28 import java.awt.dnd.DnDConstants;
29 import java.awt.dnd.DropTarget;
30 import java.awt.dnd.DropTargetDragEvent;
31 import java.awt.dnd.DropTargetDropEvent;
32 import java.awt.dnd.DropTargetEvent;
33 import java.awt.dnd.DropTargetListener;
34 import java.awt.event.ActionEvent;
35 import java.awt.event.ActionListener;
36 import java.awt.event.ComponentEvent;
37 import java.awt.event.MouseEvent;
38 import java.awt.event.MouseListener;
39 import java.io.File;
40 import java.text.DateFormat;
41 import java.util.ArrayList;
42 import java.util.Date;
43 import java.util.List;
44
45 import javax.swing.DefaultListModel;
46 import javax.swing.DefaultListSelectionModel;
47 import javax.swing.Icon;
48 import javax.swing.JButton;
49 import javax.swing.JFrame;
50 import javax.swing.JLabel;
51 import javax.swing.JList;
52 import javax.swing.JOptionPane;
53 import javax.swing.JPanel;
54 import javax.swing.JScrollPane;
55 import javax.swing.JSplitPane;
56 import javax.swing.JTextField;
57 import javax.swing.ListModel;
58 import javax.swing.ListSelectionModel;
59 import javax.swing.UIManager;
60 import javax.swing.UnsupportedLookAndFeelException;
61 import javax.swing.event.ListSelectionEvent;
62 import javax.swing.event.ListSelectionListener;
63
64 import fr.orsay.lri.varna.VARNAPanel;
65 import fr.orsay.lri.varna.components.ReorderableJList;
66 import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax;
67 import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed;
68 import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength;
69 import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses;
70 import fr.orsay.lri.varna.interfaces.InterfaceVARNAListener;
71 import fr.orsay.lri.varna.models.FullBackup;
72 import fr.orsay.lri.varna.models.VARNAConfig;
73 import fr.orsay.lri.varna.models.rna.Mapping;
74 import fr.orsay.lri.varna.models.rna.RNA;
75
76 public class AppVarnaBinding extends jalview.ext.varna.JalviewVarnaBinding implements DropTargetListener, InterfaceVARNAListener, MouseListener {
77
78         /**
79          * 
80          */
81         //private static final long serialVersionUID = -790155708306987257L;
82
83         private String DEFAULT_SEQUENCE = "CAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIACAGCACGACACUAGCAGUCAGUGUCAGACUGCAIA";
84         private String DEFAULT_STRUCTURE1 = "..(((((...(((((...(((((...(((((.....)))))...))))).....(((((...(((((.....)))))...))))).....)))))...)))))..";
85         private String DEFAULT_STRUCTURE2 = "..(((((...(((((...(((((........(((((...(((((.....)))))...)))))..................))))).....)))))...)))))..";
86         public VARNAPanel vp;
87
88         protected JPanel _tools = new JPanel();
89         private JPanel _input = new JPanel();
90
91         private JPanel _seqPanel = new JPanel();
92         private JPanel _strPanel = new JPanel();
93         private JLabel _info = new JLabel();
94         private JTextField _str = new JTextField();
95         private JTextField _seq = new JTextField();
96         private JLabel _strLabel = new JLabel(" Str:");
97         private JLabel _seqLabel = new JLabel(" Seq:");
98         private JButton _createButton = new JButton("Create");
99         private JButton _updateButton = new JButton("Update");
100         private JButton _deleteButton = new JButton("Delete");
101         private JButton _duplicateButton = new JButton("Snapshot");
102         
103         protected JPanel _listPanel = new JPanel();
104         private ReorderableJList _sideList = null;
105
106
107         private static String errorOpt = "error";
108         @SuppressWarnings("unused")
109         private boolean _error;
110
111         private Color _backgroundColor = Color.white;
112
113         private static int _nextID = 1;
114         @SuppressWarnings("unused")
115         private int _algoCode;
116         
117         private BackupHolder _rnaList;
118
119
120         /*public AppVarnaBinding() {
121                 //super("VARNA in Jalview");
122                 //this.set_seq("ATGC");
123                 //this.set_str(".().");
124                 //RNAPanelDemoInit();
125                 
126                 //initVarna("ATGCATGATATATATATAT","....((((...))))....");
127                 initVarna(this.DEFAULT_SEQUENCE,this.DEFAULT_STRUCTURE1);
128         }*/
129         
130         public AppVarnaBinding(String seq,String struc){
131                 //super("VARNA in Jalview");
132                 initVarna(seq,struc);
133         }
134         
135         public AppVarnaBinding(ArrayList<RNA> rnaList){
136                 //super("VARNA in Jalview");
137                 initVarnaEdit(rnaList);
138         }
139         
140         
141         
142         private void initVarna(String seq, String str){
143                 DefaultListModel dlm = new DefaultListModel(); 
144             
145                 DefaultListSelectionModel m = new DefaultListSelectionModel();
146             m.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
147             m.setLeadAnchorNotificationEnabled(false);
148             
149             _sideList = new ReorderableJList();
150                 _sideList.setModel(dlm);
151                 _sideList.addMouseListener(this);
152             _sideList.setSelectionModel(m);
153             _sideList.setPreferredSize(new Dimension(100, 0));
154             _sideList.addListSelectionListener( new ListSelectionListener(){
155                         public void valueChanged(ListSelectionEvent arg0) {
156                                 if (!_sideList.isSelectionEmpty() && !arg0.getValueIsAdjusting())
157                                 {
158                                         FullBackup  sel = (FullBackup) _sideList.getSelectedValue();
159                                         Mapping map = Mapping.DefaultOutermostMapping(vp.getRNA().getSize(), sel.rna.getSize());
160                                         vp.showRNAInterpolated(sel.rna,sel.config,map);
161                                         _seq.setText(sel.rna.getSeq());
162                                         _str.setText(sel.rna.getStructDBN());
163                                 }
164                         }
165             });
166
167             _rnaList = new BackupHolder(dlm,_sideList);
168                 RNA _RNA1 = new RNA("User defined 1");
169                 
170                 try {
171                         vp = new VARNAPanel("0",".");
172                         _RNA1.setRNA(seq, str);
173                         _RNA1.drawRNARadiate(vp.getConfig());
174                 } catch (ExceptionNonEqualLength e) {
175                         vp.errorDialog(e);
176                 } catch (ExceptionUnmatchedClosingParentheses e2) {
177                 e2.printStackTrace();
178                 } catch (ExceptionFileFormatOrSyntax e3) {
179                 e3.printStackTrace();
180                 }
181                 vp.setPreferredSize(new Dimension(400, 400));
182                 _rnaList.add(vp.getConfig().clone(),_RNA1,generateDefaultName(),true);
183
184                 //TODO setBackground(_backgroundColor);
185                 vp.setBackground(_backgroundColor);
186
187                 //TODO getContentPane().setLayout(new BorderLayout());
188                 //TODO getContentPane().add(vp, BorderLayout.CENTER);
189
190                 //setVisible(true);
191                 vp.addVARNAListener(this);
192         }
193         
194         private void initVarnaEdit(ArrayList<RNA> rnaInList) 
195         {
196             DefaultListModel dlm = new DefaultListModel(); 
197             
198
199                 int marginTools = 40;
200
201             DefaultListSelectionModel m = new DefaultListSelectionModel();
202             m.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
203             m.setLeadAnchorNotificationEnabled(false);
204             
205             
206                 _sideList = new ReorderableJList();
207                 _sideList.setModel(dlm);
208                 _sideList.addMouseListener(this);
209             _sideList.setSelectionModel(m);
210             _sideList.setPreferredSize(new Dimension(100, 0));
211             _sideList.addListSelectionListener( new ListSelectionListener(){
212                         public void valueChanged(ListSelectionEvent arg0) {
213                                 //System.out.println(arg0);
214                                 if (!_sideList.isSelectionEmpty() && !arg0.getValueIsAdjusting())
215                                 {
216                                         FullBackup  sel = (FullBackup) _sideList.getSelectedValue();
217                                         Mapping map = Mapping.DefaultOutermostMapping(vp.getRNA().getSize(), sel.rna.getSize());
218                                         vp.showRNAInterpolated(sel.rna,sel.config,map);
219                                         //_seq.setText(sel.rna.getSeq());
220                                         _str.setText(sel.rna.getStructDBN());
221                                 }
222                         }
223             });
224             
225             _rnaList = new BackupHolder(dlm,_sideList);
226                         
227                 try {
228                         vp = new VARNAPanel("0",".");
229                         for(int i=0;i<rnaInList.size();i++){
230                                 rnaInList.get(i).drawRNARadiate(vp.getConfig());
231                         }
232                 } catch (ExceptionNonEqualLength e) {
233                         vp.errorDialog(e);
234                 } 
235                 vp.setPreferredSize(new Dimension(400, 400));
236                 for(int i=0;i<rnaInList.size();i++){
237                         if(i<rnaInList.size()-1){
238                                 _rnaList.add(vp.getConfig().clone(),rnaInList.get(i),rnaInList.get(i).getName());
239                         }else{
240                                 _rnaList.add(vp.getConfig().clone(),rnaInList.get(i),rnaInList.get(i).getName(),true);
241                         }
242                 }
243
244             /*_rnaList.add(vp.getConfig().clone(),_RNA2,generateDefaultName());
245             _rnaList.add(vp.getConfig().clone(),_RNA1,generateDefaultName(),true);*/
246
247             JScrollPane listScroller = new JScrollPane(_sideList);
248             listScroller.setPreferredSize(new Dimension(150, 0));
249
250                 vp.setBackground(_backgroundColor);
251                 
252                 
253                 Font textFieldsFont = Font.decode("MonoSpaced-PLAIN-12");
254
255                 //_seqLabel.setHorizontalTextPosition(JLabel.LEFT);
256                 //_seqLabel.setPreferredSize(new Dimension(marginTools, 15));
257                 _seq.setFont(textFieldsFont);
258                 _seq.setText(rnaInList.get(0).getSeq());
259                 
260                 _updateButton.addActionListener(new ActionListener() {
261                         public void actionPerformed(ActionEvent e) {
262                                 FullBackup  sel = (FullBackup) _sideList.getSelectedValue();
263                                 sel.rna.setSequence("A");
264                                 }
265                 });
266                 
267                 //_seqPanel.setLayout(new BorderLayout());
268                 //_seqPanel.add(_seqLabel, BorderLayout.WEST);
269                 //_seqPanel.add(_seq, BorderLayout.CENTER);
270
271                 _strLabel.setPreferredSize(new Dimension(marginTools, 15));
272                 _strLabel.setHorizontalTextPosition(JLabel.LEFT);
273                 _str.setFont(textFieldsFont);
274                 _strPanel.setLayout(new BorderLayout());
275                 _strPanel.add(_strLabel, BorderLayout.WEST);
276                 _strPanel.add(_str, BorderLayout.CENTER);
277
278                 _input.setLayout(new GridLayout(1, 0));
279                 //_input.add(_seqPanel);
280                 _input.add(_strPanel);
281
282                 JPanel goPanel = new JPanel();
283                 goPanel.setLayout(new BorderLayout());
284
285                 _tools.setLayout(new BorderLayout());
286                 _tools.add(_input, BorderLayout.CENTER);
287                 //_tools.add(_info, BorderLayout.SOUTH);
288                 _tools.add(goPanel, BorderLayout.EAST);
289
290                 /*_deleteButton.addActionListener(new ActionListener() {
291                         public void actionPerformed(ActionEvent e) {
292                                 _rnaList.removeSelected();
293                         }
294                 });
295                 _duplicateButton.addActionListener(new ActionListener() {
296                         public void actionPerformed(ActionEvent e) {
297                                         _rnaList.add((VARNAConfig)vp.getConfig().clone(),vp.getRNA().clone(),vp.getRNA().getName()+"-"+DateFormat.getTimeInstance(DateFormat.LONG).format(new Date()),true); 
298                         }});
299                 */
300                 goPanel.add(_updateButton, BorderLayout.CENTER);
301                 
302                 
303                 JPanel ops = new JPanel();
304                 ops.setLayout(new GridLayout(1,2));
305                 ops.add(_deleteButton);
306                 ops.add(_duplicateButton);
307                 
308                 JLabel j = new JLabel("Structures Manager",JLabel.CENTER);
309                 _listPanel.setLayout(new BorderLayout());
310                 
311                 _listPanel.add(ops,BorderLayout.SOUTH);
312                 _listPanel.add(j,BorderLayout.NORTH);
313                 _listPanel.add(listScroller,BorderLayout.CENTER);
314                 
315                 
316                 
317                 //JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,_listPanel,vp);
318                 /**TODO
319                 getContentPane().setLayout(new BorderLayout());
320                 getContentPane().add(split, BorderLayout.CENTER);
321                 getContentPane().add(_tools, BorderLayout.NORTH);
322                  */
323
324                 //TODO setVisible(true);
325                 DropTarget dt = new DropTarget(vp, this);
326                 
327                 vp.addVARNAListener(this);
328         }
329         
330         public JPanel getTools(){
331                 return _tools;
332         }
333         
334         public JPanel getListPanel(){
335                 return _listPanel;
336         }
337
338         /*
339         private void RNAPanelDemoInit() 
340         {
341             DefaultListModel dlm = new DefaultListModel(); 
342             
343
344                 int marginTools = 40;
345
346             DefaultListSelectionModel m = new DefaultListSelectionModel();
347             m.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
348             m.setLeadAnchorNotificationEnabled(false);
349             
350             
351                 _sideList = new ReorderableJList();
352                 _sideList.setModel(dlm);
353                 _sideList.addMouseListener(this);
354             _sideList.setSelectionModel(m);
355             _sideList.setPreferredSize(new Dimension(100, 0));
356             _sideList.addListSelectionListener( new ListSelectionListener(){
357                         public void valueChanged(ListSelectionEvent arg0) {
358                                 //System.out.println(arg0);
359                                 if (!_sideList.isSelectionEmpty() && !arg0.getValueIsAdjusting())
360                                 {
361                                         FullBackup  sel = (FullBackup) _sideList.getSelectedValue();
362                                         Mapping map = Mapping.DefaultOutermostMapping(vp.getRNA().getSize(), sel.rna.getSize());
363                                         vp.showRNAInterpolated(sel.rna,sel.config,map);
364                                         _seq.setText(sel.rna.getSeq());
365                                         _str.setText(sel.rna.getStructDBN());
366                                 }
367                         }
368             });
369
370             _rnaList = new BackupHolder(dlm,_sideList);
371                 RNA _RNA1 = new RNA("User defined 1");
372                 RNA _RNA2 = new RNA("User defined 2");
373                 try {
374                         vp = new VARNAPanel("0",".");
375                         _RNA1.setRNA(DEFAULT_SEQUENCE, DEFAULT_STRUCTURE1);
376                         _RNA1.drawRNARadiate(vp.getConfig());
377                         _RNA2.setRNA(DEFAULT_SEQUENCE, DEFAULT_STRUCTURE2);
378                         _RNA2.drawRNARadiate(vp.getConfig());
379                 } catch (ExceptionNonEqualLength e) {
380                         vp.errorDialog(e);
381                 } catch (ExceptionUnmatchedClosingParentheses e2) {
382                 e2.printStackTrace();
383                 } catch (ExceptionFileFormatOrSyntax e3) {
384                 e3.printStackTrace();
385                 }
386                 vp.setPreferredSize(new Dimension(400, 400));
387             _rnaList.add(vp.getConfig().clone(),_RNA2,generateDefaultName());
388             _rnaList.add(vp.getConfig().clone(),_RNA1,generateDefaultName(),true);
389
390             JScrollPane listScroller = new JScrollPane(_sideList);
391             listScroller.setPreferredSize(new Dimension(150, 0));
392
393                 setBackground(_backgroundColor);
394                 vp.setBackground(_backgroundColor);
395
396
397                 Font textFieldsFont = Font.decode("MonoSpaced-PLAIN-12");
398
399                 _seqLabel.setHorizontalTextPosition(JLabel.LEFT);
400                 _seqLabel.setPreferredSize(new Dimension(marginTools, 15));
401                 _seq.setFont(textFieldsFont);
402                 _seq.setText(DEFAULT_SEQUENCE);
403
404                 _createButton.addActionListener(new ActionListener() {
405                         public void actionPerformed(ActionEvent e) {
406                                 try {
407                                 RNA nRNA = new RNA(generateDefaultName());
408                                 nRNA.setRNA(_seq.getText(), _str.getText());
409                                 nRNA.drawRNARadiate(vp.getConfig());
410                                 _rnaList.add(new VARNAConfig(),nRNA,true);
411                                 } catch (ExceptionUnmatchedClosingParentheses e1) {
412                                         JOptionPane.showMessageDialog(vp, e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);
413                                 } catch (ExceptionFileFormatOrSyntax e1) {
414                                         JOptionPane.showMessageDialog(vp, e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);
415                                 }
416                         }
417                 });
418
419
420                 _seqPanel.setLayout(new BorderLayout());
421                 _seqPanel.add(_seqLabel, BorderLayout.WEST);
422                 _seqPanel.add(_seq, BorderLayout.CENTER);
423
424                 _strLabel.setPreferredSize(new Dimension(marginTools, 15));
425                 _strLabel.setHorizontalTextPosition(JLabel.LEFT);
426                 _str.setFont(textFieldsFont);
427                 _strPanel.setLayout(new BorderLayout());
428                 _strPanel.add(_strLabel, BorderLayout.WEST);
429                 _strPanel.add(_str, BorderLayout.CENTER);
430
431                 _input.setLayout(new GridLayout(2, 0));
432                 _input.add(_seqPanel);
433                 _input.add(_strPanel);
434
435                 JPanel goPanel = new JPanel();
436                 goPanel.setLayout(new BorderLayout());
437
438                 _tools.setLayout(new BorderLayout());
439                 _tools.add(_input, BorderLayout.CENTER);
440                 _tools.add(_info, BorderLayout.SOUTH);
441                 _tools.add(goPanel, BorderLayout.EAST);
442
443                 _deleteButton.addActionListener(new ActionListener() {
444                         public void actionPerformed(ActionEvent e) {
445                                 _rnaList.removeSelected();
446                         }
447                 });
448                 _duplicateButton.addActionListener(new ActionListener() {
449                         public void actionPerformed(ActionEvent e) {
450                                         _rnaList.add((VARNAConfig)vp.getConfig().clone(),vp.getRNA().clone(),vp.getRNA().getName()+"-"+DateFormat.getTimeInstance(DateFormat.LONG).format(new Date()),true); 
451                         }});
452                 
453                 JPanel ops = new JPanel();
454                 ops.setLayout(new GridLayout(1,2));
455                 ops.add(_deleteButton);
456                 ops.add(_duplicateButton);
457
458                 JLabel j = new JLabel("Structures Manager",JLabel.CENTER);
459                 _listPanel.setLayout(new BorderLayout());
460                 
461                 _listPanel.add(ops,BorderLayout.SOUTH);
462                 _listPanel.add(j,BorderLayout.NORTH);
463                 _listPanel.add(listScroller,BorderLayout.CENTER);
464
465                 goPanel.add(_createButton, BorderLayout.CENTER);
466
467                 JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,_listPanel,vp);
468                 getContentPane().setLayout(new BorderLayout());
469                 getContentPane().add(split, BorderLayout.CENTER);
470                 getContentPane().add(_tools, BorderLayout.NORTH);
471
472                 setVisible(true);
473                 DropTarget dt = new DropTarget(vp, this);
474                 
475                 vp.addVARNAListener(this);
476         }
477         */
478         public static String generateDefaultName()
479         {
480                 return "User file #"+_nextID++;
481         }
482
483         public RNA getRNA() {
484                 return (RNA)_sideList.getSelectedValue();
485         }
486
487
488
489         public String[][] getParameterInfo() {
490                 String[][] info = {
491                                 // Parameter Name Kind of Value Description,
492                                 { "sequenceDBN", "String", "A raw RNA sequence" },
493                                 { "structureDBN", "String",
494                                                 "An RNA structure in dot bracket notation (DBN)" },
495                                 { errorOpt, "boolean", "To show errors" }, };
496                 return info;
497         }
498
499         public void init() {
500                 vp.setBackground(_backgroundColor);
501                 _error = true;
502         }
503
504         @SuppressWarnings("unused")
505         private Color getSafeColor(String col, Color def) {
506                 Color result;
507                 try {
508                         result = Color.decode(col);
509                 } catch (Exception e) {
510                         try {
511                                 result = Color.getColor(col, def);
512                         } catch (Exception e2) {
513                                 return def;
514                         }
515                 }
516                 return result;
517         }
518
519         public VARNAPanel get_varnaPanel() {
520                 return vp;
521         }
522
523         public void set_varnaPanel(VARNAPanel surface) {
524                 vp = surface;
525         }
526
527
528         public String get_seq() {
529                 return _seq.getText();
530         }
531
532         public void set_seq(String _seq) {
533                 this._seq.setText(_seq);
534         }
535         
536         public String get_str(){
537                 return _str.getText();
538         }
539         
540         public void set_str(String _str){
541                 this._str.setText(_str);
542         }
543
544         public JLabel get_info() {
545                 return _info;
546         }
547
548         public void set_info(JLabel _info) {
549                 this._info = _info;
550         }
551
552         /*public static void main(String[] args) {
553                 AppVarnaBinding d = new AppVarnaBinding();
554                 d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
555                 d.pack();
556                 d.setVisible(true);
557         }*/
558         
559
560         public void dragEnter(DropTargetDragEvent arg0) {
561                 // TODO Auto-generated method stub
562                 
563         }
564
565         public void dragExit(DropTargetEvent arg0) {
566                 // TODO Auto-generated method stub
567                 
568         }
569
570         public void dragOver(DropTargetDragEvent arg0) {
571                 // TODO Auto-generated method stub
572                 
573         }
574
575         public void drop(DropTargetDropEvent dtde) {
576             try {
577                 Transferable tr = dtde.getTransferable();
578                 DataFlavor[] flavors = tr.getTransferDataFlavors();
579                 for (int i = 0; i < flavors.length; i++) {
580             if (flavors[i].isFlavorJavaFileListType()) {
581               dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
582               Object ob = tr.getTransferData(flavors[i]);
583               if (ob instanceof List)
584               {
585                   List list = (List) ob;
586                   for (int j = 0; j < list.size(); j++) {
587                   Object o = list.get(j);
588                   
589                   if (dtde.getSource() instanceof DropTarget)
590                   {
591                           DropTarget dt = (DropTarget) dtde.getSource();
592                           Component c = dt.getComponent();
593                           if (c instanceof VARNAPanel)
594                           {
595                                           String path = o.toString();
596                                   VARNAPanel vp = (VARNAPanel) c;
597                                           try{
598                                   FullBackup bck =  VARNAPanel.importSession(path);
599                                   _rnaList.add(bck.config, bck.rna,bck.name,true);
600                                           }
601                                           catch (ExceptionLoadingFailed e3)
602                                           {
603                                                   RNA r = new RNA();
604                                                   r.loadSecStr(path);
605                                                   r.drawRNA(vp.getConfig());
606                                                   String name =r.getName();
607                                                   if (name.equals(""))
608                                                   { 
609                                                           name = path.substring(path.lastIndexOf(File.separatorChar)+1);
610                                                   }
611                                                   _rnaList.add(vp.getConfig().clone(),r,name,true);
612                                           }                                       
613                           }
614                   }
615                   }
616               }
617               // If we made it this far, everything worked.
618               dtde.dropComplete(true);
619               return;
620             }
621                 }
622                 // Hmm, the user must not have dropped a file list
623                 dtde.rejectDrop();
624               } catch (Exception e) {
625                 e.printStackTrace();
626                 dtde.rejectDrop();
627               }
628                 
629         }
630
631         public void dropActionChanged(DropTargetDragEvent arg0) {
632         }
633
634         private class BackupHolder{
635                 private DefaultListModel _rnaList;
636                 private ArrayList<RNA> _rnas = new ArrayList<RNA>();
637                 JList _l;
638                 
639                 public BackupHolder(DefaultListModel rnaList, JList l)
640                 {
641                         _rnaList = rnaList;
642                         _l = l;
643                 }
644                 
645                 public void add(VARNAConfig c, RNA r)
646                 {
647                         add(c, r, r.getName(),false);
648                 }
649
650                 public void add(VARNAConfig c, RNA r,boolean select)
651                 {
652                         add(c, r, r.getName(),select);
653                 }
654
655                 public void add(VARNAConfig c, RNA r, String name)
656                 {
657                         add(c, r, name,false);                  
658                 }
659                 public void add(VARNAConfig c, RNA r, String name, boolean select)
660                 {
661                         if (select){
662                                 _l.removeSelectionInterval(0, _rnaList.size());
663                         }
664                         if (name.equals(""))
665                         {
666                                 name = generateDefaultName();
667                         }
668                         FullBackup bck = new FullBackup(c,r,name);
669                         _rnas.add(0, r);
670                         _rnaList.add(0,bck);
671                         if (select){
672                           _l.setSelectedIndex(0);
673                         }
674                 }
675
676                 public void remove(int i)
677                 {
678                         _rnas.remove(i);
679                         _rnaList.remove(i);
680                         
681                 }
682                 public DefaultListModel getModel()
683                 {
684                         return _rnaList;
685                 }
686                 public boolean contains(RNA r)
687                 {
688                         return _rnas.contains(r);
689                 }
690                 /*public int getSize()
691                 {
692                         return _rnaList.getSize();
693                 }*/
694                 public FullBackup getElementAt(int i)
695                 {
696                         return (FullBackup) _rnaList.getElementAt(i);
697                 }
698                 
699                 public void removeSelected()
700                 {
701                         int i = _l.getSelectedIndex();
702                         if (i!=-1)
703                         {
704                           if (_rnaList.getSize()==1)
705                           {
706                                   RNA r = new RNA();
707                                   try {
708                                         r.setRNA(" ", ".");
709                                   } catch (ExceptionUnmatchedClosingParentheses e1) {
710                                   } catch (ExceptionFileFormatOrSyntax e1) {
711                                   }
712                                   vp.showRNA(r);
713                                   vp.repaint();
714                           }
715                           else
716                           {  
717                                  int newi = i+1;
718                                  if (newi==_rnaList.getSize())
719                                  {
720                                          newi = _rnaList.getSize()-2;
721                                  }
722                                  FullBackup bck = (FullBackup) _rnaList.getElementAt(newi);
723                                  _l.setSelectedValue(bck,true);
724                           }
725                           _rnaList.remove(i);
726                         }
727
728                 }
729         }
730
731         public void onLayoutChanged() {
732                 // TODO Auto-generated method stub
733                 
734         }
735
736         public void onUINewStructure(VARNAConfig v, RNA r) {
737                 _rnaList.add(v, r,"",true);
738         }
739
740         public void onWarningEmitted(String s) {
741                 // TODO Auto-generated method stub
742                 
743         }
744
745         public void mouseClicked(MouseEvent e) {
746                            if(e.getClickCount() == 2){
747                              int index = _sideList.locationToIndex(e.getPoint());
748                              ListModel dlm = _sideList.getModel();
749                              FullBackup item = (FullBackup) dlm.getElementAt(index);;
750                              _sideList.ensureIndexIsVisible(index);
751                              /*TODO Object newName = JOptionPane.showInputDialog(
752                                             this,
753                                             "Specify a new name for this RNA",
754                                             "Rename RNA", 
755                                             JOptionPane.QUESTION_MESSAGE,
756                                             (Icon)null,
757                                             null,
758                                             item.toString());
759                              if (newName!=null)
760                              {
761                                  item.name = newName.toString();
762                                  this._sideList.repaint();
763                              }*/
764                              }
765         }
766
767         public void mouseEntered(MouseEvent arg0) {
768                 // TODO Auto-generated method stub
769                 
770         }
771
772         public void mouseExited(MouseEvent arg0) {
773                 // TODO Auto-generated method stub
774                 
775         }
776
777         public void mousePressed(MouseEvent arg0) {
778                 // TODO Auto-generated method stub
779                 
780         }
781
782         public void mouseReleased(MouseEvent arg0) {
783                 // TODO Auto-generated method stub
784                 
785         }
786
787         @Override
788         public Color getColour(int atomIndex, int pdbResNum, String chain,
789                         String pdbId) {
790                 // TODO Auto-generated method stub
791                 return null;
792         }
793
794         @Override
795         public String[] getPdbFile() {
796                 // TODO Auto-generated method stub
797                 return null;
798         }
799
800         @Override
801         public void highlightAtom(int atomIndex, int pdbResNum, String chain,
802                         String pdbId) {
803                 // TODO Auto-generated method stub
804                 
805         }
806
807         @Override
808         public void mouseOverStructure(int atomIndex, String strInfo) {
809                 // TODO Auto-generated method stub
810                 
811         }
812
813         @Override
814         public void releaseReferences(Object svl) {
815                 // TODO Auto-generated method stub
816                 
817         }
818
819         @Override
820         public void updateColours(Object source) {
821                 // TODO Auto-generated method stub
822                 
823         }
824
825         @Override
826         public void componentHidden(ComponentEvent e) {
827                 // TODO Auto-generated method stub
828                 
829         }
830
831         @Override
832         public void componentMoved(ComponentEvent e) {
833                 // TODO Auto-generated method stub
834                 
835         }
836
837         @Override
838         public void componentResized(ComponentEvent e) {
839                 // TODO Auto-generated method stub
840                 
841         }
842
843         @Override
844         public void componentShown(ComponentEvent e) {
845                 // TODO Auto-generated method stub
846                 
847         }
848 }
849
850
851 /*
852         public static void main(String[] args)
853         {
854                 JTextField str = new JTextField("ATGC");
855                 
856                 AppVarnaBinding vab = new AppVarnaBinding();
857                 vab.varnagui.set_seq(str);
858                 vab.varnagui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
859                 vab.varnagui.pack();
860                 vab.varnagui.setVisible(true);  
861         }
862 }
863 */