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