/* * LabelPainterController.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.treeviewer.painters; import figtree.ui.PercentFormat; import figtree.ui.RomanFormat; import jam.controlpalettes.AbstractController; import jam.controlpalettes.ControllerListener; import jam.panels.OptionsPanel; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.*; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.*; import java.util.prefs.Preferences; import figtree.treeviewer.*; import figtree.treeviewer.decorators.*; /** * @author Andrew Rambaut * @version $Id$ * * $HeadURL$ * * $LastChangedBy$ * $LastChangedDate$ * $LastChangedRevision$ */ public class LabelPainterController extends AbstractController { public static Preferences PREFS = Preferences.userNodeForPackage(TreeViewer.class); private static final String USER_SELECTION = "User Selection"; public static final String FONT_NAME_KEY = "fontName"; public static final String FONT_SIZE_KEY = "fontSize"; public static final String FONT_STYLE_KEY = "fontStyle"; public static final String COLOR_ATTRIBUTE_KEY = "colorAttribute"; public static final String NUMBER_FORMATTING_KEY = "numberFormatting"; public static final String DISPLAY_ATTRIBUTE_KEY = "displayAttribute"; public static final String SIGNIFICANT_DIGITS_KEY = "significantDigits"; // The defaults if there is nothing in the preferences public static String DEFAULT_FONT_NAME = "sansserif"; public static int DEFAULT_FONT_SIZE = 8; public static int DEFAULT_FONT_STYLE = Font.PLAIN; public static String DECIMAL_NUMBER_FORMATTING = "#.####"; public static String SCIENTIFIC_NUMBER_FORMATTING = "0.###E0"; public static int DEFAULT_SIGNIFICANT_DIGITS = 2; public static String DEFAULT_NUMBER_FORMATTING = DECIMAL_NUMBER_FORMATTING; public LabelPainterController(String title, String key, final LabelPainter labelPainter, final JFrame frame, final AttributeColourController colourController, final TreeViewer treeViewer) { this.title = title; this.key = key; this.labelPainter = labelPainter; LabelPainter.PainterIntent intent = labelPainter.getIntent(); userLabelDecorator = new AttributableDecorator(); userLabelDecorator.setPaintAttributeName("!color"); userLabelDecorator.setFontAttributeName("!font"); labelPainter.setTextDecorator(userLabelDecorator); final String defaultFontName = PREFS.get(key + "." + FONT_NAME_KEY, DEFAULT_FONT_NAME); final int defaultFontStyle = PREFS.getInt(key + "." + FONT_STYLE_KEY, DEFAULT_FONT_STYLE); final int defaultFontSize = PREFS.getInt(key + "." + FONT_SIZE_KEY, DEFAULT_FONT_SIZE); final int defaultSignificantDigits = PREFS.getInt(key + "." + SIGNIFICANT_DIGITS_KEY, DEFAULT_SIGNIFICANT_DIGITS); final String defaultNumberFormatting = PREFS.get(key + "." + NUMBER_FORMATTING_KEY, DEFAULT_NUMBER_FORMATTING); labelPainter.setFont(new Font(defaultFontName, defaultFontStyle, defaultFontSize)); labelPainter.setNumberFormat(new DecimalFormat(defaultNumberFormatting)); optionsPanel = new ControllerOptionsPanel(2, 2); titleCheckBox = new JCheckBox(getTitle()); titleCheckBox.setSelected(labelPainter.isVisible()); displayAttributeCombo = new JComboBox(new String[] { "No attributes" }); new AttributeComboHelper(displayAttributeCombo, treeViewer, intent).addListener(new AttributeComboHelperListener() { @Override public void attributeComboChanged() { String attribute = (String) displayAttributeCombo.getSelectedItem(); labelPainter.setDisplayAttribute(attribute); } }); colourAttributeCombo = new JComboBox(new String[] { "No attributes" }); new AttributeComboHelper(colourAttributeCombo, treeViewer, "User selection", intent).addListener(new AttributeComboHelperListener() { @Override public void attributeComboChanged() { String attribute = (String) colourAttributeCombo.getSelectedItem(); setupLabelDecorator(); } }); final JButton setupColourButton = new JButton("Colour"); this.colourController = colourController; colourController.setupControls(colourAttributeCombo, setupColourButton); colourController.addControllerListener(new ControllerListener() { @Override public void controlsChanged() { setupLabelDecorator(); } }); final JButton fontButton = new JButton(new AbstractAction("Font") { public void actionPerformed(ActionEvent e) { final Font font = labelPainter.getFont(); if (fontDialog == null) { fontDialog = new FontDialog(frame); } int result = fontDialog.showDialog(font); if (result != JOptionPane.CANCEL_OPTION) { labelPainter.setFont(fontDialog.getFont()); } } }); Font font = labelPainter.getFont(); fontSizeSpinner = new JSpinner(new SpinnerNumberModel(font.getSize(), 0.01, 48, 1)); fontSizeSpinner.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { final float size = ((Double) fontSizeSpinner.getValue()).floatValue(); Font font = labelPainter.getFont().deriveFont(size); labelPainter.setFont(font); } }); JPanel panel = new JPanel(); panel.setOpaque(false); panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); ControllerOptionsPanel.setComponentLook(setupColourButton); ControllerOptionsPanel.setComponentLook(fontButton); panel.add(setupColourButton); panel.add(fontButton); NumberFormat format = labelPainter.getNumberFormat(); int digits = format.getMaximumFractionDigits(); numericalFormatCombo = new JComboBox(new String[] { "Decimal", "Scientific", "Percent", "Roman"}); numericalFormatCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { String formatType = (String) numericalFormatCombo.getSelectedItem(); final int digits = (Integer) digitsSpinner.getValue(); NumberFormat format = null; if (formatType.equals("Decimal")) { format = new DecimalFormat(DECIMAL_NUMBER_FORMATTING); } else if (formatType.equals("Scientific")) { format = new DecimalFormat(SCIENTIFIC_NUMBER_FORMATTING); } else if (formatType.equals("Percent")) { format = new PercentFormat(); } else if (formatType.equals("Roman")) { format = new RomanFormat(); } format.setMaximumFractionDigits(digits); labelPainter.setNumberFormat(format); } }); digitsSpinner = new JSpinner(new SpinnerNumberModel(digits, defaultSignificantDigits, 14, 1)); digitsSpinner.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { final int digits = (Integer)digitsSpinner.getValue(); NumberFormat format = labelPainter.getNumberFormat(); format.setMaximumFractionDigits(digits); labelPainter.setNumberFormat(format); } }); // labelPainter.addPainterListener(new PainterListener() { // public void painterChanged() { // // } // public void painterSettingsChanged() { // } // public void attributesChanged() { // setupAttributes(); // } // }); final JLabel label1 = optionsPanel.addComponentWithLabel("Display:", displayAttributeCombo); final JLabel label2 = optionsPanel.addComponentWithLabel("Colour by:", colourAttributeCombo); final JLabel label3 = optionsPanel.addComponentWithLabel("Font Size:", fontSizeSpinner); final JLabel label4 = optionsPanel.addComponentWithLabel("Setup:", panel); final JLabel label5 = optionsPanel.addComponentWithLabel("Format:", numericalFormatCombo); final JLabel label6 = optionsPanel.addComponentWithLabel("Sig. Digits:", digitsSpinner); addComponent(label1); addComponent(displayAttributeCombo); addComponent(label2); addComponent(colourAttributeCombo); addComponent(label3); addComponent(setupColourButton); addComponent(fontButton); addComponent(label4); addComponent(fontSizeSpinner); addComponent(label5); addComponent(numericalFormatCombo); addComponent(label6); addComponent(digitsSpinner); enableComponents(titleCheckBox.isSelected()); titleCheckBox.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { enableComponents(titleCheckBox.isSelected()); labelPainter.setVisible(titleCheckBox.isSelected()); } }); } private void setupLabelDecorator() { Decorator colourDecorator = colourController.getColourDecorator(colourAttributeCombo, userLabelDecorator); CompoundDecorator compoundDecorator = new CompoundDecorator(); compoundDecorator.addDecorator(colourDecorator); AttributableDecorator fontDecorator = new AttributableDecorator(); userLabelDecorator.setFontAttributeName("!font"); compoundDecorator.addDecorator(fontDecorator); labelPainter.setTextDecorator(compoundDecorator); } public JComponent getTitleComponent() { return titleCheckBox; } public JPanel getPanel() { return optionsPanel; } public boolean isInitiallyVisible() { return false; } public void initialize() { // nothing to do } public void setSettings(Map<String,Object> settings) { titleCheckBox.setSelected((Boolean) settings.get(key + "." + IS_SHOWN)); displayAttributeCombo.setSelectedItem(settings.get(key + "." + DISPLAY_ATTRIBUTE_KEY)); colourAttributeCombo.setSelectedItem(settings.get(key + "." + COLOR_ATTRIBUTE_KEY)); String name = (String)settings.get(key + "." + FONT_NAME_KEY); int size = ((Number)settings.get(key + "." + FONT_SIZE_KEY)).intValue(); int style = (Integer)settings.get(key + "." + FONT_STYLE_KEY); labelPainter.setFont(new Font(name, style, size)); digitsSpinner.setValue((Integer) settings.get(key + "." + SIGNIFICANT_DIGITS_KEY)); } public void getSettings(Map<String, Object> settings) { settings.put(key+"."+IS_SHOWN, titleCheckBox.isSelected()); settings.put(key+"."+DISPLAY_ATTRIBUTE_KEY, displayAttributeCombo.getSelectedItem().toString()); settings.put(key+"."+COLOR_ATTRIBUTE_KEY, colourAttributeCombo.getSelectedItem().toString()); Font font = labelPainter.getFont(); settings.put(key+"."+FONT_NAME_KEY, font.getName()); settings.put(key+"."+FONT_SIZE_KEY, font.getSize()); settings.put(key+"."+FONT_STYLE_KEY, font.getStyle()); settings.put(key+"."+SIGNIFICANT_DIGITS_KEY, digitsSpinner.getValue()); } public String getTitle() { return title; } private final AttributeColourController colourController; private final JCheckBox titleCheckBox; private final OptionsPanel optionsPanel; private final JComboBox displayAttributeCombo; private final JSpinner fontSizeSpinner; private FontDialog fontDialog = null; private final JComboBox numericalFormatCombo; private final JSpinner digitsSpinner; private final String title; private final String key; private final LabelPainter labelPainter; private final AttributableDecorator userLabelDecorator; private final JComboBox colourAttributeCombo; }