maintain slider values when click on a group
[jalview.git] / src / jalview / gui / Desktop.java
1 /********************\r
2  * 2004 Jalview Reengineered\r
3  * Barton Group\r
4  * Dundee University\r
5  *\r
6  * AM Waterhouse\r
7  *******************/\r
8 \r
9 \r
10 package jalview.gui;\r
11 \r
12 import jalview.gui.*;\r
13 import jalview.io.*;\r
14 import jalview.datamodel.*;\r
15 import jalview.schemes.*;\r
16 import javax.swing.*;\r
17 import java.awt.*;\r
18 import java.awt.event.*;\r
19 \r
20 \r
21 public class Desktop extends jalview.jbgui.GDesktop\r
22 {\r
23   public static JDesktopPane desktop;\r
24   static int openFrameCount = 0;\r
25   static final int xOffset = 30, yOffset = 30;\r
26 \r
27   public Desktop()\r
28   {\r
29     Image image =null;\r
30     try{\r
31       java.net.URL url = getClass().getResource("/images/logo.gif");\r
32       if(url!=null)\r
33       {\r
34         image = java.awt.Toolkit.getDefaultToolkit().createImage(url);\r
35         MediaTracker mt = new MediaTracker(this);\r
36         mt.addImage(image, 0);\r
37         mt.waitForID(0);\r
38         setIconImage(image);\r
39       }\r
40 \r
41     }catch(Exception ex){}\r
42 \r
43     setTitle("Jalview 2005");\r
44     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
45     desktop = new JDesktopPane();\r
46     desktop.setBackground(Color.white);\r
47     setContentPane(desktop);\r
48     desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);\r
49 \r
50     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();\r
51     String x = jalview.bin.Cache.getProperty("SCREEN_X");\r
52     String y = jalview.bin.Cache.getProperty("SCREEN_Y");\r
53     String width = jalview.bin.Cache.getProperty("SCREEN_WIDTH");\r
54     String height = jalview.bin.Cache.getProperty("SCREEN_HEIGHT");\r
55 \r
56     if(x!=null && y!=null && width!=null && height!=null)\r
57     {\r
58       setBounds( Integer.parseInt(x), Integer.parseInt(y),\r
59                  Integer.parseInt(width), Integer.parseInt(height));\r
60     }\r
61     else\r
62       setBounds( (int)(screenSize.width-900)/2,\r
63            (int)(screenSize.height-650)/2,\r
64           900 ,\r
65           650);\r
66 \r
67 this.addWindowListener(new WindowAdapter()\r
68 {\r
69 public void windowClosing(WindowEvent evt)\r
70 {\r
71  jalview.bin.Cache.setProperty("SCREEN_X",\r
72                                getBounds().x + "");\r
73  jalview.bin.Cache.setProperty("SCREEN_Y",\r
74                                getBounds().y + "");\r
75  jalview.bin.Cache.setProperty("SCREEN_WIDTH", getWidth() + "");\r
76  jalview.bin.Cache.setProperty("SCREEN_HEIGHT", getHeight() + "");\r
77 }\r
78 });\r
79       setVisible(true);\r
80 \r
81 /////////Add a splashscreen on startup\r
82 \r
83 \r
84    /////////Add a splashscreen on startup\r
85     JInternalFrame frame = new JInternalFrame();\r
86 \r
87     SplashScreen splash = new SplashScreen(frame, image);\r
88     frame.setContentPane(splash);\r
89     desktop.add(frame);\r
90 \r
91     openFrameCount++;\r
92     try\r
93     {\r
94       frame.setSelected(true);\r
95     }\r
96     catch (java.beans.PropertyVetoException e)\r
97     {}\r
98     frame.setResizable(true);\r
99     frame.setSize(750, 160);\r
100     frame.setLocation( (int)((getWidth()-750) /2), (int)((getHeight()-160) /2));\r
101     frame.setClosable(false);\r
102     frame.setIconifiable(false);\r
103     frame.setMaximizable(false);\r
104     frame.setFrameIcon(null);\r
105     frame.setVisible(true);\r
106 \r
107   }\r
108 \r
109   public static void addInternalFrame(final JInternalFrame frame, String title, int w, int h)\r
110   {\r
111    desktop.add(frame);\r
112    openFrameCount++;\r
113    try {\r
114        frame.setSelected(true);\r
115    } catch (java.beans.PropertyVetoException e) {}\r
116    frame.setTitle(title);\r
117    frame.setResizable(true);\r
118    frame.setSize(w,h);\r
119    frame.setClosable(true);\r
120    frame.setMaximizable(true);\r
121    frame.setIconifiable(true);\r
122    frame.setFrameIcon(null);\r
123    frame.setLocation(xOffset*openFrameCount, yOffset*openFrameCount);\r
124    frame.toFront();\r
125    final JMenuItem menuItem = new JMenuItem(title);\r
126    frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
127                                    { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
128                                      {\r
129                                        openFrameCount--;\r
130                                        windowMenu.remove(menuItem);\r
131                                      };\r
132                                    });\r
133 \r
134    menuItem.addActionListener(new ActionListener()\r
135     {\r
136       public void actionPerformed(ActionEvent e)\r
137       {\r
138         try{  frame.setSelected(true);   frame.setIcon(false); }\r
139         catch(java.beans.PropertyVetoException ex){};\r
140       }\r
141     });\r
142 \r
143    frame.setVisible(true);\r
144    windowMenu.add(menuItem);\r
145  }\r
146 \r
147 \r
148 \r
149  public void inputLocalFileMenuItem_actionPerformed(ActionEvent e)\r
150  {\r
151    JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty("LAST_DIRECTORY"),\r
152        new String[]{"fa", "fasta", "fastq", "blc", "msf", "pfam", "aln", "pir"}, "Alignment files");\r
153    chooser.setFileView(new JalviewFileView());\r
154    chooser.setDialogTitle("Open local file");\r
155    chooser.setToolTipText("Open");\r
156    int value = chooser.showOpenDialog(this);\r
157    if(value == JalviewFileChooser.APPROVE_OPTION)\r
158    {\r
159      String choice =  chooser.getSelectedFile().getPath();\r
160      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
161      String format = IdentifyFile.Identify(choice, "File");\r
162      LoadFile(choice, "File", format);\r
163    }\r
164  }\r
165 \r
166  public void LoadFile(String file, String protocol,  String format)\r
167  {\r
168    SequenceI [] sequences = null;\r
169 \r
170    if (FormatProperties.contains(format))\r
171        sequences = FormatAdapter.read(file, protocol, format);\r
172 \r
173    if (sequences != null)\r
174    {\r
175      AlignFrame af = new AlignFrame(new Alignment(sequences));\r
176      addInternalFrame(af, file, 700, 500);\r
177      af.statusBar.setText("Successfully loaded file " + file);\r
178 \r
179    }\r
180    else\r
181      JOptionPane.showInternalMessageDialog(Desktop.desktop,  "Couldn't open file.\n"\r
182                           + "Formats currently supported are\n"\r
183                           + "Fasta, MSF, Clustal, BLC, PIR, MSP or PFAM" // JBPNote - message should be generated through FormatAdapter!\r
184                           ,"Error loading file",\r
185                                    JOptionPane.WARNING_MESSAGE);\r
186 \r
187  }\r
188 \r
189  public void inputURLMenuItem_actionPerformed(ActionEvent e)\r
190  {\r
191    String url = JOptionPane.showInternalInputDialog(Desktop.desktop,"Enter url of input file",\r
192                                             "Input alignment from URL",\r
193                                             JOptionPane.QUESTION_MESSAGE);\r
194    if (url == null)\r
195      return;\r
196 \r
197    String format = IdentifyFile.Identify(url, "URL");\r
198 \r
199    System.out.println(format +" format");\r
200    if (format.equals("URL NOT FOUND"))\r
201    {\r
202      JOptionPane.showInternalMessageDialog(Desktop.desktop,"Couldn't locate " + url,\r
203                                    "URL not found",\r
204                                    JOptionPane.WARNING_MESSAGE);\r
205      return;\r
206    }\r
207 \r
208     LoadFile(url, "URL", format);\r
209  }\r
210 \r
211  public void inputTextboxMenuItem_actionPerformed(ActionEvent e)\r
212  {\r
213    CutAndPasteTransfer cap = new CutAndPasteTransfer(true);\r
214    int accept =  JOptionPane.showInternalOptionDialog(Desktop.desktop, cap, "Cut & paste Alignment File",\r
215                                        JOptionPane.YES_NO_CANCEL_OPTION,\r
216                                        JOptionPane.PLAIN_MESSAGE,\r
217                                        null,\r
218                                        new Object[]{"Accept", "Cancel", }, null);\r
219 \r
220 \r
221   if(accept == JOptionPane.YES_OPTION)\r
222   {\r
223     String format = IdentifyFile.Identify(cap.getText(), "Paste");\r
224     SequenceI [] sequences = null;\r
225 \r
226     if (FormatProperties.contains( format ))\r
227       sequences = FormatAdapter.read(cap.getText(), "Paste", format);\r
228 \r
229 \r
230       if(sequences!=null)\r
231       {\r
232         AlignFrame af = new AlignFrame(new Alignment(sequences));\r
233         addInternalFrame(af, "Cut & Paste input - "+format, 700, 500);\r
234         af.statusBar.setText("Successfully pasted alignment file");\r
235       }\r
236       else\r
237         JOptionPane.showInternalMessageDialog(Desktop.desktop, "Couldn't read the pasted text.\n"\r
238                                       +"Formats currently supported are\n"\r
239                                       +"Fasta, MSF, Clustal, BLC, PIR, MSP or PFAM",\r
240                                       "Error parsing text", JOptionPane.WARNING_MESSAGE);\r
241 \r
242    }\r
243  }\r
244 \r
245 /*\r
246 * Exit the program\r
247 */\r
248  public void quit_actionPerformed(ActionEvent e)\r
249  {\r
250    if(jalview.bin.Jalview.applet!=null)\r
251      jalview.bin.Jalview.applet.destroy();\r
252     else\r
253       System.exit(0);\r
254  }\r
255 \r
256 \r
257 \r
258  public void aboutMenuItem_actionPerformed(ActionEvent e)\r
259  {\r
260    JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
261                                          "JalView 2005 version " + jalview.bin.Cache.VERSION+"; last updated: "+jalview.bin.Cache.BUILD_DATE\r
262                                        +"\nAuthors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton."\r
263                                        +"\nCurrent development managed by Andrew Waterhouse; Barton Group, University of Dundee."\r
264                                        +"\nIf  you use JalView, please cite:  \"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",\r
265                                          "About Jalview",\r
266                                          JOptionPane.INFORMATION_MESSAGE);\r
267  }\r
268 \r
269  public void documentationMenuItem_actionPerformed(ActionEvent e)\r
270  {\r
271    try\r
272    {\r
273       ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();\r
274       java.net.URL url = javax.help.HelpSet.findHelpSet(cl,"help/help");\r
275       javax.help.HelpSet hs = new javax.help.HelpSet(cl,url);\r
276 \r
277       javax.help.HelpBroker hb = hs.createHelpBroker();\r
278       hb.setLocation(new Point(200, 50));\r
279       hb.setSize(new Dimension(800,700));\r
280       hb.setCurrentID("home");\r
281       hb.setDisplayed(true);\r
282    }\r
283    catch (Exception ex)\r
284    {\r
285      ex.printStackTrace();\r
286    }\r
287  }\r
288 \r
289  static JInternalFrame conservationSlider;\r
290  static JInternalFrame PIDSlider;\r
291  public static int setConservationSliderSource(AlignmentPanel ap, ColourSchemeI cs, String source)\r
292  {\r
293    SliderPanel sp = null;\r
294    ConservationColourScheme ccs = (ConservationColourScheme)cs;\r
295    int value = ccs.inc;\r
296 \r
297    if(conservationSlider == null)\r
298    {\r
299      sp = new SliderPanel(ap, value, true, cs);\r
300      conservationSlider = new JInternalFrame();\r
301      conservationSlider.setContentPane(sp);\r
302      addInternalFrame(conservationSlider, "Conservation Colour Increment  ("+source+")", 420, 90);\r
303      conservationSlider.setResizable(false);\r
304      conservationSlider.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
305                   {\r
306                     public void internalFrameClosed(javax.swing.event.InternalFrameEvent e)\r
307                     {\r
308                       conservationSlider = null;\r
309                     }\r
310                   });\r
311    }\r
312    else\r
313    {\r
314 \r
315        conservationSlider.setTitle("Conservation Colour Increment  ("+source+")");\r
316        sp = (SliderPanel)conservationSlider.getContentPane();\r
317        sp.cs = cs;\r
318        sp.setValue(value);\r
319    }\r
320 \r
321    if(ap.av.alignment.getGroups()!=null)\r
322      sp.setAllGroupsCheckEnabled( true );\r
323    else\r
324      sp.setAllGroupsCheckEnabled( false);\r
325 \r
326    return sp.getValue();\r
327 \r
328  }\r
329 \r
330  public static void hideConservationSlider()\r
331  {\r
332   try{\r
333     conservationSlider.setClosed(true);\r
334     conservationSlider = null;\r
335   }catch(Exception ex){}\r
336 }\r
337 \r
338 \r
339  public static void hidePIDSlider()\r
340  {\r
341    try{\r
342      PIDSlider.setClosed(true);\r
343      PIDSlider = null;\r
344    }catch(Exception ex){}\r
345  }\r
346 \r
347  public static int setPIDSliderSource(AlignmentPanel ap, ColourSchemeI cs, String source)\r
348  {\r
349    SliderPanel pid = null;\r
350    if(PIDSlider == null)\r
351    {\r
352      pid = new SliderPanel(ap, 50, false, cs);\r
353      PIDSlider = new JInternalFrame();\r
354      PIDSlider.setContentPane(pid);\r
355      addInternalFrame(PIDSlider, "Percentage Identity Threshold ("+source+")", 420, 90);\r
356      PIDSlider.setResizable(false);\r
357    }\r
358    else\r
359    {\r
360        PIDSlider.setTitle("Percentage Identity Threshold ("+source+")");\r
361        pid = (SliderPanel)PIDSlider.getContentPane();\r
362        pid.cs = cs;\r
363    }\r
364 \r
365    if (ap.av.alignment.getGroups() != null)\r
366      pid.setAllGroupsCheckEnabled(true);\r
367    else\r
368      pid.setAllGroupsCheckEnabled(false);\r
369 \r
370 \r
371    return pid.getValue();\r
372 \r
373  }\r
374 \r
375 }\r