/******************************************************************************* * Copyright (c) 2000, 2007 IBM Corporation and others. * 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 org.eclipse.dltk.internal.core; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IModelElementDelta; import org.eclipse.dltk.core.IProblemRequestor; import org.eclipse.dltk.core.ModelException; /** * Switch and ISourceModule to working copy mode and signal the working copy * addition through a delta. */ public class BecomeWorkingCopyOperation extends ModelOperation { final IProblemRequestor problemRequestor; /* * Creates a BecomeWorkingCopyOperation for the given working copy. * perOwnerWorkingCopies map is not null if the working copy is a shared * working copy. */ public BecomeWorkingCopyOperation(SourceModule workingCopy, IProblemRequestor problemRequestor) { super(new IModelElement[] { workingCopy }); this.problemRequestor = problemRequestor; } @Override protected void executeOperation() throws ModelException { // open the working copy now to ensure contents are that of the current // state of this element SourceModule workingCopy = getWorkingCopy(); // create if needed, record usage ModelManager.getModelManager().getPerWorkingCopyInfo(workingCopy, true, true, this.problemRequestor); workingCopy.openWhenClosed(workingCopy.createElementInfo(), this.progressMonitor); if (!workingCopy.isPrimary()) { // report added script delta for a non-primary working copy ModelElementDelta delta = new ModelElementDelta(this.getModel()); delta.added(workingCopy); addDelta(delta); } else { if (workingCopy.getResource().isAccessible()) { // report a F_PRIMARY_WORKING_COPY change delta for a primary // working copy ModelElementDelta delta = new ModelElementDelta(this.getModel()); delta.changed(workingCopy, IModelElementDelta.F_PRIMARY_WORKING_COPY); addDelta(delta); } else { // report an ADDED delta ModelElementDelta delta = new ModelElementDelta(this.getModel()); delta.added(workingCopy, IModelElementDelta.F_PRIMARY_WORKING_COPY); addDelta(delta); } } this.resultElements = new IModelElement[] { workingCopy }; } /* * Returns the working copy this operation is working on. */ protected SourceModule getWorkingCopy() { return (SourceModule) getElementToProcess(); } /* * @see ModelOperation#isReadOnly */ @Override public boolean isReadOnly() { return true; } }