2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.datamodel.SequenceI;
24 import jalview.ext.varna.JalviewVarnaBinding;
25 import jalview.structure.AtomSpec;
26 import jalview.util.MessageManager;
28 import java.awt.BorderLayout;
29 import java.awt.Color;
30 import java.awt.Component;
31 import java.awt.Dimension;
32 import java.awt.datatransfer.DataFlavor;
33 import java.awt.datatransfer.Transferable;
34 import java.awt.dnd.DnDConstants;
35 import java.awt.dnd.DropTarget;
36 import java.awt.dnd.DropTargetAdapter;
37 import java.awt.dnd.DropTargetDropEvent;
38 import java.awt.event.ComponentEvent;
39 import java.awt.event.MouseAdapter;
40 import java.awt.event.MouseEvent;
42 import java.io.IOException;
43 import java.util.ArrayList;
44 import java.util.Collection;
45 import java.util.List;
47 import javax.swing.DefaultListModel;
48 import javax.swing.DefaultListSelectionModel;
49 import javax.swing.JLabel;
50 import javax.swing.JList;
51 import javax.swing.JPanel;
52 import javax.swing.JScrollPane;
53 import javax.swing.ListModel;
54 import javax.swing.ListSelectionModel;
55 import javax.swing.event.ListSelectionEvent;
56 import javax.swing.event.ListSelectionListener;
58 import fr.orsay.lri.varna.VARNAPanel;
59 import fr.orsay.lri.varna.components.ReorderableJList;
60 import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed;
61 import fr.orsay.lri.varna.exceptions.ExceptionNAViewAlgorithm;
62 import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength;
63 import fr.orsay.lri.varna.models.FullBackup;
64 import fr.orsay.lri.varna.models.VARNAConfig;
65 import fr.orsay.lri.varna.models.rna.RNA;
67 public class AppVarnaBinding extends JalviewVarnaBinding
71 protected JPanel _listPanel = new JPanel();
73 private ReorderableJList _sideList = null;
75 private static String errorOpt = "error";
77 @SuppressWarnings("unused")
78 private boolean _error;
80 private Color _backgroundColor = Color.white;
82 private static int _nextID = 1;
84 @SuppressWarnings("unused")
85 private int _algoCode;
87 private BackupHolder _rnaList;
92 public AppVarnaBinding()
98 * Constructs the VARNAPanel and an (empty) selection list of structures to
103 DefaultListModel<FullBackup> dlm = new DefaultListModel<FullBackup>();
105 int marginTools = 40;
107 DefaultListSelectionModel m = new DefaultListSelectionModel();
108 m.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
109 m.setLeadAnchorNotificationEnabled(false);
111 _sideList = new ReorderableJList();
112 _sideList.setModel(dlm);
113 _sideList.addMouseListener(new MouseAdapter()
116 public void mouseClicked(MouseEvent e) {
117 AppVarnaBinding.this.mouseClicked(e);
120 _sideList.setSelectionModel(m);
121 _sideList.setPreferredSize(new Dimension(100, 0));
122 _sideList.addListSelectionListener(new ListSelectionListener()
124 public void valueChanged(ListSelectionEvent evt)
126 changeSelectedStructure_actionPerformed(evt);
129 _rnaList = new BackupHolder(dlm, _sideList);
133 vp = new VARNAPanel("0", ".");
134 } catch (ExceptionNonEqualLength e)
138 vp.setPreferredSize(new Dimension(400, 400));
140 JScrollPane listScroller = new JScrollPane(_sideList);
141 listScroller.setPreferredSize(new Dimension(150, 0));
143 vp.setBackground(_backgroundColor);
145 JLabel j = new JLabel(
146 MessageManager.getString("label.structures_manager"),
148 _listPanel.setLayout(new BorderLayout());
150 _listPanel.add(j, BorderLayout.NORTH);
151 _listPanel.add(listScroller, BorderLayout.CENTER);
153 new DropTarget(vp, new DropTargetAdapter() {
155 public void drop(DropTargetDropEvent dtde)
157 AppVarnaBinding.this.drop(dtde);
162 public JPanel getListPanel()
168 * Returns the currently selected RNA, or null if none selected
172 public RNA getSelectedRNA()
174 int selectedIndex = _sideList.getSelectedIndex();
175 if (selectedIndex < 0)
179 FullBackup selected = _rnaList.getElementAt(selectedIndex);
184 * Substitute currently selected RNA with the edited one
188 public void updateSelectedRNA(RNA rnaEdit)
194 public static String generateDefaultName()
196 return "User file #" + _nextID++;
199 public String[][] getParameterInfo()
203 // Parameter Name Kind of Value Description,
204 { "sequenceDBN", "String", "A raw RNA sequence" },
205 { "structureDBN", "String",
206 "An RNA structure in dot bracket notation (DBN)" },
207 { errorOpt, "boolean", "To show errors" }, };
211 @SuppressWarnings("unused")
212 private Color getSafeColor(String col, Color def)
217 result = Color.decode(col);
218 } catch (Exception e)
222 result = Color.getColor(col, def);
223 } catch (Exception e2)
231 public VARNAPanel get_varnaPanel()
236 public void set_varnaPanel(VARNAPanel surface)
241 public void drop(DropTargetDropEvent dtde)
245 Transferable tr = dtde.getTransferable();
246 DataFlavor[] flavors = tr.getTransferDataFlavors();
247 for (int i = 0; i < flavors.length; i++)
249 if (flavors[i].isFlavorJavaFileListType())
251 dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
252 Object ob = tr.getTransferData(flavors[i]);
253 if (ob instanceof List)
255 List list = (List) ob;
256 for (int j = 0; j < list.size(); j++)
258 Object o = list.get(j);
260 if (dtde.getSource() instanceof DropTarget)
262 DropTarget dt = (DropTarget) dtde.getSource();
263 Component c = dt.getComponent();
264 if (c instanceof VARNAPanel)
266 String path = o.toString();
267 VARNAPanel varnaPanel = (VARNAPanel) c;
270 FullBackup bck = VARNAPanel.importSession(path);
271 _rnaList.add(bck.config, bck.rna, bck.name, true);
272 } catch (ExceptionLoadingFailed e3)
275 Collection<RNA> mdls = fr.orsay.lri.varna.factories.RNAFactory
279 r.drawRNA(varnaPanel.getConfig());
280 String name = r.getName();
283 name = path.substring(path
284 .lastIndexOf(File.separatorChar) + 1);
288 name += " (Model " + mn++ + ")";
290 _rnaList.add(varnaPanel.getConfig().clone(), r, name, true);
297 // If we made it this far, everything worked.
298 dtde.dropComplete(true);
302 // Hmm, the user must not have dropped a file list
304 } catch (Exception e)
312 private class BackupHolder
314 private DefaultListModel<FullBackup> _rnalist;
316 private List<RNA> _rnas = new ArrayList<RNA>();
320 public BackupHolder(DefaultListModel<FullBackup> rnaList, JList l)
326 public void add(VARNAConfig c, RNA r, String name)
328 add(c, r, name, false);
332 * Adds an entry to the end of the selection list and (optionally) sets it
340 public void add(VARNAConfig c, RNA r, String name, boolean select)
344 _l.removeSelectionInterval(0, _rnalist.size());
348 name = generateDefaultName();
350 FullBackup bck = new FullBackup(c, r, name);
352 _rnalist.addElement(bck);
355 _l.setSelectedIndex(0);
359 public FullBackup getElementAt(int i)
361 return _rnalist.getElementAt(i);
365 public void mouseClicked(MouseEvent e)
367 if (e.getClickCount() == 2)
369 int index = _sideList.locationToIndex(e.getPoint());
370 ListModel<FullBackup> dlm = _sideList.getModel();
371 // FullBackup item = dlm.getElementAt(index);
373 _sideList.ensureIndexIsVisible(index);
375 * TODO Object newName = JOptionPane.showInputDialog( this,
376 * "Specify a new name for this RNA", "Rename RNA",
377 * JOptionPane.QUESTION_MESSAGE, (Icon)null, null, item.toString()); if
378 * (newName!=null) { item.name = newName.toString();
379 * this._sideList.repaint(); }
385 public String[] getPdbFile()
391 public void releaseReferences(Object svl)
396 public void updateColours(Object source)
401 public void componentHidden(ComponentEvent e)
406 public void componentMoved(ComponentEvent e)
411 public void componentResized(ComponentEvent e)
416 public void componentShown(ComponentEvent e)
421 public void highlightAtoms(List<AtomSpec> atoms)
426 public boolean isListeningFor(SequenceI seq)
432 * Returns the path to a temporary file containing a representation of the
433 * state of the Varna display, or null on any error
440 public String getStateInfo(RNA rna)
448 * we have to show the RNA we want to save in the viewer; get the currently
449 * displayed model first so we can restore it
451 FullBackup sel = (FullBackup) _sideList.getSelectedValue();
453 FullBackup model = null;
454 ListModel models = _sideList.getModel();
455 for (int i = 0; i < models.getSize(); i++)
457 model = (FullBackup) models.getElementAt(i);
458 if (model.rna == rna)
471 vp.showRNA(model.rna, model.config);
476 temp = File.createTempFile("varna", null);
478 String filePath = temp.getAbsolutePath();
482 * restore the previous display
484 vp.showRNA(sel.rna, sel.config);
487 } catch (IOException e)
493 public int getSelectedIndex()
495 return _sideList.getSelectedIndex();
499 * Switch the Varna display to the structure selected in the left hand panel
503 protected void changeSelectedStructure_actionPerformed(ListSelectionEvent evt)
505 if (!evt.getValueIsAdjusting())
507 showSelectedStructure();
514 protected void showSelectedStructure()
516 FullBackup sel = (FullBackup) _sideList.getSelectedValue();
519 vp.showRNA(sel.rna, sel.config);
524 * Set and display the selected item in the list of structures
528 public void setSelectedIndex(final int selectedRna)
531 * note this does nothing if, say, selecting item 3 when only 1 has been
534 _sideList.setSelectedIndex(selectedRna);
535 // TODO ? need a worker thread to get this to happen properly
539 * Add an RNA structure to the selection list
543 public void addStructure(RNA rna)
545 VARNAConfig config = vp.getConfig().clone();
546 addStructure(rna, config);
553 protected void addStructure(final RNA rna, final VARNAConfig config)
555 drawRna(rna, config);
556 _rnaList.add(config, rna, rna.getName());
563 protected void drawRna(final RNA rna, final VARNAConfig config)
567 rna.drawRNA(rna.getDrawMode(), config);
568 } catch (ExceptionNAViewAlgorithm e)
570 // only throwable for draw mode = 3 NAView
571 System.err.println("Error drawing RNA: " + e.getMessage());