/* * @(#)FloatingTextArea.java * * Copyright (c) 1996-2010 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.draw.text; import edu.umd.cs.findbugs.annotations.Nullable; import org.jhotdraw.draw.event.FigureListener; import org.jhotdraw.draw.event.FigureAdapter; import org.jhotdraw.draw.event.FigureEvent; import org.jhotdraw.draw.*; import java.awt.geom.*; import java.awt.*; import javax.swing.BorderFactory; import javax.swing.JTextArea; import javax.swing.JScrollPane; /** * A <em>floating text area</em> that is used to edit a {@link TextHolderFigure}. * * <hr> * <b>Design Patterns</b> * * <p><em>Framework</em><br> * The text creation and editing tools and the {@code TextHolderFigure} * interface define together the contracts of a smaller framework inside of the * JHotDraw framework for structured drawing editors.<br> * Contract: {@link TextHolderFigure}, {@link org.jhotdraw.draw.tool.TextCreationTool}, * {@link org.jhotdraw.draw.tool.TextAreaCreationTool}, * {@link org.jhotdraw.draw.tool.TextEditingTool}, * {@link org.jhotdraw.draw.tool.TextAreaEditingTool}, {@link FloatingTextField}, * {@link FloatingTextArea}. * <hr> * * @author Werner Randelshofer * @version $Id: FloatingTextArea.java -1 $ */ public class FloatingTextArea { /** * A scroll pane to allow for vertical scrolling while editing */ protected JScrollPane editScrollContainer; /** * The actual editor */ protected JTextArea textArea; /** * The drawing view. */ @Nullable protected DrawingView view; @Nullable private TextHolderFigure editedFigure; private FigureListener figureHandler = new FigureAdapter() { @Override public void attributeChanged(FigureEvent e) { updateWidget(); } }; /** * Constructor for the FloatingTextArea object */ public FloatingTextArea() { textArea = new JTextArea(); textArea.setWrapStyleWord(true); textArea.setLineWrap(true); editScrollContainer = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); editScrollContainer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); editScrollContainer.setBorder(BorderFactory.createLineBorder(Color.black)); } /** * Creates the overlay within the given container. * @param view the DrawingView */ public void createOverlay(DrawingView view) { createOverlay(view, null); } public void requestFocus() { textArea.requestFocus(); } /** * Creates the overlay for the given Container using a * specific font. * @param view the DrawingView * @param figure the figure holding the text */ public void createOverlay(DrawingView view, @Nullable TextHolderFigure figure) { view.getComponent().add(editScrollContainer, 0); editedFigure = figure; this.view = view; if (editedFigure != null) { editedFigure.addFigureListener(figureHandler); updateWidget(); } } protected void updateWidget() { Font f = editedFigure.getFont(); // FIXME - Should scale with fractional value! f = f.deriveFont(f.getStyle(), (float) (editedFigure.getFontSize() * view.getScaleFactor())); textArea.setFont(f); textArea.setForeground(editedFigure.getTextColor()); textArea.setBackground(editedFigure.getFillColor()); // textArea.setBounds(getFieldBounds(editedFigure)); } /** * Positions and sizes the overlay. * @param r the bounding Rectangle2D.Double for the overlay * @param text the text to edit */ public void setBounds(Rectangle2D.Double r, String text) { textArea.setText(text); editScrollContainer.setBounds(view.drawingToView(r)); editScrollContainer.setVisible(true); textArea.setCaretPosition(0); textArea.requestFocus(); } /** * Gets the text contents of the overlay. * @return The text value */ public String getText() { return textArea.getText(); } /** * Gets the preferred size of the overlay. * @param cols Description of the Parameter * @return The preferredSize value */ public Dimension getPreferredSize(int cols) { return new Dimension(textArea.getWidth(), textArea.getHeight()); } /** * Removes the overlay. */ public void endOverlay() { view.getComponent().requestFocus(); if (editScrollContainer != null) { editScrollContainer.setVisible(false); view.getComponent().remove(editScrollContainer); Rectangle bounds = editScrollContainer.getBounds(); view.getComponent().repaint(bounds.x, bounds.y, bounds.width, bounds.height); } if (editedFigure != null) { editedFigure.removeFigureListener(figureHandler); editedFigure = null; } } }