Package research.tool

Source Code of research.tool.TextTool$FloatingTextFieldDocumentListener

/*
* @(#)TextTool.java
*
* Project:    JHotdraw - a GUI framework for technical drawings
*        http://www.jhotdraw.org
*        http://jhotdraw.sourceforge.net
* Copyright:  ?by the original author(s) and all contributors
* License:    Lesser GNU Public License (LGPL)
*        http://www.opensource.org/licenses/lgpl-license.html
*/

package research.tool;

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.event.*;

import research.TextHolder;
import research.Figure;
import research.FloatingTextField;

import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;


/**
* Tool to create new or edit existing text figures.
* The editing behavior is implemented by overlaying the
* Figure providing the text with a FloatingTextField.<p>
* A tool interaction is done once a Figure that is not
* a TextHolder is clicked.
*
* @see research.TextHolder
*
* @version <$CURRENT_VERSION$>
*/
public class TextTool extends CreationTool {

    protected DocumentListener documentListener = new FloatingTextFieldDocumentListener();

    protected FloatingTextField fTextField;
    protected TextHolder fTypingTarget;

    /**
     * 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) {
        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 TextHolder) {
            textHolder = (TextHolder) pressedFigure;
            if (!textHolder.acceptsTyping())
                textHolder = null;
        }
        if (textHolder != null) {
            beginEdit(textHolder);
            return;
        }
        if (getTypingTarget() != null) {
            endEdit();
        } else {
            super.mouseDown(e, x, y);
            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();
            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);
    }

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

    protected void endEdit(boolean release) {
        if (getTypingTarget() != null) {
            if (fTextField.getText().length() > 0) {
                getTypingTarget().setText(fTextField.getText());
            } else {
                drawingView.getDrawing().remove(createdFigure);
            }

            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();
        }

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

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

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

}

TOP

Related Classes of research.tool.TextTool$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.