/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Distributable under LGPL license. * See terms of license at gnu.org. */ package net.java.sip.communicator.plugin.desktoputil; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import net.java.sip.communicator.plugin.desktoputil.event.*; /** * The SIPCommTextField is a JTextField that offers the * possibility to specify a default (tip) text that explains what is the * required data. * @author Yana Stamcheva */ public class SIPCommTextField extends JTextField implements MouseListener, FocusListener, KeyListener, DocumentListener, ColoredDefaultText { /** * Serial version UID. */ private static final long serialVersionUID = 0L; /** * The default text. */ private String defaultText; /** * A list of all listeners registered for text field change events. */ private Collection changeListeners = new LinkedList(); /** * Indicates if the default text is currently visible. */ private boolean isDefaultTextVisible; /** * The color of the foreground. */ private Color foregroundColor = Color.BLACK; /** * The foreground color of the default text. */ private Color defaultTextColor = Color.GRAY; /** * Creates an instance of SIPCommTextField by specifying the text * we would like to show by default in it. * @param text the text we would like to enter by default */ public SIPCommTextField(String text) { super(text); if (text != null && text.length() > 0) { this.defaultText = text; isDefaultTextVisible = true; } this.setFont(getFont().deriveFont(10f)); this.setForeground(defaultTextColor); this.addMouseListener(this); this.addFocusListener(this); this.addKeyListener(this); this.getDocument().addDocumentListener(this); } /** * Indicates that the mouse button was pressed on this component. Hides * the default text when user clicks on the text field. * @param e the MouseEvent that notified us */ public void mousePressed(MouseEvent e) { if (getText() == null) { clearDefaultText(); } } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} /** * Selects the user text when this text field gains the focus. * @param e the FocusEvent that notified us */ public void focusGained(FocusEvent e) { clearDefaultText(); } /** * Sets the default text when the field looses focus. * @param e the FocusEvent that notified us */ public void focusLost(FocusEvent e) { if (getText() == null || getText().length() == 0) { setDefaultText(); } } /** * Returns the text contained in this field. * @return the text contained in this field */ @Override public String getText() { if (!super.getText().equals(defaultText)) return super.getText(); return null; } /** * Sets the text of this text field. * @param text the text to show in this text field */ @Override public void setText(String text) { if ((text == null || text.length() == 0) && !isFocusOwner()) setDefaultText(); else { this.setForeground(foregroundColor); super.setText(text); } } /** * Sets the default text. */ private void setDefaultText() { super.setText(defaultText); this.setForeground(defaultTextColor); this.setCaretPosition(0); } /** * Clears the default text. */ private void clearDefaultText() { if (super.getText().equals(defaultText)) { super.setText(""); this.setForeground(foregroundColor); } } /** * Clears the default text when a key pressed event is received. * @param e the KeyEvent that notified us */ public void keyPressed(KeyEvent e) { clearDefaultText(); } /** * Clears the default text when a key typed event is received. * @param e the KeyEvent that notified us */ public void keyTyped(KeyEvent e) { clearDefaultText(); } public void keyReleased(KeyEvent e){} /** * Adds the given TextFieldChangeListener to the list of listeners * notified on changes of the text contained in this field. * @param l the TextFieldChangeListener to add */ public void addTextChangeListener(TextFieldChangeListener l) { synchronized (changeListeners) { changeListeners.add(l); } } /** * Removes the given TextFieldChangeListener from the list of * listeners notified on changes of the text contained in this field. * @param l the TextFieldChangeListener to add */ public void removeTextChangeListener(TextFieldChangeListener l) { synchronized (changeListeners) { changeListeners.remove(l); } } public void changedUpdate(DocumentEvent e) {} /** * Handles the change when a char has been inserted in the field. * @param e the DocumentEvent that notified us */ public void insertUpdate(DocumentEvent e) { if(!super.getText().equals(defaultText)) fireTextFieldChangeListener(0); else isDefaultTextVisible = true; } /** * Handles the change when a char has been removed from the field. * @param e the DocumentEvent that notified us */ public void removeUpdate(DocumentEvent e) { if (!isDefaultTextVisible) fireTextFieldChangeListener(1); else isDefaultTextVisible = false; } /** * Sets the foreground color. * * @param c the color to set for the text field foreground */ public void setForegroundColor(Color c) { foregroundColor = c; } /** * Gets the foreground color. * * @return the color of the text */ public Color getForegroundColor() { return foregroundColor; } /** * Sets the foreground color of the default text shown in this text field. * * @param c the color to set */ public void setDefaultTextColor(Color c) { defaultTextColor = c; if (isDefaultTextVisible) setForeground(defaultTextColor); } /** * Gets the foreground color of the default text shown in this text field. * * @return the color of the default text */ public Color getDefaultTextColor() { return defaultTextColor; } /** * Notifies all registered TextFieldChangeListeners that a change * has occurred in the text contained in this field. * @param eventType the type of the event to transfer */ private void fireTextFieldChangeListener(int eventType) { for (TextFieldChangeListener l : changeListeners) switch (eventType) { case 0: l.textInserted(); break; case 1: l.textRemoved(); break; } } }