package net.bioclipse.specmol.actions;
import java.io.StringBufferInputStream;
import java.util.HashMap;
import java.util.Map;
import net.bioclipse.cdk.jchempaint.editor.JChemPaintEditor;
import net.bioclipse.chemoinformatics.wizards.WizardHelper;
import net.bioclipse.core.util.LogUtils;
import net.bioclipse.specmol.Activator;
import net.bioclipse.specmol.domain.IJumboSpecmol;
import net.bioclipse.specmol.ui.views.SpecmolContentProvider;
import net.bioclipse.spectrum.editor.SpectrumEditor;
import org.apache.log4j.Logger;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.IHandlerListener;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.xmlcml.cml.base.CMLBuilder;
import org.xmlcml.cml.base.CMLElement;
import org.xmlcml.cml.element.CMLCml;
import org.xmlcml.cml.element.CMLMolecule;
import org.xmlcml.cml.element.CMLSpectrum;
import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
import spok.utils.SpectrumUtils;
public class OpenInEditorAction implements IHandler, IPropertyListener {
private static Map<IEditorPart,IFile> orignalFiles=new HashMap<IEditorPart,IFile>();
private static Map<IEditorPart,CMLElement> orignalChildren=new HashMap<IEditorPart,CMLElement>();
private static Logger logger = Logger.getLogger(OpenInEditorAction.class);
public void addHandlerListener( IHandlerListener handlerListener ) {
}
public void dispose() {
}
public Object execute( ExecutionEvent event ) throws ExecutionException {
ISelection sel=PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection();
if (sel instanceof IStructuredSelection) {
Object element = ((IStructuredSelection) sel).getFirstElement();
//we close the edi
IEditorPart[] editors = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditors();
for(int i=0;i<editors.length;i++){
if(((IFile)new SpecmolContentProvider().getParent( element )).equals( editors[i].getEditorInput().getAdapter( IFile.class ) ))
if(editors[i].isDirty()){
boolean answer = MessageDialog.openQuestion( editors[i].getSite().getShell(), "Closing editor", "You are working on the parent of the entry to edit ("+((IFile)new SpecmolContentProvider().getParent( element )).getName()+"). We need to close this editor. Should the changes be saved?" );
if(answer){
editors[i].getSite().getPage().saveEditor( editors[i], false );
}
}
editors[i].getSite().getPage().closeEditor(editors[i], false);
}
if(element instanceof CMLMolecule){
IEditorDescriptor desc = PlatformUI.getWorkbench().
getEditorRegistry().getDefaultEditor( ((CMLMolecule)element).getId()+".cml",Platform.getContentTypeManager().getContentType( "net.bioclipse.contenttypes.cml.singleMolecule2d" ));
try {
IFile tmpFile= net.bioclipse.core.Activator.getVirtualProject().getFile(WizardHelper.findUnusedFileName(new StructuredSelection(net.bioclipse.core.Activator.getVirtualProject()), ((CMLMolecule)element).getId(), ".cml") );
tmpFile.create( new StringBufferInputStream(((CMLMolecule)element).toXML()), IFile.FORCE, null);
IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(new FileEditorInput(tmpFile), desc.getId());
editor.addPropertyListener( this );
//we remember which files this element came from and
//the element in the content provider for the chilren.
orignalFiles.put( editor, (IFile)new SpecmolContentProvider().getParent( element ) );
orignalChildren.put(editor,(CMLElement)element);
System.err.println((IFile)new SpecmolContentProvider().getParent( element ));
} catch ( Exception e ) {
LogUtils.handleException( e, logger );
}
}else if(element instanceof CMLSpectrum){
//for some reason, empty xmlns="" tend to show up, we elimenate these
SpectrumUtils.namespaceThemAll( ((CMLSpectrum)element).getChildElements() );
IEditorDescriptor desc = PlatformUI.getWorkbench().
getEditorRegistry().getDefaultEditor( ((CMLSpectrum)element).getId()+".cml",Platform.getContentTypeManager().getContentType( "net.bioclipse.contenttypes.cml.singleSpectrum" ));
try {
IFile tmpFile= net.bioclipse.core.Activator.getVirtualProject().getFile( WizardHelper.findUnusedFileName(new StructuredSelection(net.bioclipse.core.Activator.getVirtualProject()), ((CMLSpectrum)element).getId(), ".cml") );
tmpFile.create( new StringBufferInputStream(((CMLSpectrum)element).toXML()), IFile.FORCE, null);
IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(new FileEditorInput(tmpFile), desc.getId());
editor.addPropertyListener( this );
orignalFiles.put( editor, (IFile)new SpecmolContentProvider().getParent( element ) );
System.err.println((IFile)new SpecmolContentProvider().getParent( element ));
orignalChildren.put(editor,(CMLElement)element);
} catch ( Exception e ) {
LogUtils.handleException( e, logger );
}
}
}
return null;
}
public boolean isEnabled() {
return true;
}
public boolean isHandled() {
return true;
}
public void removeHandlerListener( IHandlerListener handlerListener ) {
}
public void propertyChanged( Object source, int propId ) {
try{
IJumboSpecmol specmol = Activator.getDefault().getJavaSpecmolManager().loadSpecmol( orignalFiles.get( source ) );
CMLCml cmlcml=specmol.getJumboObject();
if(source instanceof JChemPaintEditor){
//we update the children content provider content
orignalChildren.get( source ).removeChildren();
for(int i=0;i<cmlcml.getChildCount();i++){
if(cmlcml.getChild( i ) instanceof CMLMolecule){
cmlcml.replaceChild( cmlcml.getChild( i ),new CMLBuilder().parseString( ((JChemPaintEditor)source).getCDKMolecule().toCML()));
for(int k=0;k<cmlcml.getChild( i ).getChildCount();k++){
if(cmlcml.getChild( i ).getChild( k )!=null)
orignalChildren.get( source ).appendChild( cmlcml.getChild( i ).getChild( k ).copy() );
}
break;
}
}
}
if(source instanceof SpectrumEditor){
CMLSpectrum spectrum = ((SpectrumEditor)source).getSpectrum();
orignalChildren.get( source ).removeChildren();
if(spectrum.getId().indexOf( "bcspectrum" )==0){
cmlcml.replaceChild( cmlcml.getChildCMLElements( "spectrum" ).get( Integer.parseInt( spectrum.getId().substring( 10 ) ) ), spectrum );
for(int k=0;k<cmlcml.getChild( Integer.parseInt( spectrum.getId().substring( 10 )) ).getChildCount();k++){
if(cmlcml.getChild( Integer.parseInt( spectrum.getId().substring( 10 )) ).getChild( k )!=null)
orignalChildren.get( source ).appendChild( cmlcml.getChild( Integer.parseInt( spectrum.getId().substring( 10 )) ).getChild( k ).copy() );
}
}else{
for(int i=0;i<cmlcml.getChildCount();i++){
if(cmlcml.getChild( i ) instanceof CMLSpectrum && ((CMLSpectrum)cmlcml.getChild( i )).getId().equals( spectrum.getId())){
cmlcml.replaceChild( cmlcml.getChild( i ),spectrum);
for(int k=0;k<cmlcml.getChild( i ).getChildCount();k++){
if(cmlcml.getChild( i ).getChild( k )!=null)
orignalChildren.get( source ).appendChild( cmlcml.getChild( i ).getChild( k ).copy() );
}
break;
}
}
}
}
try{
//we update the file the edited content came from
orignalFiles.get( source ).setContents( new StringBufferInputStream(cmlcml.toXML()), IFile.FORCE,null);
}catch(IllegalArgumentException ex){
//for some reason, we get a strange error here when saving the change
//from changing the spectrum, but content is there, so we ignore this.
}
//TODO update specmoleditor
}catch(Exception ex){
LogUtils.handleException( ex, logger );
}
}
}