📄 jchempaintpanel.java
字号:
/** * Sets the lastSavedFile attribute of the JChemPaintPanel object * *@param lsf The new lastSavedFile value */ public void setLastSavedFile(File lsf) { this.lastSavedFile = lsf; }// private void setupWorkingDirectory() {// try {// if (System.getProperty("user.dir") != null) {// setCurrentWorkDirectory(new File(System.getProperty("user.dir")));// }// } catch (Exception exc) {// logger.error("Could not read a system property. I might be in a sandbox.");// }// } /** * Sets the jChemPaintModel attribute of the JChemPaintPanel object * *@param model The new jChemPaintModel value */ public void setJChemPaintModel(JChemPaintModel model, Dimension panelDimension) { lastUsedJCPP = this; if (model != null && jchemPaintModel != null && model.getChemModel().getMoleculeSet() != null) { model.getRendererModel().setBackgroundDimension(jchemPaintModel.getRendererModel().getBackgroundDimension()); IAtomContainer acc = model.getChemModel().getBuilder().newAtomContainer(); Iterator containers = ChemModelManipulator.getAllAtomContainers(model.getChemModel()).iterator(); while (containers.hasNext()) acc.add((IAtomContainer)containers.next()); Dimension molDim = GeometryTools.get2DDimension(acc,model.getRendererModel().getRenderingCoordinates());// Dimension molDim = GeometryTools.get2DDimension(model.getChemModel().getMoleculeSet().getAtomContainer(0)); if (isViewerOnly) { Dimension viewerDim = null; //for some reason an EditorPanel opened by a ViewerPanel gets thet isViewerOnly flag set to true -- to be solved!! try { viewerDim = getViewerDimension(); } catch (ClassCastException cce) {} if (viewerDim != null) { //sets BackgroundDim to default dim if using ViewerOnlyPanel model.getRendererModel().setBackgroundDimension(viewerDim); } } Dimension backDim = model.getRendererModel().getBackgroundDimension(); int height = (int) backDim.getHeight(); int width = (int) backDim.getWidth(); if (molDim.getHeight() >= backDim.getHeight()) { height = (int) molDim.getHeight() + 10; } else if (molDim.getWidth() >= backDim.getWidth()) { width = (int) molDim.getWidth() + 10; } model.getRendererModel().setBackgroundDimension(new Dimension(width, height)); } else if (model.getChemModel().getMoleculeSet() == null && isViewerOnly) { Dimension viewerDim = null; try { viewerDim = getViewerDimension(); } catch (ClassCastException cce) {} if (viewerDim != null) { //sets BackgroundDim to default dim if using ViewerOnlyPanel model.getRendererModel().setBackgroundDimension(viewerDim); } } if(jchemPaintModel!=null && jchemPaintModel.getControllerModel()!=null) model.getControllerModel().setAutoUpdateImplicitHydrogens(jchemPaintModel.getControllerModel().getAutoUpdateImplicitHydrogens()); if(jchemPaintModel!=null && jchemPaintModel.getRendererModel()!=null){ model.getRendererModel().setUseAntiAliasing(jchemPaintModel.getRendererModel().getUseAntiAliasing()); model.getRendererModel().setShowImplicitHydrogens(jchemPaintModel.getRendererModel().getShowImplicitHydrogens()); model.getRendererModel().setShowEndCarbons(jchemPaintModel.getRendererModel().getShowEndCarbons()); model.getRendererModel().setShowAromaticityInCDKStyle(jchemPaintModel.getRendererModel().getShowAromaticityInCDKStyle()); model.getRendererModel().setDrawNumbers(jchemPaintModel.getRendererModel().getDrawNumbers()); model.getRendererModel().setShowAtomAtomMapping(jchemPaintModel.getRendererModel().getShowAtomAtomMapping()); model.getRendererModel().setKekuleStructure(jchemPaintModel.getRendererModel().getKekuleStructure()); model.getRendererModel().setColorAtomsByType(jchemPaintModel.getRendererModel().getColorAtomsByType()); model.getRendererModel().setShowTooltip(jchemPaintModel.getRendererModel().getShowTooltip()); model.getRendererModel().setShowReactionBoxes(jchemPaintModel.getRendererModel().getShowReactionBoxes()); } this.jchemPaintModel = model; jchemPaintModel.addChangeListener(this); org.openscience.cdk.interfaces.IChemModel chemModel = model.getChemModel(); scaleAndCenterMolecule(chemModel,panelDimension); drawingPanel.setJChemPaintModel(model); } /** * Partitions a given String into separate words and writes them into an * array. * *@param input String The String to be cutted into pieces *@return String[] The array containing the separate words */ public String[] tokenize(String input) { Vector v = new Vector(); StringTokenizer t = new StringTokenizer(input); String cmd[]; while (t.hasMoreTokens()) { v.addElement(t.nextToken()); } cmd = new String[v.size()]; for (int i = 0; i < cmd.length; i++) { cmd[i] = (String) v.elementAt(i); } return cmd; } public void showChemFile(Reader file) { IChemObjectReader cor = null; /* * Have the ReaderFactory determine the file format */ try { cor = getChemObjectReader(file); } catch (IOException ioExc) { logger.warn("IOException while determining file format."); logger.debug(ioExc); } catch (Exception exc) { logger.warn("Exception while determining file format."); logger.debug(exc); } if (cor == null) { JOptionPane.showMessageDialog(this, "Could not determine file format."); return; } String error = null; ChemFile chemFile = null; ChemModel chemModel = null; if (cor.accepts(ChemFile.class)) { // try to read a ChemFile try { chemFile = (ChemFile) cor.read(new ChemFile()); if (chemFile != null) { processChemFile(chemFile); return; } else { logger.warn("The object chemFile was empty unexpectedly!"); } } catch (Exception exception) { error = "Error while reading file: " + exception.getMessage(); logger.warn(error); logger.debug(exception); } } if (error != null) { JOptionPane.showMessageDialog(this, error); return; } if (cor.accepts(ChemModel.class)) { // try to read a ChemModel try { chemModel = (ChemModel) cor.read((ChemObject) new ChemModel()); if (chemModel != null) { processChemModel(chemModel); return; } else { logger.warn("The object chemModel was empty unexpectedly!"); } error = null; // overwrite previous problems, it worked now } catch (Exception exception) { error = "Error while reading file: " + exception.getMessage(); logger.error(error); logger.debug(exception); } } if (error != null) { JOptionPane.showMessageDialog(this, error); } } /** * Gets the jChemPaintModel attribute of the JChemPaintPanel object * *@return The jChemPaintModel value */ public JChemPaintModel getJChemPaintModel() { return jchemPaintModel; } public int showWarning() { if (jchemPaintModel.isModified() && !getIsOpenedByViewer() && !guiString.equals("applet")) { int answer = JOptionPane.showConfirmDialog(this, jchemPaintModel.getTitle() + " " + JCPLocalizationHandler.getInstance().getString("warning"), JCPLocalizationHandler.getInstance().getString("warningheader"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); if (answer == JOptionPane.YES_OPTION) { new SaveAction(this, false).actionPerformed(new ActionEvent(this, 12, "")); } return answer; } else if(guiString.equals("applet")){ //In case of the applet we do not ask for save but put the clear into the undo stack ClearAllEdit coa = null; try { coa = new ClearAllEdit(this.getChemModel(),(IMoleculeSet)this.getChemModel().getMoleculeSet().clone(),this.getChemModel().getReactionSet()); this.jchemPaintModel.getControllerModel().getUndoSupport().postEdit(coa); } catch (Exception e) { logger.error("Clone of IMoleculeSet failed: ", e.getMessage()); logger.debug(e); } return JOptionPane.YES_OPTION; } else { return JOptionPane.YES_OPTION; } } public void processChemFile(org.openscience.cdk.interfaces.IChemFile chemFile) { logger.info("Information read from file:"); int chemSequenceCount = chemFile.getChemSequenceCount(); logger.info(" # sequences: ", chemSequenceCount); for (int i = 0; i < chemSequenceCount; i++) { org.openscience.cdk.interfaces.IChemSequence chemSequence = chemFile.getChemSequence(i); int chemModelCount = chemSequence.getChemModelCount(); logger.info(" # model in seq(" + i + "): ", chemModelCount); for (int j = 0; j < chemModelCount; j++) { org.openscience.cdk.interfaces.IChemModel chemModel = chemSequence.getChemModel(j); processChemModel(chemModel); } } } /** * Scales and centers the structure in the dimensions of the DrawingPanel. * *@param chemModel The cheModel of the structure to be scaled and centered. */ public void scaleAndCenterMolecule(org.openscience.cdk.interfaces.IChemModel chemModel) { scaleAndCenterMolecule(chemModel, null); } public void scaleAndCenterMolecule(org.openscience.cdk.interfaces.IChemModel chemModel, Dimension dim) { IAtomContainer ac = chemModel.getBuilder().newAtomContainer(); Iterator containers = ChemModelManipulator.getAllAtomContainers(chemModel).iterator(); while (containers.hasNext()) ac.add((IAtomContainer)containers.next()); scaleAndCenterMolecule(ac,dim); } /** * Scales and centers the structure in the dimensions of the DrawingPanel. * *@param ac The IAtomContainer of the structure to be scaled and centered. */ public void scaleAndCenterMolecule(IAtomContainer ac, Dimension dim){ if(showscrollbars){ ((JViewport) drawingPanel.getParent()).setViewPosition(new Point((drawingPanel.getWidth()-getWidth())/2>0 ? (drawingPanel.getWidth()-getWidth())/2 : 0 ,(drawingPanel.getHeight()-getHeight())/2>0 ? (drawingPanel.getHeight()-getHeight())/2 : 0)); } JChemPaintModel jcpm = getJChemPaintModel(); Renderer2DModel rendererModel = jcpm.getRendererModel(); double scaleFactor = GeometryTools.getScaleFactor(ac, rendererModel.getBondLength(),jchemPaintModel.getRendererModel().getRenderingCoordinates()); GeometryTools.scaleMolecule(ac, scaleFactor, jchemPaintModel.getRendererModel().getRenderingCoordinates()); if(!showscrollbars && dim!=null){ Dimension moldims=GeometryTools.get2DDimension(ac, rendererModel.getRenderingCoordinates()); scaleFactor=1; if(moldims.width>dim.width){ scaleFactor=((float)dim.width-100)/(float)moldims.width; } if(moldims.height>dim.height && dim.height/moldims.height<scaleFactor){ scaleFactor=((float)dim.height-100)/(float)moldims.height; } GeometryTools.scaleMolecule(ac, scaleFactor, jchemPaintModel.getRendererModel().getRenderingCoordinates()); } Rectangle view; if(showscrollbars){ view = ((JViewport) drawingPanel.getParent()).getViewRect(); }else{ view = new Rectangle(drawingPanel.getSize()); } Renderer2DModel model = jchemPaintModel.getRendererModel(); double x = view.getX() + view.getWidth(); double y = view.getY() + view.getHeight(); double relocatedY = model.getBackgroundDimension().getSize().getHeight() - (y + view.getY() / 2); double relocatedX = view.getX() / 2; Dimension viewablePart = new Dimension((int) x, (int) y); //GeometryTools.center(ac, viewablePart); //to be fixed - check if molDim is reaching over viewablePart borders... if (this instanceof JChemPaintViewerOnlyPanel) { GeometryTools.center(ac, model.getBackgroundDimension(),jchemPaintModel.getRendererModel().getRenderingCoordinates()); relocatedX=0; relocatedY=0; } else { if(dim==null){ if(viewablePart.getWidth()==0 && viewablePart.getHeight()==0){ relocatedX=0; relocatedY=0; GeometryTools.center(ac, model.getBackgroundDimension(),jchemPaintModel.getRendererModel().getRenderingCoordinates()); }else{ GeometryTools.center(ac, viewablePart,jchemPaintModel.getRendererModel().getRenderingCoordinates()); } }else{ relocatedY = model.getBackgroundDimension().getSize().getHeight() - (dim.getHeight()); relocatedX = 0; GeometryTools.center(ac, dim,jchemPaintModel.getRendererModel().getRenderingCoordinates()); } } //fixing the coords regarding the position of the viewablePart java.util.Iterator atoms = ac.atoms(); while (atoms.hasNext()) { IAtom atom = (IAtom)atoms.next(); if (jchemPaintModel.getRendererModel().getRenderingCoordinate(atom) != null) { jchemPaintModel.getRendererModel().setRenderingCoordinate(atom,new Point2d(((Point2d)jchemPaintModel.getRendererModel().getRenderingCoordinate(atom)).x + relocatedX,((Point2d)jchemPaintModel.getRendererModel().getRenderingCoordinate(atom)).y + relocatedY)); } } } public void processChemModel(org.openscience.cdk.interfaces.IChemModel chemModel) { // check for bonds if (ChemModelManipulator.getBondCount(chemModel) == 0) { String error = "Model does not have bonds. Cannot depict contents."; logger.warn(error); JOptionPane.showMessageDialog(this, error); return; } // check for coordinates if ((GeometryTools.has2DCoordinatesNew(chemModel)==0)) { String error = "Model does not have 2D coordinates. Cannot open file."; logger.warn(error); JOptionPane.showMessageDialog(this, error); CreateCoordinatesForFileDialog frame = new CreateCoordinatesForFileDialog(chemModel, jchemPaintModel.getRendererModel().getRenderingCoordinates()); frame.pack(); frame.show(); return; } else if ((GeometryTools.has2DCoordinatesNew(chemModel)==1)) { int result=JOptionPane.showConfirmDialog(this,"Model has some 2d coordinates. Do you want to show only the atoms with 2d coordiantes?","Only some 2d cooridantes",JOptionPane.YES_NO_OPTION); if(result>1){ CreateCoordinatesForFileDialog frame = new CreateCoordinatesForFileDialog(chemModel, jchemPaintModel.getRendererModel().getRenderingCoordinates()); frame.pack(); frame.show(); return; }else{ for(int i=0;i<chemModel.getMoleculeSet().getAtomContainerCount();i++){ for(int k=0;i<chemModel.getMoleculeSet().getAtomContainer(i).getAtomCount();k++){ if(chemModel.getMoleculeSet().getAtomContainer(i).getAtom(k).getPoint2d()==null) chemModel.getMoleculeSet().getAtomContainer(i).removeAtomAndConnectedElectronContainers(chemModel.getMoleculeSet().getAtomContainer(i).getAtom(k)); } } } } JChemPaintModel jcpm = new JChemPaintModel(chemModel); lastUsedJCPP = this; if (isEmbedded()) { if (showWarning() != JOptionPane.CANCEL_OPTION) { registerModel(jcpm); setJChemPaintModel(jcpm,null); repaint(); } }else if (getJChemPaintModel().getChemModel().getMoleculeSet() == null || getJChemPaintModel().getChemModel().getReactionSet() == null /*|| getJChemPaintModel().getChemModel().getMoleculeSet().getMolecule(0).getAtoms().length == 0*/) { registerModel(jcpm); setJChemPaintModel(jcpm,null); repaint(); } else { JFrame jcpf = JChemPaintEditorPanel.getNewFrame(jcpm); jcpf.setVisible(true); scaleAndCenterMolecule(chemModel); jcpf.pack(); lastUsedJCPP = (JChemPaintPanel) jcpf.getContentPane().getComponents()[0]; } } /** * Gets the chemObjectReader attribute of the JChemPaintPanel object * *@param reader Description of the Parameter *@return The chemObjectReader value *@exception IOException Description of the Exception */ public IChemObjectReader getChemObjectReader(Reader reader) throws IOException { ReaderFactory factory = new ReaderFactory(); IChemObjectReader coReader = factory.createReader(reader); if (coReader != null) { coReader.addChemObjectIOListener(new SwingGUIListener(this, 4)); } return coReader; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -