Package de.FeatureModellingTool.GraphicalEditor

Source Code of de.FeatureModellingTool.GraphicalEditor.FeatureCreationTool$FloatingTextFieldDocumentListener

package de.FeatureModellingTool.GraphicalEditor;

import research.tool.CreationTool;
import research.tool.Tool;
import de.FeatureModellingTool.FeatureModel.FeatureModel;
import de.FeatureModellingTool.FeatureModel.FeatureEditor;
import de.FeatureModellingTool.FeatureModel.FeatureModelEditor;
import de.FeatureModellingTool.FeatureModel.Feature;
import de.reuse.GroupMap;
import research.FloatingTextField;
import research.TextHolder;
import research.Figure;
import research.figure.TextFigure;


import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;
import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import java.beans.PropertyChangeEvent;
import java.awt.event.MouseEvent;
import java.awt.*;
import java.awt.geom.AffineTransform;

/**
* author: zhangwei
* Date: 2003-5-28
* Time: 21:45:24
*/
class FeatureCreationTool extends CreationTool implements ConstantDefinition {

    protected DocumentListener documentListener = new FloatingTextFieldDocumentListener();

    protected FloatingTextField fTextField;
    protected TextHolder fTypingTarget;

    private FeatureModel featureModel = null;
    private FeatureEditor featureEditor = null;
    private FeatureModelEditor featureModelEditor = null;

    private GroupMap idToFigureMap = null;

    private class FeatureDocument extends PlainDocument {

        public void insertString(int offset, String s, AttributeSet as)
                throws BadLocationException {
            s = s.replace(' ', '-');
            s = s.replace('/', '-');
            s = s.replace('\\', '-');
            s = s.replace(':', '-');
            s = s.replace('*', '-');
            s = s.replace('?', '-');
            s = s.replace('"', '-');
            s = s.replace('<', '-');
            s = s.replace('>', '-');
            s = s.replace('|', '-');
            super.insertString(offset, s, as);
        }
    }

    protected void contextChange(PropertyChangeEvent e) {
        super.contextChange(e);
        String propertyName = e.getPropertyName();
        if (FEATURE_MODEL.equals(propertyName)) {
            end();
            featureModel = (FeatureModel) e.getNewValue();
        } else if (FEATURE_EDITOR.equals(propertyName)) {
            end();
            featureEditor = (FeatureEditor) e.getNewValue();
        } else if (FEATURE_MODEL_EDITOR.equals(propertyName)) {
            end();
            featureModelEditor = (FeatureModelEditor) e.getNewValue();
        } else if (ID_TO_FIGURE_MAP.equals(propertyName)) {
            idToFigureMap = (GroupMap) e.getNewValue();
        }
    }

    public boolean isEnabled() {
        if (!super.isEnabled()) return false;
        if (featureModel == null) return false;
        if (featureEditor == null) return false;
        if (featureModelEditor == null) return false;

        return true;
    }

    /**
     * If the pressed figure is a TextHolder it can be edited otherwise
     * a new text figure is created.
     */
    public void mouseDown(MouseEvent e, int x, int y) {
        //if(!isEnabled()) return;

        if ((!isActivated()) && (!isEnabled()))
            return;

        boolean flag = false;

        if (getTypingTarget() != null) {//������ǰ�ı༭״̬
            endEdit(false);
            flag = true;
        }

        TextHolder textHolder = null;

        double scale = drawingView.getScale();
        int realX = (int) (e.getX() / scale + 0.5);
        int realY = (int) (e.getY() / scale + 0.5);

        Figure pressedFigure = drawingView.getDrawing().findFigureInside(realX, realY);

        if (pressedFigure instanceof FeatureFigure) {
            textHolder = (TextHolder) pressedFigure;
            if (!textHolder.acceptsTyping())
                textHolder = null;
        }

        if (textHolder != null) {//��ʼ�༭��갴�´���textHolder����������
            beginEdit(textHolder);
            return;
        }

        //if (getTypingTarget() != null) {//������ǰ�ı༭״̬
        //    endEdit();
        if (flag) {
            getPropertyChangeSupport().firePropertyChange(Tool.TOOL_DONE, false, true);
            flag = false;
        } else {//�����µ��ı�ͼԪ�����༭�����������
            super.mouseDown(e, x, y);

            //�� feature model ���������
            String name = (String) createdFigure.getAttribute(FeatureFigure.TEXT);
            if (name == null) name = "";
            Feature currentFeature = featureModelEditor.addFeature(name);
            createdFigure.setAttribute("id", currentFeature.getID());

            //����id��figure��ӳ���
            if (idToFigureMap != null) {
                idToFigureMap.add(currentFeature.getID(), createdFigure);
            }

            drawingView.checkDamage();
            textHolder = (TextHolder) createdFigure;
            beginEdit(textHolder);
        }
    }

    public void mouseDrag(MouseEvent e, int x, int y) {
    }

    public void mouseUp(MouseEvent e, int x, int y) {
    }

    public void end() {
        endEdit();
    }

    /**
     * VTextIconTest whether the text tool is currently activated and is displaying
     * a overlay TextFigure for accepting input.
     *
     * @return true, if the text tool has a accepting target TextFigure for its input, false otherwise
     */
    public boolean isActivated() {
        return getTypingTarget() != null;
    }

    protected void beginEdit(TextHolder figure) {
        if (fTextField == null) {
            fTextField = new FloatingTextField(new FeatureDocument());
            fTextField.addDocumentListener(documentListener);
        }

        if (figure != getTypingTarget() && getTypingTarget() != null) {
            endEdit();
        }


        AffineTransform trans = new AffineTransform();
        trans.scale(drawingView.getScale(), drawingView.getScale());
        Font displayFont = figure.getFont().deriveFont(trans);


        fTextField.createOverlay((Container) drawingView, displayFont);
        fTextField.setBackground((Color) ((Figure) figure).getAttribute("fillColor"));
        fTextField.setBounds(fieldBounds(figure), figure.getText());

        setTypingTarget(figure);
       
        fTextField.getTextField().selectAll();

    }

    public void endEdit() {
        endEdit(true);
    }

    protected void endEdit(boolean release) {
        if (getTypingTarget() != null) {

            /**
             if (fTextField.getText().length() > 0) {
             getTypingTarget().setText(fTextField.getText());
             } else {
             drawingView.remove(targetFigure);
             //ɾ����ͼԪ��Ӧ������
             featureModelEditor.removeFeature((String) targetFigure.getAttribute("id"));

             //����id��figure��ӳ���
             if (idToFigureMap != null) {
             idToFigureMap.remove((String) targetFigure.getAttribute("id"), targetFigure);
             }
             }
             **/

            getTypingTarget().setText(fTextField.getText());


            setTypingTarget(null);
            fTextField.endOverlay();

            if (release)
                getPropertyChangeSupport().firePropertyChange(Tool.TOOL_DONE, false, true);
        }
    }


    protected Rectangle fieldBounds(TextHolder figure) {
        Rectangle box = figure.textDisplayBox();

        double scale = drawingView.getScale();

        int realX = (int) (box.x * scale);
        int realY = (int) (box.y * scale);
        int realW = (int) (box.width * scale + 0.5);
        int realH = (int) (box.height * scale + 0.5);

        box.setRect(realX, realY, realW, realH);

        return box;
    }

    protected void setTypingTarget(TextHolder newTypingTarget) {
        fTypingTarget = newTypingTarget;
    }

    protected TextHolder getTypingTarget() {
        return fTypingTarget;
    }

    protected class FloatingTextFieldDocumentListener implements DocumentListener {
        public void changedUpdate(DocumentEvent evt) {
            updateBounds();
            updateFeatureName();
        }

        public void insertUpdate(DocumentEvent evt) {
            updateBounds();
            updateFeatureName();
        }

        public void removeUpdate(DocumentEvent evt) {
            updateBounds();
            updateFeatureName();
        }
    }


    protected void updateBounds() {
        if ((getTypingTarget() != null) && (fTextField != null)) {
            getTypingTarget().setText(fTextField.getText());
            fTextField.updateBounds(fieldBounds(getTypingTarget()));
            drawingView.checkDamage();
        }
    }

    /**
     * ���µ�ǰͼԪ���������������
     */
    protected void updateFeatureName() {
        if ((getTypingTarget() != null) && (fTextField != null)) {
            Figure figure = (Figure) getTypingTarget();
            String id = (String) figure.getAttribute("id");
            Feature feature = featureModel.getFeature(id);
            this.featureEditor.setName(feature, getTypingTarget().getText());
        }
    }

}
TOP

Related Classes of de.FeatureModellingTool.GraphicalEditor.FeatureCreationTool$FloatingTextFieldDocumentListener

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.