int XButtonRelease(int w, int client_data, int call_data, int continue_to_dispatch) { display.hideToolTip(); XButtonEvent xEvent = new XButtonEvent(); OS.memmove(xEvent, call_data, XButtonEvent.sizeof); /* * Forward the mouse event to the parent. * This is necessary so that mouse listeners * in the parent will be called, despite the * fact that the event did not really occur * in X in the parent. This is done to be * compatible with Windows. */ int[] argList = {OS.XmNx, 0, OS.XmNy, 0}; OS.XtGetValues(handle, argList, argList.length / 2); xEvent.window = OS.XtWindow(parent.handle); xEvent.x += argList[1]; xEvent.y += argList[3]; OS.memmove(call_data, xEvent, XButtonEvent.sizeof); int result = parent.XButtonRelease(w, client_data, call_data, continue_to_dispatch); xEvent.x -= argList[1]; xEvent.y -= argList[3]; if (result == 0 && xEvent.button == 1) { int[] argList2 = {OS.XmNwidth, 0, OS.XmNheight, 0}; OS.XtGetValues(handle, argList2, argList2.length / 2); int width = argList2[1], height = argList2[3]; if (0 <= xEvent.x && xEvent.x < width && 0 <= xEvent.y && xEvent.y < height) { click(xEvent.x > width - 12, xEvent.state); } setDrawPressed(set); } return result; }
int XPointerMotion(int w, int client_data, int call_data, int continue_to_dispatch) { int result = super.XPointerMotion(w, client_data, call_data, continue_to_dispatch); if (result != 0) return result; XMotionEvent xEvent = new XMotionEvent(); OS.memmove(xEvent, call_data, XMotionEvent.sizeof); if (!dragging || (xEvent.state & OS.Button1Mask) == 0) return result; short[] x_root = new short[1], y_root = new short[1]; OS.XtTranslateCoords(handle, (short) 0, (short) 0, x_root, y_root); int eventX = xEvent.x_root - x_root[0], eventY = xEvent.y_root - y_root[0]; int[] argList1 = { OS.XmNx, 0, OS.XmNy, 0, OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0 }; OS.XtGetValues(handle, argList1, argList1.length / 2); int border = argList1[9], x = ((short) argList1[1]) - border, y = ((short) argList1[3]) - border; int width = argList1[5] + (border * 2), height = argList1[7] + (border * 2); int[] argList2 = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(parent.handle, argList2, argList2.length / 2); int parentBorder = argList2[5]; int parentWidth = argList2[1] + (parentBorder * 2); int parentHeight = argList2[3] + (parentBorder * 2); int newX = lastX, newY = lastY; if ((style & SWT.VERTICAL) != 0) { newX = Math.min(Math.max(0, eventX + x - startX - parentBorder), parentWidth - width); } else { newY = Math.min(Math.max(0, eventY + y - startY - parentBorder), parentHeight - height); } if (newX == lastX && newY == lastY) return result; drawBand(lastX, lastY, width, height); Event event = new Event(); event.time = xEvent.time; event.x = newX; event.y = newY; event.width = width; event.height = height; if ((style & SWT.SMOOTH) == 0) { event.detail = SWT.DRAG; } sendEvent(SWT.Selection, event); if (isDisposed()) return result; if (event.doit) { lastX = event.x; lastY = event.y; } parent.update(true); drawBand(lastX, lastY, width, height); if ((style & SWT.SMOOTH) != 0) { setBounds(lastX, lastY, width, height); // widget could be disposed at this point } return result; }
boolean setScrollBarVisible(ScrollBar bar, boolean visible) { if (scrolledHandle == 0) return false; int barHandle = bar.handle; boolean managed = OS.XtIsManaged(barHandle); if (managed == visible) return false; /* * Feature in Motif. Hiding or showing a scroll bar * can cause the widget to automatically resize in * the OS. This behavior is unwanted. The fix is * to force the widget to resize to original size. */ int[] argList = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(scrolledHandle, argList, argList.length / 2); int[] argList1 = {OS.XmNwidth, 0, OS.XmNheight, 0}; OS.XtGetValues(handle, argList1, argList1.length / 2); /* Hide or show the scroll bar */ if (visible) { OS.XtManageChild(barHandle); } else { OS.XtUnmanageChild(barHandle); } if ((state & CANVAS) != 0) { if (formHandle != 0) { boolean showBorder = (style & SWT.BORDER) != 0; int margin = showBorder || visible ? 3 : 0; if ((bar.style & SWT.V_SCROLL) != 0) { int[] argList2 = new int[] {OS.XmNmarginWidth, margin}; OS.XtSetValues(formHandle, argList2, argList2.length / 2); } if ((bar.style & SWT.H_SCROLL) != 0) { int[] argList2 = new int[] {OS.XmNmarginHeight, margin}; OS.XtSetValues(formHandle, argList2, argList2.length / 2); } } } /* * Feature in Motif. When XtSetValues() is used to restore the width and * height of the widget, the new width and height are sometimes ignored. * The fix is to use XtResizeWidget(). */ OS.XtResizeWidget(scrolledHandle, argList[1], argList[3], argList[5]); bar.sendEvent(visible ? SWT.Show : SWT.Hide); int[] argList3 = {OS.XmNwidth, 0, OS.XmNheight, 0}; OS.XtGetValues(handle, argList3, argList3.length / 2); return argList1[1] != argList3[1] || argList1[3] != argList3[3]; }
int XButtonRelease(int w, int client_data, int call_data, int continue_to_dispatch) { int result = super.XButtonRelease(w, client_data, call_data, continue_to_dispatch); if (result != 0) return result; XButtonEvent xEvent = new XButtonEvent(); OS.memmove(xEvent, call_data, XButtonEvent.sizeof); if (xEvent.button != 1) return result; if (!dragging) return result; dragging = false; int[] argList = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(handle, argList, argList.length / 2); int border = argList[5]; int width = argList[1] + (border * 2), height = argList[3] + (border * 2); Event event = new Event(); event.time = xEvent.time; event.x = lastX; event.y = lastY; event.width = width; event.height = height; drawBand(lastX, lastY, width, height); sendEvent(SWT.Selection, event); if (isDisposed()) return result; if (event.doit) { if ((style & SWT.SMOOTH) != 0) { setBounds(event.x, event.y, width, height); // widget could be disposed at this point } } return result; }
int XPointerMotion(int w, int client_data, int call_data, int continue_to_dispatch) { display.addMouseHoverTimeOut(handle); /* * Forward the mouse event to the parent. * This is necessary so that mouse listeners * in the parent will be called, despite the * fact that the event did not really occur * in X in the parent. This is done to be * compatible with Windows. */ XMotionEvent xEvent = new XMotionEvent(); OS.memmove(xEvent, call_data, XMotionEvent.sizeof); int[] argList = {OS.XmNx, 0, OS.XmNy, 0}; OS.XtGetValues(handle, argList, argList.length / 2); xEvent.window = OS.XtWindow(parent.handle); xEvent.x += argList[1]; xEvent.y += argList[3]; /* * This code is intentionally commented. * Currently, the implementation of the * mouse move code in the parent interferes * with tool tips for tool items. */ // OS.memmove (callData, xEvent, XButtonEvent.sizeof); // parent.XPointerMotion (w, client_data, call_data, continue_to_dispatch); if (!parent.sendMouseEvent(SWT.MouseMove, xEvent)) { OS.memmove(continue_to_dispatch, new int[1], 4); return 1; } return 0; }
int xFocusIn(XFocusChangeEvent xEvent) { int result = super.xFocusIn(xEvent); if (handle == 0) return result; int[] argList = {OS.XmNx, 0, OS.XmNy, 0}; OS.XtGetValues(handle, argList, argList.length / 2); lastX = argList[1]; lastY = argList[3]; return result; }
ScrollBar createStandardBar(int style) { if (scrolledHandle == 0) return null; ScrollBar bar = new ScrollBar(); bar.parent = this; bar.style = style; bar.display = display; int[] argList = {OS.XmNhorizontalScrollBar, 0, OS.XmNverticalScrollBar, 0}; OS.XtGetValues(scrolledHandle, argList, argList.length / 2); if (style == SWT.H_SCROLL) bar.handle = argList[1]; if (style == SWT.V_SCROLL) bar.handle = argList[3]; bar.hookEvents(); bar.register(); return bar; }
void manageChildren() { if (scrolledHandle != 0) { OS.XtSetMappedWhenManaged(scrolledHandle, false); OS.XtManageChild(scrolledHandle); } if (formHandle != 0) { OS.XtSetMappedWhenManaged(formHandle, false); OS.XtManageChild(formHandle); } super.manageChildren(); if (formHandle != 0) { int[] argList = {OS.XmNborderWidth, 0}; OS.XtGetValues(formHandle, argList, argList.length / 2); OS.XtResizeWidget(formHandle, 1, 1, argList[1]); OS.XtSetMappedWhenManaged(formHandle, true); } if (scrolledHandle != 0) { int[] argList = {OS.XmNborderWidth, 0}; OS.XtGetValues(scrolledHandle, argList, argList.length / 2); OS.XtResizeWidget(scrolledHandle, 1, 1, argList[1]); OS.XtSetMappedWhenManaged(scrolledHandle, true); } }
void click(boolean dropDown, int state) { if ((style & SWT.RADIO) != 0) { selectRadio(); } else { if ((style & SWT.CHECK) != 0) setSelection(!set); } Event event = new Event(); if ((style & SWT.DROP_DOWN) != 0) { if (dropDown) { event.detail = SWT.ARROW; int[] argList = {OS.XmNx, 0, OS.XmNy, 0, OS.XmNheight, 0}; OS.XtGetValues(handle, argList, argList.length / 2); event.x = (short) argList[1]; event.y = (short) argList[3] + (short) argList[5]; } } if (state != 0) setInputState(event, state); postEvent(SWT.Selection, event); }
int XButtonPress(int w, int client_data, int call_data, int continue_to_dispatch) { int result = super.XButtonPress(w, client_data, call_data, continue_to_dispatch); if (result != 0) return result; XButtonEvent xEvent = new XButtonEvent(); OS.memmove(xEvent, call_data, XButtonEvent.sizeof); if (xEvent.button != 1) return result; short[] x_root = new short[1], y_root = new short[1]; OS.XtTranslateCoords(handle, (short) 0, (short) 0, x_root, y_root); startX = xEvent.x_root - x_root[0]; startY = xEvent.y_root - y_root[0]; int[] argList = {OS.XmNx, 0, OS.XmNy, 0, OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(handle, argList, argList.length / 2); int border = argList[9], width = argList[5] + (border * 2), height = argList[7] + (border * 2); lastX = ((short) argList[1]) - border; lastY = ((short) argList[3]) - border; Event event = new Event(); event.time = xEvent.time; event.x = lastX; event.y = lastY; event.width = width; event.height = height; if ((style & SWT.SMOOTH) == 0) { event.detail = SWT.DRAG; } sendEvent(SWT.Selection, event); if (isDisposed()) return result; if (event.doit) { dragging = true; lastX = event.x; lastY = event.y; parent.update(true); drawBand(event.x, event.y, width, height); if ((style & SWT.SMOOTH) != 0) { setBounds(event.x, event.y, width, height); // widget could be disposed at this point } } return result; }
int XKeyPress(int w, int client_data, int call_data, int continue_to_dispatch) { int result = super.XKeyPress(w, client_data, call_data, continue_to_dispatch); if (result != 0) return result; XKeyEvent xEvent = new XKeyEvent(); OS.memmove(xEvent, call_data, XKeyEvent.sizeof); byte[] buffer = new byte[1]; int[] keysym = new int[1]; OS.XLookupString(xEvent, buffer, buffer.length, keysym, null); switch (keysym[0]) { case OS.XK_Left: case OS.XK_Right: case OS.XK_Up: case OS.XK_Down: int xChange = 0, yChange = 0; int stepSize = PAGE_INCREMENT; if ((xEvent.state & OS.ControlMask) != 0) stepSize = INCREMENT; if ((style & SWT.VERTICAL) != 0) { if (keysym[0] == OS.XK_Up || keysym[0] == OS.XK_Down) break; xChange = keysym[0] == OS.XK_Left ? -stepSize : stepSize; } else { if (keysym[0] == OS.XK_Left || keysym[0] == OS.XK_Right) break; yChange = keysym[0] == OS.XK_Up ? -stepSize : stepSize; } int[] argList1 = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(handle, argList1, argList1.length / 2); int border = argList1[5]; int width = argList1[1] + (border * 2), height = argList1[3] + (border * 2); int[] argList2 = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(parent.handle, argList2, argList2.length / 2); int parentBorder = argList2[5]; int parentWidth = argList2[1] + (parentBorder * 2); int parentHeight = argList2[3] + (parentBorder * 2); int newX = lastX, newY = lastY; if ((style & SWT.VERTICAL) != 0) { newX = Math.min(Math.max(0, lastX + xChange - parentBorder - startX), parentWidth - width); } else { newY = Math.min(Math.max(0, lastY + yChange - parentBorder - startY), parentHeight - height); } if (newX == lastX && newY == lastY) return result; /* Ensure that the pointer image does not change */ int xDisplay = display.xDisplay; int xWindow = OS.XtWindow(parent.handle); int ptrGrabResult = OS.XGrabPointer( xDisplay, xWindow, 1, OS.None, OS.GrabModeAsync, OS.GrabModeAsync, OS.None, cursor, OS.CurrentTime); Event event = new Event(); event.time = xEvent.time; event.x = newX; event.y = newY; event.width = width; event.height = height; sendEvent(SWT.Selection, event); if (ptrGrabResult == OS.GrabSuccess) OS.XUngrabPointer(xDisplay, OS.CurrentTime); if (isDisposed()) break; if (event.doit) { lastX = event.x; lastY = event.y; if ((style & SWT.SMOOTH) != 0) { setBounds(event.x, event.y, width, height); if (isDisposed()) break; } int cursorX = event.x, cursorY = event.y; if ((style & SWT.VERTICAL) != 0) { cursorY += height / 2; } else { cursorX += width / 2; } OS.XWarpPointer(xDisplay, OS.None, xWindow, 0, 0, 0, 0, cursorX, cursorY); } break; } return result; }
Point computeSize(GC gc) { int width = 0, height = 0; if ((style & SWT.SEPARATOR) != 0) { if ((parent.style & SWT.HORIZONTAL) != 0) { width = getWidth(); height = DEFAULT_HEIGHT; } else { width = DEFAULT_WIDTH; height = getWidth(); } if (control != null) { height = Math.max(height, control.getMinimumHeight()); } return new Point(width, height); } int[] argList = { OS.XmNmarginHeight, 0, OS.XmNmarginWidth, 0, OS.XmNshadowThickness, 0, }; OS.XtGetValues(handle, argList, argList.length / 2); int marginHeight = argList[1], marginWidth = argList[3]; int shadowThickness = argList[5]; if ((parent.style & SWT.FLAT) != 0) { shadowThickness = Math.min(2, display.buttonShadowThickness); } if (text.length() != 0 || image != null) { int textWidth = 0, textHeight = 0; if (text.length() != 0) { int flags = SWT.DRAW_DELIMITER | SWT.DRAW_TAB | SWT.DRAW_MNEMONIC; Point textExtent = gc.textExtent(text, flags); textWidth = textExtent.x; textHeight = textExtent.y; } int imageWidth = 0, imageHeight = 0; if (image != null) { Rectangle rect = image.getBounds(); imageWidth = rect.width; imageHeight = rect.height; } if ((parent.style & SWT.RIGHT) != 0) { width = imageWidth + textWidth; height = Math.max(imageHeight, textHeight); if (imageWidth != 0 && textWidth != 0) width += 2; } else { height = imageHeight + textHeight; if (imageHeight != 0 && textHeight != 0) height += 2; width = Math.max(imageWidth, textWidth); } } else { width = DEFAULT_WIDTH; height = DEFAULT_HEIGHT; } if ((style & SWT.DROP_DOWN) != 0) { width += 12; } if (width != 0) { width += (marginWidth + shadowThickness) * 2 + 2; } else { width = DEFAULT_WIDTH; } if (height != 0) { height += (marginHeight + shadowThickness) * 2 + 2; } else { height = DEFAULT_HEIGHT; } return new Point(width, height); }
/** * Returns a rectangle which describes the area of the receiver which is capable of displaying * data (that is, not covered by the "trimmings"). * * @return the client area * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> * * @see #computeTrim */ public Rectangle getClientArea() { checkWidget(); int[] argList = {OS.XmNwidth, 0, OS.XmNheight, 0}; OS.XtGetValues(handle, argList, argList.length / 2); return new Rectangle(0, 0, argList[1], argList[3]); }
int XmNexposureCallback(int w, int client_data, int call_data) { if ((style & SWT.SEPARATOR) != 0) return 0; int xDisplay = OS.XtDisplay(handle); if (xDisplay == 0) return 0; int xWindow = OS.XtWindow(handle); if (xWindow == 0) return 0; int[] argList = { OS.XmNcolormap, 0, OS.XmNwidth, 0, OS.XmNheight, 0, }; OS.XtGetValues(handle, argList, argList.length / 2); int width = argList[3], height = argList[5]; Image currentImage = image; boolean enabled = getEnabled(); if ((parent.style & SWT.FLAT) != 0) { boolean hasCursor = hasCursor(); /* Set the shadow thickness */ int thickness = 0; if (set || (hasCursor && enabled)) { thickness = Math.min(2, display.buttonShadowThickness); } argList = new int[] {OS.XmNshadowThickness, thickness}; OS.XtSetValues(handle, argList, argList.length / 2); /* Determine if hot image should be used */ if (enabled && hasCursor && hotImage != null) { currentImage = hotImage; } } GCData data = new GCData(); data.device = display; data.display = xDisplay; data.drawable = xWindow; data.font = parent.font; data.colormap = argList[1]; int xGC = OS.XCreateGC(xDisplay, xWindow, 0, null); if (xGC == 0) SWT.error(SWT.ERROR_NO_HANDLES); GC gc = GC.motif_new(xGC, data); XmAnyCallbackStruct cb = new XmAnyCallbackStruct(); OS.memmove(cb, call_data, XmAnyCallbackStruct.sizeof); if (cb.event != 0) { XExposeEvent xEvent = new XExposeEvent(); OS.memmove(xEvent, cb.event, XExposeEvent.sizeof); Rectangle rect = new Rectangle(xEvent.x, xEvent.y, xEvent.width, xEvent.height); gc.setClipping(rect); } if (!enabled) { currentImage = disabledImage; if (currentImage == null && image != null) { currentImage = new Image(display, image, SWT.IMAGE_DISABLE); } Color disabledColor = display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); gc.setForeground(disabledColor); } else { gc.setForeground(parent.getForeground()); } gc.setBackground(parent.getBackground()); int textX = 0, textY = 0, textWidth = 0, textHeight = 0; if (text.length() != 0) { int flags = SWT.DRAW_DELIMITER | SWT.DRAW_TAB | SWT.DRAW_MNEMONIC; Point textExtent = gc.textExtent(text, flags); textWidth = textExtent.x; textHeight = textExtent.y; } int imageX = 0, imageY = 0, imageWidth = 0, imageHeight = 0; if (currentImage != null) { Rectangle imageBounds = currentImage.getBounds(); imageWidth = imageBounds.width; imageHeight = imageBounds.height; } int spacing = 0; if (textWidth != 0 && imageWidth != 0) spacing = 2; if ((parent.style & SWT.RIGHT) != 0) { imageX = (width - imageWidth - textWidth - spacing) / 2; imageY = (height - imageHeight) / 2; textX = spacing + imageX + imageWidth; textY = (height - textHeight) / 2; } else { imageX = (width - imageWidth) / 2; imageY = (height - imageHeight - textHeight - spacing) / 2; textX = (width - textWidth) / 2; textY = spacing + imageY + imageHeight; } if ((style & SWT.DROP_DOWN) != 0) { textX -= 6; imageX -= 6; } if (textWidth > 0) { int flags = SWT.DRAW_DELIMITER | SWT.DRAW_TAB | SWT.DRAW_MNEMONIC | SWT.DRAW_TRANSPARENT; gc.drawText(text, textX, textY, flags); } if (imageWidth > 0) gc.drawImage(currentImage, imageX, imageY); if ((style & SWT.DROP_DOWN) != 0) { int startX = width - 12, startY = (height - 2) / 2; int[] arrow = {startX, startY, startX + 3, startY + 3, startX + 6, startY}; gc.setBackground(parent.getForeground()); gc.fillPolygon(arrow); gc.drawPolygon(arrow); } gc.dispose(); OS.XFreeGC(xDisplay, xGC); if (!enabled && disabledImage == null) { if (currentImage != null) currentImage.dispose(); } return 0; }
/** * Returns a rectangle describing the receiver's size and location relative to its parent. * * @return the receiver's bounding rectangle * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public Rectangle getBounds() { checkWidget(); int[] argList = {OS.XmNx, 0, OS.XmNy, 0, OS.XmNwidth, 0, OS.XmNheight, 0}; OS.XtGetValues(handle, argList, argList.length / 2); return new Rectangle((short) argList[1], (short) argList[3], argList[5], argList[7]); }
void setBackgroundPixel(int pixel) { int[] argList = {OS.XmNforeground, 0, OS.XmNhighlightColor, 0}; OS.XtGetValues(handle, argList, argList.length / 2); OS.XmChangeColor(handle, pixel); OS.XtSetValues(handle, argList, argList.length / 2); }
/** * Returns <code>true</code> if the receiver is enabled, and <code>false</code> otherwise. A * disabled control is typically not selectable from the user interface and draws with an inactive * or "grayed" look. * * @return the receiver's enabled state * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> * * @see #isEnabled */ public boolean getEnabled() { checkWidget(); int[] argList = {OS.XmNsensitive, 0}; OS.XtGetValues(handle, argList, argList.length / 2); return argList[1] != 0; }