/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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 * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.texteditors; import org.eclipse.core.runtime.CoreException; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.jboss.tools.common.core.resources.XModelObjectEditorInput; import org.jboss.tools.common.meta.action.XAction; import org.jboss.tools.common.meta.action.XActionInvoker; import org.jboss.tools.common.model.XModelException; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.event.XModelTreeEvent; import org.jboss.tools.common.model.event.XModelTreeListener; import org.jboss.tools.common.model.filesystems.impl.FolderImpl; import org.jboss.tools.common.model.util.XModelTreeListenerSWTSync; public class XMLTextEditorStandAlone extends XMLTextEditorComponent implements XModelTreeListener { protected XModelTreeListenerSWTSync syncListener = new XModelTreeListenerSWTSync(this); protected long timeStamp = -1; protected long lastModifiedTimeStamp = -1; public XMLTextEditorStandAlone() { isStandAlone = true; } public void init(IEditorSite site, IEditorInput input) throws PartInitException { super.init(site, XModelObjectEditorInput.checkInput(input)); } public void createPartControl(Composite parent) { super.createPartControl(parent); if(getModel() == null) { return; } XModelObject o = getModelObject(); setObject(o); if(o != null) o.getModel().addModelTreeListener(syncListener); } protected void doSetInput(IEditorInput input) throws CoreException { super.doSetInput(XModelObjectEditorInput.checkInput(input)); } public void doRevertToSaved() { super.doRevertToSaved(); updateDocument(); } public void dispose() { XModelObject o = getModelObject(); if(o != null) o.getModel().removeModelTreeListener(syncListener); super.dispose(); if(o != null && o.isModified() && o.isActive()) { try { XAction action = XActionInvoker.getAction("DiscardActions.Discard", o); //$NON-NLS-1$ if(action != null) { // to avoid confirmation action.executeHandler(o, null); } else if(o.getParent() instanceof FolderImpl) { ((FolderImpl)o.getParent()).discardChildFile(o); } } catch (XModelException e) { //ignore } } } boolean lock2 = false; public void nodeChanged(XModelTreeEvent event) { if(lock2) return; if(needsUpdate()) { Display.getDefault().syncExec(new U()); } } public void structureChanged(XModelTreeEvent event) { if(lock2) return; if(needsUpdate()) { Display.getDefault().syncExec(new U()); } } class U implements Runnable { public void run() { lock2 = true; update0(); while(needsUpdate()) { update0(); } lock2 = false; } } protected boolean needsUpdate() { XModelObject o = getModelObject(); if(/*o == object &&*/ (o == null || o.getTimeStamp() == timeStamp)) { if(o != null && o.getLastModificationTimeStamp() != lastModifiedTimeStamp) { if(!o.isModified()) lastModifiedTimeStamp = o.getLastModificationTimeStamp(); firePropertyChange(IEditorPart.PROP_DIRTY); updateModification(); } return false; } // object = o; timeStamp = (o == null) ? -1 : o.getTimeStamp(); return true; } public void update0() { updateDocument(); } }