c7a49f361b1d5014353ce8e0669c45890e719608
[jalview.git] / src / jalview / appletgui / CutAndPasteTransfer.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, 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.appletgui;
19
20 import java.awt.*;
21 import java.awt.event.*;
22
23 import jalview.datamodel.*;
24 import jalview.io.*;
25 import jalview.schemes.TCoffeeColourScheme;
26
27 public class CutAndPasteTransfer extends Panel implements ActionListener,
28         MouseListener
29 {
30   boolean pdbImport = false;
31
32   boolean treeImport = false;
33
34   boolean annotationImport = false;
35
36   Sequence seq;
37
38   AlignFrame alignFrame;
39
40   public CutAndPasteTransfer(boolean forImport, AlignFrame alignFrame)
41   {
42     try
43     {
44       jbInit();
45     } catch (Exception e)
46     {
47       e.printStackTrace();
48     }
49
50     this.alignFrame = alignFrame;
51
52     if (!forImport)
53     {
54       buttonPanel.setVisible(false);
55     }
56   }
57
58   public String getText()
59   {
60     return textarea.getText();
61   }
62
63   public void setText(String text)
64   {
65     textarea.setText(text);
66   }
67
68   public void setPDBImport(Sequence seq)
69   {
70     this.seq = seq;
71     accept.setLabel("Accept");
72     addSequences.setVisible(false);
73     pdbImport = true;
74   }
75
76   public void setTreeImport()
77   {
78     treeImport = true;
79     accept.setLabel("Accept");
80     addSequences.setVisible(false);
81   }
82
83   public void setAnnotationImport()
84   {
85     annotationImport = true;
86     accept.setLabel("Accept");
87     addSequences.setVisible(false);
88   }
89
90   public void actionPerformed(ActionEvent evt)
91   {
92     if (evt.getSource() == accept)
93     {
94       ok(true);
95     }
96     else if (evt.getSource() == addSequences)
97     {
98       ok(false);
99     }
100     else if (evt.getSource() == cancel)
101     {
102       cancel();
103     }
104   }
105
106   protected void ok(boolean newWindow)
107   {
108     String text = getText();
109     int length = text.length();
110     textarea.append("\n");
111     if (textarea.getText().length() == length)
112     {
113       String warning = "\n\n#################################################\n"
114               + "WARNING!! THIS IS THE MAXIMUM SIZE OF TEXTAREA!!\n"
115               + "\nCAN'T INPUT FULL ALIGNMENT"
116               + "\n\nYOU MUST DELETE THIS WARNING TO CONTINUE"
117               + "\n\nMAKE SURE LAST SEQUENCE PASTED IS COMPLETE"
118               + "\n#################################################\n";
119       textarea.setText(text.substring(0, text.length() - warning.length())
120               + warning);
121
122       textarea.setCaretPosition(text.length());
123     }
124
125     if (pdbImport)
126     {
127       PDBEntry pdb = new PDBEntry();
128       pdb.setFile(text);
129
130       if (alignFrame.alignPanel.av.applet.jmolAvailable)
131         new jalview.appletgui.AppletJmol(pdb, new Sequence[]
132         { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
133       else
134
135         new MCview.AppletPDBViewer(pdb, new Sequence[]
136         { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
137
138     }
139     else if (treeImport)
140     {
141       try
142       {
143         jalview.io.NewickFile fin = new jalview.io.NewickFile(
144                 textarea.getText(), "Paste");
145
146         fin.parse();
147         if (fin.getTree() != null)
148         {
149           alignFrame.loadTree(fin, "Pasted tree file");
150         }
151
152       } catch (Exception ex)
153       {
154         // TODO: JAL-1102 - should have a warning message in dialog, not simply
155         // overwrite the broken input data with the exception
156         textarea.setText("Could not parse Newick file!\n" + ex);
157         return;
158       }
159     }
160     else if (annotationImport)
161     {
162       TCoffeeScoreFile tcf = null;
163       try
164       {
165         tcf = new TCoffeeScoreFile(textarea.getText(),
166                 jalview.io.AppletFormatAdapter.PASTE);
167         if (tcf.isValid())
168         {
169           if (tcf.annotateAlignment(alignFrame.viewport.getAlignment(),
170                   true))
171           {
172             alignFrame.tcoffeeColour.setEnabled(true);
173             alignFrame.alignPanel.fontChanged();
174             alignFrame.changeColour(new TCoffeeColourScheme(
175                     alignFrame.viewport.getAlignment()));
176             alignFrame.statusBar
177                     .setText("Successfully pasted T-Coffee scores to alignment.");
178           }
179           else
180           {
181             // file valid but didn't get added to alignment for some reason
182             alignFrame.statusBar.setText("Failed to add T-Coffee scores: "
183                     + (tcf.getWarningMessage() != null ? tcf
184                             .getWarningMessage() : ""));
185           }
186         }
187         else
188         {
189           tcf = null;
190         }
191       } catch (Exception x)
192       {
193         tcf = null;
194       }
195       if (tcf == null)
196       {
197         if (new AnnotationFile().readAnnotationFile(
198                 alignFrame.viewport.getAlignment(), textarea.getText(),
199                 jalview.io.AppletFormatAdapter.PASTE))
200         {
201           alignFrame.alignPanel.fontChanged();
202           alignFrame.alignPanel.setScrollValues(0, 0);
203           alignFrame.statusBar
204                   .setText("Successfully pasted annotation to alignment.");
205
206         }
207         else
208         {
209           if (!alignFrame.parseFeaturesFile(textarea.getText(),
210                   jalview.io.AppletFormatAdapter.PASTE))
211           {
212             alignFrame.statusBar
213                     .setText("Couldn't parse pasted text as a valid annotation, feature, GFF, or T-Coffee score file.");
214           }
215         }
216       }
217     }
218     else if (alignFrame != null)
219     {
220       Alignment al = null;
221
222       String format = new IdentifyFile().Identify(text,
223               AppletFormatAdapter.PASTE);
224       try
225       {
226         al = new AppletFormatAdapter().readFile(text,
227                 AppletFormatAdapter.PASTE, format);
228       } catch (java.io.IOException ex)
229       {
230         ex.printStackTrace();
231       }
232
233       if (al != null)
234       {
235         if (newWindow)
236         {
237           AlignFrame af = new AlignFrame(al, alignFrame.viewport.applet,
238                   "Cut & Paste input - " + format, false);
239           af.statusBar.setText("Successfully pasted alignment file");
240         }
241         else
242         {
243           alignFrame.addSequences(al.getSequencesArray());
244           alignFrame.statusBar
245                   .setText("Successfully pasted alignment file");
246         }
247       }
248     }
249     // TODO: dialog should indicate if data was parsed correctly or not - see
250     // JAL-1102
251     if (this.getParent() instanceof Frame)
252     {
253       ((Frame) this.getParent()).setVisible(false);
254     }
255     else
256     {
257       ((Dialog) this.getParent()).setVisible(false);
258     }
259   }
260
261   protected void cancel()
262   {
263     textarea.setText("");
264     if (this.getParent() instanceof Frame)
265     {
266       ((Frame) this.getParent()).setVisible(false);
267     }
268     else
269     {
270       ((Dialog) this.getParent()).setVisible(false);
271     }
272   }
273
274   protected TextArea textarea = new TextArea();
275
276   Button accept = new Button("New Window");
277
278   Button addSequences = new Button("Add to Current Alignment");
279
280   Button cancel = new Button("Close");
281
282   protected Panel buttonPanel = new Panel();
283
284   BorderLayout borderLayout1 = new BorderLayout();
285
286   private void jbInit() throws Exception
287   {
288     textarea.setFont(new java.awt.Font("Monospaced", Font.PLAIN, 10));
289     textarea.setText("Paste your alignment file here");
290     textarea.addMouseListener(this);
291     this.setLayout(borderLayout1);
292     accept.addActionListener(this);
293     addSequences.addActionListener(this);
294     cancel.addActionListener(this);
295     this.add(buttonPanel, BorderLayout.SOUTH);
296     buttonPanel.add(accept, null);
297     buttonPanel.add(addSequences);
298     buttonPanel.add(cancel, null);
299     this.add(textarea, java.awt.BorderLayout.CENTER);
300   }
301
302   public void mousePressed(MouseEvent evt)
303   {
304     if (textarea.getText().startsWith("Paste your"))
305     {
306       textarea.setText("");
307     }
308   }
309
310   public void mouseReleased(MouseEvent evt)
311   {
312   }
313
314   public void mouseClicked(MouseEvent evt)
315   {
316   }
317
318   public void mouseEntered(MouseEvent evt)
319   {
320   }
321
322   public void mouseExited(MouseEvent evt)
323   {
324   }
325 }