/*
* Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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 in the LICENSE file that
* accompanied this code).
*
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.java.swing.plaf.windows;
import java.awt.*;
import java.awt.event.MouseEvent;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import javax.swing.*;
import static com.sun.java.swing.plaf.windows.TMSchema.*;
import static com.sun.java.swing.plaf.windows.XPStyle.Skin;
/**
* Windows rendition of the component.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is appropriate
* for short term storage or RMI between applications running the same
* version of Swing. A future release of Swing will provide support for
* long term persistence.
*/
public class WindowsSliderUI extends BasicSliderUI
{
private boolean rollover = false;
private boolean pressed = false;
public WindowsSliderUI(JSlider b){
super(b);
}
public static ComponentUI createUI(JComponent b) {
return new WindowsSliderUI((JSlider)b);
}
/**
* Overrides to return a private track listener subclass which handles
* the HOT, PRESSED, and FOCUSED states.
* @since 1.6
*/
protected TrackListener createTrackListener(JSlider slider) {
return new WindowsTrackListener();
}
private class WindowsTrackListener extends TrackListener {
public void mouseMoved(MouseEvent e) {
updateRollover(thumbRect.contains(e.getX(), e.getY()));
super.mouseMoved(e);
}
public void mouseEntered(MouseEvent e) {
updateRollover(thumbRect.contains(e.getX(), e.getY()));
super.mouseEntered(e);
}
public void mouseExited(MouseEvent e) {
updateRollover(false);
super.mouseExited(e);
}
public void mousePressed(MouseEvent e) {
updatePressed(thumbRect.contains(e.getX(), e.getY()));
super.mousePressed(e);
}
public void mouseReleased(MouseEvent e) {
updatePressed(false);
super.mouseReleased(e);
}
public void updatePressed(boolean newPressed) {
// You can't press a disabled slider
if (!slider.isEnabled()) {
return;
}
if (pressed != newPressed) {
pressed = newPressed;
slider.repaint(thumbRect);
}
}
public void updateRollover(boolean newRollover) {
// You can't have a rollover on a disabled slider
if (!slider.isEnabled()) {
return;
}
if (rollover != newRollover) {
rollover = newRollover;
slider.repaint(thumbRect);
}
}
}
public void paintTrack(Graphics g) {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
boolean vertical = (slider.getOrientation() == JSlider.VERTICAL);
Part part = vertical ? Part.TKP_TRACKVERT : Part.TKP_TRACK;
Skin skin = xp.getSkin(slider, part);
if (vertical) {
int x = (trackRect.width - skin.getWidth()) / 2;
skin.paintSkin(g, trackRect.x + x, trackRect.y,
skin.getWidth(), trackRect.height, null);
} else {
int y = (trackRect.height - skin.getHeight()) / 2;
skin.paintSkin(g, trackRect.x, trackRect.y + y,
trackRect.width, skin.getHeight(), null);
}
} else {
super.paintTrack(g);
}
}
protected void paintMinorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x ) {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
g.setColor(xp.getColor(slider, Part.TKP_TICS, null, Prop.COLOR, Color.black));
}
super.paintMinorTickForHorizSlider(g, tickBounds, x);
}
protected void paintMajorTickForHorizSlider( Graphics g, Rectangle tickBounds, int x ) {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
g.setColor(xp.getColor(slider, Part.TKP_TICS, null, Prop.COLOR, Color.black));
}
super.paintMajorTickForHorizSlider(g, tickBounds, x);
}
protected void paintMinorTickForVertSlider( Graphics g, Rectangle tickBounds, int y ) {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
g.setColor(xp.getColor(slider, Part.TKP_TICSVERT, null, Prop.COLOR, Color.black));
}
super.paintMinorTickForVertSlider(g, tickBounds, y);
}
protected void paintMajorTickForVertSlider( Graphics g, Rectangle tickBounds, int y ) {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
g.setColor(xp.getColor(slider, Part.TKP_TICSVERT, null, Prop.COLOR, Color.black));
}
super.paintMajorTickForVertSlider(g, tickBounds, y);
}
public void paintThumb(Graphics g) {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
Part part = getXPThumbPart();
State state = State.NORMAL;
if (slider.hasFocus()) {
state = State.FOCUSED;
}
if (rollover) {
state = State.HOT;
}
if (pressed) {
state = State.PRESSED;
}
if(!slider.isEnabled()) {
state = State.DISABLED;
}
xp.getSkin(slider, part).paintSkin(g, thumbRect.x, thumbRect.y, state);
} else {
super.paintThumb(g);
}
}
protected Dimension getThumbSize() {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
Dimension size = new Dimension();
Skin s = xp.getSkin(slider, getXPThumbPart());
size.width = s.getWidth();
size.height = s.getHeight();
return size;
} else {
return super.getThumbSize();
}
}
private Part getXPThumbPart() {
XPStyle xp = XPStyle.getXP();
Part part;
boolean vertical = (slider.getOrientation() == JSlider.VERTICAL);
boolean leftToRight = slider.getComponentOrientation().isLeftToRight();
Boolean paintThumbArrowShape =
(Boolean)slider.getClientProperty("Slider.paintThumbArrowShape");
if ((!slider.getPaintTicks() && paintThumbArrowShape == null) ||
paintThumbArrowShape == Boolean.FALSE) {
part = vertical ? Part.TKP_THUMBVERT
: Part.TKP_THUMB;
} else {
part = vertical ? (leftToRight ? Part.TKP_THUMBRIGHT : Part.TKP_THUMBLEFT)
: Part.TKP_THUMBBOTTOM;
}
return part;
}
}