001    /*
002     * @(#)FloatingTextField.java
003     *
004     * Project:             JHotdraw - a GUI framework for technical drawings
005     *                              http://www.jhotdraw.org
006     *                              http://jhotdraw.sourceforge.net
007     * Copyright:   © by the original author(s) and all contributors
008     * License:             Lesser GNU Public License (LGPL)
009     *                              http://www.opensource.org/licenses/lgpl-license.html
010     */
011    
012    package org.objectweb.jac.ide.diagrams;
013    
014    import java.awt.Container;
015    import java.awt.Dimension;
016    import java.awt.Font;
017    import java.awt.Rectangle;
018    import java.awt.event.ActionListener;
019    import java.awt.event.KeyListener;
020    import javax.swing.JTextField;
021    
022    /**
023     * A text field overlay that is used to edit a TextFigure.
024     * A FloatingTextField requires a two step initialization:
025     * In a first step the overlay is created and in a
026     * second step it can be positioned.
027     *
028     * @see CH.ifa.draw.figures.TextFigure
029     *
030     * @version <$CURRENT_VERSION$>
031     */
032    public  class FloatingTextField {
033    
034       private JTextField   fEditWidget;
035       private Container   fContainer;
036    
037       public FloatingTextField() {
038          fEditWidget = new JTextField(20);
039       }
040    
041       /**
042        * Creates the overlay for the given Component.
043        */
044       public void createOverlay(Container container) {
045          createOverlay(container, null);
046       }
047    
048       /**
049        * Creates the overlay for the given Container using a
050        * specific font.
051        */
052       public void createOverlay(Container container, Font font) {
053          container.add(fEditWidget, 0);
054          if (font != null) {
055             fEditWidget.setFont(font);
056          }
057          fContainer = container;
058       }
059    
060       /**
061        * Adds an action listener
062        */
063       public void addActionListener(ActionListener listener) {
064          fEditWidget.addActionListener(listener);
065       }
066    
067       /**
068        * Remove an action listener
069        */
070       public void removeActionListener(ActionListener listener) {
071          fEditWidget.removeActionListener(listener);
072       }
073    
074       /**
075        * Adds an action listener
076        */
077       public void addKeyListener(KeyListener listener) {
078          fEditWidget.addKeyListener(listener);
079       }
080    
081       /**
082        * Remove an action listener
083        */
084       public void removeKeyListener(KeyListener listener) {
085          fEditWidget.removeKeyListener(listener);
086       }
087    
088       /**
089        * Positions the overlay.
090        */
091       public void setBounds(Rectangle r, String text) {
092          fEditWidget.setText(text);
093          fEditWidget.setBounds(r.x, r.y, r.width, r.height);
094          fEditWidget.setVisible(true);
095          fEditWidget.selectAll();
096          fEditWidget.requestFocus();
097       }
098    
099       /**
100        * Gets the text contents of the overlay.
101        */
102       public String getText() {
103          return fEditWidget.getText();
104       }
105    
106       /**
107        * Gets the preferred size of the overlay.
108        */
109       public Dimension getPreferredSize(int cols) {
110          fEditWidget.setColumns(cols);
111          return fEditWidget.getPreferredSize();
112       }
113    
114       /**
115        * Removes the overlay.
116        */
117       public void endOverlay() {
118          fContainer.requestFocus();
119          if (fEditWidget != null) {
120             fEditWidget.setVisible(false);
121             fContainer.remove(fEditWidget);
122    
123             Rectangle bounds = fEditWidget.getBounds();
124             fContainer.repaint(bounds.x, bounds.y, bounds.width, bounds.height);
125          }
126       }
127    }
128