📄 mapview.java
字号:
// %%% and therefore is the scrollRectToVisible called twice ? (PN) // I don't think so and therefore I'll comment one call out... (PN) if (node != null) { JViewport mapViewport = (JViewport)getParent(); int viewPortScrollMode = mapViewport.getScrollMode(); mapViewport.setScrollMode(JViewport.SIMPLE_SCROLL_MODE ); scrollRectToVisible( new Rectangle(x - HORIZ_SPACE, node.getLocation().y - VERT_SPACE, width + HORIZ_SPACE2, node.getSize().height + VERT_SPACE2) ); mapViewport.setScrollMode(viewPortScrollMode); // (PN) scrollRectToVisible( new Rectangle(xLeft, node.getLocation().y - VERT_SPACE, // xRight, node.getSize().height + VERT_SPACE2) ); } } /** * Returns the size of the visible part of the view in view coordinates. */ public Dimension getViewportSize(){ JViewport mapViewport = (JViewport)getParent(); return mapViewport == null ? null : mapViewport.getExtentSize(); } /** * Scroll the viewport of the map to the south-west, i.e. scroll the map itself to the north-east. */ public void scrollBy(int x, int y, boolean repaint) { JViewport mapViewport = (JViewport)getParent(); if(mapViewport != null){ Point currentPoint = mapViewport.getViewPosition(); // Get View Position currentPoint.translate(x, y); // Add the difference to it // Watch for the boundaries // Low boundaries if (currentPoint.getX()<0) { currentPoint.setLocation(0, currentPoint.getY()); } if (currentPoint.getY()<0) { currentPoint.setLocation(currentPoint.getX(), 0); } // High boundaries double maxX = getSize().getWidth() - mapViewport.getExtentSize().getWidth(); // getView() gets viewed area - JPanel double maxY = getSize().getHeight() - mapViewport.getExtentSize().getHeight(); if (currentPoint.getX()>maxX) { currentPoint.setLocation(maxX, currentPoint.getY()); } if (currentPoint.getY()>maxY) { currentPoint.setLocation(currentPoint.getX(), maxY); } int oldScrollMode = mapViewport.getScrollMode(); if (repaint) { mapViewport.setScrollMode(JViewport.SIMPLE_SCROLL_MODE); } mapViewport.setViewPosition(currentPoint); if (repaint) { mapViewport.setScrollMode(oldScrollMode); } } } // // Node Navigation // private NodeView getNeighbour(int directionCode) { NodeView oldSelected = getSelected(); NodeView newSelected = null; switch (directionCode) { case KeyEvent.VK_LEFT: setSiblingMaxLevel(oldSelected.getModel().getNodeLevel()); // for case of return if(oldSelected.isRoot()){ LinkedList left = ((RootNodeView)oldSelected).getLeft(); if (left.size() == 0) return null; newSelected = oldSelected.getModel().getPreferredChild().getViewer(); if (!left.contains(newSelected)) { newSelected = (NodeView)left.getFirst(); } } else if(!oldSelected.isLeft()) { newSelected = oldSelected.getParentView(); } else { if (oldSelected.getModel().isFolded()) { // If folded in the direction, unfold getController().getModeController().setFolded(oldSelected.getModel(), false); return null; } if (oldSelected.getChildrenViews().size() == 0) return null; newSelected = oldSelected.getModel().getPreferredChild().getViewer(); } setSiblingMaxLevel(newSelected.getModel().getNodeLevel()); break; case KeyEvent.VK_RIGHT: setSiblingMaxLevel(oldSelected.getModel().getNodeLevel()); // for case of return if(oldSelected.isRoot()) { LinkedList right = ((RootNodeView)oldSelected).getRight(); if (right.size() == 0) return null; newSelected = oldSelected.getModel().getPreferredChild().getViewer(); if (!right.contains(newSelected)) { newSelected = (NodeView)right.getFirst(); } } else if(oldSelected.isLeft()) { newSelected = oldSelected.getParentView(); } else { if (oldSelected.getModel().isFolded()) { // If folded in the direction, unfold// URGENT: Change to controller setFolded.// getModel().setFolded(oldSelected.getModel(), false); getController().getModeController().setFolded(oldSelected.getModel(), false); return null; } if (oldSelected.getChildrenViews().size() == 0) return null; newSelected = oldSelected.getModel().getPreferredChild().getViewer(); } setSiblingMaxLevel(newSelected.getModel().getNodeLevel()); break; case KeyEvent.VK_UP: newSelected = oldSelected.getPreviousSibling(); break; case KeyEvent.VK_DOWN: newSelected = oldSelected.getNextSibling(); break; case KeyEvent.VK_PAGE_UP: newSelected = oldSelected.getPreviousPage(); break; case KeyEvent.VK_PAGE_DOWN: newSelected = oldSelected.getNextPage(); break; } return newSelected; } public void move(KeyEvent e) { NodeView newSelected = getNeighbour(e.getKeyCode()); if (newSelected != null) { extendSelectionWithKeyMove(newSelected, e); scrollNodeToVisible( newSelected ); e.consume(); } } private void extendSelectionWithKeyMove(NodeView newlySelectedNodeView, KeyEvent e) { if (e.isShiftDown()) { // left or right if (e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT) { shiftSelectionOrigin = null; NodeView toBeNewSelected = newlySelectedNodeView.isParentOf(getSelected()) ? newlySelectedNodeView : getSelected(); selectBranch(toBeNewSelected, false); makeTheSelected(toBeNewSelected); return; } if (shiftSelectionOrigin == null) { shiftSelectionOrigin = getSelected(); } int deltaY = newlySelectedNodeView.getY() - shiftSelectionOrigin.getY(); // page up and page down NodeView currentSelected = getSelected(); if (e.getKeyCode() == KeyEvent.VK_PAGE_UP) { for (;;) { if (currentSelected.getY() > shiftSelectionOrigin.getY()) deselect(currentSelected); else makeTheSelected(currentSelected); if (currentSelected.getY() <= newlySelectedNodeView.getY()) break; currentSelected = currentSelected.getPreviousSibling(); } return; } if (e.getKeyCode() == KeyEvent.VK_PAGE_DOWN) { for (;;) { if (currentSelected.getY() < shiftSelectionOrigin.getY()) deselect(currentSelected); else makeTheSelected(currentSelected); if (currentSelected.getY() >= newlySelectedNodeView.getY()) break; currentSelected = currentSelected.getNextSibling(); } return; } boolean enlargingMove = (deltaY > 0) && (e.getKeyCode() == KeyEvent.VK_DOWN) || (deltaY < 0) && (e.getKeyCode() == KeyEvent.VK_UP); if (enlargingMove) { toggleSelected(newlySelectedNodeView); } else { toggleSelected(getSelected()); makeTheSelected(newlySelectedNodeView); }} else { shiftSelectionOrigin = null; selectAsTheOnlyOneSelected(newlySelectedNodeView); }} public void moveToRoot() { selectAsTheOnlyOneSelected( getRoot() ); centerNode( getRoot() ); } /** * Select the node, resulting in only that one being selected. */ public void selectAsTheOnlyOneSelected(NodeView newSelected) { LinkedList oldSelecteds = getSelecteds(); //select new node this.selected.clear(); this.selected.add(newSelected); newSelected.requestFocus(); // set last focused as preferred (PN) if (newSelected.getModel().getParentNode() != null) { newSelected.getModel().getParentNode().setPreferredChild(newSelected.getModel()); } scrollNodeToVisible(newSelected); newSelected.repaint(); for(ListIterator e = oldSelecteds.listIterator();e.hasNext();) { NodeView oldSelected = (NodeView)e.next(); if (oldSelected != null) { oldSelected.repaint(); } } } /** * Add the node to the selection if it is not yet there, remove it otherwise. */ public void toggleSelected(NodeView newSelected) { NodeView oldSelected = getSelected(); if (isSelected(newSelected)) { if (selected.size() > 1) { selected.remove(newSelected); oldSelected=newSelected; } } else { selected.add(newSelected); } getSelected().requestFocus(); getSelected().repaint(); if(oldSelected != null) oldSelected.repaint(); } /** * Add the node to the selection if it is not yet there, making it the focused selected node. */ public void makeTheSelected(NodeView newSelected) { if (isSelected(newSelected)) { selected.moveToFirst(newSelected); } else { selected.add(newSelected); } getSelected().requestFocus(); getSelected().repaint(); } public void deselect(NodeView newSelected) { if (isSelected(newSelected)) { selected.remove(newSelected); newSelected.repaint(); } } /** * Select the node and his descendants. On extend = false clear up the previous selection. * if extend is false, the past selection will be empty. * if yes, the selection will extended with this node and its children */ public void selectBranch(NodeView newlySelectedNodeView, boolean extend) { //if (!extend || !isSelected(newlySelectedNodeView)) // toggleSelected(newlySelectedNodeView); if (!extend) { selectAsTheOnlyOneSelected(newlySelectedNodeView); } else if (!isSelected(newlySelectedNodeView)) { toggleSelected(newlySelectedNodeView); } //select(newSelected,extend); for (ListIterator e = newlySelectedNodeView.getChildrenViews().listIterator(); e.hasNext(); ) { NodeView target = (NodeView)e.next(); selectBranch(target,true); } } public boolean selectContinuous(NodeView newSelected) { /* fc, 25.1.2004: corrected due to completely inconsistent behaviour.*/ NodeView oldSelected = null; // search for the last already selected item among the siblings: LinkedList selList = getSelecteds(); ListIterator j = selList.listIterator(/*selList.size()*/); while(j.hasNext()) { NodeView selectedNode = (NodeView)j.next(); if(selectedNode != newSelected && newSelected.isSiblingOf(selectedNode)) { oldSelected = selectedNode; break; } } // no such sibling found. select the new one, and good bye. if(oldSelected == null) { if(!isSelected(newSelected)) { toggleSelected(newSelected); return true; } return false; } // fc, bug fix: only select the nodes on the same side: boolean oldPositionLeft = oldSelected.isLeft(); boolean newPositionLeft = newSelected.isLeft(); /* find old starting point. */ ListIterator i = newSelected.getSiblingViews().listIterator();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -