update author list in license for (JAL-826)
[jalview.git] / src / jalview / gui / AnnotationExporter.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)\r
3  * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle\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 of the License, or (at your option) any later version.\r
10  * \r
11  * Jalview is distributed in the hope that it will be useful, but \r
12  * WITHOUT ANY WARRANTY; without even the implied warranty \r
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
14  * PURPOSE.  See the GNU General Public License for more details.\r
15  * \r
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
17  */\r
18 package jalview.gui;\r
19 \r
20 import java.util.*;\r
21 \r
22 import java.awt.*;\r
23 import java.awt.event.*;\r
24 import javax.swing.*;\r
25 \r
26 import jalview.datamodel.*;\r
27 import jalview.io.*;\r
28 \r
29 /**\r
30  * \r
31  * GUI dialog for exporting features or alignment annotations depending upon\r
32  * which method is called.\r
33  * \r
34  * @author AMW\r
35  * \r
36  */\r
37 public class AnnotationExporter extends JPanel\r
38 {\r
39   JInternalFrame frame;\r
40 \r
41   AlignmentPanel ap;\r
42 \r
43   boolean features = true;\r
44 \r
45   AlignmentAnnotation[] annotations;\r
46 \r
47   Vector sequenceGroups;\r
48 \r
49   Hashtable alignmentProperties;\r
50 \r
51   public AnnotationExporter()\r
52   {\r
53     try\r
54     {\r
55       jbInit();\r
56     } catch (Exception ex)\r
57     {\r
58       ex.printStackTrace();\r
59     }\r
60 \r
61     frame = new JInternalFrame();\r
62     frame.setContentPane(this);\r
63     frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
64     Desktop.addInternalFrame(frame, "", frame.getPreferredSize().width, frame.getPreferredSize().height);\r
65   }\r
66 \r
67   public void exportFeatures(AlignmentPanel ap)\r
68   {\r
69     this.ap = ap;\r
70     features = true;\r
71     CSVFormat.setVisible(false);\r
72     frame.setTitle("Export Features");\r
73   }\r
74 \r
75   public void exportAnnotations(AlignmentPanel ap,\r
76           AlignmentAnnotation[] annotations, Vector sequenceGroups,\r
77           Hashtable alProperties)\r
78   {\r
79     this.ap = ap;\r
80     features = false;\r
81     GFFFormat.setVisible(false);\r
82     CSVFormat.setVisible(true);\r
83     this.annotations = annotations;\r
84     this.sequenceGroups = sequenceGroups;\r
85     this.alignmentProperties = alProperties;\r
86     frame.setTitle("Export Annotations");\r
87   }\r
88 \r
89   public void toFile_actionPerformed(ActionEvent e)\r
90   {\r
91     JalviewFileChooser chooser = new JalviewFileChooser(\r
92             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));\r
93 \r
94     chooser.setFileView(new JalviewFileView());\r
95     chooser.setDialogTitle(features ? "Save Features to File"\r
96             : "Save Annotation to File");\r
97     chooser.setToolTipText("Save");\r
98 \r
99     int value = chooser.showSaveDialog(this);\r
100 \r
101     if (value == JalviewFileChooser.APPROVE_OPTION)\r
102     {\r
103       String text = "No features found on alignment";\r
104       if (features)\r
105       {\r
106         if (GFFFormat.isSelected())\r
107         {\r
108           text = new FeaturesFile().printGFFFormat(ap.av.alignment\r
109                   .getDataset().getSequencesArray(),\r
110                   getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());// ap.av.featuresDisplayed//);\r
111         }\r
112         else\r
113         {\r
114           text = new FeaturesFile().printJalviewFormat(ap.av.alignment\r
115                   .getDataset().getSequencesArray(),\r
116                   getDisplayedFeatureCols(), true, ap.av.isShowNpFeats()); // ap.av.featuresDisplayed);\r
117         }\r
118       }\r
119       else\r
120       {\r
121         if (CSVFormat.isSelected())\r
122         {\r
123           text = new AnnotationFile().printCSVAnnotations(annotations);\r
124         }\r
125         else\r
126         {\r
127           text = new AnnotationFile().printAnnotations(annotations,\r
128                   sequenceGroups, alignmentProperties);\r
129         }\r
130       }\r
131 \r
132       try\r
133       {\r
134         java.io.PrintWriter out = new java.io.PrintWriter(\r
135                 new java.io.FileWriter(chooser.getSelectedFile()));\r
136 \r
137         out.print(text);\r
138         out.close();\r
139       } catch (Exception ex)\r
140       {\r
141         ex.printStackTrace();\r
142       }\r
143     }\r
144 \r
145     close_actionPerformed(null);\r
146   }\r
147 \r
148   public void toTextbox_actionPerformed(ActionEvent e)\r
149   {\r
150     String text = "No features found on alignment";\r
151     if (features)\r
152     {\r
153       if (GFFFormat.isSelected())\r
154       {\r
155         text = new FeaturesFile().printGFFFormat(ap.av.alignment\r
156                 .getDataset().getSequencesArray(),\r
157                 getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());\r
158       }\r
159       else\r
160       {\r
161         text = new FeaturesFile().printJalviewFormat(ap.av.alignment\r
162                 .getDataset().getSequencesArray(),\r
163                 getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());\r
164       }\r
165     }\r
166     else if (!features)\r
167     {\r
168       if (CSVFormat.isSelected())\r
169       {\r
170         text = new AnnotationFile().printCSVAnnotations(annotations);\r
171       }\r
172       else\r
173       {\r
174         text = new AnnotationFile().printAnnotations(annotations,\r
175                 sequenceGroups, alignmentProperties);\r
176       }\r
177     }\r
178 \r
179     CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
180     try\r
181     {\r
182       cap.setText(text);\r
183       Desktop.addInternalFrame(cap, (features ? "Features for - "\r
184               : "Annotations for - ") + ap.alignFrame.getTitle(), 600, 500);\r
185     } catch (OutOfMemoryError oom)\r
186     {\r
187       new OOMWarning("generating "\r
188               + (features ? "Features for - " : "Annotations for - ")\r
189               + ap.alignFrame.getTitle(), oom);\r
190       cap.dispose();\r
191     }\r
192 \r
193     close_actionPerformed(null);\r
194   }\r
195 \r
196   private Hashtable getDisplayedFeatureCols()\r
197   {\r
198     Hashtable fcols = new Hashtable();\r
199     if (ap.av.featuresDisplayed == null)\r
200     {\r
201       return fcols;\r
202     }\r
203     Enumeration en = ap.av.featuresDisplayed.keys();\r
204     FeatureRenderer fr = ap.seqPanel.seqCanvas.getFeatureRenderer(); // consider\r
205                                                                      // higher\r
206                                                                      // level\r
207                                                                      // method ?\r
208     while (en.hasMoreElements())\r
209     {\r
210       Object col = en.nextElement();\r
211       fcols.put(col, fr.featureColours.get(col));\r
212     }\r
213     return fcols;\r
214   }\r
215 \r
216   public void close_actionPerformed(ActionEvent e)\r
217   {\r
218     try\r
219     {\r
220       frame.setClosed(true);\r
221     } catch (java.beans.PropertyVetoException ex)\r
222     {\r
223     }\r
224   }\r
225 \r
226   private void jbInit() throws Exception\r
227   {\r
228     this.setLayout(new BorderLayout());\r
229     \r
230     toFile.setText("to File");\r
231     toFile.addActionListener(new ActionListener()\r
232     {\r
233       public void actionPerformed(ActionEvent e)\r
234       {\r
235         toFile_actionPerformed(e);\r
236       }\r
237     });\r
238     toTextbox.setText("to Textbox");\r
239     toTextbox.addActionListener(new ActionListener()\r
240     {\r
241       public void actionPerformed(ActionEvent e)\r
242       {\r
243         toTextbox_actionPerformed(e);\r
244       }\r
245     });\r
246     close.setText("Close");\r
247     close.addActionListener(new ActionListener()\r
248     {\r
249       public void actionPerformed(ActionEvent e)\r
250       {\r
251         close_actionPerformed(e);\r
252       }\r
253     });\r
254     jalviewFormat.setOpaque(false);\r
255     jalviewFormat.setSelected(true);\r
256     jalviewFormat.setText("Jalview");\r
257     GFFFormat.setOpaque(false);\r
258     GFFFormat.setText("GFF");\r
259     CSVFormat.setOpaque(false);\r
260     CSVFormat.setText("CSV(Spreadsheet)");\r
261     jLabel1.setHorizontalAlignment(SwingConstants.TRAILING);\r
262     jLabel1.setText("Format: ");\r
263     this.setBackground(Color.white);\r
264     jPanel3.setBorder(BorderFactory.createEtchedBorder());\r
265     jPanel3.setOpaque(false);\r
266     jPanel1.setOpaque(false);\r
267     jPanel1.add(toFile);\r
268     jPanel1.add(toTextbox);\r
269     jPanel1.add(close);\r
270     jPanel3.add(jLabel1);\r
271     jPanel3.add(jalviewFormat);\r
272     jPanel3.add(GFFFormat);\r
273     jPanel3.add(CSVFormat);\r
274     buttonGroup.add(jalviewFormat);\r
275     buttonGroup.add(GFFFormat);\r
276     buttonGroup.add(CSVFormat);\r
277     this.add(jPanel3, BorderLayout.CENTER);\r
278     this.add(jPanel1, BorderLayout.SOUTH);\r
279   }\r
280 \r
281   JPanel jPanel1 = new JPanel();\r
282 \r
283   JButton toFile = new JButton();\r
284 \r
285   JButton toTextbox = new JButton();\r
286 \r
287   JButton close = new JButton();\r
288 \r
289   ButtonGroup buttonGroup = new ButtonGroup();\r
290 \r
291   JRadioButton jalviewFormat = new JRadioButton();\r
292 \r
293   JRadioButton GFFFormat = new JRadioButton();\r
294 \r
295   JRadioButton CSVFormat = new JRadioButton();\r
296 \r
297   JLabel jLabel1 = new JLabel();\r
298 \r
299   JPanel jPanel3 = new JPanel();\r
300 \r
301   FlowLayout flowLayout1 = new FlowLayout();\r
302 \r
303 }\r