2 // FORESTER -- software libraries and applications
3 // for evolutionary biology research and applications.
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
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.
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.
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
26 // Contact: phylosoft @ gmail . com
27 // WWW: https://sites.google.com/site/cmzmasek/home/software/forester
29 package org.forester.archaeopteryx;
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;
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;
52 import org.forester.archaeopteryx.phylogeny.data.RenderableDomainArchitecture;
53 import org.forester.phylogeny.Phylogeny;
54 import org.forester.util.ForesterUtil;
56 public class MainPanel extends JPanel implements ComponentListener {
58 private static final long serialVersionUID = -2682765312661416435L;
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;
73 public MainPanel( final Configuration configuration, final MainFrame parent ) {
74 if ( configuration == null ) {
75 throw new IllegalArgumentException( "configuration is null" );
77 addComponentListener( this );
78 _configuration = configuration;
80 _treepanels = new ArrayList<TreePanel>();
82 _control_panel = new ControlPanel( this, configuration );
83 add( _control_panel, BorderLayout.WEST );
84 setupTreeGraphic( configuration, getControlPanel() );
85 getControlPanel().showWhole();
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 );
100 if ( !ForesterUtil.isEmpty( phy.getName() ) ) {
101 name = phy.getName();
103 else if ( phy.getIdentifier() != null ) {
104 name = phy.getIdentifier().toString();
106 else if ( !ForesterUtil.isEmpty( default_name ) ) {
110 name = "[" + ( getTabbedPane().getTabCount() + 1 ) + "]";
112 final JScrollPane treegraphic_scroll_pane = new JScrollPane( treepanel );
113 treegraphic_scroll_pane.getHorizontalScrollBar().addAdjustmentListener( new AdjustmentListener() {
116 public void adjustmentValueChanged( final AdjustmentEvent e ) {
117 if ( treepanel.isOvOn() || getOptions().isShowScale() ) {
122 treegraphic_scroll_pane.getVerticalScrollBar().addAdjustmentListener( new AdjustmentListener() {
125 public void adjustmentValueChanged( final AdjustmentEvent e ) {
126 if ( treepanel.isOvOn() || getOptions().isShowScale() ) {
128 //System.out.println( e.getValue() );
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();
147 public void componentHidden( final ComponentEvent e ) {
152 public void componentMoved( final ComponentEvent e ) {
157 public void componentResized( final ComponentEvent e ) {
158 if ( getCurrentTreePanel() != null ) {
159 getCurrentTreePanel().updateOvSettings();
160 getCurrentTreePanel().updateOvSizes();
165 public void componentShown( final ComponentEvent e ) {
169 public ControlPanel getControlPanel() {
170 return _control_panel;
173 public Set<Long> getCopiedAndPastedNodes() {
174 return _copied_and_pasted_nodes;
177 public TreePanel getCurrentTreePanel() {
178 final int selected = getTabbedPane().getSelectedIndex();
179 if ( selected >= 0 ) {
180 return _treepanels.get( selected );
183 if ( _treepanels.size() == 1 ) {
184 return _treepanels.get( 0 );
192 public Options getOptions() {
193 return _mainframe.getOptions();
196 public JTabbedPane getTabbedPane() {
200 public TreeFontSet getTreeFontSet() {
204 public void setArrowCursor() {
205 setCursor( TreePanel.ARROW_CURSOR );
209 public void setCopiedAndPastedNodes( final Set<Long> node_ids ) {
210 _copied_and_pasted_nodes = node_ids;
213 public void setWaitCursor() {
214 setCursor( TreePanel.WAIT_CURSOR );
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() {
227 public void adjustmentValueChanged( final AdjustmentEvent e ) {
228 if ( treepanel.isOvOn() || getOptions().isShowScale() ) {
233 treegraphic_scroll_pane.getVerticalScrollBar().addAdjustmentListener( new AdjustmentListener() {
236 public void adjustmentValueChanged( final AdjustmentEvent e ) {
237 if ( treepanel.isOvOn() || getOptions().isShowScale() ) {
239 //System.out.println( e.getValue() );
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 );
255 void adjustJScrollPane() {
256 if ( getTabbedPane() != null ) {
257 getCurrentScrollPanePanel().remove( getCurrentScrollPane() );
258 getCurrentScrollPanePanel().add( getCurrentScrollPane(), BorderLayout.CENTER );
260 getCurrentScrollPane().revalidate();
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 );
274 Configuration getConfiguration() {
275 return _configuration;
278 Phylogeny getCurrentPhylogeny() {
279 if ( getCurrentTreePanel() == null ) {
282 return getCurrentTreePanel().getPhylogeny();
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 );
292 return _treegraphic_scroll_panes.get( 0 );
300 JPanel getCurrentScrollPanePanel() {
301 final int selected = getTabbedPane().getSelectedIndex();
302 if ( selected >= 0 ) {
303 return _treegraphic_scroll_pane_panels.get( selected );
306 return _treegraphic_scroll_pane_panels.get( 0 );
310 int getCurrentTabIndex() {
311 final int selected = getTabbedPane().getSelectedIndex();
312 if ( selected >= 0 ) {
320 Phylogeny getCutOrCopiedTree() {
321 return _cut_or_copied_tree;
324 synchronized Hashtable<String, BufferedImage> getImageMap() {
328 MainFrame getMainFrame() {
332 Phylogeny getPhylogeny( final int index ) {
333 if ( getCurrentTreePanel() == null ) {
336 return _treepanels.get( index ).getPhylogeny();
339 Dimension getSizeOfViewport() {
340 return getCurrentScrollPane().getViewport().getExtentSize();
343 TreeColorSet getTreeColorSet() {
347 public List<TreePanel> getTreePanels() {
352 if ( !getConfiguration().isUseNativeUI() ) {
353 setBackground( getConfiguration().getGuiBackgroundColor() );
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() );
366 _tabbed_pane.addChangeListener( new ChangeListener() {
368 // This method is called whenever the selected tab changes
370 public void stateChanged( final ChangeEvent evt ) {
371 final JTabbedPane pane = ( JTabbedPane ) evt.getSource();
372 getControlPanel().tabChanged();
374 final int sel = pane.getSelectedIndex();
376 if ( !getConfiguration().isUseNativeUI() ) {
377 if ( _tabbed_pane.getTabCount() > 0 ) {
378 _tabbed_pane.setForegroundAt( sel, AptxConstants.TAB_LABEL_FOREGROUND_COLOR_SELECTED );
379 for( int i = 0; i < _tabbed_pane.getTabCount(); ++i ) {
381 _tabbed_pane.setBackgroundAt( i, getConfiguration().getGuiBackgroundColor() );
382 _tabbed_pane.setForegroundAt( i, getConfiguration().getGuiCheckboxTextColor() );
390 if ( !getConfiguration().isUseNativeUI() ) {
391 _tabbed_pane.setFont( ControlPanel.jcb_font );
393 _tabbed_pane.setTabLayoutPolicy( JTabbedPane.SCROLL_TAB_LAYOUT );
394 add( _tabbed_pane, BorderLayout.CENTER );
397 void setCutOrCopiedTree( final Phylogeny cut_or_copied_tree ) {
398 _cut_or_copied_tree = cut_or_copied_tree;
401 synchronized void setImageMap( final Hashtable<String, BufferedImage> image_map ) {
402 _image_map = image_map;
405 void setTitleOfSelectedTab( final String title ) {
406 final int selected = getTabbedPane().getSelectedIndex();
407 if ( selected >= 0 ) {
408 getTabbedPane().setTitleAt( selected, title );
412 void setTreeColorSet( final TreeColorSet colorset ) {
413 _colorset = colorset;
414 for( final TreePanel p : getTreePanels() ) {
415 p.setBackground( colorset.getBackgroundColor() );
419 void setTreeFontSet( final TreeFontSet fontset ) {
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() );
431 for( final TreePanel atvtreepanel : _treepanels ) {
432 atvtreepanel.removeAllEditNodeJFrames();
436 public synchronized static Map<String, String> getLineageToRankMap() {
437 if ( _lineage_to_rank_map == null ) {
438 _lineage_to_rank_map = new HashMap<String, String>();
440 return _lineage_to_rank_map;