blob: a11cda8ef556f9eb8a67e6db0068a806bfeb1808 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2019 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Nicolas Bros (Mia-Software) - initial API and implementation
* Gregoire Dupe (Mia-Software) - Bug 404263 - EditingDomainProvider does not work when using IResourceEditorInput
*******************************************************************************/
package org.eclipse.modisco.infra.browser.editors;
import java.util.EventObject;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStack;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.modisco.infra.browser.uicore.internal.model.ModelElementItem;
/**
* This editing domain associates each command with the editor selection at the
* time it was issued. This is useful because the command only deals with
* EObjects, whereas the editor selection contains {@link ModelElementItem}s,
* which we need when we want to select the elements affected by a command.
*/
public class BrowserEditingDomain extends AdapterFactoryEditingDomain implements
CommandStackListener {
private final EcoreBrowser ecoreBrowser;
private final Map<Command, Object> commandSelections = new HashMap<Command, Object>();
public BrowserEditingDomain(final ComposedAdapterFactory adapterFactoryWithRegistry,
final CommandStack commandStack, final HashMap<Resource, Boolean> hashMap,
final EcoreBrowser ecoreBrowser) {
super(adapterFactoryWithRegistry, commandStack, hashMap);
commandStack.addCommandStackListener(this);
this.ecoreBrowser = ecoreBrowser;
}
public BrowserEditingDomain(final ComposedAdapterFactory adapterFactoryWithRegistry,
final CommandStack commandStack, final ResourceSet resourceSet,
final EcoreBrowser ecoreBrowser) {
super(adapterFactoryWithRegistry, commandStack, resourceSet);
commandStack.addCommandStackListener(this);
this.ecoreBrowser = ecoreBrowser;
}
@Override
public Command createCommand(final Class<? extends Command> commandClass,
final CommandParameter commandParameter) {
Command command = super.createCommand(commandClass, commandParameter);
ISelection editorSelection = this.ecoreBrowser.getEditorSelection();
if (editorSelection instanceof ITreeSelection) {
ITreeSelection treeSelection = (ITreeSelection) editorSelection;
this.commandSelections.put(command, treeSelection.getFirstElement());
}
return command;
}
public Object getEditorSelectionForCommand(final Command command) {
return this.commandSelections.get(command);
}
public void commandStackChanged(final EventObject event) {
// when the command stack is flushed, clear the selections map
CommandStack theCommandStack = getCommandStack();
if (theCommandStack.getMostRecentCommand() == null) {
this.commandSelections.clear();
}
}
}