JAL-842; Added the TextField to edit structure in VARNA
[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                                 /*try {
265                                 RNA nRNA = new RNA(generateDefaultName());
266                                 nRNA.setRNA(_seq.getText(), _str.getText());
267                                 nRNA.drawRNARadiate(vp.getConfig());
268                                 _rnaList.add(new VARNAConfig(),nRNA,true);
269                                 } catch (ExceptionUnmatchedClosingParentheses e1) {
270                                         JOptionPane.showMessageDialog(vp, e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);
271                                 } catch (ExceptionFileFormatOrSyntax e1) {
272                                         JOptionPane.showMessageDialog(vp, e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);
273                                 }*/
274                         }
275                 });
276                 
277                 //_seqPanel.setLayout(new BorderLayout());
278                 //_seqPanel.add(_seqLabel, BorderLayout.WEST);
279                 //_seqPanel.add(_seq, BorderLayout.CENTER);
280
281                 _strLabel.setPreferredSize(new Dimension(marginTools, 15));
282                 _strLabel.setHorizontalTextPosition(JLabel.LEFT);
283                 _str.setFont(textFieldsFont);
284                 _strPanel.setLayout(new BorderLayout());
285                 _strPanel.add(_strLabel, BorderLayout.WEST);
286                 _strPanel.add(_str, BorderLayout.CENTER);
287
288                 _input.setLayout(new GridLayout(1, 0));
289                 //_input.add(_seqPanel);
290                 _input.add(_strPanel);
291
292                 JPanel goPanel = new JPanel();
293                 goPanel.setLayout(new BorderLayout());
294
295                 _tools.setLayout(new BorderLayout());
296                 _tools.add(_input, BorderLayout.CENTER);
297                 //_tools.add(_info, BorderLayout.SOUTH);
298                 _tools.add(goPanel, BorderLayout.EAST);
299
300                 /*_deleteButton.addActionListener(new ActionListener() {
301                         public void actionPerformed(ActionEvent e) {
302                                 _rnaList.removeSelected();
303                         }
304                 });
305                 _duplicateButton.addActionListener(new ActionListener() {
306                         public void actionPerformed(ActionEvent e) {
307                                         _rnaList.add((VARNAConfig)vp.getConfig().clone(),vp.getRNA().clone(),vp.getRNA().getName()+"-"+DateFormat.getTimeInstance(DateFormat.LONG).format(new Date()),true); 
308                         }});
309                 */
310                 goPanel.add(_updateButton, BorderLayout.CENTER);
311                 
312                 
313                 JPanel ops = new JPanel();
314                 ops.setLayout(new GridLayout(1,2));
315                 ops.add(_deleteButton);
316                 ops.add(_duplicateButton);
317                 
318                 JLabel j = new JLabel("Structures Manager",JLabel.CENTER);
319                 _listPanel.setLayout(new BorderLayout());
320                 
321                 _listPanel.add(ops,BorderLayout.SOUTH);
322                 _listPanel.add(j,BorderLayout.NORTH);
323                 _listPanel.add(listScroller,BorderLayout.CENTER);
324                 
325                 
326                 
327                 //JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,_listPanel,vp);
328                 /**TODO
329                 getContentPane().setLayout(new BorderLayout());
330                 getContentPane().add(split, BorderLayout.CENTER);
331                 getContentPane().add(_tools, BorderLayout.NORTH);
332                  */
333
334                 //TODO setVisible(true);
335                 DropTarget dt = new DropTarget(vp, this);
336                 
337                 vp.addVARNAListener(this);
338         }
339         
340         public JPanel getTools(){
341                 return _tools;
342         }
343         
344         public JPanel getListPanel(){
345                 return _listPanel;
346         }
347
348         /*
349         private void RNAPanelDemoInit() 
350         {
351             DefaultListModel dlm = new DefaultListModel(); 
352             
353
354                 int marginTools = 40;
355
356             DefaultListSelectionModel m = new DefaultListSelectionModel();
357             m.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
358             m.setLeadAnchorNotificationEnabled(false);
359             
360             
361                 _sideList = new ReorderableJList();
362                 _sideList.setModel(dlm);
363                 _sideList.addMouseListener(this);
364             _sideList.setSelectionModel(m);
365             _sideList.setPreferredSize(new Dimension(100, 0));
366             _sideList.addListSelectionListener( new ListSelectionListener(){
367                         public void valueChanged(ListSelectionEvent arg0) {
368                                 //System.out.println(arg0);
369                                 if (!_sideList.isSelectionEmpty() && !arg0.getValueIsAdjusting())
370                                 {
371                                         FullBackup  sel = (FullBackup) _sideList.getSelectedValue();
372                                         Mapping map = Mapping.DefaultOutermostMapping(vp.getRNA().getSize(), sel.rna.getSize());
373                                         vp.showRNAInterpolated(sel.rna,sel.config,map);
374                                         _seq.setText(sel.rna.getSeq());
375                                         _str.setText(sel.rna.getStructDBN());
376                                 }
377                         }
378             });
379
380             _rnaList = new BackupHolder(dlm,_sideList);
381                 RNA _RNA1 = new RNA("User defined 1");
382                 RNA _RNA2 = new RNA("User defined 2");
383                 try {
384                         vp = new VARNAPanel("0",".");
385                         _RNA1.setRNA(DEFAULT_SEQUENCE, DEFAULT_STRUCTURE1);
386                         _RNA1.drawRNARadiate(vp.getConfig());
387                         _RNA2.setRNA(DEFAULT_SEQUENCE, DEFAULT_STRUCTURE2);
388                         _RNA2.drawRNARadiate(vp.getConfig());
389                 } catch (ExceptionNonEqualLength e) {
390                         vp.errorDialog(e);
391                 } catch (ExceptionUnmatchedClosingParentheses e2) {
392                 e2.printStackTrace();
393                 } catch (ExceptionFileFormatOrSyntax e3) {
394                 e3.printStackTrace();
395                 }
396                 vp.setPreferredSize(new Dimension(400, 400));
397             _rnaList.add(vp.getConfig().clone(),_RNA2,generateDefaultName());
398             _rnaList.add(vp.getConfig().clone(),_RNA1,generateDefaultName(),true);
399
400             JScrollPane listScroller = new JScrollPane(_sideList);
401             listScroller.setPreferredSize(new Dimension(150, 0));
402
403                 setBackground(_backgroundColor);
404                 vp.setBackground(_backgroundColor);
405
406
407                 Font textFieldsFont = Font.decode("MonoSpaced-PLAIN-12");
408
409                 _seqLabel.setHorizontalTextPosition(JLabel.LEFT);
410                 _seqLabel.setPreferredSize(new Dimension(marginTools, 15));
411                 _seq.setFont(textFieldsFont);
412                 _seq.setText(DEFAULT_SEQUENCE);
413
414                 _createButton.addActionListener(new ActionListener() {
415                         public void actionPerformed(ActionEvent e) {
416                                 try {
417                                 RNA nRNA = new RNA(generateDefaultName());
418                                 nRNA.setRNA(_seq.getText(), _str.getText());
419                                 nRNA.drawRNARadiate(vp.getConfig());
420                                 _rnaList.add(new VARNAConfig(),nRNA,true);
421                                 } catch (ExceptionUnmatchedClosingParentheses e1) {
422                                         JOptionPane.showMessageDialog(vp, e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);
423                                 } catch (ExceptionFileFormatOrSyntax e1) {
424                                         JOptionPane.showMessageDialog(vp, e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);
425                                 }
426                         }
427                 });
428
429
430                 _seqPanel.setLayout(new BorderLayout());
431                 _seqPanel.add(_seqLabel, BorderLayout.WEST);
432                 _seqPanel.add(_seq, BorderLayout.CENTER);
433
434                 _strLabel.setPreferredSize(new Dimension(marginTools, 15));
435                 _strLabel.setHorizontalTextPosition(JLabel.LEFT);
436                 _str.setFont(textFieldsFont);
437                 _strPanel.setLayout(new BorderLayout());
438                 _strPanel.add(_strLabel, BorderLayout.WEST);
439                 _strPanel.add(_str, BorderLayout.CENTER);
440
441                 _input.setLayout(new GridLayout(2, 0));
442                 _input.add(_seqPanel);
443                 _input.add(_strPanel);
444
445                 JPanel goPanel = new JPanel();
446                 goPanel.setLayout(new BorderLayout());
447
448                 _tools.setLayout(new BorderLayout());
449                 _tools.add(_input, BorderLayout.CENTER);
450                 _tools.add(_info, BorderLayout.SOUTH);
451                 _tools.add(goPanel, BorderLayout.EAST);
452
453                 _deleteButton.addActionListener(new ActionListener() {
454                         public void actionPerformed(ActionEvent e) {
455                                 _rnaList.removeSelected();
456                         }
457                 });
458                 _duplicateButton.addActionListener(new ActionListener() {
459                         public void actionPerformed(ActionEvent e) {
460                                         _rnaList.add((VARNAConfig)vp.getConfig().clone(),vp.getRNA().clone(),vp.getRNA().getName()+"-"+DateFormat.getTimeInstance(DateFormat.LONG).format(new Date()),true); 
461                         }});
462                 
463                 JPanel ops = new JPanel();
464                 ops.setLayout(new GridLayout(1,2));
465                 ops.add(_deleteButton);
466                 ops.add(_duplicateButton);
467
468                 JLabel j = new JLabel("Structures Manager",JLabel.CENTER);
469                 _listPanel.setLayout(new BorderLayout());
470                 
471                 _listPanel.add(ops,BorderLayout.SOUTH);
472                 _listPanel.add(j,BorderLayout.NORTH);
473                 _listPanel.add(listScroller,BorderLayout.CENTER);
474
475                 goPanel.add(_createButton, BorderLayout.CENTER);
476
477                 JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,_listPanel,vp);
478                 getContentPane().setLayout(new BorderLayout());
479                 getContentPane().add(split, BorderLayout.CENTER);
480                 getContentPane().add(_tools, BorderLayout.NORTH);
481
482                 setVisible(true);
483                 DropTarget dt = new DropTarget(vp, this);
484                 
485                 vp.addVARNAListener(this);
486         }
487         */
488         public static String generateDefaultName()
489         {
490                 return "User file #"+_nextID++;
491         }
492
493         public RNA getRNA() {
494                 return (RNA)_sideList.getSelectedValue();
495         }
496
497
498
499         public String[][] getParameterInfo() {
500                 String[][] info = {
501                                 // Parameter Name Kind of Value Description,
502                                 { "sequenceDBN", "String", "A raw RNA sequence" },
503                                 { "structureDBN", "String",
504                                                 "An RNA structure in dot bracket notation (DBN)" },
505                                 { errorOpt, "boolean", "To show errors" }, };
506                 return info;
507         }
508
509         public void init() {
510                 vp.setBackground(_backgroundColor);
511                 _error = true;
512         }
513
514         @SuppressWarnings("unused")
515         private Color getSafeColor(String col, Color def) {
516                 Color result;
517                 try {
518                         result = Color.decode(col);
519                 } catch (Exception e) {
520                         try {
521                                 result = Color.getColor(col, def);
522                         } catch (Exception e2) {
523                                 return def;
524                         }
525                 }
526                 return result;
527         }
528
529         public VARNAPanel get_varnaPanel() {
530                 return vp;
531         }
532
533         public void set_varnaPanel(VARNAPanel surface) {
534                 vp = surface;
535         }
536
537
538         public String get_seq() {
539                 return _seq.getText();
540         }
541
542         public void set_seq(String _seq) {
543                 this._seq.setText(_seq);
544         }
545         
546         public String get_str(){
547                 return _str.getText();
548         }
549         
550         public void set_str(String _str){
551                 this._str.setText(_str);
552         }
553
554         public JLabel get_info() {
555                 return _info;
556         }
557
558         public void set_info(JLabel _info) {
559                 this._info = _info;
560         }
561
562         /*public static void main(String[] args) {
563                 AppVarnaBinding d = new AppVarnaBinding();
564                 d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
565                 d.pack();
566                 d.setVisible(true);
567         }*/
568         
569
570         public void dragEnter(DropTargetDragEvent arg0) {
571                 // TODO Auto-generated method stub
572                 
573         }
574
575         public void dragExit(DropTargetEvent arg0) {
576                 // TODO Auto-generated method stub
577                 
578         }
579
580         public void dragOver(DropTargetDragEvent arg0) {
581                 // TODO Auto-generated method stub
582                 
583         }
584
585         public void drop(DropTargetDropEvent dtde) {
586             try {
587                 Transferable tr = dtde.getTransferable();
588                 DataFlavor[] flavors = tr.getTransferDataFlavors();
589                 for (int i = 0; i < flavors.length; i++) {
590             if (flavors[i].isFlavorJavaFileListType()) {
591               dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
592               Object ob = tr.getTransferData(flavors[i]);
593               if (ob instanceof List)
594               {
595                   List list = (List) ob;
596                   for (int j = 0; j < list.size(); j++) {
597                   Object o = list.get(j);
598                   
599                   if (dtde.getSource() instanceof DropTarget)
600                   {
601                           DropTarget dt = (DropTarget) dtde.getSource();
602                           Component c = dt.getComponent();
603                           if (c instanceof VARNAPanel)
604                           {
605                                           String path = o.toString();
606                                   VARNAPanel vp = (VARNAPanel) c;
607                                           try{
608                                   FullBackup bck =  VARNAPanel.importSession(path);
609                                   _rnaList.add(bck.config, bck.rna,bck.name,true);
610                                           }
611                                           catch (ExceptionLoadingFailed e3)
612                                           {
613                                                   RNA r = new RNA();
614                                                   r.loadSecStr(path);
615                                                   r.drawRNA(vp.getConfig());
616                                                   String name =r.getName();
617                                                   if (name.equals(""))
618                                                   { 
619                                                           name = path.substring(path.lastIndexOf(File.separatorChar)+1);
620                                                   }
621                                                   _rnaList.add(vp.getConfig().clone(),r,name,true);
622                                           }                                       
623                           }
624                   }
625                   }
626               }
627               // If we made it this far, everything worked.
628               dtde.dropComplete(true);
629               return;
630             }
631                 }
632                 // Hmm, the user must not have dropped a file list
633                 dtde.rejectDrop();
634               } catch (Exception e) {
635                 e.printStackTrace();
636                 dtde.rejectDrop();
637               }
638                 
639         }
640
641         public void dropActionChanged(DropTargetDragEvent arg0) {
642         }
643
644         private class BackupHolder{
645                 private DefaultListModel _rnaList;
646                 private ArrayList<RNA> _rnas = new ArrayList<RNA>();
647                 JList _l;
648                 
649                 public BackupHolder(DefaultListModel rnaList, JList l)
650                 {
651                         _rnaList = rnaList;
652                         _l = l;
653                 }
654                 
655                 public void add(VARNAConfig c, RNA r)
656                 {
657                         add(c, r, r.getName(),false);
658                 }
659
660                 public void add(VARNAConfig c, RNA r,boolean select)
661                 {
662                         add(c, r, r.getName(),select);
663                 }
664
665                 public void add(VARNAConfig c, RNA r, String name)
666                 {
667                         add(c, r, name,false);                  
668                 }
669                 public void add(VARNAConfig c, RNA r, String name, boolean select)
670                 {
671                         if (select){
672                                 _l.removeSelectionInterval(0, _rnaList.size());
673                         }
674                         if (name.equals(""))
675                         {
676                                 name = generateDefaultName();
677                         }
678                         FullBackup bck = new FullBackup(c,r,name);
679                         _rnas.add(0, r);
680                         _rnaList.add(0,bck);
681                         if (select){
682                           _l.setSelectedIndex(0);
683                         }
684                 }
685
686                 public void remove(int i)
687                 {
688                         _rnas.remove(i);
689                         _rnaList.remove(i);
690                         
691                 }
692                 public DefaultListModel getModel()
693                 {
694                         return _rnaList;
695                 }
696                 public boolean contains(RNA r)
697                 {
698                         return _rnas.contains(r);
699                 }
700                 /*public int getSize()
701                 {
702                         return _rnaList.getSize();
703                 }*/
704                 public FullBackup getElementAt(int i)
705                 {
706                         return (FullBackup) _rnaList.getElementAt(i);
707                 }
708                 
709                 public void removeSelected()
710                 {
711                         int i = _l.getSelectedIndex();
712                         if (i!=-1)
713                         {
714                           if (_rnaList.getSize()==1)
715                           {
716                                   RNA r = new RNA();
717                                   try {
718                                         r.setRNA(" ", ".");
719                                   } catch (ExceptionUnmatchedClosingParentheses e1) {
720                                   } catch (ExceptionFileFormatOrSyntax e1) {
721                                   }
722                                   vp.showRNA(r);
723                                   vp.repaint();
724                           }
725                           else
726                           {  
727                                  int newi = i+1;
728                                  if (newi==_rnaList.getSize())
729                                  {
730                                          newi = _rnaList.getSize()-2;
731                                  }
732                                  FullBackup bck = (FullBackup) _rnaList.getElementAt(newi);
733                                  _l.setSelectedValue(bck,true);
734                           }
735                           _rnaList.remove(i);
736                         }
737
738                 }
739         }
740
741         public void onLayoutChanged() {
742                 // TODO Auto-generated method stub
743                 
744         }
745
746         public void onUINewStructure(VARNAConfig v, RNA r) {
747                 _rnaList.add(v, r,"",true);
748         }
749
750         public void onWarningEmitted(String s) {
751                 // TODO Auto-generated method stub
752                 
753         }
754
755         public void mouseClicked(MouseEvent e) {
756                            if(e.getClickCount() == 2){
757                              int index = _sideList.locationToIndex(e.getPoint());
758                              ListModel dlm = _sideList.getModel();
759                              FullBackup item = (FullBackup) dlm.getElementAt(index);;
760                              _sideList.ensureIndexIsVisible(index);
761                              /*TODO Object newName = JOptionPane.showInputDialog(
762                                             this,
763                                             "Specify a new name for this RNA",
764                                             "Rename RNA", 
765                                             JOptionPane.QUESTION_MESSAGE,
766                                             (Icon)null,
767                                             null,
768                                             item.toString());
769                              if (newName!=null)
770                              {
771                                  item.name = newName.toString();
772                                  this._sideList.repaint();
773                              }*/
774                              }
775         }
776
777         public void mouseEntered(MouseEvent arg0) {
778                 // TODO Auto-generated method stub
779                 
780         }
781
782         public void mouseExited(MouseEvent arg0) {
783                 // TODO Auto-generated method stub
784                 
785         }
786
787         public void mousePressed(MouseEvent arg0) {
788                 // TODO Auto-generated method stub
789                 
790         }
791
792         public void mouseReleased(MouseEvent arg0) {
793                 // TODO Auto-generated method stub
794                 
795         }
796
797         @Override
798         public Color getColour(int atomIndex, int pdbResNum, String chain,
799                         String pdbId) {
800                 // TODO Auto-generated method stub
801                 return null;
802         }
803
804         @Override
805         public String[] getPdbFile() {
806                 // TODO Auto-generated method stub
807                 return null;
808         }
809
810         @Override
811         public void highlightAtom(int atomIndex, int pdbResNum, String chain,
812                         String pdbId) {
813                 // TODO Auto-generated method stub
814                 
815         }
816
817         @Override
818         public void mouseOverStructure(int atomIndex, String strInfo) {
819                 // TODO Auto-generated method stub
820                 
821         }
822
823         @Override
824         public void releaseReferences(Object svl) {
825                 // TODO Auto-generated method stub
826                 
827         }
828
829         @Override
830         public void updateColours(Object source) {
831                 // TODO Auto-generated method stub
832                 
833         }
834
835         @Override
836         public void componentHidden(ComponentEvent e) {
837                 // TODO Auto-generated method stub
838                 
839         }
840
841         @Override
842         public void componentMoved(ComponentEvent e) {
843                 // TODO Auto-generated method stub
844                 
845         }
846
847         @Override
848         public void componentResized(ComponentEvent e) {
849                 // TODO Auto-generated method stub
850                 
851         }
852
853         @Override
854         public void componentShown(ComponentEvent e) {
855                 // TODO Auto-generated method stub
856                 
857         }
858 }
859
860
861 /*
862         public static void main(String[] args)
863         {
864                 JTextField str = new JTextField("ATGC");
865                 
866                 AppVarnaBinding vab = new AppVarnaBinding();
867                 vab.varnagui.set_seq(str);
868                 vab.varnagui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
869                 vab.varnagui.pack();
870                 vab.varnagui.setVisible(true);  
871         }
872 }
873 */