package org.geogebra.web.web.gui.view.spreadsheet; import org.geogebra.common.awt.GPoint; import org.geogebra.common.gui.view.spreadsheet.MyTableInterface; import org.geogebra.common.kernel.Kernel; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.web.gui.GuiManagerW; import org.geogebra.web.web.javax.swing.GPopupMenuW; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.DoubleClickEvent; import com.google.gwt.event.dom.client.DoubleClickHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; public class SpreadsheetColumnControllerW implements MouseDownHandler, MouseUpHandler, MouseMoveHandler, ClickHandler, DoubleClickHandler { private AppW app; private SpreadsheetViewW view; private Kernel kernel; private MyTableW table; protected int column0 = -1; protected boolean isResizing = false; private int overTraceButtonColumn = -1; private boolean isMouseDown = false; public SpreadsheetColumnControllerW(AppW app, MyTableW table) { this.app = app; this.kernel = app.getKernel(); this.table = table; this.view = (SpreadsheetViewW)table.getView(); } // ========================================================= // Mouse Listener Methods // ========================================================= /*public void mouseClicked(MouseEvent e) { // Double clicking on a column boundary auto-adjusts the // width of the column on the left if (isResizing && !AppD.isRightClick(e) && e.getClickCount() == 2) { // get column to adjust int x = e.getX(); int y = e.getY(); GPoint point = table.getIndexFromPixel(x, y); GPoint testPoint = table.getIndexFromPixel(x - 4, y); int col = point.getX(); if (point.getX() != testPoint.getX()) { col = col - 1; } // enlarge or shrink to fit the contents table.fitColumn(col); e.consume(); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { overTraceButtonColumn = -1; if (table.getTableHeader() != null) table.getTableHeader().resizeAndRepaint(); }*/ @Override public void onMouseDown(MouseDownEvent e) { isMouseDown = true; e.preventDefault(); int x = SpreadsheetMouseListenerW.getAbsoluteX(e, app); int y = SpreadsheetMouseListenerW.getAbsoluteY(e, app); boolean shiftDown = e.isShiftKeyDown(); boolean rightClick = (e.getNativeButton() == NativeEvent.BUTTON_RIGHT);//AppW.isRightClick(e); //?//if (!view.hasViewFocus()) //?// ((LayoutW) app.getGuiManager().getLayout()).getDockManager() //?// .setFocusedPanel(App.VIEW_SPREADSHEET); if (!rightClick) { GPoint point = table.getIndexFromPixel(x, y); if (point != null) { pointerDownForCell(point, shiftDown); // repaint(); } } } private void pointerDownForCell(GPoint point, boolean shiftDown) { // check if the cursor is within the resizing region (i.e. // border +- 3pixels) GPoint point2 = table .getPixel(point.getX(), point.getY(), true); GPoint point3 = table.getPixel(point.getX(), point.getY(), false); int x2 = point2.getX(); int x3 = point3.getX(); int x = point.getX(); isResizing = !(x > x2 + 2 && x < x3 - 3); if (!isResizing) { // launch trace dialog if over a trace button if (point.x == this.overTraceButtonColumn) { int column = point.getX(); table.setColumnSelectionInterval(column, column); //?//view.showTraceDialog(null, //?// table.selectedCellRanges.get(0)); //?//e.consume(); return; } // otherwise handle column selection if (table .getSelectionType() != MyTableInterface.COLUMN_SELECT) { table.setSelectionType(MyTableInterface.COLUMN_SELECT); //?//if (table.getTableHeader() != null) { //?// table.getTableHeader().requestFocusInWindow(); //?//} } if (shiftDown) { if (column0 != -1) { int column = point.getX(); table.setColumnSelectionInterval(column0, column); } // } else if (metaDown) { // column0 = point.getX(); // // Note: ctrl-select now handled in // // table.changeSelection // table.setColumnSelectionInterval(column0, column0); } else { column0 = point.getX(); table.setColumnSelectionInterval(column0, column0); } } } @Override public void onMouseUp(MouseUpEvent e) { isMouseDown = false; e.preventDefault(); boolean rightClick = (e.getNativeButton() == NativeEvent.BUTTON_RIGHT); if (!((AppW) kernel.getApplication()).letShowPopupMenu()) { return; } if (rightClick) { if (!app.letShowPopupMenu()) { return; } GPoint p = table.getIndexFromPixel(SpreadsheetMouseListenerW.getAbsoluteX(e, app), SpreadsheetMouseListenerW.getAbsoluteY(e, app)); if (p == null) { return; } // if click is outside current selection then change selection if (p.getY() < table.minSelectionRow || p.getY() > table.maxSelectionRow || p.getX() < table.minSelectionColumn || p.getX() > table.maxSelectionColumn) { // switch to column selection mode and select column if (table .getSelectionType() != MyTableInterface.COLUMN_SELECT) { table.setSelectionType(MyTableInterface.COLUMN_SELECT); } // selectNone(); table.setColumnSelectionInterval(p.getX(), p.getX()); } // show contextMenu SpreadsheetContextMenuW contextMenu = ((GuiManagerW) app .getGuiManager()).getSpreadsheetContextMenu(table); GPopupMenuW popup = (GPopupMenuW) contextMenu.getMenuContainer(); popup.show(view.getFocusPanel(), e.getX(), e.getY()); } else if (isResizing) { //?//if (e.getClickCount() == 2) { //?// return; //?//} int x = SpreadsheetMouseListenerW.getAbsoluteX(e, app); int y = SpreadsheetMouseListenerW.getAbsoluteY(e, app); GPoint point = table.getIndexFromPixel(x, y); if (point == null) { return; } GPoint point2 = table.getPixel(point.getX(), point.getY(), false); int column = point.getX(); if (x < point2.getX() - 3) { --column; } if (x <= 0) { x = 0; // G.Sturr 2010-4-10 prevent x=-1 with very small row // size } int width = table.getGrid().getColumnFormatter().getElement(column).getOffsetWidth(); int[] selected = table.getSelectedColumns(); boolean in = false; for (int i = 0; i < selected.length; ++i) { if (column == selected[i]) { in = true; } } if (!in) { return; } for (int i = 0; i < selected.length; ++i) { table.getGrid().getColumnFormatter().setWidth(selected[i], width+"px"); // FIXME: don't forget to write it as: // table.getColumnFormatter().getElement(selected[i]).getStyle().setWidth(width, Style.Unit.PX); // the other syntax doesn't work probably } } } // ========================================================= // MouseMotion Listener Methods // ========================================================= @Override public void onMouseMove(MouseMoveEvent e) { e.preventDefault(); // handles mouse over a trace button /*TODO int column = -1; boolean isOver = false; java.awt.Point mouseLoc = e.getPoint(); GPoint cellLoc = table.getIndexFromPixel(mouseLoc.x, mouseLoc.y); if (cellLoc != null) { column = cellLoc.x; if (app.getTraceManager().isTraceColumn(column)) { // adjust mouseLoc to the coordinate space of this column header mouseLoc.x = mouseLoc.x - table.getCellRect(0, column, true).x; // int lowBound = table.getCellRect(0, column, true).x + 3; // isOver = mouseLoc.x > lowBound && mouseLoc.x < lowBound + 24; // Point sceeenMouseLoc = // MouseInfo.getPointerInfo().getLocation(); isOver = ((ColumnHeaderRenderer) table.getColumnModel() .getColumn(column).getHeaderRenderer()) .isOverTraceButton(column, mouseLoc, table .getColumnModel().getColumn(column) .getHeaderValue()); } } // "isOver = " + isOver ); if (isOver && overTraceButtonColumn != column) { overTraceButtonColumn = column; if (table.getTableHeader() != null) { table.getTableHeader().resizeAndRepaint(); } } if (!isOver && overTraceButtonColumn > 0) { overTraceButtonColumn = -1; if (table.getTableHeader() != null) { table.getTableHeader().resizeAndRepaint(); } }*/ // DRAG if (isMouseDown) { if (e.getNativeButton() == NativeEvent.BUTTON_RIGHT) { return; // G.Sturr 2009-9-30 } if (isResizing) { return; } int x = SpreadsheetMouseListenerW.getAbsoluteX(e, app); int y = SpreadsheetMouseListenerW.getAbsoluteY(e, app); GPoint point = table.getIndexFromPixel(x, y); if (point != null) { int column = point.getX(); if (column0 == -1) { column0 = column; } table.setColumnSelectionInterval(column0, column); // repaint(); } } } // ========================================================= // Key Listener Methods // ========================================================= /*public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { boolean metaDown = AppD.isControlDown(e); boolean altDown = e.isAltDown(); boolean shiftDown = e.isShiftDown(); int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_LEFT: if (shiftDown) { // extend the column selection int column = table.getColumnModel().getSelectionModel() .getLeadSelectionIndex(); table.changeSelection(-1, column - 1, false, true); } else { // select topmost cell in first column to the left of the // selection if (table.minSelectionColumn > 0) { table.setSelection(table.minSelectionColumn - 1, 0); } else { table.setSelection(table.minSelectionColumn, 0); } table.requestFocus(); } break; case KeyEvent.VK_RIGHT: if (shiftDown) { // extend the column selection int column = table.getColumnModel().getSelectionModel() .getLeadSelectionIndex(); table.changeSelection(-1, column + 1, false, true); } else { // select topmost cell in first column to the right of the // selection if (table.minSelectionColumn > 0) { table.setSelection(table.minSelectionColumn + 1, 0); } else { table.setSelection(table.minSelectionColumn, 0); } table.requestFocus(); } break; case KeyEvent.VK_C: // control + c // Application.debug(minSelectionColumn); // Application.debug(maxSelectionColumn); if (metaDown && table.minSelectionColumn != -1 && table.maxSelectionColumn != -1) { table.copyPasteCut.copy(table.minSelectionColumn, 0, table.maxSelectionColumn, model.getRowCount() - 1, altDown); e.consume(); } break; case KeyEvent.VK_V: // control + v if (metaDown && table.minSelectionColumn != -1 && table.maxSelectionColumn != -1) { boolean storeUndo = table.copyPasteCut.paste( table.minSelectionColumn, 0, table.maxSelectionColumn, model.getRowCount() - 1); if (storeUndo) { app.storeUndoInfo(); } view.getRowHeader().revalidate(); e.consume(); } break; case KeyEvent.VK_X: // control + x if (metaDown && table.minSelectionColumn != -1 && table.maxSelectionColumn != -1) { boolean storeUndo = table.copyPasteCut.cut( table.minSelectionColumn, 0, table.maxSelectionColumn, model.getRowCount() - 1); if (storeUndo) { app.storeUndoInfo(); } e.consume(); } break; case KeyEvent.VK_BACK_SPACE: // delete case KeyEvent.VK_DELETE: // delete boolean storeUndo = table.copyPasteCut.delete( table.minSelectionColumn, 0, table.maxSelectionColumn, model.getRowCount() - 1); if (storeUndo) { app.storeUndoInfo(); } break; } } public void keyReleased(KeyEvent e) { }*/ // ========================================================= // Renderer Class // ========================================================= @Override public void onDoubleClick(DoubleClickEvent event) { // TODO Auto-generated method stub } @Override public void onClick(ClickEvent event) { // TODO Auto-generated method stub } }