001: /*
002: * @(#)SelectAllFocusListener.java 8/30/2006
003: *
004: * Copyright 2002 - 2006 JIDE Software Inc. All rights reserved.
005: */
006:
007: package com.jidesoft.swing;
008:
009: import javax.swing.text.JTextComponent;
010: import java.awt.*;
011: import java.awt.event.FocusAdapter;
012: import java.awt.event.FocusEvent;
013: import java.awt.event.FocusListener;
014:
015: /**
016: * <code>SelectAllUtils</code> is a utility class to select all the text
017: * in a text component when the component first time receives focus. It's very easy to use it.
018: * <pre><code>
019: * JTextField field = new JTextField();
020: * SelectAllUtils.install(field);
021: * </code></pre>
022: * The component you pass in can be a JTextComponent or any container that contains
023: * one or more JTextComponents. All JTextComponents will be installed such a
024: * focus listener to select all when it gets focus for the first time. For example,
025: * you can install it to an editable JComboBox.
026: * <pre><code>
027: * JComboBox comboBox = new JComboBox();
028: * comboBox.setEditable(true);
029: * SelectAllUtils.install(comboBox);
030: * </code></pre>
031: * Although JComboBox is not JTextComponent but it contains a JTextField so it
032: * will still work. However please make sure call it after the call to
033: * comboBox.setEditable(true). Otherwise it will not work because JTextField is not created
034: * until setEditable(true) is called.
035: */
036: public class SelectAllUtils {
037: /**
038: * A client property. If set to Boolean.TRUE, we will only select all the text just for the first time when the component gets focus.
039: */
040: public static final String CLIENT_PROPERTY_ONLYONCE = "SelectAll.onlyOnce";
041:
042: private static FocusListener SELECT_ALL = new FocusAdapter() {
043: @Override
044: public void focusGained(FocusEvent e) {
045: Object object = e.getSource();
046: if (object instanceof JTextComponent) {
047: ((JTextComponent) object).selectAll();
048: Object clientProperty = ((JTextComponent) object)
049: .getClientProperty(CLIENT_PROPERTY_ONLYONCE);
050: if (Boolean.TRUE.equals(clientProperty)) {
051: ((JTextComponent) object)
052: .removeFocusListener(SELECT_ALL);
053: }
054: } else if (object instanceof Component) {
055: JideSwingUtilities.setRecursively((Component) object,
056: new JideSwingUtilities.Handler() {
057: public boolean condition(Component c) {
058: return c instanceof JTextComponent;
059: }
060:
061: public void action(Component c) {
062: ((JTextComponent) c).selectAll();
063: Object clientProperty = ((JTextComponent) c)
064: .getClientProperty(CLIENT_PROPERTY_ONLYONCE);
065: if (Boolean.TRUE.equals(clientProperty)) {
066: c.removeFocusListener(SELECT_ALL);
067: }
068: }
069:
070: public void postAction(Component c) {
071: }
072: });
073: }
074: }
075: };
076:
077: /**
078: * Installs focus listener to all text components inside the component. This focus listener
079: * will select all the text when it gets focus.
080: *
081: * @param component the component to make it select all when having focus. The component could be a JTextComponent or could be
082: * a container that contains one or more JTextComponents. This install method will make all JTextComponents
083: * to have this select all feature.
084: */
085: public static void install(final Component component) {
086: install(component, true);
087: }
088:
089: /**
090: * Installs focus listener to all text components inside the component. This focus listener
091: * will select all the text when it gets focus.
092: *
093: * @param component the component to make it select all when having focus. The component could be a JTextComponent or could be
094: * a container that contains one or more JTextComponents. This install method will make all JTextComponents
095: * to have this select all feature.
096: * @param onlyOnce if true, we will only select all the text when the component has focus for the first time. Otherwise, it will
097: * always select all the text whenever the component receives focus.
098: */
099: public static void install(final Component component,
100: final boolean onlyOnce) {
101: if (component instanceof JTextComponent) {
102: if (onlyOnce) {
103: ((JTextComponent) component).putClientProperty(
104: CLIENT_PROPERTY_ONLYONCE, Boolean.TRUE);
105: }
106: component.addFocusListener(SELECT_ALL);
107: } else {
108: JideSwingUtilities.setRecursively(component,
109: new JideSwingUtilities.Handler() {
110: public boolean condition(Component c) {
111: return c instanceof JTextComponent;
112: }
113:
114: public void action(Component c) {
115: if (onlyOnce) {
116: ((JTextComponent) c).putClientProperty(
117: CLIENT_PROPERTY_ONLYONCE,
118: Boolean.TRUE);
119: }
120: c.addFocusListener(SELECT_ALL);
121: }
122:
123: public void postAction(Component c) {
124: }
125: });
126: }
127: }
128:
129: /**
130: * Uninstalls focus listener to all text components inside the component.
131: *
132: * @param component the component which {@link #install(java.awt.Component)} is called.
133: */
134: public static void uninstall(Component component) {
135: if (component instanceof JTextComponent) {
136: component.removeFocusListener(SELECT_ALL);
137: } else {
138: JideSwingUtilities.setRecursively(component,
139: new JideSwingUtilities.Handler() {
140: public boolean condition(Component c) {
141: return c instanceof JTextComponent;
142: }
143:
144: public void action(Component c) {
145: c.removeFocusListener(SELECT_ALL);
146: }
147:
148: public void postAction(Component c) {
149: }
150: });
151: }
152: }
153: }
|