KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > core > gui > search > IconTextField


1 package org.columba.core.gui.search;
2
3 import java.awt.Component JavaDoc;
4 import java.awt.Cursor JavaDoc;
5 import java.awt.Dimension JavaDoc;
6 import java.awt.FontMetrics JavaDoc;
7 import java.awt.Graphics JavaDoc;
8 import java.awt.Insets JavaDoc;
9 import java.awt.Rectangle JavaDoc;
10 import java.awt.event.MouseEvent JavaDoc;
11
12 import javax.swing.Icon JavaDoc;
13 import javax.swing.JPopupMenu JavaDoc;
14 import javax.swing.JTextField JavaDoc;
15 import javax.swing.border.AbstractBorder JavaDoc;
16 import javax.swing.border.Border JavaDoc;
17 import javax.swing.event.MouseInputAdapter JavaDoc;
18 import javax.swing.event.PopupMenuListener JavaDoc;
19
20 public class IconTextField extends JTextField JavaDoc {
21
22     private Icon JavaDoc icon;
23
24     private Rectangle JavaDoc iconBounds;
25
26     private JPopupMenu JavaDoc popupMenu;
27
28     private IconifiedBorder border;
29
30     public IconTextField(Icon JavaDoc icon, int columns) {
31         // initialization
32
super(columns);
33         
34         this.icon = icon;
35
36         popupMenu = new JPopupMenu JavaDoc();
37 // popupMenu.setFocusable( false );
38
// popupMenu.setRequestFocusEnabled(false);
39

40         // icon (we can't use the setIcon-method this time, as it relies on the
41
// border being set)
42
iconBounds = new Rectangle JavaDoc(0, 0, icon.getIconWidth(), icon
43                 .getIconHeight());
44
45         // border
46
border = new IconifiedBorder(getBorder(), icon, 1);
47         setBorder(border);
48
49         // controller
50
MouseHandler handler = new MouseHandler();
51         addMouseListener(handler);
52         addMouseMotionListener(handler);
53
54     }
55
56     public void addPopupMenuListener(PopupMenuListener JavaDoc listener) {
57         popupMenu.addPopupMenuListener(listener);
58     }
59
60     public void showPopup() {
61         //popupMenu.getSelectionModel().clearSelection();
62
popupMenu.show(IconTextField.this, 0, getHeight());
63         //popupMenu.getSelectionModel().setSelectedIndex(0);
64
}
65
66     public void setPopupMenu(JPopupMenu JavaDoc menu) {
67         JPopupMenu JavaDoc oldMenu = popupMenu;
68         popupMenu = menu;
69         firePropertyChange("popup", oldMenu, popupMenu);
70     }
71
72     public void setIcon(Icon JavaDoc ico) {
73         Icon JavaDoc oldIcon = this.icon;
74         this.icon = ico;
75         iconBounds = new Rectangle JavaDoc(0, 0, ico.getIconWidth(), ico
76                 .getIconHeight());
77         border.setIcon(icon);
78         firePropertyChange("icon", oldIcon, icon);
79     }
80
81     public Icon JavaDoc getIcon() {
82         return icon;
83     }
84
85     public JPopupMenu JavaDoc getPopupMenu() {
86         return popupMenu;
87     }
88
89     public Dimension JavaDoc getPreferredSize() {
90         Dimension JavaDoc size = super.getPreferredSize();
91         Insets JavaDoc insets = getInsets();
92         Insets JavaDoc margin = getMargin();
93         FontMetrics JavaDoc fm = getFontMetrics(getFont());
94         size.height = Math.max(fm.getHeight(), icon.getIconHeight())
95                 + insets.top + insets.bottom;
96         return size;
97     }
98
99     private class MouseHandler extends MouseInputAdapter JavaDoc {
100         public void mouseMoved(MouseEvent JavaDoc e) {
101             if (iconBounds.contains(e.getPoint())) {
102                 setCursor(Cursor.getDefaultCursor());
103             } else {
104                 setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
105             }
106         }
107
108         public void mouseClicked(MouseEvent JavaDoc e) {
109             if (iconBounds.contains(e.getPoint())) {
110                 if (popupMenu.isVisible()) {
111                     popupMenu.setVisible(false);
112                 } else {
113                     popupMenu.show(IconTextField.this, 0, getHeight());
114                 }
115             }
116         }
117     }
118
119     private class IconifiedBorder extends AbstractBorder JavaDoc {
120         private Border JavaDoc innerBorder;
121
122         private Icon JavaDoc icon;
123
124         private Insets JavaDoc insets;
125
126         private int spacing;
127
128         public IconifiedBorder(Border JavaDoc innerBorder, Icon JavaDoc icon, int spacing) {
129             this.innerBorder = innerBorder;
130             this.icon = icon;
131             this.spacing = spacing;
132         }
133
134         public void setIcon(Icon JavaDoc ico) {
135             this.icon = ico;
136             insets = null;
137         }
138
139         public Border JavaDoc getInnerBorder() {
140             return innerBorder;
141         }
142
143         public void paintBorder(Component JavaDoc c, Graphics JavaDoc g, int x, int y,
144                 int width, int height) {
145             innerBorder.paintBorder(c, g, x, y, width, height);
146             Insets JavaDoc innerInsets = innerBorder.getBorderInsets(c);
147             iconBounds.x = x + innerInsets.left + spacing;
148             iconBounds.y = y + innerInsets.top + spacing;
149             icon.paintIcon(c, g, iconBounds.x, iconBounds.y);
150         }
151
152         public Insets JavaDoc getBorderInsets(Component JavaDoc c) {
153             if (insets == null) {
154                 insets = (Insets JavaDoc) innerBorder.getBorderInsets(c).clone();
155                 insets.left += icon.getIconWidth() + spacing * 4;
156                 insets.top += spacing;
157                 insets.bottom += spacing;
158             }
159             return insets;
160         }
161     }
162
163 }
Popular Tags