void destroyItem(TabItem item) { int index = 0; int itemCount = getItemCount(); while (index < itemCount) { if (items[index] == item) break; index++; } if (index == itemCount) error(SWT.ERROR_ITEM_NOT_REMOVED); int oldIndex = OS.gtk_notebook_get_current_page(handle); OS.g_signal_handlers_block_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); OS.gtk_notebook_remove_page(handle, index); OS.g_signal_handlers_unblock_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); System.arraycopy(items, index + 1, items, index, --itemCount - index); items[itemCount] = null; if (index == oldIndex) { int newIndex = OS.gtk_notebook_get_current_page(handle); if (newIndex != -1) { Control control = items[newIndex].getControl(); if (control != null && !control.isDisposed()) { control.setBounds(getClientArea()); control.setVisible(true); } Event event = new Event(); event.item = items[newIndex]; sendSelectionEvent(SWT.Selection, event, true); // the widget could be destroyed at this point } } }
void setSelection(int index, boolean notify) { if (index < 0) return; int oldIndex = OS.gtk_notebook_get_current_page(handle); if (oldIndex == index) return; if (oldIndex != -1) { TabItem item = items[oldIndex]; Control control = item.control; if (control != null && !control.isDisposed()) { control.setVisible(false); } } OS.g_signal_handlers_block_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); OS.gtk_notebook_set_current_page(handle, index); OS.g_signal_handlers_unblock_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); int newIndex = OS.gtk_notebook_get_current_page(handle); if (newIndex != -1) { TabItem item = items[newIndex]; Control control = item.control; if (control != null && !control.isDisposed()) { control.setBounds(getClientArea()); control.setVisible(true); } if (notify) { Event event = new Event(); event.item = item; sendSelectionEvent(SWT.Selection, event, true); } } }
int /*long*/ gtk_commit(int /*long*/ imcontext, int /*long*/ textPtr) { if (!isInlineEnabled()) return 0; boolean doit = true; ranges = null; styles = null; caretOffset = commitCount = 0; if (textPtr != 0 && inComposition) { int length = OS.strlen(textPtr); if (length != 0) { byte[] buffer = new byte[length]; OS.memmove(buffer, textPtr, length); char[] chars = Converter.mbcsToWcs(null, buffer); Event event = new Event(); event.detail = SWT.COMPOSITION_CHANGED; event.start = startOffset; event.end = startOffset + text.length(); event.text = text = chars != null ? new String(chars) : ""; commitCount = text.length(); sendEvent(SWT.ImeComposition, event); doit = event.doit; text = ""; startOffset = -1; commitCount = 0; } } inComposition = false; return doit ? 0 : 1; }
@Override long /*int*/ gtk_key_press_event(long /*int*/ widget, long /*int*/ eventPtr) { long /*int*/ result = super.gtk_key_press_event(widget, eventPtr); if (result != 0) return result; if (focusIndex == -1) return result; GdkEventKey gdkEvent = new GdkEventKey(); OS.memmove(gdkEvent, eventPtr, GdkEventKey.sizeof); switch (gdkEvent.keyval) { case OS.GDK_Return: case OS.GDK_KP_Enter: case OS.GDK_space: Event event = new Event(); event.text = ids[focusIndex]; sendSelectionEvent(SWT.Selection, event, true); break; case OS.GDK_Tab: if (focusIndex < offsets.length - 1) { focusIndex++; redraw(); } break; case OS.GDK_ISO_Left_Tab: if (focusIndex > 0) { focusIndex--; redraw(); } break; } return result; }
long /*int*/ gtk_activate(long /*int*/ widget) { Event event = new Event(); event.item = this; int type = OS.gtk_expander_get_expanded(handle) ? SWT.Collapse : SWT.Expand; parent.sendEvent(type, event); return 0; }
long /*int*/ menuItemSelected(long /*int*/ widget, ToolItem item) { Event event = new Event(); switch (item.style) { case SWT.DROP_DOWN: /* * Feature in GTK. The DROP_DOWN item does not * contain arrow button in the overflow menu. So, it * is impossible to select the menu of that item. * The fix is to consider the item selection * as Arrow click, in order to popup the drop-down. */ event.detail = SWT.ARROW; GtkAllocation allocation = new GtkAllocation(); OS.gtk_widget_get_allocation(widget, allocation); event.x = allocation.x; if ((style & SWT.MIRRORED) != 0) event.x = getClientWidth() - allocation.width - event.x; event.y = allocation.y + allocation.height; break; case SWT.RADIO: if ((style & SWT.NO_RADIO_GROUP) == 0) item.selectRadio(); break; case SWT.CHECK: boolean currentSelection = item.getSelection(); item.setSelection(!currentSelection); } item.sendSelectionEvent(SWT.Selection, event, false); return 0; }
long /*int*/ gtk_clicked(long /*int*/ widget) { Event event = new Event(); if ((style & SWT.DROP_DOWN) != 0) { long /*int*/ eventPtr = OS.gtk_get_current_event(); if (eventPtr != 0) { GdkEvent gdkEvent = new GdkEvent(); OS.memmove(gdkEvent, eventPtr, GdkEvent.sizeof); long /*int*/ topHandle = topHandle(); switch (gdkEvent.type) { case OS.GDK_KEY_RELEASE: // Fall Through.. case OS.GDK_BUTTON_PRESS: case OS.GDK_2BUTTON_PRESS: case OS.GDK_BUTTON_RELEASE: { boolean isArrow = false; if (OS.GTK_VERSION < OS.VERSION(2, 6, 0)) { double[] x_win = new double[1]; double[] y_win = new double[1]; OS.gdk_event_get_coords(eventPtr, x_win, y_win); int x = OS.GTK_WIDGET_X(arrowHandle) - OS.GTK_WIDGET_X(handle); int width = OS.GTK_WIDGET_WIDTH(arrowHandle); if ((((parent.style & SWT.RIGHT_TO_LEFT) == 0) && x <= (int) x_win[0]) || (((parent.style & SWT.RIGHT_TO_LEFT) != 0) && (int) x_win[0] <= x + width)) { isArrow = true; } } else if (widget == arrowHandle) { isArrow = true; topHandle = widget; /* * Feature in GTK. ArrowButton stays in toggled state if there is no popup menu. * It is required to set back the state of arrow to normal state after it is clicked. */ OS.g_signal_handlers_block_matched( widget, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED); OS.gtk_toggle_button_set_active(widget, false); OS.g_signal_handlers_unblock_matched( widget, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED); } if (isArrow) { event.detail = SWT.ARROW; event.x = OS.GTK_WIDGET_X(topHandle); if ((parent.style & SWT.MIRRORED) != 0) event.x = parent.getClientWidth() - OS.GTK_WIDGET_WIDTH(topHandle) - event.x; event.y = OS.GTK_WIDGET_Y(topHandle) + OS.GTK_WIDGET_HEIGHT(topHandle); } break; } } OS.gdk_event_free(eventPtr); } } if ((style & SWT.RADIO) != 0) { if ((parent.getStyle() & SWT.NO_RADIO_GROUP) == 0) { selectRadio(); } } sendSelectionEvent(SWT.Selection, event, false); return 0; }
void createItem(TabItem item, int index) { long /*int*/ list = OS.gtk_container_get_children(handle); int itemCount = 0; if (list != 0) { itemCount = OS.g_list_length(list); OS.g_list_free(list); } if (!(0 <= index && index <= itemCount)) error(SWT.ERROR_INVALID_RANGE); if (itemCount == items.length) { TabItem[] newItems = new TabItem[items.length + 4]; System.arraycopy(items, 0, newItems, 0, items.length); items = newItems; } long /*int*/ boxHandle = gtk_box_new(OS.GTK_ORIENTATION_HORIZONTAL, false, 0); if (boxHandle == 0) error(SWT.ERROR_NO_HANDLES); long /*int*/ labelHandle = OS.gtk_label_new_with_mnemonic(null); if (labelHandle == 0) error(SWT.ERROR_NO_HANDLES); long /*int*/ imageHandle = OS.gtk_image_new(); if (imageHandle == 0) error(SWT.ERROR_NO_HANDLES); OS.gtk_container_add(boxHandle, imageHandle); OS.gtk_container_add(boxHandle, labelHandle); long /*int*/ pageHandle = OS.g_object_new(display.gtk_fixed_get_type(), 0); if (pageHandle == 0) error(SWT.ERROR_NO_HANDLES); if (OS.GTK3) { OS.gtk_widget_override_background_color(pageHandle, OS.GTK_STATE_FLAG_NORMAL, new GdkRGBA()); long /*int*/ region = OS.gdk_region_new(); OS.gtk_widget_input_shape_combine_region(pageHandle, region); OS.gdk_region_destroy(region); } OS.g_signal_handlers_block_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); OS.gtk_notebook_insert_page(handle, pageHandle, boxHandle, index); OS.g_signal_handlers_unblock_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); OS.gtk_widget_show(boxHandle); OS.gtk_widget_show(labelHandle); OS.gtk_widget_show(pageHandle); item.state |= HANDLE; item.handle = boxHandle; item.labelHandle = labelHandle; item.imageHandle = imageHandle; item.pageHandle = pageHandle; System.arraycopy(items, index, items, index + 1, itemCount++ - index); items[index] = item; if ((state & FOREGROUND) != 0) { item.setForegroundColor(getForegroundColor()); } if ((state & FONT) != 0) { item.setFontDescription(getFontDescription()); } if (itemCount == 1) { OS.g_signal_handlers_block_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); OS.gtk_notebook_set_current_page(handle, 0); OS.g_signal_handlers_unblock_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); Event event = new Event(); event.item = items[0]; sendSelectionEvent(SWT.Selection, event, false); // the widget could be destroyed at this point } }
LRESULT wmNotifyChild(NMHDR hdr, int /*long*/ wParam, int /*long*/ lParam) { if (OS.COMCTL32_MAJOR >= 6) { switch (hdr.code) { case OS.NM_RETURN: case OS.NM_CLICK: NMLINK item = new NMLINK(); OS.MoveMemory(item, lParam, NMLINK.sizeof); Event event = new Event(); event.text = ids[item.iLink]; sendSelectionEvent(SWT.Selection, event, true); break; } } return super.wmNotifyChild(hdr, wParam, lParam); }
void drawWidget(GC gc, RECT rect) { drawBackground(gc.handle, rect); int selStart = selection.x; int selEnd = selection.y; if (selStart > selEnd) { selStart = selection.y; selEnd = selection.x; } // temporary code to disable text selection selStart = selEnd = -1; if (!OS.IsWindowEnabled(handle)) gc.setForeground(disabledColor); layout.draw(gc, 0, 0, selStart, selEnd, null, null); if (hasFocus() && focusIndex != -1) { Rectangle[] rects = getRectangles(focusIndex); for (int i = 0; i < rects.length; i++) { Rectangle rectangle = rects[i]; gc.drawFocus(rectangle.x, rectangle.y, rectangle.width, rectangle.height); } } if (hooks(SWT.Paint) || filters(SWT.Paint)) { Event event = new Event(); event.gc = gc; event.x = rect.left; event.y = rect.top; event.width = rect.right - rect.left; event.height = rect.bottom - rect.top; sendEvent(SWT.Paint, event); event.gc = null; } }
LRESULT WM_CHAR(int /*long*/ wParam, int /*long*/ lParam) { LRESULT result = super.WM_CHAR(wParam, lParam); if (result != null) return result; if (OS.COMCTL32_MAJOR < 6) { if (focusIndex == -1) return result; switch ((int) /*64*/ wParam) { case ' ': case SWT.CR: Event event = new Event(); event.text = ids[focusIndex]; sendSelectionEvent(SWT.Selection, event, true); break; case SWT.TAB: boolean next = OS.GetKeyState(OS.VK_SHIFT) >= 0; if (next) { if (focusIndex < offsets.length - 1) { focusIndex++; redraw(); } } else { if (focusIndex > 0) { focusIndex--; redraw(); } } break; } } else { switch ((int) /*64*/ wParam) { case ' ': case SWT.CR: case SWT.TAB: /* * NOTE: Call the window proc with WM_KEYDOWN rather than WM_CHAR * so that the key that was ignored during WM_KEYDOWN is processed. * This allows the application to cancel an operation that is normally * performed in WM_KEYDOWN from WM_CHAR. */ int /*long*/ code = callWindowProc(handle, OS.WM_KEYDOWN, wParam, lParam); return new LRESULT(code); } } return result; }
long /*int*/ gtk_switch_page(long /*int*/ widget, long /*int*/ page, long /*int*/ page_num) { int index = OS.gtk_notebook_get_current_page(handle); if (index != -1) { Control control = items[index].getControl(); if (control != null && !control.isDisposed()) { control.setVisible(false); } } TabItem item = items[(int) /*64*/ page_num]; Control control = item.getControl(); if (control != null && !control.isDisposed()) { control.setBounds(getClientArea()); control.setVisible(true); } Event event = new Event(); event.item = item; sendSelectionEvent(SWT.Selection, event, false); return 0; }
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); }
void HandleClick(int sender, int e) { if (!checkEvent(e)) return; if (ignoreSelection) return; Event event = new Event(); if ((style & SWT.DROP_DOWN) != 0) { int mousePos = OS.Mouse_GetPosition(handle); int zero = OS.gcnew_Point(0, OS.FrameworkElement_ActualHeight(topHandle())); int arrowPos = OS.UIElement_TranslatePoint(arrowHandle, zero, handle); if (OS.Point_X(mousePos) > OS.Point_X(arrowPos)) { event.detail = SWT.ARROW; int location = OS.UIElement_TranslatePoint(handle, zero, parent.handle); event.x = (int) OS.Point_X(location); event.y = (int) OS.Point_Y(location); OS.GCHandle_Free(location); } OS.GCHandle_Free(arrowPos); OS.GCHandle_Free(zero); OS.GCHandle_Free(mousePos); } postEvent(SWT.Selection, event); }
LRESULT WM_LBUTTONUP(int /*long*/ wParam, int /*long*/ lParam) { LRESULT result = super.WM_LBUTTONUP(wParam, lParam); if (result == LRESULT.ZERO) return result; if (OS.COMCTL32_MAJOR < 6) { if (mouseDownIndex == -1) return result; int x = OS.GET_X_LPARAM(lParam); int y = OS.GET_Y_LPARAM(lParam); Rectangle[] rects = getRectangles(mouseDownIndex); for (int i = 0; i < rects.length; i++) { Rectangle rect = rects[i]; if (rect.contains(x, y)) { Event event = new Event(); event.text = ids[mouseDownIndex]; sendSelectionEvent(SWT.Selection, event, true); break; } } } mouseDownIndex = -1; return result; }
void sendSelection() { Event event = new Event(); int hitPart = ((NSScroller) view).hitPart(); int value = getSelection(); switch (hitPart) { case OS.NSScrollerDecrementLine: event.detail = SWT.ARROW_UP; value -= increment; break; case OS.NSScrollerDecrementPage: value -= pageIncrement; event.detail = SWT.PAGE_UP; break; case OS.NSScrollerIncrementLine: value += increment; event.detail = SWT.PAGE_DOWN; break; case OS.NSScrollerIncrementPage: value += pageIncrement; event.detail = SWT.ARROW_DOWN; break; case OS.NSScrollerKnob: event.detail = SWT.DRAG; break; } if (event.detail != SWT.DRAG) { setSelection(value); } sendEvent(SWT.Selection, event); }
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) { 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; }
@Override long /*int*/ gtk_button_release_event(long /*int*/ widget, long /*int*/ event) { long /*int*/ result = super.gtk_button_release_event(widget, event); if (result != 0) return result; if (focusIndex == -1) return result; GdkEventButton gdkEvent = new GdkEventButton(); OS.memmove(gdkEvent, event, GdkEventButton.sizeof); if (gdkEvent.button == 1) { int x = (int) gdkEvent.x; int y = (int) gdkEvent.y; if ((style & SWT.MIRRORED) != 0) x = getClientWidth() - x; Rectangle[] rects = getRectangles(focusIndex); for (int i = 0; i < rects.length; i++) { Rectangle rect = rects[i]; if (rect.contains(x, y)) { Event ev = new Event(); ev.text = ids[focusIndex]; sendSelectionEvent(SWT.Selection, ev, true); return result; } } } return result; }
void onDispose(Event event) { removeListener(SWT.Dispose, listener); notifyListeners(SWT.Dispose, event); event.type = SWT.None; table.removeListener(SWT.FocusIn, tableListener); table.removeListener(SWT.MouseDown, tableListener); unhookRowColumnListeners(); ScrollBar hBar = table.getHorizontalBar(); if (hBar != null) { hBar.removeListener(SWT.Selection, resizeListener); } ScrollBar vBar = table.getVerticalBar(); if (vBar != null) { vBar.removeListener(SWT.Selection, resizeListener); } }
void onDispose(Event event) { /* make this handler run after other dispose listeners */ if (ignoreDispose) { ignoreDispose = false; return; } ignoreDispose = true; notifyListeners(event.type, event); event.type = SWT.NONE; gradientColors = null; gradientPercents = null; backgroundImage = null; text = null; image = null; appToolTipText = null; }
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 xMouse(int type, int w, int client_data, int call_data, int continue_to_dispatch) { int xDisplay = display.xDisplay; int[] newX = new int[1], newY = new int[1], unused = new int[1]; OS.XQueryPointer(xDisplay, window, unused, unused, newX, newY, unused, unused, unused); if (oldX != newX[0] || oldY != newY[0]) { Rectangle[] oldRectangles = rectangles; boolean oldStippled = stippled; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); event.x = newX[0]; event.y = newY[0]; if ((style & SWT.RESIZE) != 0) { resizeRectangles(newX[0] - oldX, newY[0] - oldY); sendEvent(SWT.Resize, event); /* * It is possible (but unlikely) that application code * could have disposed the widget in the resize event. * If this happens then return false to indicate that * the move failed. */ if (isDisposed()) { cancelled = true; return 1; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(rectsToErase, oldStippled); update(); drawRectangles(rectangles, stippled); } Point cursorPos = adjustResizeCursor(); if (cursorPos != null) { newX[0] = cursorPos.x; newY[0] = cursorPos.y; } } else { moveRectangles(newX[0] - oldX, newY[0] - oldY); sendEvent(SWT.Move, event); /* * It is possible (but unlikely) that application code * could have disposed the widget in the move event. * If this happens then return false to indicate that * the move failed. */ if (isDisposed()) { cancelled = true; return 1; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(rectsToErase, oldStippled); update(); drawRectangles(rectangles, stippled); } } oldX = newX[0]; oldY = newY[0]; } tracking = type != OS.ButtonRelease; return 0; }
int /*long*/ gtk_preedit_changed(int /*long*/ imcontext) { if (!isInlineEnabled()) return 0; ranges = null; styles = null; commitCount = 0; int /*long*/ imHandle = imHandle(); int /*long*/[] preeditString = new int /*long*/[1]; int /*long*/[] pangoAttrs = new int /*long*/[1]; int[] cursorPos = new int[1]; OS.gtk_im_context_get_preedit_string(imHandle, preeditString, pangoAttrs, cursorPos); caretOffset = cursorPos[0]; char[] chars = null; if (preeditString[0] != 0) { int length = OS.strlen(preeditString[0]); byte[] buffer = new byte[length]; OS.memmove(buffer, preeditString[0], length); chars = Converter.mbcsToWcs(null, buffer); if (pangoAttrs[0] != 0) { int count = 0; int /*long*/ iterator = OS.pango_attr_list_get_iterator(pangoAttrs[0]); while (OS.pango_attr_iterator_next(iterator)) count++; OS.pango_attr_iterator_destroy(iterator); ranges = new int[count * 2]; styles = new TextStyle[count]; iterator = OS.pango_attr_list_get_iterator(pangoAttrs[0]); PangoAttrColor attrColor = new PangoAttrColor(); PangoAttrInt attrInt = new PangoAttrInt(); int[] start = new int[1]; int[] end = new int[1]; for (int i = 0; i < count; i++) { OS.pango_attr_iterator_range(iterator, start, end); ranges[i * 2] = (int) /*64*/ OS.g_utf16_pointer_to_offset(preeditString[0], preeditString[0] + start[0]); ranges[i * 2 + 1] = (int) /*64*/ OS.g_utf16_pointer_to_offset(preeditString[0], preeditString[0] + end[0]) - 1; styles[i] = new TextStyle(null, null, null); int /*long*/ attr = OS.pango_attr_iterator_get(iterator, OS.PANGO_ATTR_FOREGROUND); if (attr != 0) { OS.memmove(attrColor, attr, PangoAttrColor.sizeof); GdkColor color = new GdkColor(); color.red = attrColor.color_red; color.green = attrColor.color_green; color.blue = attrColor.color_blue; styles[i].foreground = Color.gtk_new(display, color); } attr = OS.pango_attr_iterator_get(iterator, OS.PANGO_ATTR_BACKGROUND); if (attr != 0) { OS.memmove(attrColor, attr, PangoAttrColor.sizeof); GdkColor color = new GdkColor(); color.red = attrColor.color_red; color.green = attrColor.color_green; color.blue = attrColor.color_blue; styles[i].background = Color.gtk_new(display, color); } attr = OS.pango_attr_iterator_get(iterator, OS.PANGO_ATTR_UNDERLINE); if (attr != 0) { OS.memmove(attrInt, attr, PangoAttrInt.sizeof); styles[i].underline = attrInt.value != OS.PANGO_UNDERLINE_NONE; ; styles[i].underlineStyle = SWT.UNDERLINE_SINGLE; switch (attrInt.value) { case OS.PANGO_UNDERLINE_DOUBLE: styles[i].underlineStyle = SWT.UNDERLINE_DOUBLE; break; case OS.PANGO_UNDERLINE_ERROR: styles[i].underlineStyle = SWT.UNDERLINE_ERROR; break; } if (styles[i].underline) { attr = OS.pango_attr_iterator_get(iterator, OS.PANGO_ATTR_UNDERLINE_COLOR); if (attr != 0) { OS.memmove(attrColor, attr, PangoAttrColor.sizeof); GdkColor color = new GdkColor(); color.red = attrColor.color_red; color.green = attrColor.color_green; color.blue = attrColor.color_blue; styles[i].underlineColor = Color.gtk_new(display, color); } } } OS.pango_attr_iterator_next(iterator); } OS.pango_attr_iterator_destroy(iterator); OS.pango_attr_list_unref(pangoAttrs[0]); } OS.g_free(preeditString[0]); } if (chars != null) { if (text.length() == 0) { /* * Bug in GTK. In Solaris, the IME sends multiple * preedit_changed signals with an empty text. * This behavior is not correct for SWT and can * cause the editor to replace its current selection * with an empty string. The fix is to ignore any * preedit_changed signals with an empty text when * the preedit buffer is already empty. */ if (chars.length == 0) return 0; startOffset = -1; } int end = startOffset + text.length(); if (startOffset == -1) { Event event = new Event(); event.detail = SWT.COMPOSITION_SELECTION; sendEvent(SWT.ImeComposition, event); startOffset = event.start; end = event.end; } inComposition = true; Event event = new Event(); event.detail = SWT.COMPOSITION_CHANGED; event.start = startOffset; event.end = end; event.text = text = chars != null ? new String(chars) : ""; sendEvent(SWT.ImeComposition, event); } return 1; }
public void handleEvent(Event e) { MessageBox m = new MessageBox(shell, SWT.OK); m.setMessage(e.toString()); m.open(); }
void key(NSEvent nsEvent) { // TODO send event // if (!sendKeyEvent (SWT.KeyDown, theEvent)) return OS.noErr; int modifierFlags = nsEvent.modifierFlags(); int stepSize = (modifierFlags & OS.NSControlKeyMask) != 0 ? STEPSIZE_SMALL : STEPSIZE_LARGE; int xChange = 0, yChange = 0; switch (nsEvent.keyCode()) { case 53: /* Esc */ cancelled = true; tracking = false; break; case 76: /* KP Enter */ case 36: /* Return */ tracking = false; break; case 123: /* Left arrow */ xChange = -stepSize; break; case 124: /* Right arrow */ xChange = stepSize; break; case 126: /* Up arrow */ yChange = -stepSize; break; case 125: /* Down arrow */ yChange = stepSize; break; } if (xChange != 0 || yChange != 0) { Rectangle[] oldRectangles = rectangles; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); int newX = oldX + xChange; int newY = oldY + yChange; event.x = newX; event.y = newY; Point cursorPos; if ((style & SWT.RESIZE) != 0) { resizeRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Resize, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustResizeCursor(true); } else { moveRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Move, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustMoveCursor(); } if (cursorPos != null) { oldX = cursorPos.x; oldY = cursorPos.y; } } }
void mouse(NSEvent nsEvent) { NSPoint location; if (nsEvent == null || nsEvent.type() == OS.NSMouseMoved) { location = NSEvent.mouseLocation(); } else { location = nsEvent.locationInWindow(); location = nsEvent.window().convertBaseToScreen(location); } location.y = display.getPrimaryFrame().height - location.y; int newX = (int) location.x, newY = (int) location.y; if (newX != oldX || newY != oldY) { Rectangle[] oldRectangles = rectangles; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); event.x = newX; event.y = newY; if ((style & SWT.RESIZE) != 0) { boolean orientationInit = resizeRectangles(newX - oldX, newY - oldY); inEvent = true; sendEvent(SWT.Resize, event); inEvent = false; /* * It is possible (but unlikely), that application * code could have disposed the widget in the move * event. If this happens, return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } Point cursorPos = adjustResizeCursor(orientationInit); if (cursorPos != null) { newX = cursorPos.x; newY = cursorPos.y; } } else { moveRectangles(newX - oldX, newY - oldY); inEvent = true; sendEvent(SWT.Move, event); inEvent = false; /* * It is possible (but unlikely), that application * code could have disposed the widget in the move * event. If this happens, return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } } oldX = newX; oldY = newY; } switch ((int) /*64*/ nsEvent.type()) { case OS.NSLeftMouseUp: case OS.NSRightMouseUp: case OS.NSOtherMouseUp: tracking = false; } }
void key(NSEvent nsEvent) { int nsType = (int) /*64*/ nsEvent.type(); long /*int*/ modifierFlags = nsEvent.modifierFlags(); int nsKeyCode = nsEvent.keyCode(); int keyCode = Display.translateKey(nsKeyCode); switch (nsType) { case OS.NSKeyDown: case OS.NSKeyUp: { Event event = new Event(); event.keyCode = keyCode; int type = nsType == OS.NSKeyDown ? SWT.KeyDown : SWT.KeyUp; if (!setKeyState(event, type, nsEvent)) break; if (!sendKeyEvent(type, event)) return; break; } case OS.NSFlagsChanged: { int mask = 0; switch (keyCode) { case SWT.ALT: mask = OS.NSAlternateKeyMask; break; case SWT.CONTROL: mask = OS.NSControlKeyMask; break; case SWT.COMMAND: mask = OS.NSCommandKeyMask; break; case SWT.SHIFT: mask = OS.NSShiftKeyMask; break; case SWT.CAPS_LOCK: Event event = new Event(); event.keyCode = keyCode; setInputState(event, nsEvent, SWT.KeyDown); sendKeyEvent(SWT.KeyDown, event); setInputState(event, nsEvent, SWT.KeyUp); sendKeyEvent(SWT.KeyUp, event); break; } if (mask != 0) { int type = (mask & modifierFlags) != 0 ? SWT.KeyDown : SWT.KeyUp; Event event = new Event(); event.keyCode = keyCode; setLocationMask(event, nsEvent); setInputState(event, nsEvent, type); if (!sendKeyEvent(type, event)) return; } break; } } int stepSize = (modifierFlags & OS.NSControlKeyMask) != 0 ? STEPSIZE_SMALL : STEPSIZE_LARGE; int xChange = 0, yChange = 0; switch (nsKeyCode) { case 53: /* Esc */ cancelled = true; tracking = false; break; case 76: /* KP Enter */ case 36: /* Return */ tracking = false; break; case 123: /* Left arrow */ xChange = -stepSize; break; case 124: /* Right arrow */ xChange = stepSize; break; case 126: /* Up arrow */ yChange = -stepSize; break; case 125: /* Down arrow */ yChange = stepSize; break; } if (xChange != 0 || yChange != 0) { Rectangle[] oldRectangles = rectangles; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); int newX = oldX + xChange; int newY = oldY + yChange; event.x = newX; event.y = newY; Point cursorPos; if ((style & SWT.RESIZE) != 0) { resizeRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Resize, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustResizeCursor(true); } else { moveRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Move, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustMoveCursor(); } if (cursorPos != null) { oldX = cursorPos.x; oldY = cursorPos.y; } } }
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; }
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 keyEvent = new XKeyEvent(); OS.memmove(keyEvent, call_data, XKeyEvent.sizeof); if (keyEvent.keycode != 0) { int[] keysym = new int[1]; OS.XLookupString(keyEvent, null, 0, keysym, null); keysym[0] &= 0xFFFF; int xChange = 0, yChange = 0; int stepSize = ((keyEvent.state & OS.ControlMask) != 0) ? STEPSIZE_SMALL : STEPSIZE_LARGE; switch (keysym[0]) { case OS.XK_KP_Enter: case OS.XK_Return: tracking = false; /* Eat the subsequent KeyRelease event */ OS.XtAppNextEvent(OS.XtDisplayToApplicationContext(keyEvent.display), call_data); break; case OS.XK_Escape: tracking = false; cancelled = true; /* Eat the subsequent KeyRelease event */ OS.XtAppNextEvent(OS.XtDisplayToApplicationContext(keyEvent.display), call_data); break; case OS.XK_Left: xChange = -stepSize; break; case OS.XK_Right: xChange = stepSize; break; case OS.XK_Up: yChange = -stepSize; break; case OS.XK_Down: yChange = stepSize; break; } if (xChange != 0 || yChange != 0) { Rectangle[] oldRectangles = rectangles; boolean oldStippled = stippled; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); event.x = oldX + xChange; event.y = oldY + yChange; Point cursorPos; if ((style & SWT.RESIZE) != 0) { resizeRectangles(xChange, yChange); sendEvent(SWT.Resize, event); /* * It is possible (but unlikely) that application code * could have disposed the widget in the resize event. * If this happens then return false to indicate that * the move failed. */ if (isDisposed()) { cancelled = true; return 1; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(rectsToErase, oldStippled); update(); drawRectangles(rectangles, stippled); } cursorPos = adjustResizeCursor(); } else { moveRectangles(xChange, yChange); sendEvent(SWT.Move, event); /* * It is possible (but unlikely) that application code * could have disposed the widget in the move event. * If this happens then return false to indicate that * the move failed. */ if (isDisposed()) { cancelled = true; return 1; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(rectsToErase, oldStippled); update(); drawRectangles(rectangles, stippled); } cursorPos = adjustMoveCursor(); } if (cursorPos != null) { oldX = cursorPos.x; oldY = cursorPos.y; } } } return result; }