freemind.modes.mindmapmode.dialogs.StylePatternFrame.java Source code

Java tutorial

Introduction

Here is the source code for freemind.modes.mindmapmode.dialogs.StylePatternFrame.java

Source

/*FreeMind - A Program for creating and viewing Mindmaps
 *Copyright (C) 2000-2006  Joerg Mueller, Daniel Polansky, Christian Foltin and others.
 *
 *See COPYING for Details
 *
 *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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * Created on 25.02.2006
 */

package freemind.modes.mindmapmode.dialogs;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.HeadlessException;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.JPanel;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

import freemind.common.BooleanProperty;
import freemind.common.ColorProperty;
import freemind.common.ComboProperty;
import freemind.common.FontProperty;
import freemind.common.IconProperty;
import freemind.common.NextLineProperty;
import freemind.common.PropertyBean;
import freemind.common.PropertyControl;
import freemind.common.ScriptEditorProperty;
import freemind.common.SeparatorProperty;
import freemind.common.StringProperty;
import freemind.common.TextTranslator;
import freemind.common.ThreeCheckBoxProperty;
import freemind.controller.actions.generated.instance.Pattern;
import freemind.controller.actions.generated.instance.PatternChild;
import freemind.controller.actions.generated.instance.PatternEdgeColor;
import freemind.controller.actions.generated.instance.PatternEdgeStyle;
import freemind.controller.actions.generated.instance.PatternEdgeWidth;
import freemind.controller.actions.generated.instance.PatternIcon;
import freemind.controller.actions.generated.instance.PatternNodeBackgroundColor;
import freemind.controller.actions.generated.instance.PatternNodeColor;
import freemind.controller.actions.generated.instance.PatternNodeFontBold;
import freemind.controller.actions.generated.instance.PatternNodeFontItalic;
import freemind.controller.actions.generated.instance.PatternNodeFontName;
import freemind.controller.actions.generated.instance.PatternNodeFontSize;
import freemind.controller.actions.generated.instance.PatternNodeStyle;
import freemind.controller.actions.generated.instance.PatternNodeText;
import freemind.controller.actions.generated.instance.PatternPropertyBase;
import freemind.controller.actions.generated.instance.PatternScript;
import freemind.main.FreeMind;
import freemind.main.FreeMindContants;
import freemind.modes.EdgeAdapter;
import freemind.modes.MindIcon;
import freemind.modes.MindMapNode;
import freemind.modes.mindmapmode.MindMapController;
import freemind.modes.mindmapmode.actions.ApplyPatternAction;
import freemind.modes.mindmapmode.actions.IconAction;

/**
 * @author foltin
 * 
 */
public class StylePatternFrame extends JPanel implements TextTranslator, PropertyChangeListener {
    public static final class StylePatternFrameType {
        private StylePatternFrameType() {

        }

        public static StylePatternFrameType WITHOUT_NAME_AND_CHILDS = new StylePatternFrameType();

        public static StylePatternFrameType WITH_NAME_AND_CHILDS = new StylePatternFrameType();
    }

    private static final String[] EDGE_STYLES = new String[] { EdgeAdapter.EDGESTYLE_LINEAR,
            EdgeAdapter.EDGESTYLE_BEZIER, EdgeAdapter.EDGESTYLE_SHARP_LINEAR, EdgeAdapter.EDGESTYLE_SHARP_BEZIER };

    private static final String[] EDGE_WIDTHS = new String[] { "EdgeWidth_parent", "EdgeWidth_thin", "EdgeWidth_1",
            "EdgeWidth_2", "EdgeWidth_4", "EdgeWidth_8" };

    private static final String NODE_BACKGROUND_COLOR = "nodebackgroundcolor";

    private static final String SET_RESOURCE = "set_property_text";

    private static final String SET_NODE_BACKGROUND_COLOR = SET_RESOURCE;

    private static final String NODE_COLOR = "nodecolor";

    private static final String SET_NODE_COLOR = SET_RESOURCE;

    private static final String SET_NODE_STYLE = SET_RESOURCE;

    private static final String NODE_STYLE = "nodestyle";

    private static final String NODE_FONT_NAME = "nodefontname";

    private static final String SET_NODE_FONT_NAME = SET_RESOURCE;

    private static final String NODE_FONT_SIZE = "nodefontsize";

    private static final String SET_NODE_FONT_SIZE = SET_RESOURCE;

    private static final String NODE_FONT_BOLD = "nodefontbold";

    private static final String SET_NODE_FONT_BOLD = SET_RESOURCE;

    private static final String NODE_FONT_ITALIC = "nodefontitalic";

    private static final String SET_NODE_FONT_ITALIC = SET_RESOURCE;

    private static final String SET_NODE_TEXT = SET_RESOURCE;

    private static final String NODE_TEXT = "nodetext";

    private static final String SET_EDGE_WIDTH = SET_RESOURCE;

    private static final String EDGE_WIDTH = "edgewidth";

    private static final String SET_EDGE_STYLE = SET_RESOURCE;

    private static final String EDGE_STYLE = "edgestyle";

    private static final String SET_EDGE_COLOR = SET_RESOURCE;

    private static final String EDGE_COLOR = "edgecolor";

    private static final String CLEAR_ALL_SETTERS = "clear_all_setters";

    private static final String SET_ICON = SET_RESOURCE;

    private static final String ICON = "icon";

    private static final String NODE_NAME = "patternname";

    private static final String SET_CHILD_PATTERN = SET_RESOURCE;

    private static final String CHILD_PATTERN = "childpattern";

    private static final String SET_SCRIPT = "setscript";

    private static final String SCRIPT = "script";

    private final TextTranslator mTranslator;

    private Vector mControls;

    private ThreeCheckBoxProperty mSetNodeColor;

    private ColorProperty mNodeColor;

    private ThreeCheckBoxProperty mSetNodeBackgroundColor;

    private ColorProperty mNodeBackgroundColor;

    private ThreeCheckBoxProperty mSetNodeStyle;

    private ComboProperty mNodeStyle;

    private ThreeCheckBoxProperty mSetNodeFontName;

    private FontProperty mNodeFontName;

    private ThreeCheckBoxProperty mSetNodeFontBold;

    private BooleanProperty mNodeFontBold;

    private ThreeCheckBoxProperty mSetNodeFontItalic;

    private BooleanProperty mNodeFontItalic;

    private ThreeCheckBoxProperty mSetNodeFontSize;

    private ComboProperty mNodeFontSize;

    private ThreeCheckBoxProperty mSetNodeText;

    private StringProperty mNodeText;

    private ThreeCheckBoxProperty mSetEdgeWidth;

    private ComboProperty mEdgeWidth;

    private ThreeCheckBoxProperty mSetEdgeStyle;

    private ComboProperty mEdgeStyle;

    private ThreeCheckBoxProperty mSetEdgeColor;

    private ColorProperty mEdgeColor;

    private ThreeCheckBoxProperty mSetIcon;

    private IconProperty mIcon;

    private ThreeCheckBoxProperty mSetChildPattern;

    private ComboProperty mChildPattern;

    private ThreeCheckBoxProperty mSetScriptPattern;

    private ScriptEditorProperty mScriptPattern;

    private StringProperty mName;

    private Vector mIconInformationVector;

    /**
     * Denotes pairs property -> ThreeCheckBoxProperty such that the boolean
     * property can be set, when the format property is changed.
     */
    private HashMap mPropertyChangePropagation = new HashMap();

    private ThreeCheckBoxProperty mClearSetters;

    private final MindMapController mMindMapController;

    private final StylePatternFrameType mType;

    /**
     * @throws HeadlessException
     */
    public StylePatternFrame(TextTranslator pTranslator, MindMapController pMindMapController,
            StylePatternFrameType pType) throws HeadlessException {
        super();
        mTranslator = pTranslator;
        mMindMapController = pMindMapController;
        mType = pType;
    }

    /**
     * Creates all controls and adds them to the frame.
     */
    public void init() {
        CardLayout cardLayout = new CardLayout();
        JPanel rightStack = new JPanel(cardLayout);
        String form = "right:max(40dlu;p), 4dlu, 20dlu, 7dlu,right:max(40dlu;p), 4dlu, 80dlu, 7dlu";
        FormLayout rightLayout = new FormLayout(form, "");
        DefaultFormBuilder rightBuilder = new DefaultFormBuilder(rightLayout);
        rightBuilder.setDefaultDialogBorder();
        mControls = getControls();
        for (Iterator i = mControls.iterator(); i.hasNext();) {
            PropertyControl control = (PropertyControl) i.next();
            control.layout(rightBuilder, this);
        }
        // add the last one, too
        rightStack.add(rightBuilder.getPanel(), "testTab");
        add(rightStack, BorderLayout.CENTER);
    }

    public void addListeners() {
        // add listeners:
        for (Iterator iter = mControls.iterator(); iter.hasNext();) {
            PropertyControl control = (PropertyControl) iter.next();
            if (control instanceof PropertyBean) {
                PropertyBean bean = (PropertyBean) control;
                bean.addPropertyChangeListener(this);
            }
        }
        mClearSetters.addPropertyChangeListener(new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent pEvt) {
                for (Iterator iter = mPropertyChangePropagation.keySet().iterator(); iter.hasNext();) {
                    ThreeCheckBoxProperty booleanProp = (ThreeCheckBoxProperty) iter.next();
                    booleanProp.setValue(mClearSetters.getValue());
                }
            }
        });
    }

    private String[] sizes = new String[] { "2", "4", "6", "8", "10", "12", "14", "16", "18", "20", "22", "24",
            "30", "36", "48", "72" };

    private List mPatternList;

    private Vector getControls() {
        Vector controls = new Vector();
        controls.add(new SeparatorProperty("General"));
        mClearSetters = new ThreeCheckBoxProperty(CLEAR_ALL_SETTERS + ".tooltip", CLEAR_ALL_SETTERS);
        mClearSetters.setValue(ThreeCheckBoxProperty.TRUE_VALUE);
        controls.add(mClearSetters);
        if (StylePatternFrameType.WITH_NAME_AND_CHILDS.equals(mType)) {
            mName = new StringProperty(NODE_NAME + ".tooltip", NODE_NAME);
            controls.add(mName);
            // child pattern
            mSetChildPattern = new ThreeCheckBoxProperty(SET_CHILD_PATTERN + ".tooltip", SET_CHILD_PATTERN);
            controls.add(mSetChildPattern);
            Vector childNames = new Vector();
            mChildPattern = new ComboProperty(CHILD_PATTERN + ".tooltip", CHILD_PATTERN, childNames, childNames);
            controls.add(mChildPattern);
        }
        controls.add(new NextLineProperty());
        controls.add(new SeparatorProperty("NodeColors"));
        mSetNodeColor = new ThreeCheckBoxProperty(SET_NODE_COLOR + ".tooltip", SET_NODE_COLOR);
        controls.add(mSetNodeColor);
        FreeMind fmMain = (FreeMind) mMindMapController.getFrame();
        mNodeColor = new ColorProperty(NODE_COLOR + ".tooltip", NODE_COLOR,
                fmMain.getDefaultProperty(FreeMindContants.RESOURCES_NODE_TEXT_COLOR), this);
        controls.add(mNodeColor);
        mSetNodeBackgroundColor = new ThreeCheckBoxProperty(SET_NODE_BACKGROUND_COLOR + ".tooltip",
                SET_NODE_BACKGROUND_COLOR);
        controls.add(mSetNodeBackgroundColor);
        mNodeBackgroundColor = new ColorProperty(NODE_BACKGROUND_COLOR + ".tooltip", NODE_BACKGROUND_COLOR,
                fmMain.getDefaultProperty(FreeMindContants.RESOURCES_BACKGROUND_COLOR), this);
        controls.add(mNodeBackgroundColor);
        controls.add(new SeparatorProperty("NodeStyles"));
        mSetNodeStyle = new ThreeCheckBoxProperty(SET_NODE_STYLE + ".tooltip", SET_NODE_STYLE);
        controls.add(mSetNodeStyle);
        mNodeStyle = new ComboProperty(NODE_STYLE + ".tooltip", NODE_STYLE, MindMapNode.NODE_STYLES, this);
        controls.add(mNodeStyle);
        mIconInformationVector = new Vector();
        MindMapController controller = mMindMapController;
        Vector iconActions = controller.iconActions;
        for (Enumeration e = iconActions.elements(); e.hasMoreElements();) {
            IconAction action = ((IconAction) e.nextElement());
            MindIcon info = action.getMindIcon();
            mIconInformationVector.add(info);
        }
        mSetIcon = new ThreeCheckBoxProperty(SET_ICON + ".tooltip", SET_ICON);
        controls.add(mSetIcon);
        mIcon = new IconProperty(ICON + ".tooltip", ICON, mMindMapController.getFrame(), mIconInformationVector);
        controls.add(mIcon);
        controls.add(new NextLineProperty());
        controls.add(new SeparatorProperty("NodeFont"));
        mSetNodeFontName = new ThreeCheckBoxProperty(SET_NODE_FONT_NAME + ".tooltip", SET_NODE_FONT_NAME);
        controls.add(mSetNodeFontName);
        mNodeFontName = new FontProperty(NODE_FONT_NAME + ".tooltip", NODE_FONT_NAME, this);
        controls.add(mNodeFontName);
        mSetNodeFontSize = new ThreeCheckBoxProperty(SET_NODE_FONT_SIZE + ".tooltip", SET_NODE_FONT_SIZE);
        controls.add(mSetNodeFontSize);
        Vector sizesVector = new Vector();
        for (int i = 0; i < sizes.length; i++) {
            sizesVector.add(sizes[i]);
        }
        mNodeFontSize = new IntegerComboProperty(NODE_FONT_SIZE + ".tooltip", NODE_FONT_SIZE, sizes, sizesVector);
        controls.add(mNodeFontSize);
        mSetNodeFontBold = new ThreeCheckBoxProperty(SET_NODE_FONT_BOLD + ".tooltip", SET_NODE_FONT_BOLD);
        controls.add(mSetNodeFontBold);
        mNodeFontBold = new BooleanProperty(NODE_FONT_BOLD + ".tooltip", NODE_FONT_BOLD);
        controls.add(mNodeFontBold);
        mSetNodeFontItalic = new ThreeCheckBoxProperty(SET_NODE_FONT_ITALIC + ".tooltip", SET_NODE_FONT_ITALIC);
        controls.add(mSetNodeFontItalic);
        mNodeFontItalic = new BooleanProperty(NODE_FONT_ITALIC + ".tooltip", NODE_FONT_ITALIC);
        controls.add(mNodeFontItalic);
        /* **** */
        mSetNodeText = new ThreeCheckBoxProperty(SET_NODE_TEXT + ".tooltip", SET_NODE_TEXT);
        controls.add(mSetNodeText);
        mNodeText = new StringProperty(NODE_TEXT + ".tooltip", NODE_TEXT);
        controls.add(mNodeText);
        /* **** */
        controls.add(new SeparatorProperty("EdgeControls"));
        mSetEdgeWidth = new ThreeCheckBoxProperty(SET_EDGE_WIDTH + ".tooltip", SET_EDGE_WIDTH);
        controls.add(mSetEdgeWidth);
        mEdgeWidth = new ComboProperty(EDGE_WIDTH + ".tooltip", EDGE_WIDTH, EDGE_WIDTHS, this);
        controls.add(mEdgeWidth);
        /* **** */
        mSetEdgeStyle = new ThreeCheckBoxProperty(SET_EDGE_STYLE + ".tooltip", SET_EDGE_STYLE);
        controls.add(mSetEdgeStyle);
        mEdgeStyle = new ComboProperty(EDGE_STYLE + ".tooltip", EDGE_STYLE, EDGE_STYLES, this);
        controls.add(mEdgeStyle);
        /* **** */
        mSetEdgeColor = new ThreeCheckBoxProperty(SET_EDGE_COLOR + ".tooltip", SET_EDGE_COLOR);
        controls.add(mSetEdgeColor);
        mEdgeColor = new ColorProperty(EDGE_COLOR + ".tooltip", EDGE_COLOR,
                fmMain.getDefaultProperty(FreeMindContants.RESOURCES_EDGE_COLOR), this);
        controls.add(mEdgeColor);
        /* **** */
        controls.add(new SeparatorProperty("ScriptingControl"));
        mSetScriptPattern = new ThreeCheckBoxProperty(SET_SCRIPT + ".tooltip", SET_SCRIPT);
        controls.add(mSetScriptPattern);
        mScriptPattern = new ScriptEditorProperty(SCRIPT + ".tooltip", SCRIPT, mMindMapController);
        controls.add(mScriptPattern);
        // fill map;
        mPropertyChangePropagation.put(mSetNodeColor, mNodeColor);
        mPropertyChangePropagation.put(mSetNodeBackgroundColor, mNodeBackgroundColor);
        mPropertyChangePropagation.put(mSetNodeStyle, mNodeStyle);
        mPropertyChangePropagation.put(mSetNodeFontName, mNodeFontName);
        mPropertyChangePropagation.put(mSetNodeFontSize, mNodeFontSize);
        mPropertyChangePropagation.put(mSetNodeFontBold, mNodeFontBold);
        mPropertyChangePropagation.put(mSetNodeFontItalic, mNodeFontItalic);
        mPropertyChangePropagation.put(mSetNodeText, mNodeText);
        mPropertyChangePropagation.put(mSetEdgeColor, mEdgeColor);
        mPropertyChangePropagation.put(mSetEdgeStyle, mEdgeStyle);
        mPropertyChangePropagation.put(mSetEdgeWidth, mEdgeWidth);
        mPropertyChangePropagation.put(mSetIcon, mIcon);
        mPropertyChangePropagation.put(mSetScriptPattern, mScriptPattern);
        if (StylePatternFrameType.WITH_NAME_AND_CHILDS.equals(mType)) {
            // child pattern
            mPropertyChangePropagation.put(mSetChildPattern, mChildPattern);
        }
        return controls;
    }

    private Vector getPatternNames() {
        Vector childNames = new Vector();
        for (Iterator iter = mPatternList.iterator(); iter.hasNext();) {
            Pattern pattern = (Pattern) iter.next();
            childNames.add(pattern.getName());
        }
        return childNames;
    }

    public String getText(String pKey) {
        return mTranslator.getText("PatternDialog." + pKey);
    }

    public void setPattern(Pattern pattern) {
        FreeMind fmMain = (FreeMind) mMindMapController.getFrame();
        setPatternControls(pattern.getPatternNodeColor(), mSetNodeColor, mNodeColor,
                fmMain.getDefaultProperty(FreeMindContants.RESOURCES_NODE_TEXT_COLOR));
        setPatternControls(pattern.getPatternNodeBackgroundColor(), mSetNodeBackgroundColor, mNodeBackgroundColor,
                fmMain.getDefaultProperty(FreeMindContants.RESOURCES_BACKGROUND_COLOR));
        setPatternControls(pattern.getPatternNodeStyle(), mSetNodeStyle, mNodeStyle, MindMapNode.STYLE_AS_PARENT);
        setPatternControls(pattern.getPatternNodeText(), mSetNodeText, mNodeText, "");
        setPatternControls(pattern.getPatternEdgeColor(), mSetEdgeColor, mEdgeColor,
                fmMain.getDefaultProperty(FreeMindContants.RESOURCES_EDGE_COLOR));
        setPatternControls(pattern.getPatternEdgeStyle(), mSetEdgeStyle, mEdgeStyle, EDGE_STYLES[0]);
        setPatternControls(pattern.getPatternEdgeWidth(), mSetEdgeWidth, mEdgeWidth, EDGE_WIDTHS[0],
                new EdgeWidthTransformer());
        setPatternControls(pattern.getPatternNodeFontName(), mSetNodeFontName, mNodeFontName,
                mMindMapController.getController().getDefaultFontFamilyName());
        setPatternControls(pattern.getPatternNodeFontSize(), mSetNodeFontSize, mNodeFontSize, sizes[0]);
        setPatternControls(pattern.getPatternNodeFontBold(), mSetNodeFontBold, mNodeFontBold,
                BooleanProperty.TRUE_VALUE);
        setPatternControls(pattern.getPatternNodeFontItalic(), mSetNodeFontItalic, mNodeFontItalic,
                BooleanProperty.TRUE_VALUE);
        MindIcon firstInfo = (MindIcon) mIconInformationVector.get(0);
        setPatternControls(pattern.getPatternIcon(), mSetIcon, mIcon, firstInfo.getName());
        setPatternControls(pattern.getPatternScript(), mSetScriptPattern, mScriptPattern, "");
        if (StylePatternFrameType.WITH_NAME_AND_CHILDS.equals(mType)) {
            mName.setValue(pattern.getName());
            setPatternControls(pattern.getPatternChild(), mSetChildPattern, mChildPattern,
                    (mPatternList.size() > 0) ? ((Pattern) mPatternList.get(0)).getName() : null);

        }
        for (Iterator iter = mPropertyChangePropagation.keySet().iterator(); iter.hasNext();) {
            ThreeCheckBoxProperty prop = (ThreeCheckBoxProperty) iter.next();
            propertyChange(new PropertyChangeEvent(prop, prop.getLabel(), null, prop.getValue()));
        }

    }

    private interface ValueTransformator {
        String transform(String value);
    }

    private final class IdentityTransformer implements ValueTransformator {
        public String transform(String value) {
            return value;
        }
    }

    private final class EdgeWidthTransformer implements ValueTransformator {
        public String transform(String value) {
            return transformEdgeWidth(value);
        }
    }

    private final class EdgeWidthBackTransformer implements ValueTransformator {
        public String transform(String value) {
            return transformStringToWidth(value);
        }
    }

    private void setPatternControls(PatternPropertyBase patternProperty, PropertyBean threeCheckBoxProperty,
            PropertyBean property, String defaultValue) {
        setPatternControls(patternProperty, threeCheckBoxProperty, property, defaultValue,
                new IdentityTransformer());
    }

    /**
     */
    private void setPatternControls(PatternPropertyBase patternProperty, PropertyBean threeCheckBoxProperty,
            PropertyBean property, String defaultValue, ValueTransformator transformer) {
        if (patternProperty == null) {
            // value is not set:
            property.setValue(defaultValue);
            threeCheckBoxProperty.setValue(ThreeCheckBoxProperty.DON_T_TOUCH_VALUE);
            return;
        }
        if (patternProperty.getValue() == null) {
            // remove prop:
            property.setValue(defaultValue);
            threeCheckBoxProperty.setValue(ThreeCheckBoxProperty.FALSE_VALUE);
            return;
        }
        property.setValue(transformer.transform(patternProperty.getValue()));
        threeCheckBoxProperty.setValue(ThreeCheckBoxProperty.TRUE_VALUE);
    }

    private String transformEdgeWidth(String pEdgeWidth) {
        if (pEdgeWidth == null)
            return null;
        int edgeWidth = ApplyPatternAction.edgeWidthStringToInt(pEdgeWidth);
        HashMap transformator = getEdgeWidthTransformation();
        for (Iterator iter = transformator.keySet().iterator(); iter.hasNext();) {
            String widthString = (String) iter.next();
            Integer width = (Integer) transformator.get(widthString);
            if (edgeWidth == width.intValue()) {
                return widthString;
            }
        }
        // not found:
        return null;
    }

    private String transformStringToWidth(String value) {
        HashMap transformator = getEdgeWidthTransformation();
        int intWidth = ((Integer) transformator.get(value)).intValue();
        return ApplyPatternAction.edgeWidthIntToString(intWidth);
    }

    private HashMap getEdgeWidthTransformation() {
        HashMap transformator = new HashMap();
        transformator.put(EDGE_WIDTHS[0], new Integer(EdgeAdapter.WIDTH_PARENT));
        transformator.put(EDGE_WIDTHS[1], new Integer(EdgeAdapter.WIDTH_THIN));
        transformator.put(EDGE_WIDTHS[2], new Integer(1));
        transformator.put(EDGE_WIDTHS[3], new Integer(2));
        transformator.put(EDGE_WIDTHS[4], new Integer(4));
        transformator.put(EDGE_WIDTHS[5], new Integer(8));
        return transformator;
    }

    public Pattern getResultPattern() {
        Pattern pattern = new Pattern();
        return getResultPattern(pattern);
    }

    public Pattern getResultPattern(Pattern pattern) {
        pattern.setPatternNodeColor(
                (PatternNodeColor) getPatternResult(new PatternNodeColor(), mSetNodeColor, mNodeColor));
        pattern.setPatternNodeBackgroundColor((PatternNodeBackgroundColor) getPatternResult(
                new PatternNodeBackgroundColor(), mSetNodeBackgroundColor, mNodeBackgroundColor));
        pattern.setPatternNodeStyle(
                (PatternNodeStyle) getPatternResult(new PatternNodeStyle(), mSetNodeStyle, mNodeStyle));
        pattern.setPatternNodeText(
                (PatternNodeText) getPatternResult(new PatternNodeText(), mSetNodeText, mNodeText));
        /* edges */
        pattern.setPatternEdgeColor(
                (PatternEdgeColor) getPatternResult(new PatternEdgeColor(), mSetEdgeColor, mEdgeColor));
        pattern.setPatternEdgeStyle(
                (PatternEdgeStyle) getPatternResult(new PatternEdgeStyle(), mSetEdgeStyle, mEdgeStyle));
        pattern.setPatternEdgeWidth((PatternEdgeWidth) getPatternResult(new PatternEdgeWidth(), mSetEdgeWidth,
                mEdgeWidth, new EdgeWidthBackTransformer()));
        /* font */
        pattern.setPatternNodeFontName(
                (PatternNodeFontName) getPatternResult(new PatternNodeFontName(), mSetNodeFontName, mNodeFontName));
        pattern.setPatternNodeFontSize(
                (PatternNodeFontSize) getPatternResult(new PatternNodeFontSize(), mSetNodeFontSize, mNodeFontSize));
        pattern.setPatternNodeFontBold(
                (PatternNodeFontBold) getPatternResult(new PatternNodeFontBold(), mSetNodeFontBold, mNodeFontBold));
        pattern.setPatternNodeFontItalic((PatternNodeFontItalic) getPatternResult(new PatternNodeFontItalic(),
                mSetNodeFontItalic, mNodeFontItalic));
        pattern.setPatternIcon((PatternIcon) getPatternResult(new PatternIcon(), mSetIcon, mIcon));
        pattern.setPatternScript(
                (PatternScript) getPatternResult(new PatternScript(), mSetScriptPattern, mScriptPattern));
        if (StylePatternFrameType.WITH_NAME_AND_CHILDS.equals(mType)) {
            pattern.setName(mName.getValue());
            pattern.setPatternChild(
                    (PatternChild) getPatternResult(new PatternChild(), mSetChildPattern, mChildPattern));
        }
        return pattern;
    }

    private PatternPropertyBase getPatternResult(PatternPropertyBase baseProperty,
            ThreeCheckBoxProperty threeCheckBoxProperty, PropertyBean property) {
        ValueTransformator transformer = new IdentityTransformer();
        return getPatternResult(baseProperty, threeCheckBoxProperty, property, transformer);
    }

    /**
     */
    private PatternPropertyBase getPatternResult(PatternPropertyBase baseProperty,
            ThreeCheckBoxProperty threeCheckBoxProperty, PropertyBean property, ValueTransformator transformer) {
        String checkboxResult = threeCheckBoxProperty.getValue();
        if (checkboxResult == null) {
            return null;
        }
        if (checkboxResult.equals(ThreeCheckBoxProperty.DON_T_TOUCH_VALUE)) {
            return null;
        }
        if (checkboxResult.equals(ThreeCheckBoxProperty.FALSE_VALUE)) {
            // remove property:
            return baseProperty;
        }
        baseProperty.setValue(transformer.transform(property.getValue()));
        return baseProperty;
    }

    /**
     * Used to enable/disable the attribute controls, if the check boxes are
     * changed.
     */
    public void propertyChange(PropertyChangeEvent pEvt) {
        // System.out.println("Propagation of "+ pEvt.getPropertyName()
        // + " with value " + pEvt.getNewValue() + " and source " +
        // pEvt.getSource());
        if (mPropertyChangePropagation.containsKey(pEvt.getSource())) {
            ThreeCheckBoxProperty booleanProp = (ThreeCheckBoxProperty) pEvt.getSource();
            // enable only when set:
            PropertyControl bean = (PropertyControl) mPropertyChangePropagation.get(booleanProp);
            bean.setEnabled(ThreeCheckBoxProperty.TRUE_VALUE.equals(booleanProp.getValue()));
            return;
        }
    }

    /**
     * For the child pattern box, the list is set here.
     * 
     */
    public void setPatternList(List patternList) {
        this.mPatternList = patternList;
        Vector childNames = getPatternNames();
        mChildPattern.updateComboBoxEntries(childNames, childNames);
    }

}