Пример #1
0
 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
     }
   }
 }
Пример #2
0
 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);
     }
   }
 }
Пример #3
0
 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;
 }
Пример #4
0
 @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;
 }
Пример #5
0
 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;
 }
Пример #6
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;
 }
Пример #7
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;
 }
Пример #8
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
   }
 }
Пример #9
0
 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);
 }
Пример #10
0
 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;
   }
 }
Пример #11
0
 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;
 }
Пример #12
0
 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;
 }
Пример #13
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);
 }
Пример #14
0
 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);
 }
Пример #15
0
 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;
 }
Пример #16
0
 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);
 }
Пример #17
0
 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;
 }
Пример #18
0
 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;
 }
Пример #19
0
 @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;
 }
Пример #20
0
  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);
    }
  }
Пример #21
0
  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;
  }
Пример #22
0
 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;
 }
Пример #23
0
 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;
 }
Пример #24
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();
 }
Пример #26
0
 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;
     }
   }
 }
Пример #27
0
 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;
   }
 }
Пример #28
0
  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;
      }
    }
  }
Пример #29
0
  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;
  }
Пример #30
0
 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;
 }