LRESULT WM_MOUSEMOVE(int /*long*/ wParam, int /*long*/ lParam) { LRESULT result = super.WM_MOUSEMOVE(wParam, lParam); if (OS.COMCTL32_MAJOR < 6) { int x = OS.GET_X_LPARAM(lParam); int y = OS.GET_Y_LPARAM(lParam); if (OS.GetKeyState(OS.VK_LBUTTON) < 0) { int oldSelection = selection.y; selection.y = layout.getOffset(x, y, null); if (selection.y != oldSelection) { int newSelection = selection.y; if (oldSelection > newSelection) { int temp = oldSelection; oldSelection = newSelection; newSelection = temp; } Rectangle rect = layout.getBounds(oldSelection, newSelection); redraw(rect.x, rect.y, rect.width, rect.height, false); } } else { for (int j = 0; j < offsets.length; j++) { Rectangle[] rects = getRectangles(j); for (int i = 0; i < rects.length; i++) { Rectangle rect = rects[i]; if (rect.contains(x, y)) { setCursor(display.getSystemCursor(SWT.CURSOR_HAND)); return result; } } } setCursor(null); } } return result; }
public void positionWindow(boolean resetToDefault) { String mapWindow; mapShellBounds = mapShell.getBounds(); mapWindow = prefs.get(RadarConsts.PREF_KEY_MAP_WINDOW, ""); if (mapWindow.equals("") || resetToDefault) { Rectangle dispBounds, tableBounds; dispBounds = ((Display.getCurrent()).getPrimaryMonitor()).getClientArea(); tableBounds = display.getShells()[1].getBounds(); mapShellBounds.width = dispBounds.width - tableBounds.width; mapShellBounds.height = dispBounds.height; mapShellBounds.x = dispBounds.x + tableBounds.width; mapShellBounds.y = dispBounds.y; } else { String[] tokens = mapWindow.split(","); mapShellBounds = new Rectangle( new Integer(tokens[0]), // X value new Integer(tokens[1]), // Y value new Integer(tokens[2]), // Width new Integer(tokens[3]) // Height ); } mapShell.setBounds(mapShellBounds); }
/** * Returns the tab item at the given point in the receiver or null if no such item exists. The * point is in the coordinate system of the receiver. * * @param point the point used to locate the item * @return the tab item at the given point, or null if the point is not in a tab item * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the point is null * </ul> * * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> * * @since 3.4 */ public TabItem getItem(Point point) { checkWidget(); if (point == null) error(SWT.ERROR_NULL_ARGUMENT); long /*int*/ list = OS.gtk_container_get_children(handle); if (list == 0) return null; int itemCount = OS.g_list_length(list); OS.g_list_free(list); for (int i = 0; i < itemCount; i++) { TabItem item = items[i]; Rectangle rect = item.getBounds(); if (rect.contains(point)) return item; } return null; }
void moveRectangles(int xChange, int yChange) { if (bounds == null) return; if (xChange < 0 && ((style & SWT.LEFT) == 0)) xChange = 0; if (xChange > 0 && ((style & SWT.RIGHT) == 0)) xChange = 0; if (yChange < 0 && ((style & SWT.UP) == 0)) yChange = 0; if (yChange > 0 && ((style & SWT.DOWN) == 0)) yChange = 0; if (xChange == 0 && yChange == 0) return; bounds.x += xChange; bounds.y += yChange; for (int i = 0; i < rectangles.length; i++) { rectangles[i].x += xChange; rectangles[i].y += yChange; } }
void resizeControl() { if (control != null && !control.isDisposed()) { /* * Set the size and location of the control * separately to minimize flashing in the * case where the control does not resize * to the size that was requested. This * case can occur when the control is a * combo box. */ Rectangle itemRect = getBounds(); control.setSize(itemRect.width, itemRect.height); Rectangle rect = control.getBounds(); rect.x = itemRect.x + (itemRect.width - rect.width) / 2; rect.y = itemRect.y + (itemRect.height - rect.height) / 2; control.setLocation(rect.x, rect.y); } }
LRESULT WM_LBUTTONUP(int /*long*/ wParam, int /*long*/ lParam) { LRESULT result = super.WM_LBUTTONUP(wParam, lParam); if (result == LRESULT.ZERO) return result; if (OS.COMCTL32_MAJOR < 6) { if (mouseDownIndex == -1) return result; int x = OS.GET_X_LPARAM(lParam); int y = OS.GET_Y_LPARAM(lParam); Rectangle[] rects = getRectangles(mouseDownIndex); for (int i = 0; i < rects.length; i++) { Rectangle rect = rects[i]; if (rect.contains(x, y)) { Event event = new Event(); event.text = ids[mouseDownIndex]; sendSelectionEvent(SWT.Selection, event, true); break; } } } mouseDownIndex = -1; return result; }
void tableMouseDown(Event event) { if (isDisposed() || !isVisible()) return; Point pt = new Point(event.x, event.y); int lineWidth = table.getLinesVisible() ? table.getGridLineWidth() : 0; TableItem item = table.getItem(pt); if ((table.getStyle() & SWT.FULL_SELECTION) != 0) { if (item == null) return; } else { int start = item != null ? table.indexOf(item) : table.getTopIndex(); int end = table.getItemCount(); Rectangle clientRect = table.getClientArea(); for (int i = start; i < end; i++) { TableItem nextItem = table.getItem(i); Rectangle rect = nextItem.getBounds(0); if (pt.y >= rect.y && pt.y < rect.y + rect.height + lineWidth) { item = nextItem; break; } if (rect.y > clientRect.y + clientRect.height) return; } if (item == null) return; } TableColumn newColumn = null; int columnCount = table.getColumnCount(); if (columnCount == 0) { if ((table.getStyle() & SWT.FULL_SELECTION) == 0) { Rectangle rect = item.getBounds(0); rect.width += lineWidth; rect.height += lineWidth; if (!rect.contains(pt)) return; } } else { for (int i = 0; i < columnCount; i++) { Rectangle rect = item.getBounds(i); rect.width += lineWidth; rect.height += lineWidth; if (rect.contains(pt)) { newColumn = table.getColumn(i); break; } } if (newColumn == null) { if ((table.getStyle() & SWT.FULL_SELECTION) == 0) return; newColumn = table.getColumn(0); } } setRowColumn(item, newColumn, true); setFocus(); return; }
@Override long /*int*/ gtk_button_press_event(long /*int*/ widget, long /*int*/ event) { long /*int*/ result = super.gtk_button_press_event(widget, event); if (result != 0) return result; GdkEventButton gdkEvent = new GdkEventButton(); OS.memmove(gdkEvent, event, GdkEventButton.sizeof); if (gdkEvent.button == 1 && gdkEvent.type == OS.GDK_BUTTON_PRESS) { if (focusIndex != -1) setFocus(); int x = (int) gdkEvent.x; int y = (int) gdkEvent.y; if ((style & SWT.MIRRORED) != 0) x = getClientWidth() - x; int offset = layout.getOffset(x, y, null); int oldSelectionX = selection.x; int oldSelectionY = selection.y; selection.x = offset; selection.y = -1; if (oldSelectionX != -1 && oldSelectionY != -1) { if (oldSelectionX > oldSelectionY) { int temp = oldSelectionX; oldSelectionX = oldSelectionY; oldSelectionY = temp; } Rectangle rect = layout.getBounds(oldSelectionX, oldSelectionY); redraw(rect.x, rect.y, rect.width, rect.height, false); } for (int j = 0; j < offsets.length; j++) { Rectangle[] rects = getRectangles(j); for (int i = 0; i < rects.length; i++) { Rectangle rect = rects[i]; if (rect.contains(x, y)) { focusIndex = j; redraw(); return result; } } } } return result; }
LRESULT WM_LBUTTONDOWN(int /*long*/ wParam, int /*long*/ lParam) { LRESULT result = super.WM_LBUTTONDOWN(wParam, lParam); if (result == LRESULT.ZERO) return result; if (OS.COMCTL32_MAJOR < 6) { if (focusIndex != -1) setFocus(); int x = OS.GET_X_LPARAM(lParam); int y = OS.GET_Y_LPARAM(lParam); int offset = layout.getOffset(x, y, null); int oldSelectionX = selection.x; int oldSelectionY = selection.y; selection.x = offset; selection.y = -1; if (oldSelectionX != -1 && oldSelectionY != -1) { if (oldSelectionX > oldSelectionY) { int temp = oldSelectionX; oldSelectionX = oldSelectionY; oldSelectionY = temp; } Rectangle rect = layout.getBounds(oldSelectionX, oldSelectionY); redraw(rect.x, rect.y, rect.width, rect.height, false); } for (int j = 0; j < offsets.length; j++) { Rectangle[] rects = getRectangles(j); for (int i = 0; i < rects.length; i++) { Rectangle rect = rects[i]; if (rect.contains(x, y)) { if (j != focusIndex) { redraw(); } focusIndex = mouseDownIndex = j; return result; } } } } return result; }
@Override long /*int*/ gtk_motion_notify_event(long /*int*/ widget, long /*int*/ event) { long /*int*/ result = super.gtk_motion_notify_event(widget, event); if (result != 0) return result; GdkEventMotion gdkEvent = new GdkEventMotion(); OS.memmove(gdkEvent, event, GdkEventMotion.sizeof); int x = (int) gdkEvent.x; int y = (int) gdkEvent.y; if ((style & SWT.MIRRORED) != 0) x = getClientWidth() - x; if ((gdkEvent.state & OS.GDK_BUTTON1_MASK) != 0) { int oldSelection = selection.y; selection.y = layout.getOffset(x, y, null); if (selection.y != oldSelection) { int newSelection = selection.y; if (oldSelection > newSelection) { int temp = oldSelection; oldSelection = newSelection; newSelection = temp; } Rectangle rect = layout.getBounds(oldSelection, newSelection); redraw(rect.x, rect.y, rect.width, rect.height, false); } } else { for (int j = 0; j < offsets.length; j++) { Rectangle[] rects = getRectangles(j); for (int i = 0; i < rects.length; i++) { Rectangle rect = rects[i]; if (rect.contains(x, y)) { setCursor(display.getSystemCursor(SWT.CURSOR_HAND)); return result; } } } setCursor(null); } return result; }
@Override long /*int*/ gtk_button_release_event(long /*int*/ widget, long /*int*/ event) { long /*int*/ result = super.gtk_button_release_event(widget, event); if (result != 0) return result; if (focusIndex == -1) return result; GdkEventButton gdkEvent = new GdkEventButton(); OS.memmove(gdkEvent, event, GdkEventButton.sizeof); if (gdkEvent.button == 1) { int x = (int) gdkEvent.x; int y = (int) gdkEvent.y; if ((style & SWT.MIRRORED) != 0) x = getClientWidth() - x; Rectangle[] rects = getRectangles(focusIndex); for (int i = 0; i < rects.length; i++) { Rectangle rect = rects[i]; if (rect.contains(x, y)) { Event ev = new Event(); ev.text = ids[focusIndex]; sendSelectionEvent(SWT.Selection, ev, true); return result; } } } return result; }
/* * Returns true if the pointer's orientation was initialized in some dimension, * and false otherwise. */ boolean resizeRectangles(int xChange, int yChange) { if (bounds == null) return false; boolean orientationInit = false; /* * If the cursor orientation has not been set in the orientation of * this change then try to set it here. */ if (xChange < 0 && ((style & SWT.LEFT) != 0) && ((cursorOrientation & SWT.RIGHT) == 0)) { if ((cursorOrientation & SWT.LEFT) == 0) { cursorOrientation |= SWT.LEFT; orientationInit = true; } } if (xChange > 0 && ((style & SWT.RIGHT) != 0) && ((cursorOrientation & SWT.LEFT) == 0)) { if ((cursorOrientation & SWT.RIGHT) == 0) { cursorOrientation |= SWT.RIGHT; orientationInit = true; } } if (yChange < 0 && ((style & SWT.UP) != 0) && ((cursorOrientation & SWT.DOWN) == 0)) { if ((cursorOrientation & SWT.UP) == 0) { cursorOrientation |= SWT.UP; orientationInit = true; } } if (yChange > 0 && ((style & SWT.DOWN) != 0) && ((cursorOrientation & SWT.UP) == 0)) { if ((cursorOrientation & SWT.DOWN) == 0) { cursorOrientation |= SWT.DOWN; orientationInit = true; } } /* * If the bounds will flip about the x or y axis then apply the adjustment * up to the axis (ie.- where bounds width/height becomes 0), change the * cursor's orientation accordingly, and flip each Rectangle's origin (only * necessary for > 1 Rectangles) */ if ((cursorOrientation & SWT.LEFT) != 0) { if (xChange > bounds.width) { if ((style & SWT.RIGHT) == 0) return orientationInit; cursorOrientation |= SWT.RIGHT; cursorOrientation &= ~SWT.LEFT; bounds.x += bounds.width; xChange -= bounds.width; bounds.width = 0; if (proportions.length > 1) { for (int i = 0; i < proportions.length; i++) { Rectangle proportion = proportions[i]; proportion.x = 100 - proportion.x - proportion.width; } } } } else if ((cursorOrientation & SWT.RIGHT) != 0) { if (bounds.width < -xChange) { if ((style & SWT.LEFT) == 0) return orientationInit; cursorOrientation |= SWT.LEFT; cursorOrientation &= ~SWT.RIGHT; xChange += bounds.width; bounds.width = 0; if (proportions.length > 1) { for (int i = 0; i < proportions.length; i++) { Rectangle proportion = proportions[i]; proportion.x = 100 - proportion.x - proportion.width; } } } } if ((cursorOrientation & SWT.UP) != 0) { if (yChange > bounds.height) { if ((style & SWT.DOWN) == 0) return orientationInit; cursorOrientation |= SWT.DOWN; cursorOrientation &= ~SWT.UP; bounds.y += bounds.height; yChange -= bounds.height; bounds.height = 0; if (proportions.length > 1) { for (int i = 0; i < proportions.length; i++) { Rectangle proportion = proportions[i]; proportion.y = 100 - proportion.y - proportion.height; } } } } else if ((cursorOrientation & SWT.DOWN) != 0) { if (bounds.height < -yChange) { if ((style & SWT.UP) == 0) return orientationInit; cursorOrientation |= SWT.UP; cursorOrientation &= ~SWT.DOWN; yChange += bounds.height; bounds.height = 0; if (proportions.length > 1) { for (int i = 0; i < proportions.length; i++) { Rectangle proportion = proportions[i]; proportion.y = 100 - proportion.y - proportion.height; } } } } // apply the bounds adjustment if ((cursorOrientation & SWT.LEFT) != 0) { bounds.x += xChange; bounds.width -= xChange; } else if ((cursorOrientation & SWT.RIGHT) != 0) { bounds.width += xChange; } if ((cursorOrientation & SWT.UP) != 0) { bounds.y += yChange; bounds.height -= yChange; } else if ((cursorOrientation & SWT.DOWN) != 0) { bounds.height += yChange; } Rectangle[] newRects = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle proportion = proportions[i]; newRects[i] = new Rectangle( proportion.x * bounds.width / 100 + bounds.x, proportion.y * bounds.height / 100 + bounds.y, proportion.width * bounds.width / 100, proportion.height * bounds.height / 100); } rectangles = newRects; return orientationInit; }
public static void main(String[] args) { final Display display = new Display(); final Image image = display.getSystemImage(SWT.ICON_INFORMATION); final Shell shell = new Shell(display, SWT.NO_TRIM); Region region = new Region(); final ImageData imageData = image.getImageData(); if (imageData.alphaData != null) { Rectangle pixel = new Rectangle(0, 0, 1, 1); for (int y = 0; y < imageData.height; y++) { for (int x = 0; x < imageData.width; x++) { if (imageData.getAlpha(x, y) == 255) { pixel.x = imageData.x + x; pixel.y = imageData.y + y; region.add(pixel); } } } } else { ImageData mask = imageData.getTransparencyMask(); Rectangle pixel = new Rectangle(0, 0, 1, 1); for (int y = 0; y < mask.height; y++) { for (int x = 0; x < mask.width; x++) { if (mask.getPixel(x, y) != 0) { pixel.x = imageData.x + x; pixel.y = imageData.y + y; region.add(pixel); } } } } shell.setRegion(region); Listener l = new Listener() { /** The x/y of the MouseDown, relative to top-left of the shell. */ int startX, startY; @Override public void handleEvent(Event e) { if (e.type == SWT.KeyDown && e.character == SWT.ESC) { shell.dispose(); } if (e.type == SWT.MouseDown && e.button == 1) { Point p = shell.toDisplay(e.x, e.y); Point loc = shell.getLocation(); startX = p.x - loc.x; startY = p.y - loc.y; } if (e.type == SWT.MouseMove && (e.stateMask & SWT.BUTTON1) != 0) { Point p = shell.toDisplay(e.x, e.y); p.x -= startX; p.y -= startY; shell.setLocation(p); } if (e.type == SWT.Paint) { e.gc.drawImage(image, imageData.x, imageData.y); } } }; shell.addListener(SWT.KeyDown, l); shell.addListener(SWT.MouseDown, l); shell.addListener(SWT.MouseMove, l); shell.addListener(SWT.Paint, l); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } region.dispose(); image.dispose(); display.dispose(); }
void keyDown(Event event) { if (row == null) return; switch (event.character) { case SWT.CR: notifyListeners(SWT.DefaultSelection, new Event()); return; } int rowIndex = table.indexOf(row); int columnIndex = column == null ? 0 : table.indexOf(column); switch (event.keyCode) { case SWT.ARROW_UP: setRowColumn(Math.max(0, rowIndex - 1), columnIndex, true); break; case SWT.ARROW_DOWN: setRowColumn(Math.min(rowIndex + 1, table.getItemCount() - 1), columnIndex, true); break; case SWT.ARROW_LEFT: case SWT.ARROW_RIGHT: { int columnCount = table.getColumnCount(); if (columnCount == 0) break; int[] order = table.getColumnOrder(); int index = 0; while (index < order.length) { if (order[index] == columnIndex) break; index++; } if (index == order.length) index = 0; int leadKey = (getStyle() & SWT.RIGHT_TO_LEFT) != 0 ? SWT.ARROW_RIGHT : SWT.ARROW_LEFT; if (event.keyCode == leadKey) { setRowColumn(rowIndex, order[Math.max(0, index - 1)], true); } else { setRowColumn(rowIndex, order[Math.min(columnCount - 1, index + 1)], true); } break; } case SWT.HOME: setRowColumn(0, columnIndex, true); break; case SWT.END: { int i = table.getItemCount() - 1; setRowColumn(i, columnIndex, true); break; } case SWT.PAGE_UP: { int index = table.getTopIndex(); if (index == rowIndex) { Rectangle rect = table.getClientArea(); TableItem item = table.getItem(index); Rectangle itemRect = item.getBounds(0); rect.height -= itemRect.y; int height = table.getItemHeight(); int page = Math.max(1, rect.height / height); index = Math.max(0, index - page + 1); } setRowColumn(index, columnIndex, true); break; } case SWT.PAGE_DOWN: { int index = table.getTopIndex(); Rectangle rect = table.getClientArea(); TableItem item = table.getItem(index); Rectangle itemRect = item.getBounds(0); rect.height -= itemRect.y; int height = table.getItemHeight(); int page = Math.max(1, rect.height / height); int end = table.getItemCount() - 1; index = Math.min(end, index + page - 1); if (index == rowIndex) { index = Math.min(end, index + page - 1); } setRowColumn(index, columnIndex, true); break; } } }
@Override int hit(Theme theme, Point position, Rectangle bounds) { return bounds.contains(position) ? DrawData.WIDGET_WHOLE : DrawData.WIDGET_NOWHERE; }