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