/***************************************************************************** * Copyright (c) 2008 Bioclipse Project * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *****************************************************************************/ package net.bioclipse.specmol.editor; import java.io.UnsupportedEncodingException; import net.bioclipse.core.business.BioclipseException; import net.bioclipse.core.util.LogUtils; import net.bioclipse.specmol.Activator; import net.bioclipse.specmol.business.ISpecmolManager; import net.bioclipse.specmol.domain.JumboSpecmol; import net.bioclipse.specmol.outline.SpecmolOutlinePage; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.editors.text.TextEditor; import org.eclipse.ui.part.MultiPageEditorPart; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.xmlcml.cml.element.CMLCml; import org.xmlcml.cml.element.CMLMolecule; public class SpecMolEditor extends MultiPageEditorPart { private IEditorInput editorInput; private AssignmentPage specmoleditorpage; private TextEditor textEditor; private SpecmolOutlinePage fOutlinePage; private static final Logger logger = Logger.getLogger(SpecMolEditor.class); public static String nucleus="nmr:OBSERVENUCLEUS"; public static String fileextension="cml"; public void setTextEditor(TextEditor textEditor) { this.textEditor = textEditor; } public TextEditor getTextEditor() { return textEditor; } private CMLCml cmlcml; private int textpageindex; /* (non-Javadoc) * @see org.eclipse.ui.part.MultiPageEditorPart#createPages() */ @Override protected void createPages() { createPage0(); createPage1(); } /** * create the assignment editor page and add it to the MultiPageEditor */ void createPage0(){ String name =editorInput.getName(); this.setPartName(name); try{ specmoleditorpage = new AssignmentPage(cmlcml); int assignmentpageindex = this.addPage((IEditorPart) specmoleditorpage, editorInput); setPageText(assignmentpageindex, "Assignment"); this.setActivePage(assignmentpageindex); } catch (PartInitException e){ e.printStackTrace(); } } /** * create a xmlEditor and add it to the MultiPageEditor */ void createPage1(){ textEditor = new UneditableTextEditor(); try { textpageindex = this.addPage((IEditorPart) textEditor, getEditorInput()); setPageText(textpageindex,"Source"); } catch (PartInitException e) { e.printStackTrace(); } } /* (non-Javadoc) * @see org.eclipse.ui.part.MultiPageEditorPart#setPageText(int, java.lang.String) */ public void setPageText(int index,String text){ super.setPageText(index,text); } /** * Gets a CMLSpectrum from the editorInput * @return The CMLSpectrum in the editorInput, null if not possible * @throws BioclipseException */ private CMLCml getModelFromEditorInput(IEditorInput input) throws BioclipseException{ Object file = input.getAdapter(IFile.class); if (!(file instanceof IFile)) { throw new BioclipseException( "Invalid editor input: Does not provide an IFile"); } IFile inputFile = (IFile) file; try { ISpecmolManager specmolManager = Activator.getDefault().getJavaSpecmolManager(); return specmolManager.loadSpecmol(inputFile).getJumboObject(); } catch (Exception e) { e.printStackTrace(); } return null; } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ @Override public void doSave(IProgressMonitor monitor) { this.specmoleditorpage.setDirty(false); try { Activator.getDefault().getJavaSpecmolManager().saveSpecmol(new JumboSpecmol(cmlcml),(IFile)editorInput.getAdapter(IFile.class)); } catch (BioclipseException e) { LogUtils.handleException(e,logger); } catch (CoreException e) { LogUtils.handleException(e,logger); } catch (UnsupportedEncodingException e) { LogUtils.handleException(e,logger); } } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSaveAs() */ @Override public void doSaveAs() { //Since CML is the only possible format, no save as is needed } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed() */ @Override public boolean isSaveAsAllowed() { //Since CML is the only possible format, no save as is needed return false; } /** * Init and validate input. */ public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException { super.init(site, editorInput); this.editorInput = editorInput; try { this.cmlcml=this.getModelFromEditorInput(editorInput); CMLMolecule cmlmol=(CMLMolecule)cmlcml.getChildCMLElement("molecule", 0); for(int i=0;i<cmlmol.getAtomCount();i++){ if(cmlmol.getAtom(i).getX2Attribute()==null){ MessageDialog.openInformation(getSite().getShell() , "No 2D coordinates", "At least one atom in the molecule is missing 2D coordinates. We need these for display and assignment!"); getSite().getWorkbenchWindow().getActivePage().closeEditor(this,false); return; } } } catch (BioclipseException e) { LogUtils.handleException(e,logger); } } /** * get the assignment editor page * * @return AssignmentPage specmoleditorpage */ public AssignmentPage getSpecmoleditorpage() { return specmoleditorpage; } /* (non-Javadoc) * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int) */ @Override protected void pageChange(int newPageIndex) { super.pageChange(newPageIndex); //since the text is read only, we do if we came from text if(newPageIndex==textpageindex && cmlcml!=null && textEditor!=null){ textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()).set(cmlcml.toXML()); } } @Override public void setFocus() { super.setFocus(); } public Object getAdapter(Class required) { if (IContentOutlinePage.class.equals(required)) { if (fOutlinePage == null) { fOutlinePage = new SpecmolOutlinePage( cmlcml,this); } return fOutlinePage; } return super.getAdapter(required); } }