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

  1. /*
  2.  * @(#)MotifComboBoxUI.java    1.10 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. package com.sun.java.swing.plaf.motif;
  21.  
  22. import java.awt.*;
  23. import com.sun.java.swing.*;
  24. import com.sun.java.swing.plaf.*;
  25. import com.sun.java.swing.border.*;
  26. import com.sun.java.swing.plaf.basic.BasicComboBoxUI;
  27. import java.io.Serializable;
  28. import java.awt.event.*;
  29.  
  30. /**
  31.  * ComboBox motif look and feel
  32.  * <p>
  33.  * Warning: serialized objects of this class will not be compatible with
  34.  * future swing releases.  The current serialization support is appropriate
  35.  * for short term storage or RMI between Swing1.0 applications.  It will
  36.  * not be possible to load serialized Swing1.0 objects with future releases
  37.  * of Swing.  The JDK1.2 release of Swing will be the compatibility
  38.  * baseline for the serialized form of Swing objects.
  39.  *
  40.  * @version 1.10 02/02/98
  41.  * @author Arnaud Weber
  42.  */
  43. public class MotifComboBoxUI extends BasicComboBoxUI implements Serializable {
  44.     Icon arrowIcon;
  45.     static final int HORIZ_MARGIN = 3;
  46.  
  47.     public static ComponentUI createUI(JComponent c) {
  48.         return new MotifComboBoxUI();
  49.     }  
  50.  
  51.     public void installUI(JComponent c) {
  52.         super.installUI(c);
  53.         c.setBorder(new CompoundBorder(MotifBorderFactory.getFocusBorder(),
  54.                                        MotifBorderFactory.getRaisedBevelBorder()));
  55.         arrowIcon = new MotifComboBoxArrowIcon(UIManager.getColor("controlHighlight"),
  56.                                                UIManager.getColor("controlShadow"),
  57.                                                UIManager.getColor("control"));
  58.     }
  59.  
  60.     public void uninstallUI(JComponent c) {
  61.         super.uninstallUI(c);
  62.         c.setBorder(null);
  63.     }
  64.  
  65.     protected void configureComboBox() {
  66.         MotifLookAndFeel.installColorsAndFont(comboBox,"ComboBox.control","ComboBox.controlForeground",
  67.                                               "ComboBox.font");
  68.     }
  69.  
  70.     protected void unconfigureComboBox() {
  71.     }
  72.  
  73.  
  74.     public void focusGained(FocusEvent e) {
  75.         comboBox.repaint();
  76.     }
  77.  
  78.     public void focusLost(FocusEvent e) {
  79.         comboBox.repaint();
  80.     }
  81.  
  82.     /** No arrow button necessary with motif **/
  83.     public void addArrowButton() {
  84.     }
  85.  
  86.     /** No arrow button necessary with motif **/
  87.     public void removeArrowButton() {
  88.     }
  89.  
  90.     public void paint(Graphics g, JComponent c) {
  91.         boolean hasFocus = comboBox.hasFocus();
  92.         Rectangle r;
  93.  
  94.         g.setColor(comboBox.getBackground()/*UIManager.getColor("ComboBox.control")*/);
  95.         g.fillRect(0,0,c.getWidth(),c.getHeight());
  96.  
  97.         if(!comboBox.isEditable()) {
  98.             r = rectangleForCurrentValue();
  99.             paintCurrentValue(g,r,hasFocus);
  100.         }
  101.         r = rectangleForArrowIcon();
  102.         arrowIcon.paintIcon(c,g,r.x,r.y);
  103.         if(!comboBox.isEditable()) {
  104.             Border border = comboBox.getBorder();
  105.             Insets in = border.getBorderInsets(comboBox);
  106.             // Draw the separation
  107.             r.x -= (HORIZ_MARGIN + 2);
  108.             r.y = in.top;
  109.             r.width = 1;
  110.             r.height = comboBox.getBounds().height - in.bottom - in.top;
  111.             g.setColor(UIManager.getColor("controlShadow"));
  112.             g.fillRect(r.x,r.y,r.width,r.height);
  113.             r.x++;
  114.             g.setColor(UIManager.getColor("controlHighlight"));
  115.             g.fillRect(r.x,r.y,r.width,r.height);
  116.         }
  117.     }
  118.  
  119.     public void paintCurrentValue(Graphics g,Rectangle bounds,boolean hasFocus) {
  120.         ListCellRenderer renderer = comboBox.getRenderer();
  121.         Component c;
  122.         Dimension d;
  123.         validateMenu();
  124.         c = renderer.getListCellRendererComponent(listBox, comboBox.getSelectedItem(), -1, false, false);
  125.         c.setFont(comboBox.getFont());
  126.         if(comboBox.isEnabled()) {
  127.             c.setForeground(comboBox.getForeground());
  128.             c.setBackground(comboBox.getBackground());
  129.         } else {
  130.             c.setForeground(UIManager.getColor("ComboBox.disabledForeground"));
  131.             c.setBackground(UIManager.getColor("ComboBox.disabledBackground"));
  132.         }
  133.         d  = c.getPreferredSize();
  134.         currentValuePane.paintComponent(g,c,comboBox,bounds.x,bounds.y,
  135.                                         bounds.width,d.height);
  136.     }
  137.  
  138.     protected Rectangle rectangleForArrowIcon() {
  139.         Rectangle b = comboBox.getBounds();
  140.         Border border = comboBox.getBorder();
  141.         Insets in = border.getBorderInsets(comboBox);
  142.         b.x = in.left;
  143.         b.y = in.top;
  144.         b.width -= (in.left + in.right);
  145.         b.height -= (in.top + in.bottom);
  146.  
  147.         b.x = b.x + b.width - HORIZ_MARGIN - arrowIcon.getIconWidth();
  148.         b.y = b.y + (b.height - arrowIcon.getIconHeight()) / 2;
  149.         b.width = arrowIcon.getIconWidth();
  150.         b.height = arrowIcon.getIconHeight();
  151.         return b;
  152.     }
  153.  
  154.     protected Rectangle rectangleForCurrentValue() {
  155.         Border b = comboBox.getBorder();
  156.         Dimension cbSize = comboBox.getSize();
  157.         Insets in = b.getBorderInsets(comboBox);
  158.         return new Rectangle(in.left,in.top,cbSize.width - iconAreaWidth() - in.left -in.right,
  159.                              cbSize.height - in.bottom - in.top);
  160.     }
  161.  
  162.     public int iconAreaWidth() {
  163.         if(comboBox.isEditable())
  164.             return arrowIcon.getIconWidth() + (2 * HORIZ_MARGIN);
  165.         else
  166.             return arrowIcon.getIconWidth() + (3 * HORIZ_MARGIN) + 2;
  167.     }
  168.  
  169.     protected boolean shouldActivatePopupForEvent(MouseEvent anEvent) {
  170.         Rectangle r = comboBox.getBounds();
  171.         r.x=r.y = 0;
  172.         if(r.contains(anEvent.getPoint()))
  173.             return true;
  174.         else
  175.             return false;
  176.     }
  177.  
  178.     public void validateMenu() {
  179.         boolean menuValid = (menu != null);
  180.         super.validateMenu();
  181.         if(!menuValid) {
  182.             listBox.setBorder(null);
  183.             menu.setBorder(MotifBorderFactory.getRaisedBevelBorder());
  184.         }
  185.     }
  186.  
  187.     protected int getPopupHeightForRowCount(int maxRowCount) {
  188.         return super.getPopupHeightForRowCount(maxRowCount) + 2;
  189.     }
  190.  
  191.     public void mouseMoved(MouseEvent anEvent) {
  192.     }    
  193.  
  194.     public void layoutContainer(Container parent) {
  195.         if(editor != null){
  196.             Rectangle cvb = rectangleForCurrentValue();
  197.             cvb.x += 1;
  198.             cvb.y += 1;
  199.             cvb.width -= 1;
  200.             cvb.height -= 2;
  201.             editor.setBounds(cvb);
  202.         }
  203.     }
  204.  
  205.     static class MotifComboBoxArrowIcon implements Icon, Serializable {
  206.         private Color lightShadow;
  207.         private Color darkShadow;
  208.         private Color fill;
  209.  
  210.         public MotifComboBoxArrowIcon(Color lightShadow, Color darkShadow, Color fill) {
  211.             this.lightShadow = lightShadow;
  212.             this.darkShadow = darkShadow;
  213.             this.fill = fill;
  214.         }
  215.  
  216.  
  217.         public void paintIcon(Component c, Graphics g, int xo, int yo) {
  218.             int w = getIconWidth();
  219.             int h = getIconHeight();
  220.  
  221.             g.setColor(lightShadow);
  222.             g.drawLine(xo, yo, xo+w-1, yo);
  223.             g.drawLine(xo, yo+1, xo+w-3, yo+1);
  224.             g.setColor(darkShadow);
  225.             g.drawLine(xo+w-2, yo+1, xo+w-1, yo+1);
  226.  
  227.             for(int x = xo+1, y = yo+2, dx = w-6; y+1 < yo+h; y += 2) {
  228.                 g.setColor(lightShadow);
  229.                 g.drawLine(x, y,   x+1, y);
  230.                 g.drawLine(x, y+1, x+1, y+1);
  231.                 if (dx > 0) {
  232.                     g.setColor(fill);
  233.                     g.drawLine(x+2, y,   x+1+dx, y);
  234.                     g.drawLine(x+2, y+1, x+1+dx, y+1);
  235.                 }
  236.                 g.setColor(darkShadow);
  237.                 g.drawLine(x+dx+2, y,   x+dx+3, y);
  238.                 g.drawLine(x+dx+2, y+1, x+dx+3, y+1);
  239.                 x += 1;
  240.                 dx -= 2;
  241.             }
  242.  
  243.             g.setColor(darkShadow);
  244.             g.drawLine(xo+(w/2), yo+h-1, xo+(w/2), yo+h-1); 
  245.         
  246.         }
  247.     
  248.         public int getIconWidth() {
  249.             return 11;
  250.         }
  251.  
  252.         public int getIconHeight() {
  253.             return 11;
  254.         }
  255.     }
  256.  
  257.     protected void selectNextPossibleValue() {
  258.         super.selectNextPossibleValue();
  259.     }
  260.  
  261.     protected void selectPreviousPossibleValue() {
  262.         super.selectPreviousPossibleValue();
  263.     }
  264.  
  265.     protected void addKeyAccelerators(JComponent comp) {
  266.         final JComboBox thisComboBox = comboBox;
  267.         final MotifComboBoxUI thisUI = this;
  268.         thisComboBox.registerKeyboardAction(
  269.                                     new AbstractAction() {
  270.             public void actionPerformed(ActionEvent e) {
  271.                 if(!popupIsVisible())
  272.                     thisUI.showPopup();
  273.                 else
  274.                     thisUI.selectNextPossibleValue();
  275.             }
  276.             public boolean isEnabled() {
  277.                 return thisComboBox.isEnabled();
  278.             }
  279.         },KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0),JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
  280.  
  281.         thisComboBox.registerKeyboardAction(
  282.                                     new AbstractAction() {
  283.             public void actionPerformed(ActionEvent e) {
  284.                 thisUI.selectPreviousPossibleValue();
  285.             }
  286.             public boolean isEnabled() {
  287.                 return (thisComboBox.isEnabled() && popupIsVisible());
  288.             }
  289.         },KeyStroke.getKeyStroke(KeyEvent.VK_UP,0),JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
  290.  
  291.  
  292.         thisComboBox.registerKeyboardAction(
  293.                                     new AbstractAction() {
  294.             public void actionPerformed(ActionEvent e) {
  295.                 thisUI.showPopup();
  296.             }
  297.             public boolean isEnabled() {
  298.                 return thisComboBox.isEnabled();
  299.             }
  300.         },KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,0),JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
  301.     }
  302.  
  303.     protected void removeKeyAccelerators(JComponent comp) {
  304.         comboBox.unregisterKeyboardAction(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0));
  305.         comboBox.unregisterKeyboardAction(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0));
  306.         comboBox.unregisterKeyboardAction(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,0));
  307.     }
  308. }
  309.  
  310.  
  311.