/*
* TreeViewerController.java
*
* Copyright (C) 2006-2014 Andrew Rambaut
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package figtree.panel;
import figtree.treeviewer.treelayouts.*;
import figtree.treeviewer.TreeViewer;
import jam.controlpalettes.AbstractController;
import jam.panels.OptionsPanel;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.Map;
/**
* @author Andrew Rambaut
* @version $Id$
*
* $HeadURL$
*
* $LastChangedBy$
* $LastChangedDate$
* $LastChangedRevision$
*/
public class TreeViewerController extends AbstractController {
private static final String CONTROLLER_TITLE = "Layout";
private static final String CONTROLLER_KEY = "layout";
private static final String ZOOM_KEY = "zoom";
private static final String EXPANSION_KEY = "expansion";
// The defaults if there is nothing in the preferences
private final static int MAX_ZOOM_SLIDER = 10000;
private final static int DELTA_ZOOM_SLIDER = 200;
public TreeViewerController(final TreeViewer treeViewer) {
this(treeViewer, false);
}
public TreeViewerController(final TreeViewer treeViewer, boolean hideZoom) {
this.treeViewer = treeViewer;
this.hideZoom = hideZoom;
titleLabel = new JLabel(CONTROLLER_TITLE);
optionsPanel = new OptionsPanel();
rectilinearTreeLayout = new RectilinearTreeLayout();
treeLayoutController = new TreeLayoutController(rectilinearTreeLayout);
if (!hideZoom) {
zoomSlider = new JSlider(SwingConstants.HORIZONTAL, 0, MAX_ZOOM_SLIDER, 0);
zoomSlider.setOpaque(false);
zoomSlider.setAlignmentX(Component.LEFT_ALIGNMENT);
// zoomSlider.setPaintTicks(true);
// zoomSlider.setPaintLabels(true);
zoomSlider.setValue(0);
zoomSlider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
final int value = zoomSlider.getValue();
treeViewer.setZoom(((double) value) / MAX_ZOOM_SLIDER);
}
});
optionsPanel.addComponentWithLabel("Zoom:", zoomSlider, true);
}
verticalExpansionSlider = new JSlider(SwingConstants.HORIZONTAL, 0, MAX_ZOOM_SLIDER, 0);
verticalExpansionSlider.setOpaque(false);
// verticalExpansionSlider.setPaintTicks(true);
// verticalExpansionSlider.setPaintLabels(true);
verticalExpansionSlider.setValue(0);
verticalExpansionSlider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
final int value = verticalExpansionSlider.getValue();
treeViewer.setVerticalExpansion(((double) value) / MAX_ZOOM_SLIDER);
}
});
verticalExpansionLabel = new JLabel("Expansion:");
optionsPanel.addComponents(verticalExpansionLabel, false, verticalExpansionSlider, true);
layoutPanel = new JPanel(new BorderLayout());
layoutPanel.setOpaque(false);
setTreeLayout();
setExpansion();
optionsPanel.addSpanningComponent(layoutPanel);
// Set some InputMaps and ActionMaps for key strokes. The ActionMaps are set in setExpansion()
// because they differ by whether vertical expansion is allowed for the current layout.
// The key strokes could be obtained from preferences and set in a preference dialog box
optionsPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke("meta 0"), "resetZoom");
optionsPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke("meta EQUALS"), "increasePrimaryZoom");
optionsPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke("meta MINUS"), "decreasePrimaryZoom");
optionsPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke("meta alt EQUALS"), "increaseSecondaryZoom");
optionsPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke("meta alt MINUS"), "decreaseSecondaryZoom");
optionsPanel.getActionMap().put("resetZoom", resetZoomAction);
}
public JComponent getTitleComponent() {
return titleLabel;
}
public JPanel getPanel() {
return optionsPanel;
}
public boolean isInitiallyVisible() {
return true;
}
public void setColouringAttributeName(String attributeName) {
rectilinearTreeLayout.setBranchColouringAttributeName(attributeName);
}
public void initialize() {
// nothing to do
}
public void setSettings(Map<String,Object> settings) {
if (!hideZoom) {
zoomSlider.setValue((Integer)settings.get(CONTROLLER_KEY + "." + ZOOM_KEY));
}
verticalExpansionSlider.setValue((Integer)settings.get(CONTROLLER_KEY + "." + EXPANSION_KEY));
// These controllers are internal to TreeViewerController so settings must be done here
treeLayoutController.setSettings(settings);
}
public void getSettings(Map<String, Object> settings) {
if (!hideZoom) {
settings.put(CONTROLLER_KEY + "." + ZOOM_KEY, zoomSlider.getValue());
}
settings.put(CONTROLLER_KEY + "." + EXPANSION_KEY, verticalExpansionSlider.getValue());
// These controllers are internal to TreeViewerController so settings must be done here
treeLayoutController.getSettings(settings);
}
private void setTreeLayout() {
treeViewer.setTreeLayout(rectilinearTreeLayout);
setExpansion();
layoutPanel.removeAll();
layoutPanel.add(treeLayoutController.getPanel(), BorderLayout.CENTER);
fireControllerChanged();
}
private void setExpansion() {
if (treeViewer.verticalExpansionAllowed()) {
verticalExpansionLabel.setEnabled(true);
verticalExpansionSlider.setEnabled(true);
optionsPanel.getActionMap().put("increasePrimaryZoom", increaseVerticalExpansionAction);
optionsPanel.getActionMap().put("decreasePrimaryZoom", decreaseVerticalExpansionAction);
optionsPanel.getActionMap().put("increaseSecondaryZoom", increaseZoomAction);
optionsPanel.getActionMap().put("decreaseSecondaryZoom", decreaseZoomAction);
} else {
verticalExpansionLabel.setEnabled(false);
verticalExpansionSlider.setEnabled(false);
optionsPanel.getActionMap().put("increasePrimaryZoom", increaseZoomAction);
optionsPanel.getActionMap().put("decreasePrimaryZoom", decreaseZoomAction);
optionsPanel.getActionMap().put("increaseSecondaryZoom", increaseZoomAction);
optionsPanel.getActionMap().put("decreaseSecondaryZoom", decreaseZoomAction);
}
}
private Action resetZoomAction = new AbstractAction("Reset Zoom") {
public void actionPerformed(ActionEvent actionEvent) {
zoomSlider.setValue(0);
verticalExpansionSlider.setValue(0);
}
};
private Action increaseZoomAction = new AbstractAction("Zoom In") {
public void actionPerformed(ActionEvent actionEvent) {
zoomSlider.setValue(zoomSlider.getValue() + DELTA_ZOOM_SLIDER);
}
};
private Action decreaseZoomAction = new AbstractAction("Zoom In") {
public void actionPerformed(ActionEvent actionEvent) {
zoomSlider.setValue(zoomSlider.getValue() - DELTA_ZOOM_SLIDER);
}
};
private Action increaseVerticalExpansionAction = new AbstractAction("Expand Vertically") {
public void actionPerformed(ActionEvent actionEvent) {
verticalExpansionSlider.setValue(verticalExpansionSlider.getValue() + DELTA_ZOOM_SLIDER);
}
};
private Action decreaseVerticalExpansionAction = new AbstractAction("Unexpand Vertically") {
public void actionPerformed(ActionEvent actionEvent) {
int value = verticalExpansionSlider.getValue();
if (value > 0) {
verticalExpansionSlider.setValue(value - DELTA_ZOOM_SLIDER);
} else {
// If the vertical expansion was zero then assume the user is trying to un-zoom
zoomSlider.setValue(zoomSlider.getValue() - DELTA_ZOOM_SLIDER);
}
}
};
private JSlider zoomSlider;
private JSlider verticalExpansionSlider;
private JLabel verticalExpansionLabel;
private final JPanel layoutPanel;
private final JLabel titleLabel;
private final OptionsPanel optionsPanel;
private final RectilinearTreeLayout rectilinearTreeLayout;
private final TreeLayoutController treeLayoutController;
private final TreeViewer treeViewer;
private final boolean hideZoom;
}