JAL-3026 srcjar files for VARNA and log4j
[jalview.git] / srcjar / fr / orsay / lri / varna / applications / templateEditor / TemplateEditor.java
1 package fr.orsay.lri.varna.applications.templateEditor;
2 import java.awt.BorderLayout;
3 import java.awt.Color;
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;
22 import java.io.File;
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;
28 import java.net.URL;
29 import java.net.URLConnection;
30 import java.util.ArrayList;
31 import java.util.List;
32
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;
53
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;
66
67
68
69
70 public class TemplateEditor extends JFrame implements KeyListener, ActionListener,DropTargetListener {
71
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[];
83         */
84
85
86         public TemplateEditor()
87         {
88                 init();
89                 clearCurrentFilePath();
90         }       
91
92         public JScrollPane getJp() {
93                 return jp;
94         }
95         
96         private void init()
97         {
98                 try {
99                         _vp = new VARNAPanel(" ",".");
100                 } catch (ExceptionNonEqualLength e) {
101                         e.printStackTrace();
102                 }
103                 _vp.setNumPeriod(0);
104                 JPanel p = new JPanel();
105                 p.setLayout(new GridLayout(1,2));
106                 
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);
134                 
135                 JButton benchmarkButton = new JButton("Benchmark"); 
136                 benchmarkButton.setActionCommand("benchmark");
137                 benchmarkButton.addActionListener(this);
138                 benchmarkButton.addKeyListener(this);
139                 
140                 DrawRNATemplateMethod applyMethods[] = DrawRNATemplateMethod.values();
141                 applyMethodList = new JComboBox(applyMethods); 
142                 applyMethodList.setSelectedItem(DrawRNATemplateMethod.getDefault());
143                 
144                 DrawRNATemplateCurveMethod ellipseMethods[] = DrawRNATemplateCurveMethod.values();
145                 ellipseMethodList = new JComboBox(ellipseMethods); 
146                 ellipseMethodList.setSelectedItem(DrawRNATemplateCurveMethod.getDefault());
147
148                 JButton applyButton = new JButton("Apply"); 
149                 applyButton.setActionCommand("apply");
150                 applyButton.addActionListener(this);
151                 applyButton.addKeyListener(this);
152
153                 JButton retrieveButton = new JButton("Retrieve Templates"); 
154                 retrieveButton.setActionCommand("retrieve");
155                 retrieveButton.addActionListener(this);
156                 
157                 
158                 flipButton = new JButton("Flip helix"); 
159                 flipButton.setActionCommand("flip");
160                 flipButton.addActionListener(this);
161                 flipButton.addKeyListener(this);
162                 flipButton.setEnabled(false);
163
164                 
165                 systemBar.add(newButton);
166                 systemBar.add(loadButton);
167                 systemBar.add(saveButton);
168                 systemBar.add(saveAsButton);
169                 systemBar.addSeparator();
170                 
171                 systemBar.addSeparator();
172                 systemBar.addSeparator();
173                 systemBar.add(benchmarkButton);
174                 systemBar.addKeyListener(this);
175                 
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();
187                 
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);
196                 */
197
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);
215
216                 bg.add(selectButton);
217                 bg.add(helixButton);
218                 bg.add(unpairedButton);
219                 
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);
230
231                 
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);
239                 
240                 jp = new JScrollPane(_sk,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
241                 p.add(jp);
242                 p.add(_vp);
243                 JPanel bars = new JPanel();
244                 BoxLayout barsLayout = new BoxLayout(bars, BoxLayout.Y_AXIS);
245                 bars.setLayout(barsLayout);
246                 systemBar.setAlignmentX(0);
247                 bars.add(systemBar);
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);
254                 
255             new DropTarget(_vp, this);
256             new DropTarget(_sk, this);
257             this.pack();
258
259                 _sk.requestFocusInWindow();
260         }
261         
262         
263         private File getCurrentFilePath() {
264                 return currentFilePath;
265         }
266
267         private void setCurrentFilePath(File currentFilePath) {
268                 this.currentFilePath = currentFilePath;
269                 saveButton.setEnabled(true);
270                 setTitle("VARNA Template Editor: " + currentFilePath);
271         }
272         
273         private void clearCurrentFilePath() {
274                 currentFilePath = null;
275                 saveButton.setEnabled(false);
276                 setTitle("VARNA Template Editor: New file");
277         }
278         
279         
280         /**
281          * 
282          */
283         private static final long serialVersionUID = -5942729520783690050L;
284
285         public static void main(String[] argv)
286         {
287                 try {
288                         LookAndFeelInfo[] lfs = UIManager.getInstalledLookAndFeels();
289                         int i = 1;
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.
294                 }
295                 TemplateEditor frame = new TemplateEditor();
296                 frame.pack();
297                 frame.setVisible(true);
298                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
299         }
300
301         public void keyPressed(KeyEvent e) {
302                 System.out.println(e);
303                 switch (e.getKeyCode())
304                 {
305                   case (KeyEvent.VK_DELETE):
306                   {
307                           GraphicalTemplateElement h = _sk.getSelected();
308                           _sk.Unselect();
309                           _sk.getTemplateUI().removeElementUI(h);
310                           _sk.repaint();
311                   }
312                   break;
313                   case (KeyEvent.VK_Z):
314                   {
315                           if (e.isControlDown())
316                           {
317                                   undo();
318                           }
319                   }
320                   break;
321                   case (KeyEvent.VK_Y):
322                   {
323                           if (e.isControlDown())
324                           {
325                                   redo();
326                           }
327                   }
328                   break;
329                 }
330         }
331         
332         public void undo()
333         {
334                 if (manager.canUndo())
335                 {
336                         //System.out.println("Undo: "+manager.getUndoPresentationName());
337                         manager.undo();
338                 }
339         }
340
341         public void redo()
342         {
343                   if (manager.canRedo())
344                   {
345                           //System.out.println("Redo: "+manager.getRedoPresentationName());
346                       manager.redo();
347                   }
348         }
349         
350         public void clearTemplate() {
351                 _sk.clearTemplate();
352                 clearCurrentFilePath();
353                 
354                 // Empty the cancel history
355                 manager.discardAllEdits();
356         }
357         
358         public void loadTemplate(File templatePath) {
359                 _sk.loadFromXmlFile(templatePath);
360                 setCurrentFilePath(templatePath);
361                 
362                 // Empty the cancel history
363                 manager.discardAllEdits();
364         }
365         
366         public void keyReleased(KeyEvent e) {
367                 System.out.println(e);
368         }
369
370         public void keyTyped(KeyEvent e) {
371                 System.out.println(e);
372         }
373
374         public void actionPerformed(ActionEvent e) {
375                 if (e.getActionCommand().equals("undo"))
376                 {
377                         undo();
378                 }
379                 else if (e.getActionCommand().equals("redo"))
380                 {
381                         redo();
382                 }
383                 else if (e.getActionCommand().equals("flip"))
384                 {
385                         GraphicalTemplateElement gr = _sk.getSelected();
386                         if (gr != null)
387                         {
388                                 if (gr instanceof Helix)
389                                 {
390                                         _sk.getTemplateUI().flipHelixUI((Helix)gr);
391                                 }
392                         }
393                 }
394                 else if (e.getActionCommand().equals("select")) {
395                         _sk.getTemplateUI().setSelectedTool(TemplateEditorPanelUI.Tool.SELECT);
396                 }
397                 else if (e.getActionCommand().equals("helix")) {
398                         _sk.getTemplateUI().setSelectedTool(TemplateEditorPanelUI.Tool.CREATE_HELIX);
399                 }
400                 else if (e.getActionCommand().equals("retrieve")) {
401                         retrieveTemplates();
402                 }               
403                 else if (e.getActionCommand().equals("unpaired")) {
404                         _sk.getTemplateUI().setSelectedTool(TemplateEditorPanelUI.Tool.CREATE_UNPAIRED);
405                 }
406                 else if (e.getActionCommand().equals("apply"))
407                 {
408                         try {
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())
413                                 {
414                                         RNATemplateElement t = map.getPartner(i);
415                                         Color c = _sk.getElement(t).getDominantColor();
416                                         _vp.getRNA().getBaseAt(i).getStyleBase().setBaseInnerColor(c);
417                                 }
418                                 _vp.repaint();
419                         } catch (RNATemplateDrawingAlgorithmException e1) {
420                                 e1.printStackTrace();
421                                 JOptionPane.showMessageDialog(this, e1.getMessage(), "Template-based RNA drawing error", JOptionPane.ERROR_MESSAGE);
422                         }
423                 }
424                 else if (e.getActionCommand().equals("save"))
425                 {
426                         try {
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();
433                         }
434                 }
435                 else if (e.getActionCommand().equals("save as"))
436                 {
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";
444                                 }
445                                 try {
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();
453                                 }
454                         }
455                 }
456                 else if (e.getActionCommand().equals("new"))
457                 {
458                         clearTemplate();
459                 }
460                 else if (e.getActionCommand().equals("open"))
461                 {
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);
468                         }
469                 }
470                 else if (e.getActionCommand().equals("benchmark")) {
471                         new Benchmark(_vp.getRNA()).printAll();
472                 }
473
474         }
475         
476         
477         private boolean getStraightBulges() {
478                 return false;
479         }
480
481         public void dragEnter(DropTargetDragEvent arg0) {
482         }
483
484         public void dragExit(DropTargetEvent arg0) {
485         }
486
487         public void dragOver(DropTargetDragEvent arg0) {
488         }
489
490         public void drop(DropTargetDropEvent dtde) 
491         {
492           try 
493           {
494             Transferable tr = dtde.getTransferable();
495             DataFlavor[] flavors = tr.getTransferDataFlavors();
496             for (int i = 0; i < flavors.length; i++) 
497             {
498               if (flavors[i].isFlavorJavaFileListType()) 
499               {
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++) 
503                   {
504                           Object o = list.get(j);
505                           if (dtde.getSource() instanceof DropTarget)
506                           {
507                                   DropTarget dt = (DropTarget) dtde.getSource();
508                                   Component c = dt.getComponent();
509                                   if (c instanceof VARNAPanel)
510                                   {
511                                           VARNAPanel vp = (VARNAPanel) c;
512                                           //String path = o.toString();
513                                           vp.loadFile((File) o, true); // BH SwingJS 
514                                           vp.repaint();
515                                   }
516                                   else if (c instanceof TemplatePanel)
517                                   {
518                                           TemplatePanel sk = (TemplatePanel) c;
519                                           //String path = o.toString();
520                                           sk.loadFromXmlFile((File) o); // BH SwingJS
521                                           sk.repaint();
522                                   }
523                           }
524                   }
525                   dtde.dropComplete(true);
526                   return;
527               }
528             }
529         dtde.rejectDrop();
530          } 
531          catch (Exception e) 
532          {
533                  e.printStackTrace();
534              dtde.rejectDrop();
535           }
536         }
537
538         public void dropActionChanged(DropTargetDragEvent arg0) {
539         }
540
541         public VARNAPanel getVarnaPanel() {
542                 return _vp;
543         }
544         
545         public void flipButtonEnable() {
546                 flipButton.setEnabled(true);
547         }
548         
549         public void flipButtonDisable() {
550                 flipButton.setEnabled(false);
551         }
552         
553         public void retrieveTemplates()
554         {
555                 URL u;
556                 
557                 try {
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();
564                 while(s!=null)
565                 {
566                         res.add(s);
567                         s = b.readLine();
568                 }
569                 } catch (MalformedURLException e) {
570                         // TODO Auto-generated catch block
571                         e.printStackTrace();
572                 } catch (IOException e) {
573                         // TODO Auto-generated catch block
574                         e.printStackTrace();
575                 }
576         }
577 }