/* * @(#)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 org.jhotdraw.draw.gui.JAttributeTextField; import org.jhotdraw.draw.gui.JAttributeSlider; import javax.annotation.Nullable; import org.jhotdraw.draw.event.SelectionComponentRepainter; import org.jhotdraw.draw.event.FigureAttributeEditorHandler; import org.jhotdraw.draw.event.SelectionComponentDisplayer; import org.jhotdraw.text.JavaNumberFormatter; import javax.swing.border.*; import org.jhotdraw.gui.*; import org.jhotdraw.gui.plaf.palette.*; import org.jhotdraw.util.*; import java.awt.*; import java.util.HashMap; import java.util.Map; import javax.swing.*; import javax.swing.plaf.SliderUI; import javax.swing.text.DefaultFormatterFactory; import org.jhotdraw.draw.*; import org.jhotdraw.draw.action.*; import org.jhotdraw.text.ColorFormatter; import static org.jhotdraw.samples.svg.SVGAttributeKeys.*; /** * StrokeToolBar. * * @author Werner Randelshofer * @version $Id$ */ public class StrokeToolBar extends AbstractToolBar { private static final long serialVersionUID = 1L; @Nullable private SelectionComponentDisplayer displayer; /** Creates new instance. */ public StrokeToolBar() { ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.samples.svg.Labels"); setName(labels.getString("stroke.toolbar")); 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 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 put if (editor == null) { break; } ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.samples.svg.Labels"); GridBagLayout layout = new GridBagLayout(); p.setLayout(layout); GridBagConstraints gbc; AbstractButton btn; // Stroke color Map<AttributeKey<?>, Object> defaultAttributes = new HashMap<AttributeKey<?>, Object>(); STROKE_GRADIENT.put(defaultAttributes, null); btn = ButtonFactory.createSelectionColorChooserButton(editor, STROKE_COLOR, "attribute.strokeColor", labels, defaultAttributes, new Rectangle(3, 3, 10, 10), PaletteColorChooserUI.class, disposables); btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn)); ((JPopupButton) btn).setAction(null, null); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.anchor = GridBagConstraints.FIRST_LINE_START; p.add(btn, gbc); // Opacity slider JPopupButton opacityPopupButton = new JPopupButton(); JAttributeSlider opacitySlider = new JAttributeSlider(JSlider.VERTICAL, 0, 100, 100); opacityPopupButton.add(opacitySlider); labels.configureToolBarButton(opacityPopupButton, "attribute.strokeOpacity"); opacityPopupButton.setUI((PaletteButtonUI) PaletteButtonUI.createUI(opacityPopupButton)); opacityPopupButton.setIcon( new SelectionOpacityIcon(editor, STROKE_OPACITY, null, STROKE_COLOR, Images.createImage(getClass(), labels.getString("attribute.strokeOpacity.icon")), new Rectangle(5, 5, 6, 6), new Rectangle(4, 4, 7, 7))); opacityPopupButton.setPopupAnchor(SOUTH_EAST); disposables.add(new SelectionComponentRepainter(editor, opacityPopupButton)); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.insets = new Insets(3, 0, 0, 0); p.add(opacityPopupButton, gbc); opacitySlider.setUI((SliderUI) PaletteSliderUI.createUI(opacitySlider)); opacitySlider.setScaleFactor(100d); disposables.add(new FigureAttributeEditorHandler<Double>(STROKE_OPACITY, opacitySlider, editor)); // Create stroke width popup slider JPopupButton strokeWidthPopupButton = new JPopupButton(); JAttributeSlider strokeWidthSlider = new JAttributeSlider( JSlider.VERTICAL, 0, 50, 1); strokeWidthSlider.setUI((SliderUI) PaletteSliderUI.createUI(strokeWidthSlider)); strokeWidthPopupButton.add(strokeWidthSlider); labels.configureToolBarButton(strokeWidthPopupButton, "attribute.strokeWidth"); strokeWidthPopupButton.setUI((PaletteButtonUI) PaletteButtonUI.createUI(strokeWidthPopupButton)); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.gridx = 0; gbc.insets = new Insets(3, 0, 0, 0); p.add(strokeWidthPopupButton, gbc); disposables.add(new FigureAttributeEditorHandler<Double>(STROKE_WIDTH, strokeWidthSlider, editor)); // Create stroke dashes buttons btn = ButtonFactory.createStrokeJoinButton(editor, labels, disposables); btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn)); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.gridy = 0; gbc.insets = new Insets(0, 3, 0, 0); p.add(btn, gbc); btn = ButtonFactory.createStrokeCapButton(editor, labels, disposables); btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn)); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.gridy = 1; gbc.insets = new Insets(3, 3, 0, 0); p.add(btn, gbc); btn = ButtonFactory.createStrokeDashesButton(editor, new double[][]{ null, {4d, 4d}, {2d, 2d}, {4d, 2d}, {2d, 4d}, {8d, 2d}, {6d, 2d, 2d, 2d},}, labels, disposables); btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn)); gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.gridy = 2; gbc.insets = new Insets(3, 3, 0, 0); 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 put if (editor == null) { break; } ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.samples.svg.Labels"); GridBagLayout layout = new GridBagLayout(); p.setLayout(layout); GridBagConstraints gbc; AbstractButton btn; // Stroke color field and button Map<AttributeKey<?>, Object> defaultAttributes = new HashMap<AttributeKey<?>, Object>(); STROKE_GRADIENT.put(defaultAttributes, null); JAttributeTextField<Color> colorField = new JAttributeTextField<Color>(); colorField.setColumns(7); colorField.setToolTipText(labels.getString("attribute.strokeColor.toolTipText")); colorField.putClientProperty("Palette.Component.segmentPosition", "first"); colorField.setUI((PaletteFormattedTextFieldUI) PaletteFormattedTextFieldUI.createUI(colorField)); colorField.setFormatterFactory(ColorFormatter.createFormatterFactory(ColorFormatter.Format.RGB_INTEGER_SHORT, false, false)); colorField.setHorizontalAlignment(JTextField.LEFT); disposables.add(new FigureAttributeEditorHandler<Color>(STROKE_COLOR, defaultAttributes, colorField, editor, true)); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridwidth = 3; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.anchor = GridBagConstraints.FIRST_LINE_START; p.add(colorField, gbc); btn = ButtonFactory.createSelectionColorChooserButton(editor, STROKE_COLOR, "attribute.strokeColor", labels, defaultAttributes, new Rectangle(3, 3, 10, 10), PaletteColorChooserUI.class, disposables); btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn)); ((JPopupButton) btn).setAction(null, null); gbc = new GridBagConstraints(); gbc.gridx = 3; gbc.anchor = GridBagConstraints.FIRST_LINE_START; p.add(btn, gbc); // Opacity field with slider JAttributeTextField<Double> opacityField = new JAttributeTextField<Double>(); opacityField.setColumns(4); opacityField.setToolTipText(labels.getString("attribute.strokeOpacity.toolTipText")); opacityField.setHorizontalAlignment(JAttributeTextField.RIGHT); opacityField.putClientProperty("Palette.Component.segmentPosition", "first"); opacityField.setUI((PaletteFormattedTextFieldUI) PaletteFormattedTextFieldUI.createUI(opacityField)); opacityField.setHorizontalAlignment(JTextField.LEFT); JavaNumberFormatter formatter = new JavaNumberFormatter(0d, 100d, 100d, false, "%"); formatter.setUsesScientificNotation(false); formatter.setMaximumFractionDigits(1); opacityField.setFormatterFactory(new DefaultFormatterFactory(formatter)); disposables.add(new FigureAttributeEditorHandler<Double>(STROKE_OPACITY, opacityField, editor)); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.insets = new Insets(3, 0, 0, 0); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.anchor = GridBagConstraints.FIRST_LINE_START; p.add(opacityField, gbc); JPopupButton opacityPopupButton = new JPopupButton(); JAttributeSlider opacitySlider = new JAttributeSlider(JSlider.VERTICAL, 0, 100, 100); opacityPopupButton.add(opacitySlider); labels.configureToolBarButton(opacityPopupButton, "attribute.strokeOpacity"); opacityPopupButton.setUI((PaletteButtonUI) PaletteButtonUI.createUI(opacityPopupButton)); opacityPopupButton.setIcon( new SelectionOpacityIcon(editor, STROKE_OPACITY, null, STROKE_COLOR, Images.createImage(getClass(), labels.getString("attribute.strokeOpacity.icon")), new Rectangle(5, 5, 6, 6), new Rectangle(4, 4, 7, 7))); opacityPopupButton.setPopupAnchor(SOUTH_EAST); disposables.add(new SelectionComponentRepainter(editor, opacityPopupButton)); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.weighty = 1f; gbc.insets = new Insets(3, 0, 0, 0); p.add(opacityPopupButton, gbc); opacitySlider.setUI((SliderUI) PaletteSliderUI.createUI(opacitySlider)); opacitySlider.setScaleFactor(100d); disposables.add(new FigureAttributeEditorHandler<Double>(STROKE_OPACITY, opacitySlider, editor)); // Create stroke width field with popup slider JAttributeTextField<Double> strokeWidthField = new JAttributeTextField<Double>(); strokeWidthField.setColumns(2); strokeWidthField.setToolTipText(labels.getString("attribute.strokeWidth.toolTipText")); strokeWidthField.setHorizontalAlignment(JAttributeTextField.LEFT); strokeWidthField.putClientProperty("Palette.Component.segmentPosition", "first"); strokeWidthField.setUI((PaletteFormattedTextFieldUI) PaletteFormattedTextFieldUI.createUI(strokeWidthField)); formatter = new JavaNumberFormatter(0d, 100d, 1d); formatter.setUsesScientificNotation(false); formatter.setMaximumFractionDigits(1); strokeWidthField.setFormatterFactory(new DefaultFormatterFactory(formatter)); disposables.add(new FigureAttributeEditorHandler<Double>(STROKE_WIDTH, strokeWidthField, editor)); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 2; gbc.insets = new Insets(3, 0, 0, 0); gbc.fill = GridBagConstraints.BOTH; p.add(strokeWidthField, gbc); JPopupButton strokeWidthPopupButton = new JPopupButton(); JAttributeSlider strokeWidthSlider = new JAttributeSlider( JSlider.VERTICAL, 0, 50, 1); strokeWidthSlider.setUI((SliderUI) PaletteSliderUI.createUI(strokeWidthSlider)); strokeWidthPopupButton.add(strokeWidthSlider); labels.configureToolBarButton(strokeWidthPopupButton, "attribute.strokeWidth"); strokeWidthPopupButton.setUI((PaletteButtonUI) PaletteButtonUI.createUI(strokeWidthPopupButton)); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.gridx = 1; gbc.insets = new Insets(3, 0, 0, 0); p.add(strokeWidthPopupButton, gbc); disposables.add(new FigureAttributeEditorHandler<Double>(STROKE_WIDTH, strokeWidthSlider, editor)); btn = ButtonFactory.createStrokeJoinButton(editor, labels, disposables); btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn)); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.gridx = 4; gbc.gridy = 0; gbc.gridwidth = 2; gbc.insets = new Insets(0, 3, 0, 0); p.add(btn, gbc); btn = ButtonFactory.createStrokeCapButton(editor, labels, disposables); btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn)); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.gridx = 4; gbc.gridy = 1; gbc.insets = new Insets(3, 3, 0, 0); p.add(btn, gbc); // Create dash offset field and dashes button JAttributeTextField<Double> dashOffsetField = new JAttributeTextField<Double>(); dashOffsetField.setColumns(1); dashOffsetField.setToolTipText(labels.getString("attribute.strokeDashPhase.toolTipText")); dashOffsetField.setHorizontalAlignment(JAttributeTextField.LEFT); //dashOffsetField.putClientProperty("Palette.Component.segmentPosition", "first"); dashOffsetField.setUI((PaletteFormattedTextFieldUI) PaletteFormattedTextFieldUI.createUI(dashOffsetField)); dashOffsetField.setFormatterFactory(JavaNumberFormatter.createFormatterFactory(-1000d, 1000d, 1d)); disposables.add(new FigureAttributeEditorHandler<Double>(STROKE_DASH_PHASE, dashOffsetField, editor)); gbc = new GridBagConstraints(); gbc.gridx = 2; gbc.gridy = 2; gbc.insets = new Insets(3, 3, 0, 0); gbc.fill = GridBagConstraints.BOTH; gbc.gridwidth = 2; p.add(dashOffsetField, gbc); btn = ButtonFactory.createStrokeDashesButton(editor, new double[][]{ null, {4d, 4d}, {2d, 2d}, {4d, 2d}, {2d, 4d}, {8d, 2d}, {6d, 2d, 2d, 2d},}, labels, disposables); btn.setUI((PaletteButtonUI) PaletteButtonUI.createUI(btn)); gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.gridx = 4; gbc.gridy = 2; gbc.insets = new Insets(3, 3, 0, 0); p.add(btn, gbc); } break; } return p; } @Override protected String getID() { return "stroke"; } @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() { setOpaque(false); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables }