📄 abstractcontroller2d.java
字号:
} // make note of current coordinates for next DraggedEvent prevDragCoordX = mouseX; prevDragCoordY = mouseY; } /** * manages all actions that will be invoked when a mouse button is pressed * *@param event MouseEvent object */ public void mousePressed(MouseEvent event) { isUndoableChange = false; int[] screenCoords = {event.getX(), event.getY()}; int[] mouseCoords = getWorldCoordinates(screenCoords); int mouseX = mouseCoords[0]; int mouseY = mouseCoords[1]; logger.debug("MousePressed Event Props: mode=", c2dm.getDrawModeString()); if (logger.isDebugEnabled()) { logger.debug(" trigger=" + event.isPopupTrigger() + /* * ", Button number: " + event.getButton() + */ ", Click count: " + event.getClickCount()); } int startX = 0; int startY = 0; r2dm.setPointerVectorStart(null); r2dm.setPointerVectorEnd(null); IAtom atomInRange = getAtomInRange(mouseX, mouseY); IBond bondInRange = getBondInRange(mouseX, mouseY); if (atomInRange != null) { startX = (int) ((Point2d)r2dm.getRenderingCoordinate(atomInRange)).x; startY = (int) ((Point2d)r2dm.getRenderingCoordinate(atomInRange)).y; r2dm.setPointerVectorStart(new Point(startX, startY)); } else { r2dm.setPointerVectorStart(new Point(mouseX, mouseY)); } if(r2dm.getSelectedPart()!=null && !((atomInRange == null) || (atomInRange == null)) && !(r2dm.getSelectedPart().contains(atomInRange) || r2dm.getSelectedPart().contains(bondInRange)) && r2dm.getRotateRadius()==0){ r2dm.setSelectedPart(atomInRange.getBuilder().newAtomContainer()); } if (c2dm.getDrawMode() == Controller2DModel.MOVE) { selectNearestChemObjectIfNoneSelected(mouseX, mouseY); dragMode = DRAG_MOVING_SELECTED; } else if (c2dm.getDrawMode() == Controller2DModel.DRAWBOND || c2dm.getDrawMode() == Controller2DModel.DOWN_BOND || c2dm.getDrawMode() == Controller2DModel.UP_BOND) { if (bondInRange != null && atomInRange == null) { // make sure we are not dragging a bond } else { dragMode = DRAG_DRAWING_PROPOSED_BOND; lastAtomInRange = atomInRange; } } else if (c2dm.getDrawMode() == Controller2DModel.MAPATOMATOM) { dragMode = DRAG_DRAWING_PROPOSED_ATOMATOMMAP; } else if (c2dm.getDrawMode() == Controller2DModel.SELECT) { dragMode = DRAG_MAKING_SQUARE_SELECTION; } else if (c2dm.getDrawMode() == Controller2DModel.LASSO && r2dm.getRotateRadius()==0) { if(c2dm.isMovingAllowed() && r2dm.getSelectedPart()!=null && (r2dm.getSelectedPart().contains(r2dm.getHighlightedAtom()) || r2dm.getSelectedPart().contains(r2dm.getHighlightedBond()))){ if(r2dm.getSelectedPart().getAtomCount()>0) c2dm.setDrawMode(Controller2DModel.MOVE); if(lastAction!=null){ ((JButton)lastAction.get(0)).setBackground(Color.LIGHT_GRAY); lastAction.set(0,moveButton); moveButton.setBackground(Color.GRAY); } dragMode = DRAG_MOVING_SELECTED; } else{ dragMode = DRAG_MAKING_LASSO_SELECTION; } } else if (c2dm.getDrawMode() == Controller2DModel.RING || c2dm.getDrawMode() == Controller2DModel.BENZENERING) { dragMode = DRAG_DRAWING_PROPOSED_RING; } else if(r2dm.getRotateRadius()!=0){ dragMode = DRAG_ROTATE; } if(dragMode==DRAG_MOVING_SELECTED){ if (r2dm.getSelectedPart() != null && r2dm.getSelectedPart().getAtom(0) != null) { moveoldX=((Point2d)r2dm.getRenderingCoordinate(r2dm.getSelectedPart().getAtom(0))).x; moveoldY=((Point2d)r2dm.getRenderingCoordinate(r2dm.getSelectedPart().getAtom(0))).y; } } } /** * manages all actions that will be invoked when a mouse button is released * *@param event MouseEvent object */ public void mouseReleased(MouseEvent event) { isUndoableChange = false; logger.debug("MouseReleased Event Props: mode=", c2dm.getDrawModeString()); if (logger.isDebugEnabled()) { logger.debug(" trigger=" + event.isPopupTrigger(), ", Click count: " + event.getClickCount()); } if ((event.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) { int[] screenCoords = {event.getX(), event.getY()}; int[] mouseCoords = getWorldCoordinates(screenCoords); int mouseX = mouseCoords[0]; int mouseY = mouseCoords[1]; if (c2dm.getDrawMode() == Controller2DModel.SYMBOL) { changeSymbol(); } if (c2dm.getDrawMode() == Controller2DModel.ELEMENT) { changeElement(); } if (c2dm.getDrawMode() == Controller2DModel.INCCHARGE) { increaseCharge(); } if (c2dm.getDrawMode() == Controller2DModel.ENTERELEMENT) { enterElement(); } if (c2dm.getDrawMode() == Controller2DModel.DECCHARGE) { decreaseCharge(); } if (c2dm.getDrawMode() == Controller2DModel.MAPATOMATOM) { handleMapping(wasDragged, r2dm); } if (c2dm.getDrawMode() == Controller2DModel.DRAWBOND || c2dm.getDrawMode() == Controller2DModel.DOWN_BOND || c2dm.getDrawMode() == Controller2DModel.UP_BOND) { drawBond(mouseX, mouseY); } if (c2dm.getDrawMode() == Controller2DModel.SELECT && wasDragged) { logger.info("User asks to selected atoms"); IAtomContainer selectedPart = chemModel.getBuilder().newAtomContainer(); r2dm.setSelectedPart(selectedPart); r2dm.setSelectedPart(getContainedAtoms(r2dm.getSelectRect())); r2dm.setSelectRect(null); logger.debug("selected stuff ", selectedPart); } if (c2dm.getDrawMode() == Controller2DModel.ERASER) { eraseSelection(); } if (c2dm.getDrawMode() == Controller2DModel.RING || c2dm.getDrawMode() == Controller2DModel.BENZENERING) { drawRing(mouseX, mouseY); } if (c2dm.getDrawMode() == Controller2DModel.LASSO && r2dm.getRotateRadius()==0) { // first deselect all atoms r2dm.setSelectedPart(chemModel.getBuilder().newAtomContainer()); // now select new atoms if (wasDragged) { lassoSelection(); } else { singleObjectSelected(mouseX, mouseY); } fireChange(); } if (wasDragged) { prevDragCoordX = 0; prevDragCoordY = 0; wasDragged = false; } if (dragMode==DRAG_MOVING_SELECTED){ dragAndDropSelection(); } if (c2dm.getDrawMode() == Controller2DModel.MOVE) { if (draggingSelected == false) { // then it was dragging nearest Bond or Atom r2dm.setSelectedPart(chemModel.getBuilder().newAtomContainer()); } if(r2dm.getMerge().size()>0){ mergeMolecules(); this.updateMoleculeCoordinates(); } } dragMode = DRAG_UNSET; r2dm.setPointerVectorStart(null); r2dm.setPointerVectorEnd(null); } if (shiftX != 0 || shiftY != 0) { shiftMolecule(); } shiftX = 0; shiftY = 0; } private void shiftMolecule() { for (int i = 0; i < chemModel.getMoleculeSet().getMoleculeCount(); i++) { IMolecule mol = chemModel.getMoleculeSet().getMolecule(i); for (int k = 0; k < mol.getAtomCount(); k++) { ((Point2d)r2dm.getRenderingCoordinate(mol.getAtom(k))).x=((Point2d)r2dm.getRenderingCoordinate(mol.getAtom(k))).x -shiftX; ((Point2d)r2dm.getRenderingCoordinate(mol.getAtom(k))).y=((Point2d)r2dm.getRenderingCoordinate(mol.getAtom(k))).y -shiftY; } } r2dm.fireChange(); fireChange(); } private void dragAndDropSelection() { double deltaX=0; double deltaY=0; IAtomContainer undoredoContainer = chemModel.getBuilder().newAtomContainer(); if(r2dm.getSelectedPart()!=null && r2dm.getSelectedPart().getAtomCount()>0){ undoredoContainer.add(r2dm.getSelectedPart()); deltaX=((Point2d)r2dm.getRenderingCoordinate(r2dm.getSelectedPart().getAtom(0))).x-moveoldX; deltaY=((Point2d)r2dm.getRenderingCoordinate(r2dm.getSelectedPart().getAtom(0))).y-moveoldY; }else if(r2dm.getHighlightedAtom()!=null){ deltaX=((Point2d)r2dm.getRenderingCoordinate(r2dm.getHighlightedAtom())).x-moveoldX; deltaY=((Point2d)r2dm.getRenderingCoordinate(r2dm.getHighlightedAtom())).y-moveoldY; undoredoContainer.addAtom(r2dm.getHighlightedAtom()); }else if (r2dm.getHighlightedBond()!=null){ deltaX=((Point2d)r2dm.getRenderingCoordinate(r2dm.getHighlightedBond().getAtom(0))).x-moveoldX; deltaY=((Point2d)r2dm.getRenderingCoordinate(r2dm.getHighlightedBond().getAtom(0))).y-moveoldY; } UndoableEdit edit = new MoveAtomEdit(undoredoContainer, (int)deltaX, (int)deltaY, r2dm.getRenderingCoordinates()); undoRedoHandler.postEdit(edit); } private void mergeMolecules() { Iterator it=r2dm.getMerge().keySet().iterator(); IBond[] bondson2 = null; IAtom atom2 = null; IAtom atom1 = null; ArrayList undoredoContainer = new ArrayList(); while(it.hasNext()){ Object[] undoObject = new Object[3]; atom1=(IAtom)it.next(); atom2=(IAtom)r2dm.getMerge().get(atom1); undoObject[0] = atom1; undoObject[1] = atom2; IMoleculeSet som=chemModel.getMoleculeSet(); IAtomContainer container1 = ChemModelManipulator.getRelevantAtomContainer(chemModel, atom1); IAtomContainer container2 = ChemModelManipulator.getRelevantAtomContainer(chemModel, atom2); if (container1 != container2) { container1.add(container2); som.removeAtomContainer(container2); } bondson2=AtomContainerManipulator.getBondArray(container1.getConnectedBondsList(atom2)); undoObject[2] = bondson2; undoredoContainer.add(undoObject); for(int i=0;i<bondson2.length;i++){ if(bondson2[i].getAtom(0)==atom2) bondson2[i].setAtom(atom1,0); if(bondson2[i].getAtom(1)==atom2) bondson2[i].setAtom(atom1,1); if(bondson2[i].getAtom(0)==bondson2[i].getAtom(1)){ container1.removeBond(bondson2[i]); } } container1.removeAtom(atom2); } UndoableEdit edit = new MergeMoleculesEdit(chemModel, undoredoContainer, "Molecules merged"); undoRedoHandler.postEdit(edit); r2dm.getMerge().clear(); } private void singleObjectSelected(int mouseX, int mouseY) {// one atom clicked or one bond clicked IChemObject chemObj = getChemObjectInRange(mouseX, mouseY); IAtomContainer container = chemObj.getBuilder().newAtomContainer(); if (chemObj instanceof IAtom) { container.addAtom((IAtom) chemObj); logger.debug("selected one atom in lasso mode"); r2dm.setSelectedPart(container); } else if (chemObj instanceof IBond) { IBond bond = (IBond) chemObj; container.addBond(bond); logger.debug("selected one bond in lasso mode"); for (int i = 0; i < bond.getAtomCount(); i++) { container.addAtom(bond.getAtom(i)); } r2dm.setSelectedPart(container); } } private void lassoSelection() { Vector lassoPoints = r2dm.getLassoPoints(); r2dm.addLassoPoint(new Point((Point) lassoPoints.elementAt(0))); int number = lassoPoints.size(); logger.debug("# lasso points: ", number); int[] screenLassoCoords = new int[number * 2]; Point currentPoint; for (int i = 0; i < number; i++) { currentPoint = (Point) lassoPoints.elementAt(i); screenLassoCoords[i * 2] = currentPoint.x; screenLassoCoords[i * 2 + 1] = currentPoint.y; logger.debug("ScreenLasso.x = ", screenLassoCoords[i * 2]); logger.debug("ScreenLasso.y = ", screenLassoCoords[i * 2 + 1]); } /* * Convert points to world coordinates as they are * in screen coordinates in the vector */ int[] worldCoords = getWorldCoordinates(screenLassoCoords); logger.debug("Returned coords: ", worldCoords.length); logger.debug(" # points: ", number); int[] xPoints = new int[number]; int[] yPoints = new int[number]; for (int i = 0; i < number; i++) { xPoints[i] = worldCoords[i * 2]; yPoints[i] = worldCoords[i * 2 + 1]; logger.debug("WorldCoords.x = ", worldCoords[i * 2]); logger.debug("WorldCoords.y = ", worldCoords[i * 2 + 1]); logger.debug("Polygon.x = ", xPoints[i]); logger.debug("Polygon.y = ", yPoints[i]); } Polygon polygon = new Polygon(xPoints, yPoints, number); r2dm.setSelectedPart(getContainedAtoms(polygon)); r2dm.getLassoPoints().removeAllElements(); r2dm.fireChange(); } private void drawRing(int mouseX, int mouseY) { this.updateMoleculeCoordinates(); IAtomContainer undoRedoContainer = chemModel.getBuilder().newAtomContainer(); IRing newRing = null; Point2d sharedAtomsCenter; Vector2d ringCenterVector;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -