JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / CutAndPasteTransfer.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3\r
10  * of the License, or (at your option) any later version.\r
11  *  \r
12  * Jalview is distributed in the hope that it will be useful, but \r
13  * WITHOUT ANY WARRANTY; without even the implied warranty \r
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
15  * PURPOSE.  See the GNU General Public License for more details.\r
16  * \r
17  * You should have received a copy of the GNU General Public License\r
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
19  * The Jalview Authors are detailed in the 'AUTHORS' file.\r
20  */\r
21 package jalview.appletgui;\r
22 \r
23 import jalview.analysis.AlignmentUtils;\r
24 import jalview.api.ComplexAlignFile;\r
25 import jalview.bin.JalviewLite;\r
26 import jalview.datamodel.AlignmentI;\r
27 import jalview.datamodel.ColumnSelection;\r
28 import jalview.datamodel.PDBEntry;\r
29 import jalview.datamodel.SequenceI;\r
30 import jalview.io.AlignFile;\r
31 import jalview.io.AnnotationFile;\r
32 import jalview.io.AppletFormatAdapter;\r
33 import jalview.io.FileParse;\r
34 import jalview.io.IdentifyFile;\r
35 import jalview.io.NewickFile;\r
36 import jalview.jsdev.GenericFileAdapter;\r
37 import jalview.schemes.ColourSchemeI;\r
38 import jalview.schemes.TCoffeeColourScheme;\r
39 import jalview.util.MessageManager;\r
40 \r
41 import java.awt.BorderLayout;\r
42 import java.awt.Font;\r
43 import java.awt.event.ActionEvent;\r
44 import java.awt.event.ActionListener;\r
45 import java.awt.event.MouseEvent;\r
46 import java.awt.event.MouseListener;\r
47 \r
48 import javax.swing.JButton;\r
49 import javax.swing.JDialog;\r
50 import javax.swing.JFrame;\r
51 import javax.swing.JLabel;\r
52 import javax.swing.JPanel;\r
53 import javax.swing.JTextArea;\r
54 \r
55 public class CutAndPasteTransfer extends JPanel implements ActionListener,\r
56         MouseListener\r
57 {\r
58   boolean pdbImport = false;\r
59 \r
60   boolean treeImport = false;\r
61 \r
62   boolean annotationImport = false;\r
63 \r
64   SequenceI seq;\r
65 \r
66   AlignFrame alignFrame;\r
67 \r
68   FileParse source = null;\r
69 \r
70   public CutAndPasteTransfer(boolean forImport, AlignFrame alignFrame)\r
71   {\r
72     try\r
73     {\r
74       jbInit();\r
75     } catch (Exception e)\r
76     {\r
77       e.printStackTrace();\r
78     }\r
79 \r
80     this.alignFrame = alignFrame;\r
81 \r
82     if (!forImport)\r
83     {\r
84       buttonPanel.setVisible(false);\r
85     }\r
86   }\r
87 \r
88   public String getText()\r
89   {\r
90     return textarea.getText();\r
91   }\r
92 \r
93   public void setText(String text)\r
94   {\r
95     textarea.setText(text);\r
96   }\r
97 \r
98   public void setPDBImport(SequenceI seq)\r
99   {\r
100     this.seq = seq;\r
101     accept.setLabel(MessageManager.getString("action.accept"));\r
102     addSequences.setVisible(false);\r
103     pdbImport = true;\r
104   }\r
105 \r
106   public void setTreeImport()\r
107   {\r
108     treeImport = true;\r
109     accept.setLabel(MessageManager.getString("action.accept"));\r
110     addSequences.setVisible(false);\r
111   }\r
112 \r
113   public void setAnnotationImport()\r
114   {\r
115     annotationImport = true;\r
116     accept.setLabel(MessageManager.getString("action.accept"));\r
117     addSequences.setVisible(false);\r
118   }\r
119 \r
120   public void actionPerformed(ActionEvent evt)\r
121   {\r
122     if (evt.getSource() == accept)\r
123     {\r
124       ok(true);\r
125     }\r
126     else if (evt.getSource() == addSequences)\r
127     {\r
128       ok(false);\r
129     }\r
130     else if (evt.getSource() == cancel)\r
131     {\r
132       cancel();\r
133     }\r
134   }\r
135 \r
136   protected void ok(boolean newWindow)\r
137   {\r
138     String text = getText();\r
139     int length = text.length();\r
140     textarea.append("\n");\r
141     if (textarea.getText().length() == length)\r
142     {\r
143       String warning = "\n\n#################################################\n"\r
144               + "WARNING!! THIS IS THE MAXIMUM SIZE OF TEXTAREA!!\n"\r
145               + "\nCAN'T INPUT FULL ALIGNMENT"\r
146               + "\n\nYOU MUST DELETE THIS WARNING TO CONTINUE"\r
147               + "\n\nMAKE SURE LAST SEQUENCE PASTED IS COMPLETE"\r
148               + "\n#################################################\n";\r
149       textarea.setText(text.substring(0, text.length() - warning.length())\r
150               + warning);\r
151 \r
152       textarea.setCaretPosition(text.length());\r
153     }\r
154 \r
155     if (pdbImport)\r
156     {\r
157       openPdbViewer(text);\r
158 \r
159     }\r
160     else if (treeImport)\r
161     {\r
162       if (!loadTree())\r
163       {\r
164         return;\r
165       }\r
166     }\r
167     else if (annotationImport)\r
168     {\r
169       loadAnnotations();\r
170     }\r
171     else if (alignFrame != null)\r
172     {\r
173       loadAlignment(text, newWindow, alignFrame.getAlignViewport());\r
174     }\r
175 \r
176     // TODO: dialog should indicate if data was parsed correctly or not - see\r
177     // JAL-1102\r
178     if (this.getParent() instanceof JFrame)\r
179     {\r
180       ((JFrame) this.getParent()).setVisible(false);\r
181     }\r
182     else\r
183     {\r
184       ((JDialog) this.getParent()).setVisible(false);\r
185     }\r
186   }\r
187 \r
188   /**\r
189    * Parses text as Newick Tree format, and loads on to the alignment. Returns\r
190    * true if successful, else false.\r
191    */\r
192   protected boolean loadTree()\r
193   {\r
194     try\r
195     {\r
196       NewickFile fin = new NewickFile(textarea.getText(), "Paste");\r
197 \r
198       fin.parse();\r
199       if (fin.getTree() != null)\r
200       {\r
201         alignFrame.loadTree(fin, "Pasted tree file");\r
202         return true;\r
203       }\r
204     } catch (Exception ex)\r
205     {\r
206       // TODO: JAL-1102 - should have a warning message in dialog, not simply\r
207       // overwrite the broken input data with the exception\r
208       textarea.setText(MessageManager.formatMessage(\r
209               "label.could_not_parse_newick_file", new Object[]\r
210               { ex.getMessage() }));\r
211       return false;\r
212     }\r
213     return false;\r
214   }\r
215 \r
216   /**\r
217    * Parse text as an alignment file and add to the current or a new window.\r
218    * \r
219    * @param text\r
220    * @param newWindow\r
221    */\r
222   protected void loadAlignment(String text, boolean newWindow,\r
223           AlignViewport viewport)\r
224   {\r
225     AlignmentI al = null;\r
226 \r
227     String format = new IdentifyFile().Identify(text,\r
228             AppletFormatAdapter.PASTE);\r
229     AppletFormatAdapter afa = new AppletFormatAdapter(alignFrame.alignPanel);\r
230     try\r
231     {\r
232       al = afa.readFile(text, AppletFormatAdapter.PASTE, format);\r
233       source = afa.getAlignFile();\r
234     } catch (java.io.IOException ex)\r
235     {\r
236       ex.printStackTrace();\r
237     }\r
238 \r
239     if (al != null)\r
240     {\r
241       al.setDataset(null); // set dataset on alignment/sequences\r
242 \r
243       /*\r
244        * SplitFrame option dependent on applet parameter for now.\r
245        */\r
246       boolean allowSplitFrame = alignFrame.viewport.applet\r
247               .getDefaultParameter("enableSplitFrame", false);\r
248       if (allowSplitFrame && openSplitFrame(al, format))\r
249       {\r
250         return;\r
251       }\r
252       if (newWindow)\r
253       {\r
254         AlignFrame af;\r
255 \r
256         if (source instanceof ComplexAlignFile)\r
257         {\r
258           ColumnSelection colSel = ((ComplexAlignFile) source)\r
259                   .getColumnSelection();\r
260           SequenceI[] hiddenSeqs = ((ComplexAlignFile) source)\r
261                   .getHiddenSequences();\r
262           boolean showSeqFeatures = ((ComplexAlignFile) source)\r
263                   .isShowSeqFeatures();\r
264           ColourSchemeI cs = ((ComplexAlignFile) source).getColourScheme();\r
265           af = new AlignFrame(al, hiddenSeqs, colSel,\r
266                   alignFrame.viewport.applet, "Cut & Paste input - "\r
267                           + format, false);\r
268           af.getAlignViewport().setShowSequenceFeatures(showSeqFeatures);\r
269           af.changeColour(cs);\r
270         }\r
271         else\r
272         {\r
273           af = new AlignFrame(al, alignFrame.viewport.applet,\r
274                   "Cut & Paste input - " + format, false);\r
275         }\r
276 \r
277         af.statusBar\r
278                 .setText(MessageManager\r
279                         .getString("label.successfully_pasted_annotation_to_alignment"));\r
280       }\r
281       else\r
282       {\r
283         alignFrame.addSequences(al.getSequencesArray());\r
284         alignFrame.statusBar.setText(MessageManager\r
285                 .getString("label.successfully_pasted_alignment_file"));\r
286       }\r
287     }\r
288   }\r
289 \r
290   /**\r
291    * Check whether the new alignment could be mapped to the current one as\r
292    * cDNA/protein, if so offer the option to open as split frame view. Returns\r
293    * true if a split frame view is opened, false if not.\r
294    * \r
295    * @param al\r
296    * @return\r
297    */\r
298   protected boolean openSplitFrame(AlignmentI al, String format)\r
299   {\r
300     final AlignmentI thisAlignment = this.alignFrame.getAlignViewport().getAlignment();\r
301     if (thisAlignment.isNucleotide() == al.isNucleotide())\r
302     {\r
303       // both nucleotide or both protein\r
304       return false;\r
305     }\r
306     AlignmentI protein = thisAlignment.isNucleotide() ? al : thisAlignment;\r
307     AlignmentI dna = thisAlignment.isNucleotide() ? thisAlignment : al;\r
308     boolean mapped = AlignmentUtils.mapProteinToCdna(protein, dna);\r
309     if (!mapped)\r
310     {\r
311       return false;\r
312     }\r
313 \r
314     /*\r
315      * A mapping is possible; ask user if they want a split frame.\r
316      */\r
317     String title = MessageManager.getString("label.open_split_window");\r
318     final JVDialog dialog = new JVDialog((JFrame) this.getParent(), title,\r
319             true, 100, 400);\r
320     dialog.ok.setLabel(MessageManager.getString("action.yes"));\r
321     dialog.cancel.setLabel(MessageManager.getString("action.no"));\r
322     JPanel question = new JPanel(new BorderLayout());\r
323     final String text = MessageManager\r
324             .getString("label.open_split_window?");\r
325     question.add(new JLabel(text, JLabel.CENTER), BorderLayout.CENTER);\r
326     dialog.setMainPanel(question);\r
327     dialog.setVisible(true);\r
328     dialog.toFront();\r
329     \r
330     if (!dialog.accept)\r
331     {\r
332       return false;\r
333     }\r
334 \r
335     /*\r
336      * Open SplitFrame with DNA above and protein below, including the alignment\r
337      * from textbox and a copy of the original.\r
338      */\r
339     final JalviewLite applet = this.alignFrame.viewport.applet;\r
340     AlignFrame copyFrame = new AlignFrame(\r
341             this.alignFrame.viewport.getAlignment(), applet,\r
342             alignFrame.getTitle(), false, false);\r
343     AlignFrame newFrame = new AlignFrame(al, alignFrame.viewport.applet,\r
344             "Cut & Paste input - " + format, false, false);\r
345     AlignFrame dnaFrame = al.isNucleotide() ? newFrame : copyFrame;\r
346     AlignFrame proteinFrame = al.isNucleotide() ? copyFrame\r
347             : newFrame;\r
348     SplitFrame sf = new SplitFrame(dnaFrame, proteinFrame);\r
349     sf.addToDisplay(false, applet);\r
350     return true;\r
351   }\r
352 \r
353   /**\r
354    * Parse the text as a TCoffee score file, if successful add scores as\r
355    * alignment annotations.\r
356    */\r
357   protected void loadAnnotations()\r
358   {\r
359     AlignFile tcf = null;\r
360     try\r
361     {\r
362       tcf = GenericFileAdapter.newTCoffeeScoreFile(textarea.getText(),\r
363               AppletFormatAdapter.PASTE);\r
364       if (tcf.isValid())\r
365       {\r
366         if (tcf.annotateAlignment(alignFrame.viewport.getAlignment(),\r
367                 true))\r
368         {\r
369           alignFrame.tcoffeeColour.setEnabled(true);\r
370           alignFrame.alignPanel.fontChanged();\r
371           alignFrame.changeColour(new TCoffeeColourScheme(\r
372                   alignFrame.viewport.getAlignment()));\r
373           alignFrame.statusBar\r
374                   .setText(MessageManager\r
375                           .getString("label.successfully_pasted_tcoffee_scores_to_alignment"));\r
376         }\r
377         else\r
378         {\r
379           // file valid but didn't get added to alignment for some reason\r
380           alignFrame.statusBar.setText(MessageManager.formatMessage(\r
381                   "label.failed_add_tcoffee_scores",\r
382                   new Object[]\r
383                   { (tcf.getWarningMessage() != null ? tcf\r
384                           .getWarningMessage() : "") }));\r
385         }\r
386       }\r
387       else\r
388       {\r
389         tcf = null;\r
390       }\r
391     } catch (Exception x)\r
392     {\r
393       tcf = null;\r
394     }\r
395     if (tcf == null)\r
396     {\r
397       if (new AnnotationFile().annotateAlignmentView(alignFrame.viewport,\r
398               textarea.getText(), AppletFormatAdapter.PASTE))\r
399       {\r
400         alignFrame.alignPanel.fontChanged();\r
401         alignFrame.alignPanel.setScrollValues(0, 0);\r
402         alignFrame.statusBar\r
403                 .setText(MessageManager\r
404                         .getString("label.successfully_pasted_annotation_to_alignment"));\r
405 \r
406       }\r
407       else\r
408       {\r
409         if (!alignFrame.parseFeaturesFile(textarea.getText(),\r
410                 AppletFormatAdapter.PASTE))\r
411         {\r
412           alignFrame.statusBar\r
413                   .setText(MessageManager\r
414                           .getString("label.couldnt_parse_pasted_text_as_valid_annotation_feature_GFF_tcoffee_file"));\r
415         }\r
416       }\r
417     }\r
418   }\r
419 \r
420   /**\r
421    * Open a Jmol viewer (if available), failing that the built-in PDB viewer,\r
422    * passing the input text as the PDB file data.\r
423    * \r
424    * @param text\r
425    */\r
426   protected void openPdbViewer(String text)\r
427   {\r
428     PDBEntry pdb = new PDBEntry();\r
429     pdb.setFile(text);\r
430 \r
431 //    if (alignFrame.alignPanel.av.applet.jmolAvailable)\r
432 //    {\r
433       new AppletJmol(pdb, new SequenceI[]\r
434       { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);\r
435 //    }\r
436 //    else\r
437 //    {\r
438 //      new MCview.AppletPDBViewer(pdb, new SequenceI[]\r
439 //      { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);\r
440 //    }\r
441   }\r
442 \r
443   protected void cancel()\r
444   {\r
445     textarea.setText("");\r
446     if (this.getParent() instanceof JFrame)\r
447     {\r
448       ((JFrame) this.getParent()).setVisible(false);\r
449     }\r
450     else\r
451     {\r
452       ((JDialog) this.getParent()).setVisible(false);\r
453     }\r
454   }\r
455 \r
456   protected JTextArea textarea = new JTextArea();\r
457 \r
458   JButton accept = new JButton("New Window");\r
459 \r
460   JButton addSequences = new JButton("Add to Current Alignment");\r
461 \r
462   JButton cancel = new JButton("Close");\r
463 \r
464   protected JPanel buttonPanel = new JPanel();\r
465 \r
466   BorderLayout borderLayout1 = new BorderLayout();\r
467 \r
468   private void jbInit() throws Exception\r
469   {\r
470     textarea.setFont(new java.awt.Font("Monospaced", Font.PLAIN, 10));\r
471     textarea.setText(MessageManager\r
472             .getString("label.paste_your_alignment_file"));\r
473     textarea.addMouseListener(this);\r
474     this.setLayout(borderLayout1);\r
475     accept.addActionListener(this);\r
476     addSequences.addActionListener(this);\r
477     cancel.addActionListener(this);\r
478     this.add(buttonPanel, BorderLayout.SOUTH);\r
479     buttonPanel.add(accept, null);\r
480     buttonPanel.add(addSequences);\r
481     buttonPanel.add(cancel, null);\r
482     this.add(textarea, java.awt.BorderLayout.CENTER);\r
483   }\r
484 \r
485   public void mousePressed(MouseEvent evt)\r
486   {\r
487     if (textarea.getText().startsWith(\r
488             MessageManager.getString("label.paste_your")))\r
489     {\r
490       textarea.setText("");\r
491     }\r
492   }\r
493 \r
494   public void mouseReleased(MouseEvent evt)\r
495   {\r
496   }\r
497 \r
498   public void mouseClicked(MouseEvent evt)\r
499   {\r
500   }\r
501 \r
502   public void mouseEntered(MouseEvent evt)\r
503   {\r
504   }\r
505 \r
506   public void mouseExited(MouseEvent evt)\r
507   {\r
508   }\r
509 }\r