recovery of identical dataset sequence object on undo (rather than creation of a...
[jalview.git] / src / jalview / appletgui / CutAndPasteTransfer.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 \r
20 package jalview.appletgui;\r
21 \r
22 import java.awt.*;\r
23 import java.awt.event.*;\r
24 \r
25 import jalview.datamodel.*;\r
26 import jalview.io.*;\r
27 \r
28 public class CutAndPasteTransfer\r
29     extends Panel implements ActionListener, MouseListener\r
30 {\r
31   boolean pdbImport = false;\r
32   boolean treeImport = false;\r
33   boolean annotationImport = false;\r
34   Sequence  seq;\r
35   AlignFrame alignFrame;\r
36 \r
37   public CutAndPasteTransfer(boolean forImport, AlignFrame alignFrame)\r
38   {\r
39     try\r
40     {\r
41       jbInit();\r
42     }\r
43     catch (Exception e)\r
44     {\r
45       e.printStackTrace();\r
46     }\r
47 \r
48     this.alignFrame = alignFrame;\r
49 \r
50     if (!forImport)\r
51     {\r
52       buttonPanel.setVisible(false);\r
53     }\r
54   }\r
55 \r
56   public String getText()\r
57   {\r
58     return textarea.getText();\r
59   }\r
60 \r
61   public void setText(String text)\r
62   {\r
63     textarea.setText(text);\r
64   }\r
65 \r
66   public void setPDBImport(Sequence seq)\r
67   {\r
68     this.seq = seq;\r
69     accept.setLabel("Accept");\r
70     addSequences.setVisible(false);\r
71     pdbImport = true;\r
72   }\r
73 \r
74   public void setTreeImport()\r
75   {\r
76     treeImport = true;\r
77     accept.setLabel("Accept");\r
78     addSequences.setVisible(false);\r
79   }\r
80 \r
81   public void setAnnotationImport()\r
82   {\r
83     annotationImport = true;\r
84     accept.setLabel("Accept");\r
85     addSequences.setVisible(false);\r
86   }\r
87 \r
88   public void actionPerformed(ActionEvent evt)\r
89   {\r
90     if (evt.getSource() == accept)\r
91     {\r
92       ok(true);\r
93     }\r
94     else if (evt.getSource() == addSequences)\r
95     {\r
96       ok(false);\r
97     }\r
98     else if (evt.getSource() == cancel)\r
99     {\r
100       cancel();\r
101     }\r
102   }\r
103 \r
104   protected void ok(boolean newWindow)\r
105   {\r
106     String text = getText();\r
107     int length = text.length();\r
108     textarea.append("\n");\r
109     if (textarea.getText().length() == length)\r
110     {\r
111       String warning =\r
112           "\n\n#################################################\n"\r
113           + "WARNING!! THIS IS THE MAXIMUM SIZE OF TEXTAREA!!\n"\r
114           + "\nCAN'T INPUT FULL ALIGNMENT"\r
115           + "\n\nYOU MUST DELETE THIS WARNING TO CONTINUE"\r
116           + "\n\nMAKE SURE LAST SEQUENCE PASTED IS COMPLETE"\r
117           + "\n#################################################\n";\r
118       textarea.setText(text.substring(0, text.length() - warning.length())\r
119                        + warning);\r
120 \r
121       textarea.setCaretPosition(text.length());\r
122     }\r
123 \r
124     if (pdbImport)\r
125     {\r
126       PDBEntry pdb = new PDBEntry();\r
127       pdb.setFile(text);\r
128 \r
129       if ( alignFrame.alignPanel.av.applet.jmolAvailable )\r
130         new jalview.appletgui.AppletJmol(pdb,\r
131                                          new Sequence[]{seq},\r
132                                          null,\r
133                                          alignFrame.alignPanel,\r
134                                          AppletFormatAdapter.PASTE);\r
135       else\r
136 \r
137         new MCview.AppletPDBViewer(pdb,\r
138                                    new Sequence[]{seq},\r
139                                    null,\r
140                                    alignFrame.alignPanel,\r
141                                    AppletFormatAdapter.PASTE);\r
142 \r
143     }\r
144     else if (treeImport)\r
145     {\r
146       try\r
147       {\r
148         jalview.io.NewickFile fin = new jalview.io.NewickFile(textarea.getText(),\r
149             "Paste");\r
150 \r
151         fin.parse();\r
152         if (fin.getTree() != null)\r
153         {\r
154           alignFrame.loadTree(fin, "Pasted tree file");\r
155         }\r
156 \r
157       }\r
158       catch (Exception ex)\r
159       {\r
160         textarea.setText("Could not parse Newick file!\n" + ex);\r
161         return;\r
162       }\r
163     }\r
164     else if (annotationImport)\r
165     {\r
166       if (new AnnotationFile().readAnnotationFile(\r
167           alignFrame.viewport.alignment, textarea.getText(),\r
168           jalview.io.AppletFormatAdapter.PASTE))\r
169       {\r
170         alignFrame.alignPanel.fontChanged();\r
171         alignFrame.alignPanel.setScrollValues(0, 0);\r
172 \r
173       }\r
174       else\r
175       {\r
176         alignFrame.parseFeaturesFile(textarea.getText(),\r
177                                      jalview.io.AppletFormatAdapter.PASTE);\r
178       }\r
179     }\r
180     else if (alignFrame != null)\r
181     {\r
182       Alignment al = null;\r
183 \r
184       String format = new IdentifyFile().Identify(text,\r
185                                                   AppletFormatAdapter.PASTE);\r
186       try\r
187       {\r
188         al = new AppletFormatAdapter().readFile(text, AppletFormatAdapter.PASTE,\r
189                                                 format);\r
190       }\r
191       catch (java.io.IOException ex)\r
192       {\r
193         ex.printStackTrace();\r
194       }\r
195 \r
196       if (al != null)\r
197       {\r
198         if (newWindow)\r
199         {\r
200           AlignFrame af = new AlignFrame(al, alignFrame.viewport.applet,\r
201                                          "Cut & Paste input - " + format,\r
202                                          false);\r
203           af.statusBar.setText("Successfully pasted alignment file");\r
204         }\r
205         else\r
206         {\r
207           alignFrame.addSequences(al.getSequencesArray());\r
208         }\r
209       }\r
210     }\r
211 \r
212     if (this.getParent() instanceof Frame)\r
213     {\r
214       ( (Frame)this.getParent()).setVisible(false);\r
215     }\r
216     else\r
217     {\r
218       ( (Dialog)this.getParent()).setVisible(false);\r
219     }\r
220   }\r
221 \r
222   protected void cancel()\r
223   {\r
224     textarea.setText("");\r
225     if (this.getParent() instanceof Frame)\r
226     {\r
227       ( (Frame)this.getParent()).setVisible(false);\r
228     }\r
229     else\r
230     {\r
231       ( (Dialog)this.getParent()).setVisible(false);\r
232     }\r
233   }\r
234 \r
235   protected TextArea textarea = new TextArea();\r
236   Button accept = new Button("New Window");\r
237   Button addSequences = new Button("Add to Current Alignment");\r
238   Button cancel = new Button("Close");\r
239 \r
240   protected Panel buttonPanel = new Panel();\r
241   BorderLayout borderLayout1 = new BorderLayout();\r
242 \r
243   private void jbInit()\r
244       throws Exception\r
245   {\r
246     textarea.setFont(new java.awt.Font("Monospaced", Font.PLAIN, 10));\r
247     textarea.setText("Paste your alignment file here");\r
248     textarea.addMouseListener(this);\r
249     this.setLayout(borderLayout1);\r
250     accept.addActionListener(this);\r
251     addSequences.addActionListener(this);\r
252     cancel.addActionListener(this);\r
253     this.add(buttonPanel, BorderLayout.SOUTH);\r
254     buttonPanel.add(accept, null);\r
255     buttonPanel.add(addSequences);\r
256     buttonPanel.add(cancel, null);\r
257     this.add(textarea, java.awt.BorderLayout.CENTER);\r
258   }\r
259 \r
260   public void mousePressed(MouseEvent evt)\r
261   {\r
262     if (textarea.getText().startsWith("Paste your"))\r
263     {\r
264       textarea.setText("");\r
265     }\r
266   }\r
267 \r
268   public void mouseReleased(MouseEvent evt)\r
269   {}\r
270 \r
271   public void mouseClicked(MouseEvent evt)\r
272   {}\r
273 \r
274   public void mouseEntered(MouseEvent evt)\r
275   {}\r
276 \r
277   public void mouseExited(MouseEvent evt)\r
278   {}\r
279 }\r