home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 November / Chip_1998-11_cd.bin / tema / Cafe / jfc.bin / BasicButtonUI.java < prev    next >
Text File  |  1998-02-26  |  9KB  |  285 lines

  1. /*
  2.  * @(#)BasicButtonUI.java    1.76 98/02/02
  3.  * 
  4.  * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  * 
  19.  */
  20.  
  21. package com.sun.java.swing.plaf.basic;
  22.  
  23. import java.awt.*;
  24. import java.awt.event.*;
  25. import java.io.Serializable;
  26. import com.sun.java.swing.*;
  27. import com.sun.java.swing.border.*;
  28. import java.awt.*;
  29. import java.awt.event.*;
  30. import com.sun.java.swing.plaf.ButtonUI;
  31. import com.sun.java.swing.plaf.UIResource;
  32. import com.sun.java.swing.plaf.ComponentUI;
  33.  
  34. /**
  35.  * BasicButton implementation
  36.  * <p>
  37.  * Warning: serialized objects of this class will not be compatible with
  38.  * future swing releases.  The current serialization support is appropriate 
  39.  * for short term storage or RMI between Swing1.0 applications.  It will
  40.  * not be possible to load serialized Swing1.0 objects with future releases
  41.  * of Swing.  The JDK1.2 release of Swing will be the compatibility
  42.  * baseline for the serialized form of Swing objects.
  43.  *
  44.  * @version 1.76 02/02/98
  45.  * @author Jeff Dinkins
  46.  */
  47. public class BasicButtonUI extends ButtonUI implements Serializable {
  48.  
  49.     protected Color getSelectColor()       { return UIManager.getColor("Button.pressed"); }
  50.     protected Color getDisabledColor()     { return UIManager.getColor("Button.disabled"); }
  51.     protected Color getDisabledTextColor() { return UIManager.getColor("Button.disabledText"); }
  52.     protected Color getFocusColor()        { return UIManager.getColor("Button.focus"); }
  53.  
  54.     // Borders
  55.       private final static Insets defaultMargin = new Insets(2,14,2,14);
  56.  
  57.     // Visual constants
  58.     private static final int defaultTextIconGap = 4;
  59.   
  60.   // offset controlled by set method 
  61.     private int shift_offset = 0;
  62.  
  63.     // Shared UI object
  64.     protected static ButtonUI buttonUI;
  65.  
  66.     public static ComponentUI createUI(JComponent c) {
  67.     if(buttonUI == null) {
  68.             buttonUI = new BasicButtonUI();
  69.     }
  70.         return buttonUI;
  71.     }
  72.  
  73.     protected static BasicButtonListener listener;
  74.  
  75.     public void installUI(JComponent c) {
  76.       installDefaults(c);
  77.       installListeners(c);
  78.       installKeyboardActions(c);
  79.     }
  80.  
  81.     protected void installDefaults(JComponent c) {
  82.       c.setOpaque(false); // exterior "is Default" border turns on and off 
  83.       LookAndFeel.installColorsAndFont(c, 
  84.                         "Button.background", 
  85.                         "Button.foreground", 
  86.                         "Button.font");
  87.       LookAndFeel.installBorder(c,"Button.border");
  88.     }
  89.  
  90.     protected void installListeners(JComponent c) {
  91.     if ((listener = createListener(c)) != null) {
  92.         c.addMouseListener(listener);
  93.         c.addMouseMotionListener(listener);
  94.         c.addFocusListener(listener);
  95.         ((AbstractButton)c).addChangeListener(listener);
  96.     }
  97.     }
  98.     
  99.     protected void installKeyboardActions(JComponent c){
  100.     listener.setupKeyboard((AbstractButton) c);
  101.     }
  102.  
  103.     
  104.     public void uninstallUI(JComponent c) {
  105.         uninstallKeyboardActions(c);
  106.         uninstallListeners(c);
  107.         uninstallDefaults(c);
  108.     }
  109.  
  110.     protected void uninstallKeyboardActions(JComponent c) {
  111.         c.resetKeyboardActions();
  112.     }
  113.  
  114.     protected void uninstallListeners(JComponent c) {
  115.         c.removeMouseListener(listener);
  116.         c.removeMouseMotionListener(listener);
  117.         c.removeFocusListener(listener);
  118.         ((AbstractButton)c).removeChangeListener(listener);
  119.     }
  120.  
  121.     protected void uninstallDefaults(JComponent c) {
  122.         LookAndFeel.uninstallBorder(c);
  123.     }
  124.   
  125.     protected BasicButtonListener createListener(JComponent c) {
  126.     return new BasicButtonListener((AbstractButton) c);
  127.     }
  128.  
  129.  
  130.     /**
  131.      * ComponentUI implementation for BasicButton
  132.      *
  133.      */
  134.     public void paint(Graphics g, JComponent c) {
  135.         AbstractButton b = (AbstractButton) c;
  136.         ButtonModel model = b.getModel();
  137.  
  138.         Dimension size = b.getSize();
  139.         FontMetrics fm = g.getFontMetrics();
  140.  
  141.     Insets i = c.getInsets();
  142.  
  143.         Rectangle viewRect = new Rectangle(size);
  144.  
  145.     viewRect.x += i.left;
  146.     viewRect.y += i.top;
  147.     viewRect.width -= (i.right + viewRect.x);
  148.     viewRect.height -= (i.bottom + viewRect.y);
  149.  
  150.         Rectangle iconRect = new Rectangle(); 
  151.     Rectangle textRect = new Rectangle();
  152.  
  153.     Font f = c.getFont();
  154.     g.setFont(f);
  155.  
  156.     // layout the text and icon
  157.         String text = SwingUtilities.layoutCompoundLabel(
  158.         fm, b.getText(), b.getIcon(),
  159.         b.getVerticalAlignment(), b.getHorizontalAlignment(),
  160.         b.getVerticalTextPosition(), b.getHorizontalTextPosition(),
  161.         viewRect, iconRect, textRect, b.getText() == null ? 0 : defaultTextIconGap
  162.     );
  163.  
  164.     setTextShiftOffset(0);
  165.  
  166.     // perform UI specific press action, ie
  167.     // ie. Basic L&F shifts text
  168.         if (model.isArmed() && model.isPressed()) {
  169.       paintButtonPressed(g,b); 
  170.         }
  171.  
  172.     // Paint the Icon
  173.         if(b.getIcon() != null) { 
  174.         paintIcon(g,c,iconRect);
  175.         }
  176.  
  177.     if (text != null && !text.equals("")){
  178.         paintText(g, c,textRect, text);
  179.     }
  180.  
  181.     if (b.isFocusPainted() && b.hasFocus()) {
  182.       // paint UI specific focus
  183.       paintFocus(g,size);
  184.     }
  185.     }
  186.  
  187.     protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect){
  188.             AbstractButton b = (AbstractButton) c;                 
  189.             ButtonModel model = b.getModel();
  190.             Icon icon = null;
  191.             if(!model.isEnabled()) {
  192.                 icon = (Icon) b.getDisabledIcon();
  193.             } else if(model.isPressed() && model.isArmed()) {
  194.                 icon = (Icon) b.getPressedIcon();
  195.                 if(icon == null) {
  196.                     // Use default icon
  197.                     icon = (Icon) b.getIcon();
  198.                 } else {
  199.             // revert back to 0 offset
  200.           setTextShiftOffset(0);
  201.             }
  202.             } else if(b.isRolloverEnabled() && model.isRollover()) {
  203.                 icon = (Icon) b.getRolloverIcon();
  204.             }
  205.           
  206.         if (icon == null) {
  207.                 icon = (Icon) b.getIcon();
  208.         }
  209.            
  210.             if(model.isPressed() && model.isArmed()) {
  211.                 icon.paintIcon(c, g, iconRect.x + getTextShiftOffset(),
  212.             iconRect.y + getTextShiftOffset());
  213.             } else {
  214.                 icon.paintIcon(c, g, iconRect.x, iconRect.y);
  215.             }
  216.  
  217.     }
  218.  
  219.     protected void paintText(Graphics g, JComponent c, Rectangle textRect, String text) {
  220.     AbstractButton b = (AbstractButton) c;                 
  221.     ButtonModel model = b.getModel();
  222.     FontMetrics fm = g.getFontMetrics();
  223.  
  224.     /* Draw the Text */
  225.     if(model.isEnabled()) {
  226.         /*** paint the text normally */
  227.         g.setColor(b.getForeground());
  228.         BasicGraphicsUtils.drawString(g,text, model.getMnemonic(),
  229.                       textRect.x + getTextShiftOffset(),
  230.                       textRect.y + fm.getAscent() + getTextShiftOffset());
  231.     }
  232.     else {
  233.         /*** paint the text disabled ***/
  234.         g.setColor(b.getBackground().brighter());
  235.         BasicGraphicsUtils.drawString(g,text,model.getMnemonic(),
  236.                       textRect.x, textRect.y + fm.getAscent());
  237.         g.setColor(b.getBackground().darker());
  238.         BasicGraphicsUtils.drawString(g,text,model.getMnemonic(),
  239.                       textRect.x - 1, textRect.y + fm.getAscent() - 1);
  240.     }
  241.     }
  242.     
  243.  
  244.     protected void paintFocus(Graphics g, Dimension size){
  245.     }
  246.   
  247.     protected void paintButtonPressed(Graphics g, AbstractButton b){
  248.     }
  249.  
  250.     protected void setTextShiftOffset(int i){
  251.     this.shift_offset = i;
  252.     }
  253.  
  254.     private int getTextShiftOffset(){
  255.     return this.shift_offset;
  256.     }
  257.  
  258.     public Dimension getMinimumSize(JComponent c) {
  259.         return getPreferredSize(c);
  260.     }
  261.  
  262.     public Dimension getPreferredSize(JComponent c) {
  263.     AbstractButton b = (AbstractButton)c;
  264.     return BasicGraphicsUtils.getPreferredButtonSize(b, defaultTextIconGap);
  265.     }
  266.  
  267.     public Dimension getMaximumSize(JComponent c) {
  268.         return getPreferredSize(c);
  269.     }
  270.  
  271.     /**
  272.      * insets and margin
  273.      */
  274.  
  275.     public Insets getDefaultMargin(AbstractButton b) {
  276.     return defaultMargin;
  277.     }
  278.  
  279.     public int getDefaultTextIconGap(AbstractButton b) {
  280.     return defaultTextIconGap;
  281.     }
  282.  
  283. }
  284.  
  285.