예제 #1
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;
 }
예제 #2
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;
   }
 }
예제 #3
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;
 }
예제 #4
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;
 }
예제 #5
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);
 }
예제 #6
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);
 }
예제 #7
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;
 }
예제 #8
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;
      }
    }
  }
예제 #9
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;
   }
 }
예제 #10
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;
  }
예제 #11
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;
     }
   }
 }
예제 #12
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;
 }
예제 #13
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;
 }