in progress
[jalview.git] / forester / java / src / org / forester / archaeopteryx / MainPanel.java
1 // $Id:
2 // FORESTER -- software libraries and applications
3 // for evolutionary biology research and applications.
4 //
5 // Copyright (C) 2008-2009 Christian M. Zmasek
6 // Copyright (C) 2008-2009 Burnham Institute for Medical Research
7 // Copyright (C) 2000-2001 Washington University School of Medicine
8 // and Howard Hughes Medical Institute
9 // Copyright (C) 2003-2007 Ethalinda K.S. Cannon
10 // All rights reserved
11 //
12 // This library is free software; you can redistribute it and/or
13 // modify it under the terms of the GNU Lesser General Public
14 // License as published by the Free Software Foundation; either
15 // version 2.1 of the License, or (at your option) any later version.
16 //
17 // This library is distributed in the hope that it will be useful,
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 // Lesser General Public License for more details.
21 //
22 // You should have received a copy of the GNU Lesser General Public
23 // License along with this library; if not, write to the Free Software
24 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 //
26 // Contact: phylosoft @ gmail . com
27 // WWW: https://sites.google.com/site/cmzmasek/home/software/forester
28
29 package org.forester.archaeopteryx;
30
31 import java.awt.BorderLayout;
32 import java.awt.Dimension;
33 import java.awt.event.AdjustmentEvent;
34 import java.awt.event.AdjustmentListener;
35 import java.awt.event.ComponentEvent;
36 import java.awt.event.ComponentListener;
37 import java.awt.image.BufferedImage;
38 import java.util.ArrayList;
39 import java.util.HashMap;
40 import java.util.Hashtable;
41 import java.util.List;
42 import java.util.Map;
43 import java.util.Set;
44
45 import javax.swing.JPanel;
46 import javax.swing.JScrollPane;
47 import javax.swing.JTabbedPane;
48 import javax.swing.SwingConstants;
49 import javax.swing.event.ChangeEvent;
50 import javax.swing.event.ChangeListener;
51
52 import org.forester.archaeopteryx.phylogeny.data.RenderableDomainArchitecture;
53 import org.forester.phylogeny.Phylogeny;
54 import org.forester.util.ForesterUtil;
55
56 public class MainPanel extends JPanel implements ComponentListener {
57
58     private static final long                serialVersionUID = -2682765312661416435L;
59     MainFrame                                _mainframe;
60     List<TreePanel>                          _treepanels;
61     ControlPanel                             _control_panel;
62     private List<JScrollPane>                _treegraphic_scroll_panes;
63     private List<JPanel>                     _treegraphic_scroll_pane_panels;
64     Configuration                            _configuration;
65     private JTabbedPane                      _tabbed_pane;
66     private TreeColorSet                     _colorset;
67     private TreeFontSet                      _fontset;
68     private Phylogeny                        _cut_or_copied_tree;
69     private Set<Long>                        _copied_and_pasted_nodes;
70     private Hashtable<String, BufferedImage> _image_map;
71     private static Map<String, String>       _lineage_to_rank_map;
72
73     public MainPanel( final Configuration configuration, final MainFrame parent ) {
74         if ( configuration == null ) {
75             throw new IllegalArgumentException( "configuration is null" );
76         }
77         addComponentListener( this );
78         _configuration = configuration;
79         _mainframe = parent;
80         _treepanels = new ArrayList<TreePanel>();
81         initialize();
82         _control_panel = new ControlPanel( this, configuration );
83         add( _control_panel, BorderLayout.WEST );
84         setupTreeGraphic( configuration, getControlPanel() );
85         getControlPanel().showWhole();
86     }
87
88     MainPanel() {
89     }
90
91     public void addPhylogenyInNewTab( final Phylogeny phy,
92                                       final Configuration config,
93                                       final String default_name,
94                                       final String full_path ) {
95         final TreePanel treepanel = new TreePanel( phy, config, this );
96         getControlPanel().phylogenyAdded( config );
97         treepanel.setControlPanel( getControlPanel() );
98         _treepanels.add( treepanel );
99         String name = "";
100         if ( !ForesterUtil.isEmpty( phy.getName() ) ) {
101             name = phy.getName();
102         }
103         else if ( phy.getIdentifier() != null ) {
104             name = phy.getIdentifier().toString();
105         }
106         else if ( !ForesterUtil.isEmpty( default_name ) ) {
107             name = default_name;
108         }
109         else {
110             name = "[" + ( getTabbedPane().getTabCount() + 1 ) + "]";
111         }
112         final JScrollPane treegraphic_scroll_pane = new JScrollPane( treepanel );
113         treegraphic_scroll_pane.getHorizontalScrollBar().addAdjustmentListener( new AdjustmentListener() {
114
115             @Override
116             public void adjustmentValueChanged( final AdjustmentEvent e ) {
117                 if ( treepanel.isOvOn() || getOptions().isShowScale() ) {
118                     treepanel.repaint();
119                 }
120             }
121         } );
122         treegraphic_scroll_pane.getVerticalScrollBar().addAdjustmentListener( new AdjustmentListener() {
123
124             @Override
125             public void adjustmentValueChanged( final AdjustmentEvent e ) {
126                 if ( treepanel.isOvOn() || getOptions().isShowScale() ) {
127                     treepanel.repaint();
128                     //System.out.println( e.getValue() );
129                 }
130             }
131         } );
132         treegraphic_scroll_pane.getHorizontalScrollBar().setUnitIncrement( 10 );
133         treegraphic_scroll_pane.getHorizontalScrollBar().setBlockIncrement( 200 );
134         treegraphic_scroll_pane.getVerticalScrollBar().setUnitIncrement( 10 );
135         treegraphic_scroll_pane.getVerticalScrollBar().setBlockIncrement( 200 );
136         final JPanel treegraphic_scroll_pane_panel = new JPanel();
137         treegraphic_scroll_pane_panel.setLayout( new BorderLayout() );
138         treegraphic_scroll_pane_panel.add( treegraphic_scroll_pane, BorderLayout.CENTER );
139         _treegraphic_scroll_pane_panels.add( treegraphic_scroll_pane_panel );
140         _treegraphic_scroll_panes.add( treegraphic_scroll_pane );
141         getTabbedPane().addTab( name, null, treegraphic_scroll_pane_panel, "" );
142         getTabbedPane().setSelectedIndex( getTabbedPane().getTabCount() - 1 );
143         getControlPanel().showWhole();
144     }
145
146     @Override
147     public void componentHidden( final ComponentEvent e ) {
148         // Do nothing.
149     }
150
151     @Override
152     public void componentMoved( final ComponentEvent e ) {
153         // Do nothing.
154     }
155
156     @Override
157     public void componentResized( final ComponentEvent e ) {
158         if ( getCurrentTreePanel() != null ) {
159             getCurrentTreePanel().updateOvSettings();
160             getCurrentTreePanel().updateOvSizes();
161         }
162     }
163
164     @Override
165     public void componentShown( final ComponentEvent e ) {
166         // Do nothing.
167     }
168
169     public ControlPanel getControlPanel() {
170         return _control_panel;
171     }
172
173     public Set<Long> getCopiedAndPastedNodes() {
174         return _copied_and_pasted_nodes;
175     }
176
177     public TreePanel getCurrentTreePanel() {
178         final int selected = getTabbedPane().getSelectedIndex();
179         if ( selected >= 0 ) {
180             return _treepanels.get( selected );
181         }
182         else {
183             if ( _treepanels.size() == 1 ) {
184                 return _treepanels.get( 0 );
185             }
186             else {
187                 return null;
188             }
189         }
190     }
191
192     public Options getOptions() {
193         return _mainframe.getOptions();
194     }
195
196     public JTabbedPane getTabbedPane() {
197         return _tabbed_pane;
198     }
199
200     public TreeFontSet getTreeFontSet() {
201         return _fontset;
202     }
203
204     public void setArrowCursor() {
205         setCursor( TreePanel.ARROW_CURSOR );
206         repaint();
207     }
208
209     public void setCopiedAndPastedNodes( final Set<Long> node_ids ) {
210         _copied_and_pasted_nodes = node_ids;
211     }
212
213     public void setWaitCursor() {
214         setCursor( TreePanel.WAIT_CURSOR );
215         repaint();
216     }
217
218     void addPhylogenyInPanel( final Phylogeny phy, final Configuration config ) {
219         final TreePanel treepanel = new TreePanel( phy, config, this );
220         getControlPanel().phylogenyAdded( config );
221         treepanel.setControlPanel( getControlPanel() );
222         _treepanels.add( treepanel );
223         final JScrollPane treegraphic_scroll_pane = new JScrollPane( treepanel );
224         treegraphic_scroll_pane.getHorizontalScrollBar().addAdjustmentListener( new AdjustmentListener() {
225
226             @Override
227             public void adjustmentValueChanged( final AdjustmentEvent e ) {
228                 if ( treepanel.isOvOn() || getOptions().isShowScale() ) {
229                     treepanel.repaint();
230                 }
231             }
232         } );
233         treegraphic_scroll_pane.getVerticalScrollBar().addAdjustmentListener( new AdjustmentListener() {
234
235             @Override
236             public void adjustmentValueChanged( final AdjustmentEvent e ) {
237                 if ( treepanel.isOvOn() || getOptions().isShowScale() ) {
238                     treepanel.repaint();
239                     //System.out.println( e.getValue() );
240                 }
241             }
242         } );
243         treegraphic_scroll_pane.getHorizontalScrollBar().setUnitIncrement( 20 );
244         treegraphic_scroll_pane.getHorizontalScrollBar().setBlockIncrement( 50 );
245         treegraphic_scroll_pane.getVerticalScrollBar().setUnitIncrement( 20 );
246         treegraphic_scroll_pane.getVerticalScrollBar().setBlockIncrement( 50 );
247         final JPanel treegraphic_scroll_pane_panel = new JPanel();
248         treegraphic_scroll_pane_panel.setLayout( new BorderLayout() );
249         treegraphic_scroll_pane_panel.add( treegraphic_scroll_pane, BorderLayout.CENTER );
250         _treegraphic_scroll_pane_panels.add( treegraphic_scroll_pane_panel );
251         _treegraphic_scroll_panes.add( treegraphic_scroll_pane );
252         add( treegraphic_scroll_pane_panel, BorderLayout.CENTER );
253     }
254
255     void adjustJScrollPane() {
256         if ( getTabbedPane() != null ) {
257             getCurrentScrollPanePanel().remove( getCurrentScrollPane() );
258             getCurrentScrollPanePanel().add( getCurrentScrollPane(), BorderLayout.CENTER );
259         }
260         getCurrentScrollPane().revalidate();
261     }
262
263     void closeCurrentPane() {
264         final int index = getCurrentTabIndex();
265         if ( ( index >= 0 ) && ( getTabbedPane().getTabCount() > 0 ) ) {
266             getTabbedPane().remove( index );
267             getTreePanels().remove( index );
268             _treegraphic_scroll_panes.remove( index );
269             _treegraphic_scroll_pane_panels.remove( index );
270             getControlPanel().phylogenyRemoved( index );
271         }
272     }
273
274     Configuration getConfiguration() {
275         return _configuration;
276     }
277
278     Phylogeny getCurrentPhylogeny() {
279         if ( getCurrentTreePanel() == null ) {
280             return null;
281         }
282         return getCurrentTreePanel().getPhylogeny();
283     }
284
285     JScrollPane getCurrentScrollPane() {
286         if ( _treegraphic_scroll_panes.size() > 0 ) {
287             final int selected = getTabbedPane().getSelectedIndex();
288             if ( selected >= 0 ) {
289                 return _treegraphic_scroll_panes.get( selected );
290             }
291             else {
292                 return _treegraphic_scroll_panes.get( 0 );
293             }
294         }
295         else {
296             return null;
297         }
298     }
299
300     JPanel getCurrentScrollPanePanel() {
301         final int selected = getTabbedPane().getSelectedIndex();
302         if ( selected >= 0 ) {
303             return _treegraphic_scroll_pane_panels.get( selected );
304         }
305         else {
306             return _treegraphic_scroll_pane_panels.get( 0 );
307         }
308     }
309
310     int getCurrentTabIndex() {
311         final int selected = getTabbedPane().getSelectedIndex();
312         if ( selected >= 0 ) {
313             return selected;
314         }
315         else {
316             return 0;
317         }
318     }
319
320     Phylogeny getCutOrCopiedTree() {
321         return _cut_or_copied_tree;
322     }
323
324     synchronized Hashtable<String, BufferedImage> getImageMap() {
325         return _image_map;
326     }
327
328     MainFrame getMainFrame() {
329         return _mainframe;
330     }
331
332     Phylogeny getPhylogeny( final int index ) {
333         if ( getCurrentTreePanel() == null ) {
334             return null;
335         }
336         return _treepanels.get( index ).getPhylogeny();
337     }
338
339     Dimension getSizeOfViewport() {
340         return getCurrentScrollPane().getViewport().getExtentSize();
341     }
342
343     TreeColorSet getTreeColorSet() {
344         return _colorset;
345     }
346
347     List<TreePanel> getTreePanels() {
348         return _treepanels;
349     }
350
351     void initialize() {
352         if ( !getConfiguration().isUseNativeUI() ) {
353             setBackground( getConfiguration().getGuiBackgroundColor() );
354         }
355         setTreeFontSet( new TreeFontSet( this ) );
356         getTreeFontSet().setBaseFont( getOptions().getBaseFont() );
357         setLayout( new BorderLayout() );
358         setTreeColorSet( TreeColorSet.createInstance( getConfiguration() ) );
359         _treegraphic_scroll_panes = new ArrayList<JScrollPane>();
360         _treegraphic_scroll_pane_panels = new ArrayList<JPanel>();
361         _tabbed_pane = new JTabbedPane( SwingConstants.TOP );
362         if ( !getConfiguration().isUseNativeUI() ) {
363             _tabbed_pane.setBackground( getConfiguration().getGuiBackgroundColor() );
364             _tabbed_pane.setForeground( getConfiguration().getGuiBackgroundColor() );
365         }
366         _tabbed_pane.addChangeListener( new ChangeListener() {
367
368             // This method is called whenever the selected tab changes
369             @Override
370             public void stateChanged( final ChangeEvent evt ) {
371                 final JTabbedPane pane = ( JTabbedPane ) evt.getSource();
372                 getControlPanel().tabChanged();
373                 // Get current tab
374                 final int sel = pane.getSelectedIndex();
375                 if ( sel >= 0 ) {
376                     if ( !getConfiguration().isUseNativeUI() ) {
377                         if ( _tabbed_pane.getTabCount() > 0 ) {
378                             _tabbed_pane.setForegroundAt( sel, Constants.TAB_LABEL_FOREGROUND_COLOR_SELECTED );
379                             for( int i = 0; i < _tabbed_pane.getTabCount(); ++i ) {
380                                 if ( i != sel ) {
381                                     _tabbed_pane.setBackgroundAt( i, getConfiguration().getGuiBackgroundColor() );
382                                     _tabbed_pane.setForegroundAt( i, getConfiguration().getGuiCheckboxTextColor() );
383                                 }
384                             }
385                         }
386                     }
387                 }
388             }
389         } );
390         if ( !getConfiguration().isUseNativeUI() ) {
391             _tabbed_pane.setFont( ControlPanel.jcb_font );
392         }
393         _tabbed_pane.setTabLayoutPolicy( JTabbedPane.SCROLL_TAB_LAYOUT );
394         add( _tabbed_pane, BorderLayout.CENTER );
395     }
396
397     void setCutOrCopiedTree( final Phylogeny cut_or_copied_tree ) {
398         _cut_or_copied_tree = cut_or_copied_tree;
399     }
400
401     synchronized void setImageMap( final Hashtable<String, BufferedImage> image_map ) {
402         _image_map = image_map;
403     }
404
405     void setTitleOfSelectedTab( final String title ) {
406         final int selected = getTabbedPane().getSelectedIndex();
407         if ( selected >= 0 ) {
408             getTabbedPane().setTitleAt( selected, title );
409         }
410     }
411
412     void setTreeColorSet( final TreeColorSet colorset ) {
413         _colorset = colorset;
414         for( final TreePanel p : getTreePanels() ) {
415             p.setBackground( colorset.getBackgroundColor() );
416         }
417     }
418
419     void setTreeFontSet( final TreeFontSet fontset ) {
420         _fontset = fontset;
421     }
422
423     void setupTreeGraphic( final Configuration config_settings, final ControlPanel control ) {
424         control.setSpeciesColors( config_settings.getSpeciesColors() );
425         control.setSequenceColors( config_settings.getSequenceColors() );
426         control.setAnnotationColors( config_settings.getAnnotationColors() );
427         RenderableDomainArchitecture.setColorMap( config_settings.getDomainColors() );
428     }
429
430     void terminate() {
431         for( final TreePanel atvtreepanel : _treepanels ) {
432             atvtreepanel.removeAllEditNodeJFrames();
433         }
434     }
435
436     public synchronized static Map<String, String> getLineageToRankMap() {
437         if ( _lineage_to_rank_map == null ) {
438             _lineage_to_rank_map = new HashMap<String, String>();
439         }
440         return _lineage_to_rank_map;
441     }
442 }