예제 #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
 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;
 }
예제 #3
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);
 }
예제 #4
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;
 }
예제 #5
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;
  }
예제 #6
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;
 }
예제 #7
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;
 }