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