/*
 * @(#)TextTool.java 5.2
 *
 */

package CH.ifa.draw.figures;

import java.awt.*;
import java.awt.event.*;
import CH.ifa.draw.framework.*;
import CH.ifa.draw.standard.*;
import CH.ifa.draw.util.FloatingTextField;

/**
 * Tool to create new or edit existing text figures.
 * The editing behavior is implemented by overlaying the
 * Figure providing the text with a FloatingTextField.

* A tool interaction is done once a Figure that is not * a TextHolder is clicked. * * @see TextHolder * @see FloatingTextField */ public class TextTool extends CreationTool { private FloatingTextField fTextField; private TextHolder fTypingTarget; public TextTool(DrawingView view, Figure prototype) { super(view, prototype); } /** * 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; Figure pressedFigure = drawing().findFigureInside(x, y); if (pressedFigure instanceof TextHolder) { textHolder = (TextHolder) pressedFigure; if (!textHolder.acceptsTyping()) textHolder = null; } if (textHolder != null) { beginEdit(textHolder); return; } if (getTypingTarget() != null) { editor().toolDone(); endEdit(); } else { super.mouseDown(e, x, y); textHolder = (TextHolder)createdFigure(); beginEdit(textHolder); } } public void mouseDrag(MouseEvent e, int x, int y) { } public void mouseUp(MouseEvent e, int x, int y) { } /** * Terminates the editing of a text figure. */ public void deactivate() { super.deactivate(); endEdit(); } /** * Sets the text cursor. */ public void activate() { super.activate(); view().clearSelection(); // JDK1.1 TEXT_CURSOR has an incorrect hot spot //view().setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR)); } /** * Test 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(); if (figure != getTypingTarget() && getTypingTarget() != null) endEdit(); fTextField.createOverlay((Container)view(), figure.getFont()); fTextField.setBounds(fieldBounds(figure), figure.getText()); setTypingTarget(figure); view().checkDamage(); } protected void endEdit() { if (getTypingTarget() != null) { if (fTextField.getText().length() > 0) getTypingTarget().setText(fTextField.getText()); else { drawing().remove((Figure)getTypingTarget()); } setTypingTarget(null); fTextField.endOverlay(); view().checkDamage(); } } private Rectangle fieldBounds(TextHolder figure) { Rectangle box = figure.textDisplayBox(); int nChars = figure.overlayColumns(); Dimension d = fTextField.getPreferredSize(nChars); return new Rectangle(box.x, box.y, d.width, d.height); } protected void setTypingTarget(TextHolder newTypingTarget) { fTypingTarget = newTypingTarget; } protected TextHolder getTypingTarget() { return fTypingTarget; } }

Ads help maintain this website.