/* * @(#)DemoButton.java 1.5 06/10/10 * * Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package basis; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import java.util.EventObject; public class DemoButton extends Component { public static final Font DEFAULT_FONT = new Font("sanserif", Font.PLAIN, 12); public static final Color DEFAULT_COLOR = Builder.SUN_BLUE; private static boolean pending; private String label; private boolean mousePressed; private boolean keyPressed; private boolean inside; private ArrayList listeners = new ArrayList(); private Dimension preferredSize; public DemoButton(String label) { this.label = label; setForeground(DEFAULT_COLOR); enableEvents(MouseEvent.MOUSE_CLICKED | MouseEvent.MOUSE_ENTERED | MouseEvent.MOUSE_EXITED | MouseEvent.MOUSE_PRESSED | MouseEvent.MOUSE_RELEASED | KeyEvent.KEY_PRESSED // Makes no difference - not needed! // FocusEvent.FOCUS_GAINED | // FocusEvent.FOCUS_LOST ); } public String getLabel() { return label; } public Dimension getPreferredSize() { if (preferredSize == null) { Graphics g = getGraphics(); FontMetrics fm = g.getFontMetrics(DEFAULT_FONT); int fw = fm.stringWidth(label); int fh = fm.getHeight(); preferredSize = new Dimension(fw + 4, fh + 4); } return preferredSize; } public Dimension getMinimumSize() { return getPreferredSize(); } public Dimension getMaximumSize() { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } public void paint(Graphics g) { Dimension d = getSize(); Color color = getForeground(); if (inside) { if (mousePressed) { color = color.darker(); pending = true; } if (!pending) { color = color.brighter(); } } if (keyPressed) { color = color.darker(); } g.setColor(color); g.fillRect(0, 0, d.width, d.height); int w = d.width - 1; int h = d.height - 1; if ((mousePressed && inside) || keyPressed) { g.setColor(Color.white); } else { g.setColor(Color.black); } g.drawLine(0, h, w, h); g.drawLine(w, 0, w, h); if ((mousePressed && inside) || keyPressed) { g.setColor(Color.black); } else { g.setColor(Color.white); } g.drawLine(0, 0, w, 0); g.drawLine(0, 0, 0, h); int max = 160; if (color.getRed() > max || color.getGreen() > max || color.getBlue() > max) { g.setColor(Color.black); } else { g.setColor(Color.white); } g.setFont(DEFAULT_FONT); FontMetrics fm = g.getFontMetrics(DEFAULT_FONT); int fw = fm.stringWidth(label); int fa = fm.getAscent(); g.drawString(label, (d.width - fw) / 2, (d.height + fa) / 2 - 1); if (hasFocus()) { int margin = 2; g.drawRect(margin, margin, w - 2 * margin, h - 2 * margin); } } protected void processMouseEvent(MouseEvent e) { switch (e.getID()) { case MouseEvent.MOUSE_CLICKED: break; case MouseEvent.MOUSE_ENTERED: inside = true; repaint(); break; case MouseEvent.MOUSE_EXITED: inside = false; repaint(); break; case MouseEvent.MOUSE_PRESSED: mousePressed = true; // NOTE: Personal doesn't need to request focus, // as it is done in Component's dispatchEventImpl(), // but Basis and even J2SE do need it... requestFocus(); repaint(); break; case MouseEvent.MOUSE_RELEASED: mousePressed = false; repaint(); if (!inside) { return; } pending = false; for (int i = 0; i < listeners.size(); i++) { DemoButtonListener listener = (DemoButtonListener) listeners.get(i); listener.buttonPressed(new EventObject(this)); } break; } super.processMouseEvent(e); } protected void processKeyEvent(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { switch (e.getID()) { case KeyEvent.KEY_PRESSED: keyPressed = true; repaint(); break; case KeyEvent.KEY_RELEASED: keyPressed = false; repaint(); pending = false; for (int i = 0; i < listeners.size(); i++) { DemoButtonListener listener = (DemoButtonListener) listeners.get(i); listener.buttonPressed(new EventObject(this)); } break; } return; } super.processKeyEvent(e); } protected void processFocusEvent(FocusEvent e) { switch (e.getID()) { case FocusEvent.FOCUS_GAINED: repaint(); break; case FocusEvent.FOCUS_LOST: keyPressed = false; repaint(); break; } super.processFocusEvent(e); } public synchronized void addDemoButtonListener(DemoButtonListener listener) { listeners.add(listener); } public synchronized void removeDemoButtonListener(DemoButtonListener listener) { listeners.remove(listener); } public boolean isFocusTraversable() { return true; } public String toString() { return "DemoButton[" + label + "]"; } }