blob: e07d507131d7e0b271d2b25793f01cccfec7d542 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2002, 2008 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
*
* Contributors:
* IBM Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.gmf.runtime.diagram.ui.commands;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.transaction.Transaction;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.emf.workspace.AbstractEMFOperation;
import org.eclipse.gef.commands.Command;
import org.eclipse.gmf.runtime.common.core.util.Log;
import org.eclipse.gmf.runtime.common.core.util.StringStatics;
import org.eclipse.gmf.runtime.common.core.util.Trace;
import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIDebugOptions;
import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIPlugin;
import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIStatusCodes;
import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
import org.eclipse.gmf.runtime.notation.View;
/**
* Command that sets the view's mutability. if a view is Mutability state is used
* by the Diagram Listener to decide if a view can move from the transient childern
* list of its container to the persisted list. so a mutable view will never be persisted
* keep in mind that the mutability state of the view is a transient state so as soon as the
* model is closed and opened again all views will be immutable.
* @author mhanner
*/
public class SetViewMutabilityCommand extends Command {
/** cached non-persisted views. */
private List _viewAdapters = Collections.emptyList();
/** immutable flag. */
private boolean _immutable = true;
/**
* Creates a command instance.
* @param viewAdapter an <code>IAdaptable</code> that adapts to <code>View</code>
* @param immutable immutable state
*/
public SetViewMutabilityCommand(IAdaptable viewAdapter, boolean immutable) {
this( Collections.singletonList(viewAdapter), immutable );
}
/**
* Creates a command instance.
* @param viewAdapters a list of <code>IAdaptable</code> objects that adapts to <code>View</code>
* @param immutable immutable state
*/
public SetViewMutabilityCommand(List viewAdapters, boolean immutable) {
super( DiagramUIMessages.SetViewMutabilityCommand_Label);
Assert.isNotNull(viewAdapters);
_viewAdapters = viewAdapters;
_immutable = immutable;
}
/**
* Convenience method returning a command to make the supplied views mutable.
* @param viewAdapters views to be associated with the command
* @return <code>SetViewMutabilityCommand</code>
*/
public static SetViewMutabilityCommand makeMutable( List viewAdapters ) {
return new SetViewMutabilityCommand(viewAdapters, false);
}
/**
* Convenience method returning a command to make the supplied view mutable.
* @param viewAdapter view to be associated with the command
* @return <code>SetViewMutabilityCommand</code>
*/
public static SetViewMutabilityCommand makeMutable( IAdaptable viewAdapter) {
return new SetViewMutabilityCommand(viewAdapter, false);
}
/**
* Convenience method returning a command to make the supplied views immutable.
* @param viewAdapters views to be associated with the command
* @return <code>SetViewMutabilityCommand</code>
*/
public static SetViewMutabilityCommand makeImmutable( List viewAdapters ) {
return new SetViewMutabilityCommand(viewAdapters, true);
}
/**
* Convenience method returning a command to make the supplied view immutable.
* @param viewAdapter views to be associated with the command
* @return <code>SetViewMutabilityCommand</code>
*/
public static SetViewMutabilityCommand makeImmutable( IAdaptable viewAdapter) {
return new SetViewMutabilityCommand(viewAdapter, true);
}
/**
* gets an unmodifiable copy of the cached view adapters.
* @return view adapters
*/
protected List getViewAdapters() {
return Collections.unmodifiableList(_viewAdapters);
}
/* (non-Javadoc)
* @see org.eclipse.gef.commands.Command#execute()
*/
public void execute() {
setMutability(_immutable);
}
/** Set the mutability flag on all views. */
private void setMutability(final boolean immutable) {
if (!_viewAdapters.isEmpty()) {
TransactionalEditingDomain editingDomain = TransactionUtil
.getEditingDomain(((IAdaptable) _viewAdapters.get(0))
.getAdapter(View.class));
if (editingDomain != null) {
Map options = Collections.singletonMap(
Transaction.OPTION_UNPROTECTED, Boolean.TRUE);
AbstractEMFOperation operation = new AbstractEMFOperation(
editingDomain, StringStatics.BLANK, options) {
protected IStatus doExecute(IProgressMonitor monitor,
IAdaptable info)
throws ExecutionException {
Iterator adapters = _viewAdapters.iterator();
while (adapters.hasNext()) {
IAdaptable adapter = (IAdaptable) adapters.next();
View notationView = (View) adapter
.getAdapter(View.class);
if (notationView != null) {
notationView.setMutable(!immutable);
}
}
return Status.OK_STATUS;
}
};
try {
operation.execute(new NullProgressMonitor(), null);
} catch (ExecutionException e) {
Trace.catching(DiagramUIPlugin.getInstance(),
DiagramUIDebugOptions.EXCEPTIONS_CATCHING, getClass(),
"setMutability", e); //$NON-NLS-1$
Log.warning(DiagramUIPlugin.getInstance(),
DiagramUIStatusCodes.IGNORED_EXCEPTION_WARNING,
"setMutability", e); //$NON-NLS-1$
}
}
}
}
/**
* Returns the view that would be affected if this
* command were executed, undone, or redone.
* @return views adapter Collection
*/
public Collection getAffectedObjects() {
return getViewAdapters();
}
/* (non-Javadoc)
* @see org.eclipse.gef.commands.Command#redo()
*/
public void redo() {
setMutability(_immutable);
}
/* (non-Javadoc)
* @see org.eclipse.gef.commands.Command#undo()
*/
public void undo() {
setMutability(!_immutable);
}
}