diff options
author | Silenio Quarti | 2002-04-02 22:08:14 +0000 |
---|---|---|
committer | Silenio Quarti | 2002-04-02 22:08:14 +0000 |
commit | 04de3fc7ae68f9215fb3d4fcc47ca5754e572bac (patch) | |
tree | ead6cddb86c106b6a2d4024549e5386d9980f89e | |
parent | abcda6211c0bcc3a908332242b9d1409108c82ba (diff) | |
download | eclipse.platform.swt-04de3fc7ae68f9215fb3d4fcc47ca5754e572bac.tar.gz eclipse.platform.swt-04de3fc7ae68f9215fb3d4fcc47ca5754e572bac.tar.xz eclipse.platform.swt-04de3fc7ae68f9215fb3d4fcc47ca5754e572bac.zip |
*** empty log message ***
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java | 295 |
1 files changed, 137 insertions, 158 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java index 4eb5c23fae..a40f5a1091 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java @@ -28,8 +28,7 @@ import org.eclipse.swt.events.*; */ public class Sash extends Control { boolean dragging; - int originX, originY; - int lastX, lastY; /* relative to the receiver, not the parent */ + int startX, startY, lastX, lastY; int cursor; /** @@ -64,34 +63,6 @@ public Sash (Composite parent, int style) { super (parent, checkStyle (style)); } -void createHandle (int index) { - state |= HANDLE; - handle = OS.gtk_drawing_area_new(); - if (handle == 0) error (SWT.ERROR_NO_HANDLES); - int parentHandle = parent.parentingHandle (); - OS.gtk_container_add (parentHandle, handle); - OS.gtk_widget_show (handle); - int type = (style & SWT.VERTICAL) != 0 ? OS.GDK_SB_H_DOUBLE_ARROW:OS.GDK_SB_V_DOUBLE_ARROW; - cursor = OS.gdk_cursor_new (type); - OS.gtk_widget_realize (handle); - int window = OS.GTK_WIDGET_WINDOW (handle); - OS.gdk_window_set_cursor (window, cursor); -} - -public Point computeSize (int wHint, int hHint, boolean changed) { - checkWidget (); - int border = getBorderWidth (); - int width = border * 2, height = border * 2; - if ((style & SWT.HORIZONTAL) != 0) { - width += DEFAULT_WIDTH; height += 3; - } else { - width += 3; height += DEFAULT_HEIGHT; - } - if (wHint != SWT.DEFAULT) width = wHint + (border * 2); - if (hHint != SWT.DEFAULT) height = hHint + (border * 2); - return new Point (width, height); -} - /** * Adds the listener to the collection of listeners who will * be notified when the control is selected, by sending @@ -125,48 +96,76 @@ public void addSelectionListener (SelectionListener listener) { addListener (SWT.MouseDoubleClick,typedListener); } -/** - * Removes the listener from the collection of listeners who will - * be notified when the control is selected. - * - * @param listener the listener which should be notified - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - * - * @see SelectionListener - * @see #addSelectionListener - */ -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.MouseDoubleClick,listener); +static int checkStyle (int style) { + return checkBits (style, SWT.HORIZONTAL, SWT.VERTICAL, 0, 0, 0, 0); +} + +public Point computeSize (int wHint, int hHint, boolean changed) { + checkWidget (); + int border = getBorderWidth (); + int width = border * 2, height = border * 2; + if ((style & SWT.HORIZONTAL) != 0) { + width += DEFAULT_WIDTH; height += 3; + } else { + width += 3; height += DEFAULT_HEIGHT; + } + if (wHint != SWT.DEFAULT) width = wHint + (border * 2); + if (hHint != SWT.DEFAULT) height = hHint + (border * 2); + return new Point (width, height); +} + +void createHandle (int index) { + state |= HANDLE; + handle = OS.gtk_drawing_area_new (); + if (handle == 0) error (SWT.ERROR_NO_HANDLES); + int parentHandle = parent.parentingHandle (); + OS.gtk_container_add (parentHandle, handle); + OS.gtk_widget_show (handle); + int type = (style & SWT.VERTICAL) != 0 ? OS.GDK_SB_H_DOUBLE_ARROW : OS.GDK_SB_V_DOUBLE_ARROW; + cursor = OS.gdk_cursor_new (type); + OS.gtk_widget_realize (handle); + int window = OS.GTK_WIDGET_WINDOW (handle); + OS.gdk_window_set_cursor (window, cursor); +} + +void drawBand (int x, int y, int width, int height) { + int window = OS.GTK_WIDGET_WINDOW (parent.paintHandle()); + if (window == 0) return; + byte [] bits = {-86, 0, 85, 0, -86, 0, 85, 0, -86, 0, 85, 0, -86, 0, 85, 0}; + int stipplePixmap = OS.gdk_bitmap_create_from_data (window, bits, 8, 8); + int gc = OS.gdk_gc_new (window); + int colormap = OS.gdk_colormap_get_system(); + GdkColor color = new GdkColor (); + OS.gdk_color_white (colormap, color); + OS.gdk_gc_set_foreground (gc, color); + OS.gdk_gc_set_stipple (gc, stipplePixmap); + OS.gdk_gc_set_subwindow (gc, OS.GDK_INCLUDE_INFERIORS); + OS.gdk_gc_set_fill (gc, OS.GDK_STIPPLED); + OS.gdk_gc_set_function (gc, OS.GDK_XOR); + OS.gdk_draw_rectangle (window, gc, 1, x, y, width, height); + OS.g_object_unref (stipplePixmap); + OS.g_object_unref (gc); } -int processMouseDown (int callData, int arg1, int int2) { - super.processMouseDown (callData,arg1,int2); - if (OS.gdk_event_button_get_button(callData) != 1) return 0; - - originX = OS.GTK_WIDGET_X(handle); - originY = OS.GTK_WIDGET_Y(handle); - lastX = 0; - lastY = 0; - +int processMouseDown (int callData, int int1, int int2) { + super.processMouseDown (callData, int1, int2); + int button = OS.gdk_event_button_get_button (callData); + if (button != 1) return 0; + double[] px = new double [1], py = new double [1]; + OS.gdk_event_get_coords (callData, px, py); + startX = (int)px [0]; startY = (int) py [0]; + int border = 0; + int x = OS.GTK_WIDGET_X (handle); + int y = OS.GTK_WIDGET_Y (handle); + int width = OS.GTK_WIDGET_WIDTH (handle); + int height = OS.GTK_WIDGET_HEIGHT (handle); + lastX = x - border; lastY = y - border; /* The event must be sent because its doit flag is used. */ Event event = new Event (); event.detail = SWT.DRAG; - event.time = OS.gdk_event_get_time(callData); - event.x = originX; - event.y = originY; - event.width = OS.GTK_WIDGET_WIDTH (handle); - event.height = OS.GTK_WIDGET_HEIGHT (handle); + event.time = OS.gdk_event_get_time (callData); + event.x = lastX; event.y = lastY; + event.width = width; event.height = height; /* * It is possible (but unlikely) that client code could have disposed * the widget in the selection event. If this happens end the processing @@ -176,123 +175,103 @@ int processMouseDown (int callData, int arg1, int int2) { if (isDisposed ()) return 0; if (event.doit) { dragging = true; - drawBand (originX, originY, event.width, event.height); +// OS.XmUpdateDisplay (handle); + drawBand (lastX = event.x, lastY = event.y, width, height); } - return 0; + return 0; } -int processMouseMove (int callData, int arg1, int int2) { - super.processMouseMove (callData, arg1, int2); - if (!dragging) return 0; - - /* Get the coordinates where the event happened, relative to the receiver */ - double[] px = new double[1]; - double[] py = new double[1]; - OS.gdk_event_get_coords(callData, px, py); - int x = (int)(px[0]); - int y = (int)(py[0]); - - int width = OS.GTK_WIDGET_WIDTH(handle); - int height = OS.GTK_WIDGET_HEIGHT(handle); - +int processMouseMove (int callData, int int1, int int2) { + super.processMouseMove (callData, int1, int2); + int [] state = new int [1]; + OS.gdk_event_get_state (callData, state); + if (!dragging || (state [0] & OS.GDK_BUTTON1_MASK) == 0) return 0; + int x = OS.GTK_WIDGET_X (handle); + int y = OS.GTK_WIDGET_Y (handle); + int width = OS.GTK_WIDGET_WIDTH (handle); + int height = OS.GTK_WIDGET_HEIGHT (handle); + int border = 0, parentBorder = 0; + int parentWidth = OS.GTK_WIDGET_WIDTH (parent.handle); + int parentHeight = OS.GTK_WIDGET_WIDTH (parent.handle); + double[] px = new double [1], py = new double [1]; + OS.gdk_event_get_coords (callData, px, py); + int newX = lastX, newY = lastY; if ((style & SWT.VERTICAL) != 0) { - /* Erase the old one */ - int oldDrawX = originX + lastX; - drawBand(oldDrawX, originY, width, height); - /* Draw the new */ - int drawX = originX + x; - drawBand(drawX, originY, width, height); - lastX = x; + newX = Math.min (Math.max (0, (int)px [0] + x - startX - parentBorder), parentWidth - width); } else { - /* Erase the old one */ - int oldDrawY = originY + lastY; - drawBand(originX, oldDrawY, width, height); - /* Draw the new */ - int drawY = originY + y; - drawBand(originX, drawY, width, height); - lastY = y; + newY = Math.min (Math.max (0, (int)py[0] + y - startY - parentBorder), parentHeight - height); + } + if (newX == lastX && newY == lastY) return 0; + drawBand (lastX, lastY, width, height); + /* The event must be sent because its doit flag is used. */ + Event event = new Event (); + event.detail = SWT.DRAG; + event.time = OS.gdk_event_get_time (callData); + event.x = newX; event.y = newY; + event.width = width; event.height = height; + /* + * It is possible (but unlikely) that client code could have disposed + * the widget in the selection event. If this happens end the processing + * of this message by returning. + */ + sendEvent (SWT.Selection, event); + if (isDisposed ()) return 0; + if (event.doit) { + lastX = event.x; lastY = event.y; +// OS.XmUpdateDisplay (handle); + drawBand (lastX, lastY, width, height); } return 0; } -int processMouseUp (int callData, int arg1, int int2) { - super.processMouseUp(callData, arg1,int2); +int processMouseUp (int callData, int int1, int int2) { + super.processMouseUp (callData, int1, int2); int button = OS.gdk_event_button_get_button(callData); if (button != 1) return 0; if (!dragging) return 0; - int width = OS.GTK_WIDGET_WIDTH(handle); - int height = OS.GTK_WIDGET_HEIGHT(handle); - int x = lastX + originX; - int y = lastY + originY; - drawBand(x, y, width, height); dragging = false; - - Event event = new Event (); - event.time = OS.gdk_event_get_time(callData); - event.x = x; event.y = y; - event.width = width; event.height = height; - sendEvent (SWT.Selection, event); - return 0; -} - -int processMouseEnter (int callData, int arg1, int int2) { int width = OS.GTK_WIDGET_WIDTH (handle); int height = OS.GTK_WIDGET_HEIGHT (handle); - lastX = OS.GTK_WIDGET_X(handle); lastY = OS.GTK_WIDGET_Y(handle); + /* The event must be sent because its doit flag is used. */ Event event = new Event (); - event.time = OS.gdk_event_get_time(callData); - event.detail = SWT.DRAG; + event.time = OS.gdk_event_get_time (callData); event.x = lastX; event.y = lastY; event.width = width; event.height = height; - Cursor arrowCursor; - if ((style & SWT.HORIZONTAL) != 0) { - arrowCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_SIZENS); - } else { - arrowCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_SIZEWE); - } - setCursor(arrowCursor); + drawBand (lastX, lastY, width, height); sendEvent (SWT.Selection, event); + /* widget could be disposed here */ return 0; } -int processMouseExit (int callData, int arg1, int int2) { - int width = OS.GTK_WIDGET_WIDTH (handle); - int height = OS.GTK_WIDGET_HEIGHT (handle); - Event event = new Event (); - event.time = OS.gdk_event_get_time(callData); - event.x = lastX; event.y = lastY; - event.width = width; event.height = height; - sendEvent (SWT.MouseExit, event); - return 0; - -} - -void drawBand (int x, int y, int width, int height) { - Display display= parent.getDisplay (); - if (display == null) return; - int window = OS.GTK_WIDGET_WINDOW(parent.paintHandle()); - if (window == 0) return; - byte [] bits = {-86, 0, 85, 0, -86, 0, 85, 0, -86, 0, 85, 0, -86, 0, 85, 0}; - int stipplePixmap = OS.gdk_bitmap_create_from_data (window, bits, 8, 8); - int gc = OS.gdk_gc_new(window); - Color color = getDisplay().getSystemColor(SWT.COLOR_WHITE); - OS.gdk_gc_set_foreground(gc, color.handle); - OS.gdk_gc_set_stipple(gc, stipplePixmap); - OS.gdk_gc_set_subwindow(gc, OS.GDK_INCLUDE_INFERIORS); - OS.gdk_gc_set_fill(gc, OS.GDK_STIPPLED); - OS.gdk_gc_set_function(gc, OS.GDK_XOR); - OS.gdk_draw_rectangle(window, gc, 1, x, y, width, height); - OS.g_object_unref(stipplePixmap); - OS.g_object_unref(gc); -} -static int checkStyle (int style) { - return checkBits (style, SWT.HORIZONTAL, SWT.VERTICAL, 0, 0, 0, 0); -} - void releaseWidget () { super.releaseWidget (); if (cursor != 0) OS.gdk_cursor_destroy (cursor); cursor = 0; } +/** + * Removes the listener from the collection of listeners who will + * be notified when the control is selected. + * + * @param listener the listener which should be notified + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> + * </ul> + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + * + * @see SelectionListener + * @see #addSelectionListener + */ +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.MouseDoubleClick,listener); +} + } |