b492ddfb51ce34a60a066b6d9410d615ab9e246c
[jalview.git] / src / jalview / gui / CutAndPasteTransfer.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
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
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.gui;
22
23 import jalview.api.AlignViewportI;
24 import jalview.api.AlignmentViewPanel;
25 import jalview.api.ComplexAlignFile;
26 import jalview.datamodel.AlignmentI;
27 import jalview.datamodel.ColumnSelection;
28 import jalview.datamodel.SequenceI;
29 import jalview.io.FileParse;
30 import jalview.io.FormatAdapter;
31 import jalview.io.IdentifyFile;
32 import jalview.io.JalviewFileChooser;
33 import jalview.io.JalviewFileView;
34 import jalview.jbgui.GCutAndPasteTransfer;
35 import jalview.schemes.ColourSchemeI;
36 import jalview.util.MessageManager;
37
38 import java.awt.Toolkit;
39 import java.awt.datatransfer.Clipboard;
40 import java.awt.datatransfer.DataFlavor;
41 import java.awt.datatransfer.StringSelection;
42 import java.awt.datatransfer.Transferable;
43 import java.awt.event.ActionEvent;
44 import java.awt.event.ActionListener;
45 import java.awt.event.MouseEvent;
46
47 import javax.swing.JMenuItem;
48 import javax.swing.JOptionPane;
49 import javax.swing.JPopupMenu;
50 import javax.swing.SwingUtilities;
51
52 /**
53  * Cut'n'paste files into the desktop See JAL-1105
54  * 
55  * @author $author$
56  * @version $Revision$
57  */
58 public class CutAndPasteTransfer extends GCutAndPasteTransfer
59 {
60
61   AlignmentViewPanel alignpanel;
62
63   AlignViewportI viewport;
64
65   FileParse source = null;
66   public CutAndPasteTransfer()
67   {
68     SwingUtilities.invokeLater(new Runnable()
69     {
70       public void run()
71       {
72         textarea.requestFocus();
73       }
74     });
75
76   }
77
78   /**
79    * DOCUMENT ME!
80    */
81   public void setForInput(AlignmentViewPanel viewpanel)
82   {
83     this.alignpanel = viewpanel;
84     if (alignpanel != null)
85     {
86
87     }
88     this.viewport = alignpanel.getAlignViewport();
89     if (viewport != null)
90     {
91       ok.setText(MessageManager.getString("action.add"));
92     }
93
94     getContentPane().add(inputButtonPanel, java.awt.BorderLayout.SOUTH);
95   }
96
97   /**
98    * DOCUMENT ME!
99    * 
100    * @return DOCUMENT ME!
101    */
102   public String getText()
103   {
104     return textarea.getText();
105   }
106
107   /**
108    * DOCUMENT ME!
109    * 
110    * @param text
111    *          DOCUMENT ME!
112    */
113   public void setText(String text)
114   {
115     textarea.setText(text);
116   }
117
118   public void appendText(String text)
119   {
120     textarea.append(text);
121   }
122
123   public void save_actionPerformed(ActionEvent e)
124   {
125     JalviewFileChooser chooser = new JalviewFileChooser(
126             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
127
128     chooser.setAcceptAllFileFilterUsed(false);
129     chooser.setFileView(new JalviewFileView());
130     chooser.setDialogTitle(MessageManager.getString("label.save_text_to_file"));
131     chooser.setToolTipText(MessageManager.getString("action.save"));
132
133     int value = chooser.showSaveDialog(this);
134
135     if (value == JalviewFileChooser.APPROVE_OPTION)
136     {
137       try
138       {
139         java.io.PrintWriter out = new java.io.PrintWriter(
140                 new java.io.FileWriter(chooser.getSelectedFile()));
141
142         out.print(getText());
143         out.close();
144       } catch (Exception ex)
145       {
146         ex.printStackTrace();
147       }
148
149     }
150   }
151
152   /**
153    * DOCUMENT ME!
154    * 
155    * @param e
156    *          DOCUMENT ME!
157    */
158   public void copyItem_actionPerformed(ActionEvent e)
159   {
160     textarea.getSelectedText();
161     Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
162     c.setContents(new StringSelection(textarea.getSelectedText()), null);
163   }
164
165   /**
166    * DOCUMENT ME!
167    * 
168    * @param e
169    *          DOCUMENT ME!
170    */
171   public void pasteMenu_actionPerformed(ActionEvent e)
172   {
173     Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
174     Transferable contents = c.getContents(this);
175
176     if (contents == null)
177     {
178       return;
179     }
180
181     try
182     {
183       textarea.append((String) contents
184               .getTransferData(DataFlavor.stringFlavor));
185     } catch (Exception ex)
186     {
187     }
188   }
189
190   /**
191    * DOCUMENT ME!
192    * 
193    * @param e
194    *          DOCUMENT ME!
195    */
196   public void ok_actionPerformed(ActionEvent e)
197   {
198     String format = new IdentifyFile().Identify(getText(), "Paste");
199     // TODO: identify feature, annotation or tree file and parse appropriately.
200     AlignmentI al = null;
201
202     if (FormatAdapter.isValidFormat(format))
203     {
204       try
205       {
206         FormatAdapter fa = new FormatAdapter(alignpanel);
207         al = fa.readFile(getText(), "Paste", format);
208         source = fa.getAlignFile();
209
210       } catch (java.io.IOException ex)
211       {
212         JOptionPane.showInternalMessageDialog(Desktop.desktop,
213                 MessageManager.formatMessage(
214                         "label.couldnt_read_pasted_text", new String[]
215                         { ex.toString() }), MessageManager
216                         .getString("label.error_parsing_text"),
217                 JOptionPane.WARNING_MESSAGE);
218       }
219     }
220
221     if (al != null)
222     {
223       String title = MessageManager.formatMessage(
224               "label.input_cut_paste_params", new String[]
225               { format });
226       if (viewport != null)
227       {
228         ((AlignViewport) viewport).addAlignment(al, title);
229       }
230       else
231       {
232
233         AlignFrame af;
234         if (source instanceof ComplexAlignFile)
235         {
236           ColumnSelection colSel = ((ComplexAlignFile) source)
237                   .getColumnSelection();
238           SequenceI[] hiddenSeqs = ((ComplexAlignFile) source)
239                   .getHiddenSequences();
240           boolean showSeqFeatures = ((ComplexAlignFile) source)
241                   .isShowSeqFeatures();
242           ColourSchemeI cs = ((ComplexAlignFile) source).getColourScheme();
243           af = new AlignFrame(al, hiddenSeqs, colSel,
244                   AlignFrame.DEFAULT_WIDTH,
245                   AlignFrame.DEFAULT_HEIGHT);
246
247           af.getViewport().setShowSequenceFeatures(showSeqFeatures);
248           af.changeColour(cs);
249         }
250         else
251         {
252           af = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
253                   AlignFrame.DEFAULT_HEIGHT);
254         }
255
256         af.currentFileFormat = format;
257         Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH,
258                 AlignFrame.DEFAULT_HEIGHT);
259         af.statusBar.setText(MessageManager
260                 .getString("label.successfully_pasted_alignment_file"));
261
262         try
263         {
264           af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN",
265                   false));
266         } catch (Exception ex)
267         {
268         }
269       }
270     }
271   }
272
273
274   /**
275    * DOCUMENT ME!
276    * 
277    * @param e
278    *          DOCUMENT ME!
279    */
280   public void cancel_actionPerformed(ActionEvent e)
281   {
282     try
283     {
284       this.setClosed(true);
285     } catch (Exception ex)
286     {
287     }
288   }
289
290   public void textarea_mousePressed(MouseEvent e)
291   {
292     if (SwingUtilities.isRightMouseButton(e))
293     {
294       JPopupMenu popup = new JPopupMenu(
295               MessageManager.getString("action.edit"));
296       JMenuItem item = new JMenuItem(
297               MessageManager.getString("action.copy"));
298       item.addActionListener(new ActionListener()
299       {
300         public void actionPerformed(ActionEvent e)
301         {
302           copyItem_actionPerformed(e);
303         }
304       });
305       popup.add(item);
306       item = new JMenuItem(MessageManager.getString("action.paste"));
307       item.addActionListener(new ActionListener()
308       {
309         public void actionPerformed(ActionEvent e)
310         {
311           pasteMenu_actionPerformed(e);
312         }
313       });
314       popup.add(item);
315       popup.show(this, e.getX() + 10, e.getY() + textarea.getY() + 40);
316
317     }
318   }
319
320 }