blob: 7c741a4d34a304ff3d6c79b32fea79cb3007497d [file] [log] [blame]
package org.eclipse.swt.widgets;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved
*/
import org.eclipse.swt.internal.photon.*;
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.events.*;
public class ScrollBar extends Widget {
Scrollable parent;
ScrollBar (Scrollable parent, int style, int handle) {
super (parent, checkStyle (style));
this.parent = parent;
this.handle = handle;
state |= HANDLE;
createWidget (0);
}
ScrollBar (Scrollable parent, int style) {
super (parent, checkStyle (style));
this.parent = parent;
createWidget (0);
}
static int checkStyle (int style) {
return checkBits (style, SWT.HORIZONTAL, SWT.VERTICAL, 0, 0, 0, 0);
}
public void addSelectionListener (SelectionListener listener) {
checkWidget();
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
TypedListener typedListener = new TypedListener(listener);
addListener (SWT.Selection,typedListener);
addListener (SWT.DefaultSelection,typedListener);
}
void createHandle (int index) {
state |= HANDLE;
if (handle != 0) return;
Display display = getDisplay ();
int parentHandle = parent.scrolledHandle;
int orientation, sizeArg, size, basicFlags;
if ((style & SWT.HORIZONTAL) != 0) {
orientation = OS.Pt_HORIZONTAL;
sizeArg = OS.Pt_ARG_HEIGHT;
size = display.SCROLLBAR_HEIGHT;
basicFlags = display.SCROLLBAR_HORIZONTAL_BASIC_FLAGS;
} else {
orientation = OS.Pt_VERTICAL;
sizeArg = OS.Pt_ARG_WIDTH;
size = display.SCROLLBAR_WIDTH;
basicFlags = display.SCROLLBAR_VERTICAL_BASIC_FLAGS;
}
int [] args = {
sizeArg, size, 0,
OS.Pt_ARG_MAXIMUM, 100, 0,
OS.Pt_ARG_PAGE_INCREMENT, 10, 0,
OS.Pt_ARG_SLIDER_SIZE, 10, 0,
OS.Pt_ARG_BASIC_FLAGS, basicFlags, ~0,
OS.Pt_ARG_ORIENTATION, orientation, 0,
OS.Pt_ARG_FLAGS, 0, OS.Pt_GETS_FOCUS,
OS.Pt_ARG_RESIZE_FLAGS, 0, OS.Pt_RESIZE_XY_BITS,
};
handle = OS.PtCreateWidget (OS.PtScrollbar (), parentHandle, args.length / 3, args);
if (handle == 0) error (SWT.ERROR_NO_HANDLES);
}
public Display getDisplay () {
Scrollable parent = this.parent;
if (parent == null) error (SWT.ERROR_WIDGET_DISPOSED);
return parent.getDisplay ();
}
public boolean getEnabled () {
checkWidget();
int [] args = {OS.Pt_ARG_FLAGS, 0, 0};
OS.PtGetResources (handle, args.length / 3, args);
return (args [1] & OS.Pt_BLOCKED) == 0;
}
public int getIncrement () {
checkWidget();
int [] args = {OS.Pt_ARG_INCREMENT, 0, 0};
OS.PtGetResources (handle, args.length / 3, args);
return args [1];
}
public int getMinimum () {
checkWidget();
int [] args = {OS.Pt_ARG_MINIMUM, 0, 0};
OS.PtGetResources (handle, args.length / 3, args);
return args [1];
}
public int getMaximum () {
checkWidget();
int [] args = {OS.Pt_ARG_MAXIMUM, 0, 0};
OS.PtGetResources (handle, args.length / 3, args);
return args [1];
}
public int getPageIncrement () {
checkWidget();
int [] args = {OS.Pt_ARG_PAGE_INCREMENT, 0, 0};
OS.PtGetResources (handle, args.length / 3, args);
return args [1];
}
public Scrollable getParent () {
checkWidget();
return parent;
}
public int getSelection () {
checkWidget();
int [] args = {OS.Pt_ARG_SCROLL_POSITION, 0, 0};
OS.PtGetResources (handle, args.length / 3, args);
return args [1];
}
public Point getSize () {
checkWidget();
int [] args = {OS.Pt_ARG_WIDTH, 0, 0, OS.Pt_ARG_HEIGHT, 0, 0};
OS.PtGetResources (handle, args.length / 3, args);
return new Point (args [1], args [4]);
}
public int getThumb () {
checkWidget();
int [] args = {OS.Pt_ARG_SLIDER_SIZE, 0, 0};
OS.PtGetResources (handle, args.length / 3, args);
return args [1];
}
public boolean getVisible () {
checkWidget();
int topHandle = topHandle ();
int [] args = {OS.Pt_ARG_FLAGS, 0, 0};
OS.PtGetResources (topHandle, args.length / 3, args);
return (args [1] & OS.Pt_DELAY_REALIZE) == 0;
}
void hookEvents () {
int windowProc = getDisplay ().windowProc;
OS.PtAddCallback (handle, OS.Pt_CB_SCROLL_MOVE, windowProc, SWT.Selection);
}
public boolean isEnabled () {
checkWidget();
return getEnabled () && parent.isEnabled ();
}
public boolean isVisible () {
checkWidget();
return OS.PtWidgetIsRealized (handle);
}
int processSelection (int info) {
if (info == 0) return OS.Pt_CONTINUE;
PtCallbackInfo_t cbinfo = new PtCallbackInfo_t ();
OS.memmove (cbinfo, info, PtCallbackInfo_t.sizeof);
if (cbinfo.cbdata == 0) return OS.Pt_CONTINUE;
PtScrollbarCallback_t cb = new PtScrollbarCallback_t ();
OS.memmove (cb, cbinfo.cbdata, PtScrollbarCallback_t.sizeof);
Event event = new Event ();
switch (cb.action) {
case OS.Pt_SCROLL_DRAGGED:
event.detail = SWT.DRAG;
break;
case OS.Pt_SCROLL_TO_MIN:
event.detail = SWT.HOME;
break;
case OS.Pt_SCROLL_TO_MAX:
event.detail = SWT.END;
break;
case OS.Pt_SCROLL_INCREMENT:
event.detail = SWT.ARROW_DOWN;
break;
case OS.Pt_SCROLL_DECREMENT :
event.detail = SWT.ARROW_UP;
break;
case OS.Pt_SCROLL_PAGE_DECREMENT:
event.detail = SWT.PAGE_UP;
break;
case OS.Pt_SCROLL_PAGE_INCREMENT:
event.detail = SWT.PAGE_DOWN;
break;
}
sendEvent(SWT.Selection, event);
return OS.Pt_CONTINUE;
}
public void removeSelectionListener (SelectionListener listener) {
checkWidget();
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
if (eventTable == null) return;
eventTable.unhook (SWT.Selection, listener);
eventTable.unhook (SWT.DefaultSelection,listener);
}
void setBounds (int x, int y, int width, int height) {
PhArea_t area = new PhArea_t ();
area.pos_x = (short) x;
area.pos_y = (short) y;
area.size_w = (short) (Math.max (width, 0));
area.size_h = (short) (Math.max (height, 0));
int ptr = OS.malloc (PhArea_t.sizeof);
OS.memmove (ptr, area, PhArea_t.sizeof);
int [] args = {OS.Pt_ARG_AREA, ptr, 0};
OS.PtSetResources (handle, args.length / 3, args);
OS.free (ptr);
}
public void setEnabled (boolean enabled) {
checkWidget();
int [] args = {
OS.Pt_ARG_FLAGS, enabled ? 0 : OS.Pt_BLOCKED, OS.Pt_BLOCKED,
OS.Pt_ARG_FLAGS, enabled ? 0 : OS.Pt_GHOST, OS.Pt_GHOST,
};
OS.PtSetResources (handle, args.length / 3, args);
}
public void setIncrement (int value) {
checkWidget();
int [] args = {OS.Pt_ARG_INCREMENT, value, 0};
OS.PtSetResources (handle, args.length / 3, args);
}
public void setMaximum (int value) {
checkWidget();
int [] args = {OS.Pt_ARG_MAXIMUM, value - 1, 0};
OS.PtSetResources (handle, args.length / 3, args);
}
public void setMinimum (int value) {
checkWidget();
int [] args = {OS.Pt_ARG_MINIMUM, value, 0};
OS.PtSetResources (handle, args.length / 3, args);
}
public void setPageIncrement (int value) {
checkWidget();
int [] args = {OS.Pt_ARG_PAGE_INCREMENT, value, 0};
OS.PtSetResources (handle, args.length / 3, args);
}
public void setSelection (int value) {
checkWidget();
int [] args = {OS.Pt_ARG_SCROLL_POSITION, value, 0};
OS.PtSetResources (handle, args.length / 3, args);
}
public void setThumb (int value) {
checkWidget();
int [] args = {OS.Pt_ARG_SLIDER_SIZE, value, 0};
OS.PtSetResources (handle, args.length / 3, args);
}
public void setValues (int selection, int minimum, int maximum, int thumb, int increment, int pageIncrement) {
checkWidget();
if (selection < 0) return;
if (minimum < 0) return;
if (maximum < 0) return;
if (thumb < 1) return;
if (maximum - minimum - thumb < 0) return;
if (increment < 1) return;
if (pageIncrement < 1) return;
int [] args = {
OS.Pt_ARG_SCROLL_POSITION, selection, 0,
OS.Pt_ARG_INCREMENT, increment, 0,
OS.Pt_ARG_PAGE_INCREMENT, pageIncrement, 0,
OS.Pt_ARG_SLIDER_SIZE, thumb, 0,
OS.Pt_ARG_MINIMUM, minimum, 0,
OS.Pt_ARG_MAXIMUM, maximum - 1, 0,
};
OS.PtSetResources (handle, args.length / 3, args);
}
public void setVisible (boolean visible) {
checkWidget();
if (visible == OS.PtWidgetIsRealized (handle)) return;
int [] args = {
OS.Pt_ARG_FLAGS, visible ? 0 : OS.Pt_DELAY_REALIZE, OS.Pt_DELAY_REALIZE,
};
OS.PtSetResources (handle, args.length / 3, args);
if (visible) {
sendEvent (SWT.Show);
OS.PtRealizeWidget (handle);
parent.resizeClientArea ();
} else {
OS.PtUnrealizeWidget (handle);
parent.resizeClientArea ();
sendEvent(SWT.Hide);
}
}
}