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

  1. /*
  2.  * @(#)MetalSliderUI.java    1.14 98/02/04
  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.metal;
  22.  
  23. import com.sun.java.swing.plaf.basic.BasicSliderUI;
  24.  
  25. import java.awt.Component;
  26. import java.awt.Container;
  27. import java.awt.Graphics;
  28. import java.awt.Dimension;
  29. import java.awt.Rectangle;
  30. import java.awt.Point;
  31. import java.awt.Insets;
  32. import java.awt.Color;
  33. import java.io.Serializable;
  34. import java.awt.IllegalComponentStateException;
  35. import java.awt.Polygon;
  36. import java.beans.*;
  37.  
  38. import com.sun.java.swing.border.AbstractBorder;
  39.  
  40. import com.sun.java.swing.*;
  41. import com.sun.java.swing.event.*;
  42. import com.sun.java.swing.plaf.*;
  43.  
  44. /**
  45.  * A Java L&F implementation of SliderUI.  
  46.  * <p>
  47.  * Warning: serialized objects of this class will not be compatible with
  48.  * future swing releases.  The current serialization support is appropriate
  49.  * for short term storage or RMI between Swing1.0 applications.  It will
  50.  * not be possible to load serialized Swing1.0 objects with future releases
  51.  * of Swing.  The JDK1.2 release of Swing will be the compatibility
  52.  * baseline for the serialized form of Swing objects.
  53.  *
  54.  * @version 1.14 02/04/98
  55.  * @author Tom Santos
  56.  */
  57. public class MetalSliderUI extends BasicSliderUI implements PropertyChangeListener {
  58.   
  59.     protected final int TICK_BUFFER = 4;
  60.     protected boolean filledSlider = false;
  61.     protected static Color thumbColor;
  62.     protected static Color highlightColor;
  63.     protected static Color darkShadowColor;
  64.     protected static int trackWidth;
  65.     protected static int tickLength;
  66.     protected static Icon horizThumbIcon;
  67.     protected static Icon vertThumbIcon;
  68.  
  69.  
  70.     protected final String SLIDER_FILL = "JSlider.isFilled";
  71.  
  72.     public static ComponentUI createUI(JComponent c)    {
  73.         return new MetalSliderUI();
  74.     }
  75.  
  76.     public MetalSliderUI() {
  77.         super( null );
  78.     }
  79.  
  80.     public void installUI( JComponent c ) {
  81.     trackWidth = ((Integer)UIManager.get( "Slider.trackWidth" )).intValue();
  82.     tickLength = ((Integer)UIManager.get( "Slider.majorTickLength" )).intValue();
  83.     horizThumbIcon = UIManager.getIcon( "Slider.horizontalThumbIcon" );
  84.     vertThumbIcon = UIManager.getIcon( "Slider.verticalThumbIcon" );
  85.  
  86.         super.installUI( c );
  87.  
  88.     thumbColor = UIManager.getColor("Slider.thumb");
  89.     highlightColor = UIManager.getColor("Slider.highlight");
  90.     darkShadowColor = UIManager.getColor("Slider.darkShadow");
  91.  
  92.  
  93.     scrollListener.setScrollByBlock( false );
  94.  
  95.     c.addPropertyChangeListener( this ); // add to listen for filled slider change
  96.  
  97.     Object sliderFillProp = c.getClientProperty( SLIDER_FILL );
  98.     if ( sliderFillProp != null ) {
  99.         filledSlider = ((Boolean)sliderFillProp).booleanValue();
  100.     }
  101.  
  102.     //slider.setInverted( true );
  103.     }
  104.  
  105.     public void uninstallUI( JComponent c ) {
  106.      c.removePropertyChangeListener( this );
  107.     super.uninstallUI( c );
  108.     }
  109.  
  110.     public void propertyChange( PropertyChangeEvent e ) {  // listen for slider fill
  111.         super.propertyChange( e );
  112.  
  113.     String name = e.getPropertyName();
  114.     if ( name.equals( SLIDER_FILL ) ) {
  115.         if ( e.getNewValue() != null ) {
  116.             filledSlider = ((Boolean)e.getNewValue()).booleanValue();
  117.         }
  118.         else {
  119.         filledSlider = false;
  120.         }
  121.         }
  122.     }
  123.  
  124.     public void paintThumb(Graphics g)  {
  125.     Rectangle knobBounds = getThumbRect();
  126.  
  127.         g.translate( knobBounds.x, knobBounds.y );
  128.  
  129.     if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
  130.         horizThumbIcon.paintIcon( slider, g, 0, 0 );
  131.     }
  132.     else {
  133.         vertThumbIcon.paintIcon( slider, g, 0, 0 );
  134.     }
  135.  
  136.     g.translate( -knobBounds.x, -knobBounds.y );
  137.     }
  138.  
  139.     public void paintTrack(Graphics g)  {
  140.     
  141.     Rectangle trackBounds = getScrollTrackRect();
  142.  
  143.     Color trackColor = !slider.isEnabled() ? MetalLookAndFeel.getControlShadow() :
  144.                                              slider.getForeground();
  145.  
  146.     g.translate( trackBounds.x, trackBounds.y );
  147.  
  148.     int trackLeft = 0;
  149.     int trackTop = 0;
  150.     int trackRight = 0;
  151.     int trackBottom = 0;
  152.  
  153.     // Draw the track
  154.     if ( slider.getOrientation() == JSlider.HORIZONTAL ) {        
  155.         trackLeft = trackBuffer;
  156.         trackTop = (trackBounds.height - getThumbOverhang()) - getTrackWidth();
  157.         trackRight = (trackBounds.width - 1) - trackBuffer;
  158.         trackBottom = (trackBounds.height - getThumbOverhang()) - 1;
  159.  
  160.         if ( slider.isEnabled() ) {
  161.             MetalUtils.drawFlush3DBorder( g, trackLeft, trackTop, getTrackLength(), getTrackWidth() );
  162.         }
  163.         else {
  164.             Rectangle thumbBounds = getThumbRect();
  165.         int middleOfThumb = thumbBounds.x + (thumbBounds.width / 2);
  166.  
  167.             g.setColor( trackColor );
  168.         g.drawRect( trackLeft, trackTop, getTrackLength(), getTrackWidth() - 2 );
  169.  
  170.         if ( filledSlider ) {
  171.               if ( slider.isEnabled() ) {
  172.                 g.fillRect( trackLeft, trackTop, middleOfThumb - trackLeft, getTrackWidth() - 2 );
  173.             }
  174.             else {
  175.                 g.fillRect( middleOfThumb, trackTop, trackRight - middleOfThumb, getTrackWidth() - 2 );
  176.             }
  177.         }
  178.         }
  179.     }
  180.     else {
  181.         trackLeft = (trackBounds.width - getThumbOverhang()) - getTrackWidth();
  182.         trackTop = trackBuffer;
  183.         trackRight = (trackBounds.width - getThumbOverhang()) - 1;
  184.         trackBottom = (trackBounds.height - 1) - trackBuffer;
  185.  
  186.         if ( slider.isEnabled() ) {
  187.             MetalUtils.drawFlush3DBorder( g, trackLeft, trackTop, getTrackWidth(), getTrackLength() );
  188.         }
  189.         else {
  190.             Rectangle thumbBounds = getThumbRect();
  191.         int middleOfThumb = thumbBounds.y + (thumbBounds.height / 2);
  192.  
  193.             g.setColor( trackColor );
  194.         g.drawRect( trackLeft, trackTop, getTrackWidth() - 2, getTrackLength() );
  195.         if ( filledSlider ) {
  196.             if ( slider.isEnabled() ) {
  197.                 g.fillRect( trackLeft, middleOfThumb, getTrackWidth() - 2, trackBottom - middleOfThumb );
  198.             }
  199.             else {
  200.                 g.fillRect( trackLeft, trackTop, getTrackWidth() - 2, middleOfThumb - trackLeft );
  201.             }
  202.         }
  203.         }
  204.     }
  205.  
  206.     // Draw the fill
  207.     if ( !filledSlider ) {
  208.         if ( slider.isEnabled() ) {
  209.             g.setColor( slider.getForeground() );
  210.  
  211.             if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
  212.             g.fillRect( trackLeft + 2, trackTop + 2, getTrackLength() - 4, getTrackWidth() - 4 );
  213.  
  214.             g.setColor( MetalLookAndFeel.getPrimaryControl() );
  215.             g.drawLine( trackLeft + 1, trackTop + 1, trackLeft + 1, trackBottom - 2 );
  216.             g.drawLine( trackLeft + 1, trackTop + 1, trackRight - 2, trackTop + 1 );
  217.  
  218.             g.setColor( MetalLookAndFeel.getPrimaryControlDarkShadow() );
  219.             g.drawLine( trackLeft + 2, trackBottom - 1, trackRight - 1, trackBottom - 1 );
  220.             g.drawLine( trackRight - 1, trackTop + 2, trackRight - 1, trackBottom - 1 );
  221.         }
  222.         else {
  223.             g.fillRect( trackLeft + 2, trackTop + 2, getTrackWidth() - 4, getTrackLength() - 4 );
  224.  
  225.             g.setColor( MetalLookAndFeel.getPrimaryControl() );
  226.             g.drawLine( trackLeft + 1, trackTop + 1, trackLeft + 1, trackBottom - 2 );
  227.             g.drawLine( trackLeft + 1, trackTop + 1, trackRight - 2, trackTop + 1 );
  228.  
  229.             g.setColor( MetalLookAndFeel.getPrimaryControlDarkShadow() );
  230.             g.drawLine( trackRight - 1, trackTop + 2, trackRight - 1, trackBottom - 1 );
  231.             g.drawLine( trackLeft + 2, trackBottom - 1, trackRight - 1, trackBottom - 1 );
  232.         }        
  233.         }
  234.     }
  235.     else {
  236.         Color lightColor = MetalLookAndFeel.getPrimaryControl();
  237.         Color darkColor = MetalLookAndFeel.getPrimaryControlDarkShadow();
  238.  
  239.         g.setColor( slider.getForeground() );
  240.  
  241.         if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
  242.             Rectangle thumbBounds = getThumbRect();
  243.         int middleOfThumb = thumbBounds.x + (thumbBounds.width / 2);
  244.  
  245.             if ( !slider.getInverted() ) {
  246.             g.fillRect( trackLeft + 2, trackTop + 2,
  247.                 (middleOfThumb - (trackLeft + 2)), getTrackWidth() - 4 );
  248.             g.setColor( lightColor );
  249.             g.drawLine( trackLeft + 2, trackTop + 1, middleOfThumb, trackTop + 1 );
  250.             g.drawLine( trackLeft + 1, trackTop + 1, trackLeft + 1, trackBottom - 1 );
  251.             g.setColor( darkColor );
  252.             g.drawLine( trackLeft + 2, trackBottom - 1, middleOfThumb, trackBottom - 1 );
  253.         }
  254.         else {
  255.             g.fillRect( middleOfThumb, trackTop + 2,
  256.                 (trackRight - 1) - middleOfThumb, getTrackWidth() - 4 );
  257.             g.setColor( lightColor );
  258.             g.drawLine( middleOfThumb, trackTop + 1, trackRight - 2, trackTop + 1 );
  259.             g.drawLine( trackRight - 1, trackTop + 1, trackRight - 1, trackBottom - 1 );
  260.             g.setColor( darkColor );
  261.             g.drawLine( middleOfThumb, trackBottom - 1, trackRight - 2, trackBottom - 1 );
  262.         }
  263.         }
  264.         else {
  265.             Rectangle thumbBounds = getThumbRect();
  266.         int middleOfThumb = thumbBounds.y + (thumbBounds.height / 2);
  267.  
  268.             if ( !slider.getInverted() ) {
  269.             g.fillRect( trackLeft + 2, middleOfThumb,
  270.                 getTrackWidth() - 4, (trackBottom - 1) - middleOfThumb );
  271.             g.setColor( lightColor );
  272.             g.drawLine( trackLeft + 1, middleOfThumb, trackLeft + 1, trackBottom - 2 );
  273.             g.drawLine( trackLeft + 1, trackBottom - 1, trackRight - 1, trackBottom - 1 );
  274.             g.setColor( darkColor );
  275.             g.drawLine( trackRight - 1, middleOfThumb, trackRight - 1, trackBottom - 2 );
  276.         }
  277.         else {
  278.             g.fillRect( trackLeft + 2, trackTop + 2,
  279.                 getTrackWidth() - 4, middleOfThumb - (trackTop + 2) );
  280.             g.setColor( lightColor );
  281.             g.drawLine( trackLeft + 1, trackTop + 2, trackLeft + 1, middleOfThumb );
  282.             g.drawLine( trackLeft + 1, trackTop + 1, trackRight - 1, trackTop + 1 );
  283.             g.setColor( darkColor );
  284.             g.drawLine( trackRight - 1, trackTop + 2, trackRight - 1, middleOfThumb );
  285.         }
  286.         }
  287.     }
  288.  
  289.     g.translate( -trackBounds.x, -trackBounds.y );
  290.     }
  291.         
  292.     public void paintFocus(Graphics g)  {        
  293.         if (slider.hasFocus()) {
  294.         Rectangle r = slider.getBounds();
  295.         r.x = 0;
  296.             r.y = 0;        
  297.         if(slider.getBorder() != null) {
  298.              r = getFullContentArea();
  299.         } 
  300.             g.setColor(getFocusColor());
  301.             g.drawRect(r.x + 1, r.y + 1, r.width - 2, r.height - 2);
  302.         }
  303.     }
  304.  
  305.     /**
  306.       * Subclasses of BasicSliderUI override this method to determine their own
  307.       * thumb size.
  308.       */
  309.     public void calculateThumbBounds()    {
  310.         final int thumbWidth = 15;
  311.         int thumbLength = 16;
  312.  
  313.         if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
  314.         int thumbX = xPositionForValue( slider.getValue( )) - getThumbRect().width / 2;
  315.         int thumbY = (getScrollTrackRect().y + getScrollTrackRect().height) - thumbLength;
  316.  
  317.         setThumbBounds( thumbX, thumbY, thumbWidth, thumbLength );
  318.         }
  319.     else {
  320.         int thumbY = yPositionForValue(slider.getValue()) - getThumbRect().height / 2;
  321.         int thumbX = (getScrollTrackRect().x + getScrollTrackRect().width) - thumbLength;
  322.  
  323.         setThumbBounds( thumbX, thumbY, thumbLength, thumbWidth );
  324.     }
  325.     }
  326.  
  327.     /**
  328.      * Gets the height of the tick area for horizontal sliders and the width of the
  329.      * tick area for vertical sliders.  BasicSliderUI uses the returned value to
  330.      * determine the bounds of the tray rectangle and the tick area rectangle.
  331.      */
  332.     public int getTickSpace() {
  333.         return slider.getOrientation() == JSlider.HORIZONTAL ? tickLength + TICK_BUFFER + 1 :
  334.                                                            tickLength + TICK_BUFFER + 3;
  335.     }
  336.  
  337.     /**
  338.      * Returns the shorter dimension of the track.
  339.      */
  340.     protected int getTrackWidth() {
  341.         return trackWidth;
  342.     }
  343.  
  344.     /**
  345.      * Returns the longer dimension of the slide bar.  (The slide bar is only the
  346.      * part that runs directly under the thumb)
  347.      */
  348.     protected int getTrackLength() {   
  349.     Rectangle interiorRect = getFullContentArea();
  350.  
  351.     if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
  352.         return getScrollTrackRect().width - (trackBuffer * 2);
  353.     }
  354.     return getScrollTrackRect().height - (trackBuffer * 2);
  355.     }
  356.  
  357.     /**
  358.      * Returns the amount that the thumb goes past the slide bar.
  359.      */
  360.     protected int getThumbOverhang() {
  361.         return 4;
  362.     }
  363.  
  364.     protected void scrollDueToClickInTrack( int dir ) {
  365.         scrollByUnit( dir );
  366.     }
  367.  
  368.     protected void paintMinorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x ) {
  369.     g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
  370.     g.drawLine( x, TICK_BUFFER, x, TICK_BUFFER + (tickLength / 2) );
  371.     }
  372.  
  373.     protected void paintMajorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x ) {
  374.     g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
  375.     g.drawLine( x, TICK_BUFFER , x, TICK_BUFFER + (tickLength - 1) );
  376.     }
  377.  
  378.     protected void paintMinorTickForVertSlider( Graphics g, Rectangle tickBounds, int y ) {
  379.     g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
  380.     g.drawLine( TICK_BUFFER, y, TICK_BUFFER + (tickLength / 2), y );
  381.     }
  382.  
  383.     protected void paintMajorTickForVertSlider( Graphics g, Rectangle tickBounds, int y ) {
  384.     g.setColor( slider.isEnabled() ? slider.getForeground() : MetalLookAndFeel.getControlShadow() );
  385.     g.drawLine( TICK_BUFFER, y, TICK_BUFFER + tickLength, y );
  386.     }
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393. }
  394.