⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractcontroller2d.java

📁 化学图形处理软件
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
		}		// 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 + -