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