/** * This implementation of <code>dragOver</code> provides a default drag under effect for the * feedback specified in <code>event.feedback</code>. The class description lists the FEEDBACK * constants that are applicable to the class. * * <p>For additional information see <code>DropTargetAdapter.dragOver</code>. * * <p>Subclasses that override this method should call <code>super.dragOver(event)</code> to get * the default drag under effect implementation. * * @param event the information associated with the drag over event * @see DropTargetAdapter * @see DropTargetEvent * @see DND#FEEDBACK_SELECT * @see DND#FEEDBACK_SCROLL */ public void dragOver(DropTargetEvent event) { Table table = (Table) control; long /*int*/ handle = table.handle; int effect = checkEffect(event.feedback); Point coordinates = new Point(event.x, event.y); coordinates = table.toControl(coordinates); long /*int*/[] path = new long /*int*/[1]; OS.gtk_tree_view_get_path_at_pos(handle, coordinates.x, coordinates.y, path, null, null, null); int index = -1; if (path[0] != 0) { long /*int*/ indices = OS.gtk_tree_path_get_indices(path[0]); if (indices != 0) { int[] temp = new int[1]; OS.memmove(temp, indices, 4); index = temp[0]; } } if ((effect & DND.FEEDBACK_SCROLL) == 0) { scrollBeginTime = 0; scrollIndex = -1; } else { if (index != -1 && scrollIndex == index && scrollBeginTime != 0) { if (System.currentTimeMillis() >= scrollBeginTime) { if (coordinates.y < table.getItemHeight()) { OS.gtk_tree_path_prev(path[0]); } else { OS.gtk_tree_path_next(path[0]); } if (path[0] != 0) { OS.gtk_tree_view_scroll_to_cell(handle, path[0], 0, false, 0, 0); OS.gtk_tree_path_free(path[0]); path[0] = 0; OS.gtk_tree_view_get_path_at_pos( handle, coordinates.x, coordinates.y, path, null, null, null); } scrollBeginTime = 0; scrollIndex = -1; } } else { scrollBeginTime = System.currentTimeMillis() + SCROLL_HYSTERESIS; scrollIndex = index; } } if (path[0] != 0) { int position = 0; if ((effect & DND.FEEDBACK_SELECT) != 0) position = OS.GTK_TREE_VIEW_DROP_INTO_OR_BEFORE; // if ((effect & DND.FEEDBACK_INSERT_BEFORE) != 0) position = OS.GTK_TREE_VIEW_DROP_BEFORE; // if ((effect & DND.FEEDBACK_INSERT_AFTER) != 0) position = OS.GTK_TREE_VIEW_DROP_AFTER; if (position != 0) { OS.gtk_tree_view_set_drag_dest_row(handle, path[0], OS.GTK_TREE_VIEW_DROP_INTO_OR_BEFORE); } else { OS.gtk_tree_view_set_drag_dest_row(handle, 0, OS.GTK_TREE_VIEW_DROP_BEFORE); } } else { OS.gtk_tree_view_set_drag_dest_row(handle, 0, OS.GTK_TREE_VIEW_DROP_BEFORE); } if (path[0] != 0) OS.gtk_tree_path_free(path[0]); }
private int getHeight(final int index) { int result = 0; int columnCount = parent.getColumnCount(); boolean singleColumn = index == 0 && columnCount == 0; boolean columnInRange = index >= 0 && index < columnCount; if (singleColumn || columnInRange) { result = parent.getItemHeight(); } return result; }
private int getTop(final int itemIndex) { int relativeItemIndex = itemIndex - parent.getTopIndex(); int headerHeight = parent.getHeaderHeight(); int itemHeight = parent.getItemHeight(); return headerHeight + relativeItemIndex * itemHeight; }
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; } } }