blob: fecadfbf06f634a110a6fe691a459079dee69199 [file] [log] [blame]
/*
* Copyright (c) 2002, 2006, 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 sun.awt.X11;
import java.awt.*;
import java.awt.event.*;
import java.awt.peer.*;
import sun.util.logging.PlatformLogger;
class XScrollbarPeer extends XComponentPeer implements ScrollbarPeer, XScrollbarClient {
private final static PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XScrollbarPeer");
private static final int DEFAULT_LENGTH = 50;
private static final int DEFAULT_WIDTH_SOLARIS = 19;
private static final int DEFAULT_WIDTH_LINUX;
XScrollbar tsb;
static {
DEFAULT_WIDTH_LINUX = XToolkit.getUIDefaults().getInt("ScrollBar.defaultWidth");
}
public void preInit(XCreateWindowParams params) {
super.preInit(params);
Scrollbar target = (Scrollbar) this.target;
if (target.getOrientation() == Scrollbar.VERTICAL) {
tsb = new XVerticalScrollbar(this);
} else {
tsb = new XHorizontalScrollbar(this);
}
int min = target.getMinimum();
int max = target.getMaximum();
int vis = target.getVisibleAmount();
int val = target.getValue();
int line = target.getLineIncrement();
int page = target.getPageIncrement();
tsb.setValues(val, vis, min, max, line, page);
}
/**
* Create a scrollbar.
*/
XScrollbarPeer(Scrollbar target) {
super(target);
this.target = target;
xSetVisible(true);
}
/**
* Returns default size of scrollbar on the platform
* Currently uses hardcoded values
*/
private int getDefaultDimension() {
if (System.getProperty("os.name").equals("Linux")) {
return DEFAULT_WIDTH_LINUX;
} else {
return DEFAULT_WIDTH_SOLARIS;
}
}
/**
* Compute the minimum size for the scrollbar.
*/
public Dimension getMinimumSize() {
Scrollbar sb = (Scrollbar)target;
return (sb.getOrientation() == Scrollbar.VERTICAL)
? new Dimension(getDefaultDimension(), DEFAULT_LENGTH)
: new Dimension(DEFAULT_LENGTH, getDefaultDimension());
}
public void repaint() {
Graphics g = getGraphics();
if (g != null) paint(g);
}
/**
* Paint the scrollbar.
*/
public void paint(Graphics g) {
Scrollbar sb = (Scrollbar)target;
Color colors[] = getGUIcolors();
g.setColor(colors[BACKGROUND_COLOR]);
tsb.paint(g, colors, true);
// paint the whole scrollbar
}
public void repaintScrollbarRequest(XScrollbar sb) {
repaint();
}
/**
* The value has changed.
*/
public void notifyValue(XScrollbar obj, int type, int value, boolean isAdjusting) {
Scrollbar sb = (Scrollbar)target;
sb.setValue(value);
postEvent( new AdjustmentEvent(sb, AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, type, value, isAdjusting));
}
/**
*
* @see java.awt.event.MouseEvent
* MouseEvent.MOUSE_CLICKED
* MouseEvent.MOUSE_PRESSED
* MouseEvent.MOUSE_RELEASED
* MouseEvent.MOUSE_MOVED
* MouseEvent.MOUSE_ENTERED
* MouseEvent.MOUSE_EXITED
* MouseEvent.MOUSE_DRAGGED
*/
public void handleJavaMouseEvent( MouseEvent mouseEvent ) {
super.handleJavaMouseEvent(mouseEvent);
int x = mouseEvent.getX();
int y = mouseEvent.getY();
int modifiers = mouseEvent.getModifiers();
int id = mouseEvent.getID();
if ((mouseEvent.getModifiers() & InputEvent.BUTTON1_MASK) == 0) {
return;
}
switch (mouseEvent.getID()) {
case MouseEvent.MOUSE_PRESSED:
target.requestFocus();
tsb.handleMouseEvent(id, modifiers,x,y);
break;
case MouseEvent.MOUSE_RELEASED:
tsb.handleMouseEvent(id, modifiers,x,y);
break;
case MouseEvent.MOUSE_DRAGGED:
tsb.handleMouseEvent(id, modifiers,x,y);
break;
}
}
public void handleJavaKeyEvent(KeyEvent event) {
super.handleJavaKeyEvent(event);
if (log.isLoggable(PlatformLogger.FINEST)) log.finer("KeyEvent on scrollbar: " + event);
if (!(event.isConsumed()) && event.getID() == KeyEvent.KEY_RELEASED) {
switch(event.getKeyCode()) {
case KeyEvent.VK_UP:
log.finer("Scrolling up");
tsb.notifyValue(tsb.getValue() - tsb.getUnitIncrement());
break;
case KeyEvent.VK_DOWN:
log.finer("Scrolling down");
tsb.notifyValue(tsb.getValue() + tsb.getUnitIncrement());
break;
case KeyEvent.VK_LEFT:
log.finer("Scrolling up");
tsb.notifyValue(tsb.getValue() - tsb.getUnitIncrement());
break;
case KeyEvent.VK_RIGHT:
log.finer("Scrolling down");
tsb.notifyValue(tsb.getValue() + tsb.getUnitIncrement());
break;
case KeyEvent.VK_PAGE_UP:
log.finer("Scrolling page up");
tsb.notifyValue(tsb.getValue() - tsb.getBlockIncrement());
break;
case KeyEvent.VK_PAGE_DOWN:
log.finer("Scrolling page down");
tsb.notifyValue(tsb.getValue() + tsb.getBlockIncrement());
break;
case KeyEvent.VK_HOME:
log.finer("Scrolling to home");
tsb.notifyValue(0);
break;
case KeyEvent.VK_END:
log.finer("Scrolling to end");
tsb.notifyValue(tsb.getMaximum());
break;
}
}
}
public void setValue(int value) {
tsb.setValue(value);
repaint();
}
public void setValues(int value, int visible, int minimum, int maximum) {
tsb.setValues(value, visible, minimum, maximum);
repaint();
}
public void setLineIncrement(int l) {
tsb.setUnitIncrement(l);
}
public void setPageIncrement(int p) {
tsb.setBlockIncrement(p);
}
public void layout() {
super.layout();
tsb.setSize(width, height);
}
}