Package com.bbn.openmap.omGraphics

Source Code of com.bbn.openmap.omGraphics.BasicStrokeEditor

// **********************************************************************
//
// <copyright>
//
//  BBN Technologies
//  10 Moulton Street
//  Cambridge, MA 02138
//  (617) 873-8000
//
//  Copyright (C) BBNT Solutions LLC. All rights reserved.
//
// </copyright>
// **********************************************************************
//
// $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/omGraphics/BasicStrokeEditor.java,v $
// $RCSfile: BasicStrokeEditor.java,v $
// $Revision: 1.5.2.2 $
// $Date: 2005/08/09 21:17:46 $
// $Author: dietrick $
//
// **********************************************************************

package com.bbn.openmap.omGraphics;

/*  Java Core  */
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeSupport;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import com.bbn.openmap.util.PaletteHelper;
import com.bbn.openmap.util.PropUtils;

/**
* The BasicStrokeEditor provides a GUI to adjust BasicStroke
* parameters. It can provide a default button to launch itself, or a
* button can be set. This class is being replaced by the
* BasicStrokeEditorMenu.
*/
public class BasicStrokeEditor extends JDialog implements ActionListener {

    protected BasicStroke basicStroke = null;
    protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    protected float width; // must be >= 0f
    protected int endCaps; //CAP_ROUND, CAP_BUTT, CAP_SQUARE
    protected int lineJoins; //JOIN_BEVEL, JOIN_MITER, JOIN_ROUND
    protected float miterLimit; // 10f default, must be >= 1f
    protected float[] dash;
    protected float dashPhase;

    public BasicStrokeEditor() {
        basicStroke = new BasicStroke(1f);
    }

    public BasicStrokeEditor(BasicStroke bs) {
        if (bs != null) {
            basicStroke = bs;
        } else {
            basicStroke = new BasicStroke(1f);
        }

        setStrokeWidth(basicStroke.getLineWidth());
        setMiterLimit(basicStroke.getMiterLimit());
        setDash(basicStroke.getDashArray());
        setDashPhase(basicStroke.getDashPhase());
        setEndCaps(basicStroke.getEndCap());
        setLineJoins(basicStroke.getLineJoin());
    }

    public void resetStroke() {
        BasicStroke oldStroke = basicStroke;
        setMiterLimit(miterLimit);
        basicStroke = new BasicStroke(width, endCaps, lineJoins, miterLimit, dash, dashPhase);
        pcs.firePropertyChange("line", oldStroke, basicStroke);
    }

    protected void widgetsToSettings() {
        try {
            float w = new Float(widthField.getText()).floatValue();
            if (w < 0)
                w = 0;
            width = w;
        } catch (NumberFormatException nfe) {
            width = 1f;
        }

        try {
            setMiterLimit(new Float(miterLimitField.getText()).floatValue());
        } catch (NumberFormatException nfe) {
            setMiterLimit(10f);
        }

        dash = stringToDashArray(dashField.getText());

        try {
            float dp = new Float(dashPhaseField.getText()).floatValue();
            if (dp < 0f)
                dp = 0f;
            dashPhase = dp;
        } catch (NumberFormatException nfe) {
            dashPhase = 0f;
        }

        endCaps = capBox.getSelectedIndex();
        lineJoins = joinBox.getSelectedIndex();
    }

    protected transient JTextField widthField, miterLimitField, dashField,
            dashPhaseField;
    protected transient JPanel palette = null;
    protected transient JButton closebutton;
    protected transient JButton applybutton;
    protected transient JComboBox capBox;
    protected transient JComboBox joinBox;

    public void setGUI() {

        if (palette == null) {
            setTitle("Modify Line Stroke Parameters");
            palette = new JPanel();
            palette.setLayout(new BoxLayout(palette, BoxLayout.Y_AXIS));

            JPanel capPanel = PaletteHelper.createPaletteJPanel("Line Cap Decoration");
            String[] capStrings = { "Butt", "Round", "Square" };
            capBox = new JComboBox(capStrings);
            capBox.addActionListener(this);
            capPanel.add(capBox);
            palette.add(capPanel);

            JPanel joinPanel = PaletteHelper.createPaletteJPanel("Line Joint Decoration");

            String[] joinStrings = { "Miter", "Round", "Bevel" };
            joinBox = new JComboBox(joinStrings);
            joinBox.addActionListener(this);
            joinPanel.add(joinBox);
            palette.add(joinPanel);

            JPanel widthPanel = new JPanel();
            widthPanel.setLayout(new GridLayout(0, 1));

            JLabel widthLabel = new JLabel("Line Width");
            widthField = new JTextField(Float.toString(basicStroke.getLineWidth()), 4);
            widthField.setToolTipText("Enter pixel width of line.");
            widthPanel.add(widthLabel);
            widthPanel.add(widthField);

            JPanel mlPanel = new JPanel();
            mlPanel.setLayout(new GridLayout(0, 1));

            JLabel miterLimitLabel = new JLabel("Miter Limit");
            miterLimitField = new JTextField(Float.toString(basicStroke.getMiterLimit()), 4);
            miterLimitField.setToolTipText("Min angle for corner decorations.");

            mlPanel.add(miterLimitLabel);
            mlPanel.add(miterLimitField);

            JPanel dlPanel = new JPanel();
            dlPanel.setLayout(new FlowLayout());

            JLabel dashLabel = new JLabel("Dash Pattern");
//            float[] da = basicStroke.getDashArray();
//            String dashArrayString = dashArrayToString(da);

            dashField = new JTextField(dashArrayToString(basicStroke.getDashArray()), 15);
            dashField.setToolTipText("Number of pixels on off on ...");
            dlPanel.add(dashLabel);
            dlPanel.add(dashField);

            JPanel dpPanel = new JPanel();
            dpPanel.setLayout(new GridLayout(0, 1));

            JLabel dashPhaseLabel = new JLabel("Dash Phase");
            dashPhaseField = new JTextField(Float.toString(basicStroke.getDashPhase()), 4);
            dashPhaseField.setToolTipText("Phase to start dash array.");
            dpPanel.add(dashPhaseLabel);
            dpPanel.add(dashPhaseField);

            JPanel textFieldPanel = new JPanel();
            textFieldPanel.setLayout(new GridLayout(0, 3));
            textFieldPanel.add(widthPanel);
            textFieldPanel.add(dpPanel);
            textFieldPanel.add(mlPanel);
            palette.add(textFieldPanel);
            palette.add(dlPanel);

            JPanel buttonPanel = new JPanel();
            buttonPanel.setLayout(new GridLayout(0, 2));
            closebutton = new JButton("Cancel");
            closebutton.addActionListener(this);
            applybutton = new JButton("OK");
            applybutton.addActionListener(this);
            buttonPanel.add(applybutton);
            buttonPanel.add(closebutton);

            palette.add(buttonPanel);

            getContentPane().add(palette);
            this.pack();

        } else {
            widthField.setText(Float.toString(basicStroke.getLineWidth()));
            miterLimitField.setText(Float.toString(basicStroke.getMiterLimit()));
            dashField.setText(dashArrayToString(basicStroke.getDashArray()));
            dashPhaseField.setText(Float.toString(basicStroke.getDashPhase()));
        }

        // Set palette to current conditions;
        capBox.setSelectedIndex(basicStroke.getEndCap());
        joinBox.setSelectedIndex(basicStroke.getLineJoin());
    }

    public final static String NONE = "No Dash Pattern";

    public static String dashArrayToString(float[] da) {
        if (da == null) {
            return NONE;
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < da.length; i++) {
            sb.append(Float.toString(da[i]) + " ");
        }
        return sb.toString();
    }

    public static float[] stringToDashArray(String das) {
        if (das == null || das.equals(NONE) || das.equals("")) {
            return null;
        }

        Vector floats = PropUtils.parseSpacedMarkers(das);
        float[] ret = new float[floats.size()];
        int index = 0;
        Enumeration thing = floats.elements();
        while (thing.hasMoreElements()) {
            String f = (String) thing.nextElement();
            try {
                ret[index++] = (new Float(f)).floatValue();
            } catch (NumberFormatException nfe) {
                return null;
            }
        }

        return ret;
    }

    public final static String LaunchCmd = "LAUNCH";

    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == applybutton) {
            widgetsToSettings();
            resetStroke();
            this.setVisible(false);
        } else if (event.getSource() == closebutton) {
            this.setVisible(false);
        } else if (event.getActionCommand() == LaunchCmd) {
            setGUI();
            this.setVisible(true);
        } else {
            widgetsToSettings();
            resetStroke();
        }
    }

    public BasicStroke getBasicStroke() {
        return basicStroke;
    }

    public void setBasicStroke(BasicStroke bs) {
        basicStroke = bs;
        if (launchButton != null) {
            //          float buttonHeight = (bs == null?11:bs.getLineWidth() +
            // 10f);
            float buttonHeight = 20;
            launchButton.setIcon(createIcon(getBasicStroke(),
                    40,
                    (int) buttonHeight,
                    true));
        }
    }

    JButton launchButton;

    public void setLaunchButton(JButton lb) {
        launchButton = lb;
    }

    public JButton getLaunchButton() {
        if (launchButton == null) {
//            BasicStroke bs = getBasicStroke();
//            float buttonHeight = (bs == null ? 11 : bs.getLineWidth() + 10f);
            float buttonHeight = 20;
            ImageIcon icon = createIcon(getBasicStroke(),
                    40,
                    (int) buttonHeight,
                    true);
            launchButton = new JButton(icon);
            launchButton.setToolTipText("Modify Line Stroke");
            launchButton.addActionListener(this);
            launchButton.setActionCommand(LaunchCmd);
        }
        return launchButton;
    }

    public void setPropertyChangeSupport(
                                         PropertyChangeSupport propertyChangeSupport) {
        pcs = propertyChangeSupport;
    }

    public PropertyChangeSupport getPropertyChangeSupport() {
        return pcs;
    }

    /**
     * Given a BasicStroke, create an ImageIcon that shows it.
     *
     * @param stroke the BasicStroke to draw on the Icon.
     * @param width the width of the icon.
     * @param height the height of the icon.
     * @param horizontalOrientation if true, draw line on the icon
     *        horizontally, else draw it vertically.
     */
    public static ImageIcon createIcon(BasicStroke stroke, int width,
                                       int height, boolean horizontalOrientation) {

        BufferedImage bigImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = (Graphics2D) bigImage.getGraphics();

        g.setBackground(OMColor.clear);
        g.setPaint(OMColor.clear);
        g.fillRect(0, 0, width, height);
        g.setPaint(Color.black);
        g.setStroke(stroke);
        if (horizontalOrientation) {
            g.drawLine(0, height / 2, width, height / 2);
        } else {
            g.drawLine(width / 2, 0, width / 2, height);
        }

        return new ImageIcon(bigImage);
    }

    public void setStrokeWidth(float w) {
        if (w < 1)
            w = 1;
        width = w;
    }

    public float getStrokeWidth() {
        return width;
    }

    public void setMiterLimit(float ml) {
        if (ml < 1f)
            miterLimit = 10f;
        else
            miterLimit = ml;
    }

    public float getMiterLimit() {
        return miterLimit;
    }

    public void setDash(float[] da) {
        dash = da;
    }

    public float[] getDash() {
        return dash;
    }

    public void setDashPhase(float dp) {
        dashPhase = dp;
    }

    public float getDashPhase() {
        return dashPhase;
    }

    public void setEndCaps(int ec) {
        endCaps = ec;
    }

    public int getEndCaps() {
        return endCaps;
    }

    public void setLineJoins(int lj) {
        lineJoins = lj;
    }

    public int getLineJoins() {
        return lineJoins;
    }
}
TOP

Related Classes of com.bbn.openmap.omGraphics.BasicStrokeEditor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.