1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * ident	"%Z%%M%	%I%	%E% SMI"
24 *
25 * Copyright (c) 2000 by Sun Microsystems, Inc.
26 * All rights reserved.
27 */
28
29/*
30 *        Copyright (C) 1996  Active Software, Inc.
31 *                  All rights reserved.
32 *
33 * @(#) KeyField.java 1.6 - last change made 05/02/97
34 */
35
36package sunsoft.jws.visual.rt.awt;
37
38import sunsoft.jws.visual.rt.base.Global;
39import java.awt.*;
40
41public class KeyField extends Canvas {
42    // commented out -kp use Event constants...
43    //  public static final int ESC = 27;
44    //  public static final int DELETE = 127;
45
46
47
48
49    private static int ipadx = 20;
50    private static int ipady = 14;
51
52    private int key;
53    private FontMetrics fontMetrics;
54    private boolean hasFocus;
55
56    public void addNotify() {
57        super.addNotify();
58        fontMetrics = getFontMetrics(getFont());
59    }
60
61    public void removeNotify() {
62        super.removeNotify();
63        fontMetrics = null;
64    }
65
66    public Dimension minimumSize() {
67        Dimension d = new Dimension(0, 0);
68
69        if (fontMetrics != null) {
70            d.width = fontMetrics.stringWidth(/* NOI18N */
71					      "Carriage Return") + ipadx;
72            d.height = fontMetrics.getMaxAscent() + ipady;
73        }
74
75        return d;
76    }
77
78    public Dimension preferredSize() {
79        return minimumSize();
80    }
81
82    public void setKey(int key) {
83        this.key = key;
84        repaint();
85    }
86
87    public int getKey() {
88        return key;
89    }
90
91    private String getKeyString() {
92        String str;
93
94        switch (key) {
95	case 0:
96            str = /* NOI18N */"null";
97            break;
98	case /* NOI18N */ '\n':
99            str = /* NOI18N */"Line Feed";
100            break;
101	case /* NOI18N */ '\t':
102            str = /* NOI18N */"Tab";
103            break;
104	case /* NOI18N */ '\f':
105            str = /* NOI18N */"Form Feed";
106            break;
107	case /* NOI18N */ '\r':
108            str = /* NOI18N */"Carriage Return";
109            break;
110            //    case /* NOI18N */ '\b':
111	case Event.BACK_SPACE:
112            str = /* NOI18N */"Back Space";
113            break;
114	case /* NOI18N */ ' ':
115            str = /* NOI18N */"Space";
116            break;
117
118            //    case ESC:
119	case Event.ESCAPE:
120            str = /* NOI18N */"Esc";
121            break;
122            //    case DELETE:
123	case Event.DELETE:
124            str = /* NOI18N */"Delete";
125            break;
126            /* added -kp */
127	case Event.INSERT:
128            str = /* NOI18N */"Insert";
129            break;
130	case Event.CAPS_LOCK:
131            str = /* NOI18N */"Caps Lock";
132            break;
133	case Event.NUM_LOCK:
134            str = /* NOI18N */"Num Lock";
135            break;
136	case Event.PAUSE:
137            str = /* NOI18N */"Pause";
138            break;
139	case Event.PRINT_SCREEN:
140            str = /* NOI18N */"Print Screen";
141            break;
142	case Event.SCROLL_LOCK:
143            str = /* NOI18N */"Scroll Lock";
144            break;
145            /* end added -kp */
146	case Event.HOME:
147            str = /* NOI18N */"Home";
148            break;
149	case Event.END:
150            str = /* NOI18N */"End";
151            break;
152	case Event.PGUP:
153            str = /* NOI18N */"Page Up";
154            break;
155	case Event.PGDN:
156            str = /* NOI18N */"Page Down";
157            break;
158	case Event.UP:
159            str = /* NOI18N */"Up";
160            break;
161	case Event.DOWN:
162            str = /* NOI18N */"Down";
163            break;
164	case Event.LEFT:
165            str = /* NOI18N */"Left";
166            break;
167	case Event.RIGHT:
168            str = /* NOI18N */"Right";
169            break;
170	case Event.F1:
171            str = /* NOI18N */"F1";
172            break;
173	case Event.F2:
174            str = /* NOI18N */"F2";
175            break;
176	case Event.F3:
177            str = /* NOI18N */"F3";
178            break;
179	case Event.F4:
180            str = /* NOI18N */"F4";
181            break;
182	case Event.F5:
183            str = /* NOI18N */"F5";
184            break;
185	case Event.F6:
186            str = /* NOI18N */"F6";
187            break;
188	case Event.F7:
189            str = /* NOI18N */"F7";
190            break;
191	case Event.F8:
192            str = /* NOI18N */"F8";
193            break;
194	case Event.F9:
195            str = /* NOI18N */"F9";
196            break;
197	case Event.F10:
198            str = /* NOI18N */"F10";
199            break;
200	case Event.F11:
201            str = /* NOI18N */"F11";
202            break;
203	case Event.F12:
204            str = /* NOI18N */"F12";
205            break;
206
207	default:
208            if (key >= 32)
209                str = String.valueOf((char)key);
210            else
211                str = /* NOI18N */"^" + String.valueOf((char)
212					       (key+ /* NOI18N */ 'A'-1));
213
214            break;
215        }
216
217        return str;
218    }
219
220    public void paint(Graphics g) {
221        if (Global.isWindows())
222            g = getGraphics();
223        Dimension size = size();
224
225        String str = getKeyString();
226        int x = (size.width - fontMetrics.stringWidth(str)) / 2;
227        int y = (size.height + fontMetrics.getMaxAscent()) / 2 - 1;
228        if (isEnabled())
229            g.setColor(getForeground());
230        else
231            g.setColor(getBackground().darker());
232        g.setFont(getFont());
233        g.drawString(str, x, y);
234
235        g.setColor(getBackground());
236        g.draw3DRect(1, 1, size.width-3, size.height-3, false);
237        g.draw3DRect(2, 2, size.width-5, size.height-5, false);
238
239        if (hasFocus) {
240            g.setColor(getForeground());
241            g.drawRect(0, 0, size.width-1, size.height-1);
242        }
243    }
244
245    public boolean handleEvent(Event e) {
246
247        if (e.id == Event.GOT_FOCUS) {
248            if (!hasFocus) {
249                hasFocus = true;
250                repaint();
251            }
252        } else if (e.id == Event.LOST_FOCUS) {
253            if (hasFocus) {
254                hasFocus = false;
255                repaint();
256            }
257        } else {
258            return super.handleEvent(e);
259        }
260
261        return false;
262    }
263
264    public boolean mouseDown(Event e, int x, int y) {
265        if (!hasFocus)
266            requestFocus();
267        return false;
268    }
269
270    public boolean keyDown(Event e, int key) {
271        setKey(key);
272        return false;
273    }
274}
275