URLTool.java

/*
 * @(#)URLTool.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 CH.ifa.draw.samples.javadraw;

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

/**
 * A tool to attach URLs to figures.
 * The URLs are stored in the figure's "URL" attribute.
 * The URL text is entered with a FloatingTextField.
 *
 * @see CH.ifa.draw.util.FloatingTextField
 *
 * @version <$CURRENT_VERSION$>
 */
public  class URLTool extends AbstractTool {

	private FloatingTextField   fTextField;
	private Figure              fURLTarget;

	public URLTool(DrawingEditor newDrawingEditor) {
		super(newDrawingEditor);
	}

	public void mouseDown(MouseEvent e, int x, int y)
	{
		Figure pressedFigure;

		pressedFigure =  drawing().findFigureInside(x, y);
		if (pressedFigure != null) {
			beginEdit(pressedFigure);
			return;
		}
		endEdit();
		editor().toolDone();
	}

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

	public void deactivate(DrawingView view) {
		super.deactivate();
		endEdit();
	}

	private void beginEdit(Figure figure) {
		if (fTextField == null) {
			fTextField = new FloatingTextField();
			fTextField.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent event) {
						endEdit();
					}
				}
			);
		}

		if (figure != fURLTarget && fURLTarget != null) {
			endEdit();
		}
		if (figure != fURLTarget) {
			fTextField.createOverlay((Container)view());
			fTextField.setBounds(fieldBounds(figure), getURL(figure));
			fURLTarget = figure;
		}
	}

	private void endEdit() {
		if (fURLTarget != null) {
			setURL(fURLTarget, fTextField.getText());
			fURLTarget = null;
			fTextField.endOverlay();
		}
	}

	private Rectangle fieldBounds(Figure figure) {
		Rectangle box = figure.displayBox();
		int nChars = Math.max(20, getURL(figure).length());
		Dimension d = fTextField.getPreferredSize(nChars);
		box.x = Math.max(0, box.x + (box.width - d.width)/2);
		box.y = Math.max(0, box.y + (box.height - d.height)/2);
		return new Rectangle(box.x, box.y, d.width, d.height);
	}

	private String getURL(Figure figure) {
		String url = (String) figure.getAttribute("URL");
		if (url == null) {
			url = "";
		}
		return url;
	}

	private void setURL(Figure figure, String url) {
		figure.setAttribute("URL", url);
	}
}