1 package fr.orsay.lri.varna.applications.templateEditor;
2 import java.awt.BorderLayout;
4 import java.awt.Component;
5 import java.awt.ComponentOrientation;
6 import java.awt.Dimension;
7 import java.awt.FlowLayout;
8 import java.awt.GridLayout;
9 import java.awt.datatransfer.DataFlavor;
10 import java.awt.datatransfer.Transferable;
11 import java.awt.dnd.DnDConstants;
12 import java.awt.dnd.DropTarget;
13 import java.awt.dnd.DropTargetDragEvent;
14 import java.awt.dnd.DropTargetDropEvent;
15 import java.awt.dnd.DropTargetEvent;
16 import java.awt.dnd.DropTargetListener;
17 import java.awt.event.ActionEvent;
18 import java.awt.event.ActionListener;
19 import java.awt.event.KeyEvent;
20 import java.awt.event.KeyListener;
21 import java.io.BufferedReader;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.io.InputStreamReader;
26 import java.io.Reader;
27 import java.net.MalformedURLException;
29 import java.net.URLConnection;
30 import java.util.ArrayList;
31 import java.util.List;
33 import javax.swing.BoxLayout;
34 import javax.swing.ButtonGroup;
35 import javax.swing.Icon;
36 import javax.swing.JButton;
37 import javax.swing.JComboBox;
38 import javax.swing.JDialog;
39 import javax.swing.JFileChooser;
40 import javax.swing.JFrame;
41 import javax.swing.JLabel;
42 import javax.swing.JList;
43 import javax.swing.JOptionPane;
44 import javax.swing.JPanel;
45 import javax.swing.JRadioButton;
46 import javax.swing.JScrollPane;
47 import javax.swing.JToggleButton;
48 import javax.swing.JToolBar;
49 import javax.swing.UIManager;
50 import javax.swing.UIManager.LookAndFeelInfo;
51 import javax.swing.filechooser.FileFilter;
52 import javax.swing.undo.UndoManager;
54 import fr.orsay.lri.varna.VARNAPanel;
55 import fr.orsay.lri.varna.applications.FileNameExtensionFilter;
56 import fr.orsay.lri.varna.exceptions.ExceptionInvalidRNATemplate;
57 import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength;
58 import fr.orsay.lri.varna.exceptions.ExceptionXMLGeneration;
59 import fr.orsay.lri.varna.models.templates.Benchmark;
60 import fr.orsay.lri.varna.models.templates.DrawRNATemplateCurveMethod;
61 import fr.orsay.lri.varna.models.templates.DrawRNATemplateMethod;
62 import fr.orsay.lri.varna.models.templates.RNATemplate;
63 import fr.orsay.lri.varna.models.templates.RNATemplateDrawingAlgorithmException;
64 import fr.orsay.lri.varna.models.templates.RNATemplateMapping;
65 import fr.orsay.lri.varna.models.templates.RNATemplate.RNATemplateElement;
70 public class TemplateEditor extends JFrame implements KeyListener, ActionListener,DropTargetListener {
72 private TemplatePanel _sk;
73 private VARNAPanel _vp;
74 private File currentFilePath = null;
75 private JButton saveButton;
76 private JScrollPane jp;
77 private UndoManager manager;
78 private JButton flipButton;
79 private JComboBox ellipseMethodList;
80 private JComboBox applyMethodList;
81 /*private JRadioButton ellipseButtons[];
82 private JRadioButton methodButtons[];
86 public TemplateEditor()
89 clearCurrentFilePath();
92 public JScrollPane getJp() {
99 _vp = new VARNAPanel(" ",".");
100 } catch (ExceptionNonEqualLength e) {
104 JPanel p = new JPanel();
105 p.setLayout(new GridLayout(1,2));
107 JToolBar systemBar = new JToolBar();
108 JToolBar optionsBar = new JToolBar();
109 JButton newButton = new JButton("New",UIManager.getIcon("FileView.fileIcon"));
110 newButton.setActionCommand("new");
111 newButton.addActionListener(this);
112 newButton.addKeyListener(this);
113 JButton loadButton = new JButton("Open...",UIManager.getIcon("FileView.directoryIcon"));
114 loadButton.setActionCommand("open");
115 loadButton.addActionListener(this);
116 loadButton.addKeyListener(this);
117 saveButton = new JButton("Save",UIManager.getIcon("FileView.floppyDriveIcon"));
118 saveButton.setActionCommand("save");
119 saveButton.addActionListener(this);
120 saveButton.addKeyListener(this);
121 saveButton.setEnabled(false);
122 JButton saveAsButton = new JButton("Save As...",UIManager.getIcon("FileView.floppyDriveIcon"));
123 saveAsButton.setActionCommand("save as");
124 saveAsButton.addActionListener(this);
125 saveAsButton.addKeyListener(this);
126 JButton undoButton = new JButton("Undo");
127 undoButton.setActionCommand("undo");
128 undoButton.addActionListener(this);
129 undoButton.addKeyListener(this);
130 JButton redoButton = new JButton("Redo");
131 redoButton.setActionCommand("redo");
132 redoButton.addActionListener(this);
133 redoButton.addKeyListener(this);
135 JButton benchmarkButton = new JButton("Benchmark");
136 benchmarkButton.setActionCommand("benchmark");
137 benchmarkButton.addActionListener(this);
138 benchmarkButton.addKeyListener(this);
140 DrawRNATemplateMethod applyMethods[] = DrawRNATemplateMethod.values();
141 applyMethodList = new JComboBox(applyMethods);
142 applyMethodList.setSelectedItem(DrawRNATemplateMethod.getDefault());
144 DrawRNATemplateCurveMethod ellipseMethods[] = DrawRNATemplateCurveMethod.values();
145 ellipseMethodList = new JComboBox(ellipseMethods);
146 ellipseMethodList.setSelectedItem(DrawRNATemplateCurveMethod.getDefault());
148 JButton applyButton = new JButton("Apply");
149 applyButton.setActionCommand("apply");
150 applyButton.addActionListener(this);
151 applyButton.addKeyListener(this);
153 JButton retrieveButton = new JButton("Retrieve Templates");
154 retrieveButton.setActionCommand("retrieve");
155 retrieveButton.addActionListener(this);
158 flipButton = new JButton("Flip helix");
159 flipButton.setActionCommand("flip");
160 flipButton.addActionListener(this);
161 flipButton.addKeyListener(this);
162 flipButton.setEnabled(false);
165 systemBar.add(newButton);
166 systemBar.add(loadButton);
167 systemBar.add(saveButton);
168 systemBar.add(saveAsButton);
169 systemBar.addSeparator();
171 systemBar.addSeparator();
172 systemBar.addSeparator();
173 systemBar.add(benchmarkButton);
174 systemBar.addKeyListener(this);
176 optionsBar.setLayout(new FlowLayout(FlowLayout.LEFT));
177 optionsBar.add(new JLabel("Single-Stranded "));
178 optionsBar.add(this.ellipseMethodList);
179 optionsBar.addSeparator();
180 optionsBar.add(new JLabel("Layout "));
181 optionsBar.add(this.applyMethodList);
182 optionsBar.addSeparator();
183 optionsBar.add(applyButton);
184 optionsBar.addSeparator();
185 optionsBar.add(retrieveButton);
186 optionsBar.doLayout();
188 /*optionsBar.add(new JLabel("Curves:"));
189 for (int i=0; i<ellipseButtons.length; i++)
190 optionsBar.add(ellipseButtons[i]);
191 optionsBar.addSeparator();
192 optionsBar.add(new JLabel("Helix positions:"));
193 for (int i=0; i<methodButtons.length; i++)
194 optionsBar.add(methodButtons[i]);
195 optionsBar.addKeyListener(this);
198 JToolBar toolBar = new JToolBar();
199 ButtonGroup bg = new ButtonGroup();
200 toolBar.setOrientation(JToolBar.VERTICAL);
201 //toolBar.setLayout(new BoxLayout(toolBar, BoxLayout.PAGE_AXIS));
202 JToggleButton selectButton = new JToggleButton("Select");
203 selectButton.setActionCommand("select");
204 selectButton.addActionListener(this);
205 selectButton.addKeyListener(this);
206 JToggleButton helixButton = new JToggleButton("Helix");
207 helixButton.setActionCommand("helix");
208 helixButton.addActionListener(this);
209 helixButton.addKeyListener(this);
210 helixButton.setSelected(true);
211 JToggleButton unpairedButton = new JToggleButton("Unpaired");
212 unpairedButton.setActionCommand("unpaired");
213 unpairedButton.addActionListener(this);
214 unpairedButton.addKeyListener(this);
216 bg.add(selectButton);
218 bg.add(unpairedButton);
220 toolBar.add(undoButton);
221 toolBar.add(redoButton);
222 toolBar.addSeparator();
223 toolBar.add(new JLabel("Tools:"));
224 toolBar.add(selectButton);
225 toolBar.add(helixButton);
226 toolBar.add(unpairedButton);
227 toolBar.addSeparator();
228 toolBar.add(flipButton);
229 systemBar.addKeyListener(this);
232 this.setLayout(new BorderLayout());
233 _sk = new TemplatePanel(this);
234 _sk.setPreferredSize(new Dimension(800,600));
235 manager = new UndoManager();
236 manager.setLimit(2000);
237 _sk.addUndoableEditListener(manager);
238 _sk.addKeyListener(this);
240 jp = new JScrollPane(_sk,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
243 JPanel bars = new JPanel();
244 BoxLayout barsLayout = new BoxLayout(bars, BoxLayout.Y_AXIS);
245 bars.setLayout(barsLayout);
246 systemBar.setAlignmentX(0);
248 optionsBar.setAlignmentX(0);
249 bars.add(optionsBar);
250 getContentPane().add(bars,BorderLayout.PAGE_START);
251 getContentPane().add(toolBar,BorderLayout.WEST);
252 getContentPane().add(p,BorderLayout.CENTER);
253 this.addKeyListener(this);
255 new DropTarget(_vp, this);
256 new DropTarget(_sk, this);
259 _sk.requestFocusInWindow();
263 private File getCurrentFilePath() {
264 return currentFilePath;
267 private void setCurrentFilePath(File currentFilePath) {
268 this.currentFilePath = currentFilePath;
269 saveButton.setEnabled(true);
270 setTitle("VARNA Template Editor: " + currentFilePath);
273 private void clearCurrentFilePath() {
274 currentFilePath = null;
275 saveButton.setEnabled(false);
276 setTitle("VARNA Template Editor: New file");
283 private static final long serialVersionUID = -5942729520783690050L;
285 public static void main(String[] argv)
288 LookAndFeelInfo[] lfs = UIManager.getInstalledLookAndFeels();
290 LookAndFeelInfo info = lfs[i % lfs.length];
291 UIManager.setLookAndFeel(info.getClassName());
292 } catch (Exception e) {
293 // If Nimbus is not available, you can set the GUI to another look and feel.
295 TemplateEditor frame = new TemplateEditor();
297 frame.setVisible(true);
298 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
301 public void keyPressed(KeyEvent e) {
302 System.out.println(e);
303 switch (e.getKeyCode())
305 case (KeyEvent.VK_DELETE):
307 GraphicalTemplateElement h = _sk.getSelected();
309 _sk.getTemplateUI().removeElementUI(h);
313 case (KeyEvent.VK_Z):
315 if (e.isControlDown())
321 case (KeyEvent.VK_Y):
323 if (e.isControlDown())
334 if (manager.canUndo())
336 //System.out.println("Undo: "+manager.getUndoPresentationName());
343 if (manager.canRedo())
345 //System.out.println("Redo: "+manager.getRedoPresentationName());
350 public void clearTemplate() {
352 clearCurrentFilePath();
354 // Empty the cancel history
355 manager.discardAllEdits();
358 public void loadTemplate(File templatePath) {
359 _sk.loadFromXmlFile(templatePath);
360 setCurrentFilePath(templatePath);
362 // Empty the cancel history
363 manager.discardAllEdits();
366 public void keyReleased(KeyEvent e) {
367 System.out.println(e);
370 public void keyTyped(KeyEvent e) {
371 System.out.println(e);
374 public void actionPerformed(ActionEvent e) {
375 if (e.getActionCommand().equals("undo"))
379 else if (e.getActionCommand().equals("redo"))
383 else if (e.getActionCommand().equals("flip"))
385 GraphicalTemplateElement gr = _sk.getSelected();
388 if (gr instanceof Helix)
390 _sk.getTemplateUI().flipHelixUI((Helix)gr);
394 else if (e.getActionCommand().equals("select")) {
395 _sk.getTemplateUI().setSelectedTool(TemplateEditorPanelUI.Tool.SELECT);
397 else if (e.getActionCommand().equals("helix")) {
398 _sk.getTemplateUI().setSelectedTool(TemplateEditorPanelUI.Tool.CREATE_HELIX);
400 else if (e.getActionCommand().equals("retrieve")) {
403 else if (e.getActionCommand().equals("unpaired")) {
404 _sk.getTemplateUI().setSelectedTool(TemplateEditorPanelUI.Tool.CREATE_UNPAIRED);
406 else if (e.getActionCommand().equals("apply"))
409 DrawRNATemplateMethod method = (DrawRNATemplateMethod)applyMethodList.getSelectedItem();
410 DrawRNATemplateCurveMethod curveMethod = (DrawRNATemplateCurveMethod)ellipseMethodList.getSelectedItem();
411 RNATemplateMapping map = _vp.getRNA().drawRNATemplate(_sk.getTemplate(),_vp.getConfig(), method, curveMethod, getStraightBulges());
412 for(int i: map.getSourceElemsAsSet())
414 RNATemplateElement t = map.getPartner(i);
415 Color c = _sk.getElement(t).getDominantColor();
416 _vp.getRNA().getBaseAt(i).getStyleBase().setBaseInnerColor(c);
419 } catch (RNATemplateDrawingAlgorithmException e1) {
420 e1.printStackTrace();
421 JOptionPane.showMessageDialog(this, e1.getMessage(), "Template-based RNA drawing error", JOptionPane.ERROR_MESSAGE);
424 else if (e.getActionCommand().equals("save"))
427 _sk.getTemplate().toXMLFile(getCurrentFilePath());
428 System.out.println("Template saved in " + getCurrentFilePath().toString());
429 } catch (ExceptionXMLGeneration e1) {
430 e1.printStackTrace();
431 } catch (ExceptionInvalidRNATemplate e1) {
432 e1.printStackTrace();
435 else if (e.getActionCommand().equals("save as"))
437 JFileChooser chooser = new JFileChooser();
438 FileFilter filter = new FileNameExtensionFilter("VARNA RNA template (.xml)", "xml");
439 chooser.setFileFilter(filter);
440 if (chooser.showSaveDialog(_sk) == JFileChooser.APPROVE_OPTION) {
441 String path = chooser.getSelectedFile().getAbsolutePath();
442 if (!path.toLowerCase().endsWith(".xml")) {
443 path = path + ".xml";
446 _sk.getTemplate().toXMLFile(new File(path));
447 System.out.println("Template saved in " + path);
448 setCurrentFilePath(new File(path));
449 } catch (ExceptionXMLGeneration e1) {
450 e1.printStackTrace();
451 } catch (ExceptionInvalidRNATemplate e1) {
452 e1.printStackTrace();
456 else if (e.getActionCommand().equals("new"))
460 else if (e.getActionCommand().equals("open"))
462 JFileChooser chooser = new JFileChooser();
463 FileFilter filter = new FileNameExtensionFilter("VARNA RNA template (.xml)", "xml");
464 chooser.setFileFilter(filter);
465 if (chooser.showOpenDialog(_sk) == JFileChooser.APPROVE_OPTION) {
466 File templatePath = chooser.getSelectedFile();
467 loadTemplate(templatePath);
470 else if (e.getActionCommand().equals("benchmark")) {
471 new Benchmark(_vp.getRNA()).printAll();
477 private boolean getStraightBulges() {
481 public void dragEnter(DropTargetDragEvent arg0) {
484 public void dragExit(DropTargetEvent arg0) {
487 public void dragOver(DropTargetDragEvent arg0) {
490 public void drop(DropTargetDropEvent dtde)
494 Transferable tr = dtde.getTransferable();
495 DataFlavor[] flavors = tr.getTransferDataFlavors();
496 for (int i = 0; i < flavors.length; i++)
498 if (flavors[i].isFlavorJavaFileListType())
500 dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
501 List list = (List) tr.getTransferData(flavors[i]);
502 for (int j = 0; j < list.size(); j++)
504 Object o = list.get(j);
505 if (dtde.getSource() instanceof DropTarget)
507 DropTarget dt = (DropTarget) dtde.getSource();
508 Component c = dt.getComponent();
509 if (c instanceof VARNAPanel)
511 VARNAPanel vp = (VARNAPanel) c;
512 //String path = o.toString();
513 vp.loadFile((File) o, true); // BH SwingJS
516 else if (c instanceof TemplatePanel)
518 TemplatePanel sk = (TemplatePanel) c;
519 //String path = o.toString();
520 sk.loadFromXmlFile((File) o); // BH SwingJS
525 dtde.dropComplete(true);
538 public void dropActionChanged(DropTargetDragEvent arg0) {
541 public VARNAPanel getVarnaPanel() {
545 public void flipButtonEnable() {
546 flipButton.setEnabled(true);
549 public void flipButtonDisable() {
550 flipButton.setEnabled(false);
553 public void retrieveTemplates()
558 u = new URL("http://127.0.0.1/VARNA/templateShare/actions.php?action=retrieve&nbHelices=3&nbMultiLoops=1&length=50");
559 URLConnection uc = u.openConnection();
560 InputStreamReader isr = new InputStreamReader(uc.getInputStream());
561 BufferedReader b = new BufferedReader(isr);
562 ArrayList<String> res = new ArrayList<String>();
563 String s = b.readLine();
569 } catch (MalformedURLException e) {
570 // TODO Auto-generated catch block
572 } catch (IOException e) {
573 // TODO Auto-generated catch block