/*
* @(#)StrokeToolBar.java
*
* Copyright (c) 2007-2008 The authors and contributors of JHotDraw.
* You may not use, copy or modify this file, except in compliance with the
* accompanying license terms.
*/
package org.jhotdraw.samples.svg.gui;
import javax.annotation.Nullable;
import org.jhotdraw.draw.tool.TextCreationTool;
import org.jhotdraw.draw.tool.TextAreaCreationTool;
import org.jhotdraw.draw.event.SelectionComponentRepainter;
import org.jhotdraw.draw.event.SelectionComponentDisplayer;
import javax.swing.border.*;
import org.jhotdraw.util.*;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.plaf.SliderUI;
import org.jhotdraw.draw.*;
import org.jhotdraw.draw.action.*;
import org.jhotdraw.draw.event.FigureAttributeEditorHandler;
import org.jhotdraw.draw.gui.JAttributeSlider;
import org.jhotdraw.draw.gui.JAttributeTextField;
import org.jhotdraw.gui.JFontChooser;
import org.jhotdraw.gui.JPopupButton;
import org.jhotdraw.gui.plaf.palette.*;
import org.jhotdraw.text.FontFormatter;
import org.jhotdraw.text.JavaNumberFormatter;
import static org.jhotdraw.samples.svg.SVGAttributeKeys.*;
/**
* StrokeToolBar.
*
* @author Werner Randelshofer
* @version $Id$
*/
public class FontToolBar extends AbstractToolBar {
private static final long serialVersionUID = 1L;
@Nullable private SelectionComponentDisplayer displayer;
/** Creates new instance. */
public FontToolBar() {
ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.samples.svg.Labels");
setName(labels.getString("font.toolbar"));
JFontChooser.loadAllFonts();
setDisclosureStateCount(3);
}
@Override
public void setEditor(DrawingEditor newValue) {
if (displayer != null) {
displayer.dispose();
displayer = null;
}
super.setEditor(newValue);
if (newValue != null) {
displayer = new SelectionComponentDisplayer(editor, this) {
@Override
public void updateVisibility() {
boolean newValue = editor != null &&
editor.getActiveView() != null &&
(isVisibleIfCreationTool && ((editor.getTool() instanceof TextCreationTool) || editor.getTool() instanceof TextAreaCreationTool) ||
containsTextHolderFigure(editor.getActiveView().getSelectedFigures()));
JComponent component = getComponent();
if (component == null) {
dispose();
return;
}
component.setVisible(newValue);
// The following is needed to trick BoxLayout
if (newValue) {
component.setPreferredSize(null);
} else {
component.setPreferredSize(new Dimension(0, 0));
}
component.revalidate();
}
private boolean containsTextHolderFigure(Collection<Figure> figures) {
for (Figure f : figures) {
if (f instanceof TextHolderFigure) {
return true;
} else if (f instanceof CompositeFigure) {
if (containsTextHolderFigure(((CompositeFigure) f).getChildren())) {
return true;
}
}
}
return false;
}
};
}
}
@Override
protected JComponent createDisclosedComponent(int state) {
JPanel p = null;
switch (state) {
case 1: {
p = new JPanel();
p.setOpaque(false);
p.setBorder(new EmptyBorder(5, 5, 5, 8));
// Abort if no editor is set
if (editor == null) {
break;
}
JPanel p1 = new JPanel(new GridBagLayout());
JPanel p2 = new JPanel(new GridBagLayout());
JPanel p3 = new JPanel(new GridBagLayout());
p1.setOpaque(false);
p2.setOpaque(false);
p3.setOpaque(false);
ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.samples.svg.Labels");
GridBagLayout layout = new GridBagLayout();
p.setLayout(layout);
GridBagConstraints gbc;
AbstractButton btn;
// Font face field and popup button
JAttributeTextField<Font> faceField = new JAttributeTextField<Font>();
faceField.setColumns(2);
faceField.setToolTipText(labels.getString("attribute.font.toolTipText"));
faceField.setHorizontalAlignment(JAttributeTextField.RIGHT);
faceField.putClientProperty("Palette.Component.segmentPosition", "first");
faceField.setUI((PaletteFormattedTextFieldUI) PaletteFormattedTextFieldUI.createUI(faceField));
faceField.setHorizontalAlignment(JTextField.LEADING);
faceField.setFormatterFactory(FontFormatter.createFormatterFactory());
disposables.add(new FigureAttributeEditorHandler<Font>(FONT_FACE, faceField, editor));
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(0, 0, 0, 0);
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.HORIZONTAL;
p.add(faceField, gbc);
btn = ButtonFactory.createFontButton(editor, FONT_FACE, labels, disposables);
btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn));
gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.WEST;
p.add(btn, gbc);
// Font size field with slider
JAttributeTextField<Double> sizeField = new JAttributeTextField<Double>();
sizeField.setColumns(1);
sizeField.setToolTipText(labels.getString("attribute.fontSize.toolTipText"));
sizeField.setHorizontalAlignment(JAttributeTextField.RIGHT);
sizeField.putClientProperty("Palette.Component.segmentPosition", "first");
sizeField.setUI((PaletteFormattedTextFieldUI) PaletteFormattedTextFieldUI.createUI(sizeField));
sizeField.setFormatterFactory(JavaNumberFormatter.createFormatterFactory(0d, 1000d, 1d));
sizeField.setHorizontalAlignment(JTextField.LEADING);
disposables.add(new FigureAttributeEditorHandler<Double>(FONT_SIZE, sizeField, editor));
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.insets = new Insets(3, 0, 0, 0);
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.gridwidth = 2;
gbc.weightx = 1f;
gbc.fill = GridBagConstraints.HORIZONTAL;
p2.add(sizeField, gbc);
JPopupButton sizePopupButton = new JPopupButton();
JAttributeSlider sizeSlider = new JAttributeSlider(JSlider.VERTICAL, 0, 100, 12);
sizePopupButton.add(sizeSlider);
labels.configureToolBarButton(sizePopupButton, "attribute.fontSize");
sizePopupButton.setUI((PaletteButtonUI) PaletteButtonUI.createUI(sizePopupButton));
sizePopupButton.setPopupAnchor(SOUTH_EAST);
disposables.add(new SelectionComponentRepainter(editor, sizePopupButton));
gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 1;
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.insets = new Insets(3, 0, 0, 0);
p2.add(sizePopupButton, gbc);
sizeSlider.setUI((SliderUI) PaletteSliderUI.createUI(sizeSlider));
sizeSlider.setScaleFactor(1d);
disposables.add(new FigureAttributeEditorHandler<Double>(FONT_SIZE, sizeSlider, editor));
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.insets = new Insets(0, 0, 0, 0);
p.add(p2, gbc);
// Font style buttons
btn = ButtonFactory.createFontStyleBoldButton(editor, labels, disposables);
btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn));
btn.putClientProperty("Palette.Component.segmentPosition", "first");
gbc = new GridBagConstraints();
gbc.gridy = 2;
gbc.insets = new Insets(3, 0, 0, 0);
p.add(btn, gbc);
btn = ButtonFactory.createFontStyleItalicButton(editor, labels, disposables);
btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn));
btn.putClientProperty("Palette.Component.segmentPosition", "middle");
gbc = new GridBagConstraints();
gbc.gridy = 2;
gbc.insets = new Insets(3, 0, 0, 0);
p.add(btn, gbc);
btn = ButtonFactory.createFontStyleUnderlineButton(editor, labels, disposables);
btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn));
btn.putClientProperty("Palette.Component.segmentPosition", "last");
gbc = new GridBagConstraints();
gbc.gridy = 2;
gbc.insets = new Insets(3, 0, 0, 0);
gbc.anchor = GridBagConstraints.WEST;
p.add(btn, gbc);
}
break;
case 2: {
p = new JPanel();
p.setOpaque(false);
p.setBorder(new EmptyBorder(5, 5, 5, 8));
// Abort if no editor is set
if (editor == null) {
break;
}
JPanel p1 = new JPanel(new GridBagLayout());
JPanel p2 = new JPanel(new GridBagLayout());
JPanel p3 = new JPanel(new GridBagLayout());
p1.setOpaque(false);
p2.setOpaque(false);
p3.setOpaque(false);
ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.samples.svg.Labels");
GridBagLayout layout = new GridBagLayout();
p.setLayout(layout);
GridBagConstraints gbc;
AbstractButton btn;
// Font face field and popup button
JAttributeTextField<Font> faceField = new JAttributeTextField<Font>();
faceField.setColumns(12);
faceField.setToolTipText(labels.getString("attribute.font.toolTipText"));
faceField.setHorizontalAlignment(JAttributeTextField.RIGHT);
faceField.putClientProperty("Palette.Component.segmentPosition", "first");
faceField.setUI((PaletteFormattedTextFieldUI) PaletteFormattedTextFieldUI.createUI(faceField));
faceField.setHorizontalAlignment(JTextField.LEADING);
faceField.setFormatterFactory(FontFormatter.createFormatterFactory());
disposables.add(new FigureAttributeEditorHandler<Font>(FONT_FACE, faceField, editor));
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(0, 0, 0, 0);
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
p.add(faceField, gbc);
btn = ButtonFactory.createFontButton(editor, FONT_FACE, labels, disposables);
btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn));
gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.WEST;
p.add(btn, gbc);
// Font size field with slider
JAttributeTextField<Double> sizeField = new JAttributeTextField<Double>();
sizeField.setColumns(1);
sizeField.setToolTipText(labels.getString("attribute.fontSize.toolTipText"));
sizeField.setHorizontalAlignment(JAttributeTextField.RIGHT);
sizeField.putClientProperty("Palette.Component.segmentPosition", "first");
sizeField.setUI((PaletteFormattedTextFieldUI) PaletteFormattedTextFieldUI.createUI(sizeField));
sizeField.setFormatterFactory(JavaNumberFormatter.createFormatterFactory(0d, 1000d, 1d));
sizeField.setHorizontalAlignment(JTextField.LEADING);
disposables.add(new FigureAttributeEditorHandler<Double>(FONT_SIZE, sizeField, editor));
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.insets = new Insets(3, 0, 0, 0);
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.gridwidth = 2;
gbc.weightx = 1f;
gbc.fill = GridBagConstraints.HORIZONTAL;
p2.add(sizeField, gbc);
JPopupButton sizePopupButton = new JPopupButton();
JAttributeSlider sizeSlider = new JAttributeSlider(JSlider.VERTICAL, 0, 100, 12);
sizePopupButton.add(sizeSlider);
labels.configureToolBarButton(sizePopupButton, "attribute.fontSize");
sizePopupButton.setUI((PaletteButtonUI) PaletteButtonUI.createUI(sizePopupButton));
sizePopupButton.setPopupAnchor(SOUTH_EAST);
disposables.add(new SelectionComponentRepainter(editor, sizePopupButton));
gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 1;
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.insets = new Insets(3, 0, 0, 0);
p2.add(sizePopupButton, gbc);
sizeSlider.setUI((SliderUI) PaletteSliderUI.createUI(sizeSlider));
sizeSlider.setScaleFactor(1d);
disposables.add(new FigureAttributeEditorHandler<Double>(FONT_SIZE, sizeSlider, editor));
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.insets = new Insets(0, 0, 0, 0);
p.add(p2, gbc);
// Font style buttons
btn = ButtonFactory.createFontStyleBoldButton(editor, labels, disposables);
btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn));
btn.putClientProperty("Palette.Component.segmentPosition", "first");
gbc = new GridBagConstraints();
gbc.gridy = 2;
gbc.insets = new Insets(3, 0, 0, 0);
p.add(btn, gbc);
btn = ButtonFactory.createFontStyleItalicButton(editor, labels, disposables);
btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn));
btn.putClientProperty("Palette.Component.segmentPosition", "middle");
gbc = new GridBagConstraints();
gbc.gridy = 2;
gbc.insets = new Insets(3, 0, 0, 0);
p.add(btn, gbc);
btn = ButtonFactory.createFontStyleUnderlineButton(editor, labels, disposables);
btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn));
btn.putClientProperty("Palette.Component.segmentPosition", "last");
gbc = new GridBagConstraints();
gbc.gridy = 2;
gbc.insets = new Insets(3, 0, 0, 0);
gbc.anchor = GridBagConstraints.WEST;
p.add(btn, gbc);
}
break;
}
return p;
}
@Override
protected String getID() {
return "font";
}
@Override
protected int getDefaultDisclosureState() {
return 1;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
}