/******************************************************************************* * Copyright (c) 2006-2012 * Software Technology Group, Dresden University of Technology * DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026 * * 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: * Software Technology Group - TU Dresden, Germany; * DevBoost GmbH - Berlin, Germany * - initial API and implementation ******************************************************************************/ package org.reuseware.coconut.compositionprogram.diagram.actions; import org.eclipse.emf.common.command.CommandStack; import org.eclipse.emf.transaction.RecordingCommand; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.InputDialog; import org.reuseware.coconut.compositionprogram.FragmentInstance; /** * Action for defining arguments as additional configuration of * fragment instances. An example for an argument is 'layoutStrategy' * interpreted by Lacome. */ public class SetArgumentAction extends FragmentInstanceAction { /** * @param action the action proxy that handles the presentation portion of the * action * * @see IActionDelegat#run(IAction) */ public void run(IAction action) { InputDialog argumentDialog = new InputDialog(shell, "Configure Attribute", "Enter name of attribute", proposeAttribute(selectedFragmentInstance), new IInputValidator() { public String isValid(String newText) { if (newText == null || newText.length() == 0) { return "Enter a valid attribute name"; } return null; } }); if (argumentDialog.open() != InputDialog.OK) { return; } final String argumentName = argumentDialog.getValue(); InputDialog valueDialog = new InputDialog(shell, "Enter Value", "Enter value for " + argumentName, proposeValue(selectedFragmentInstance, argumentName), new IInputValidator() { public String isValid(String newText) { if (newText == null || newText.length() == 0) { return "Enter a valid attribute value"; } return null; } }); if (valueDialog.open() != InputDialog.OK) { return; } final String attributeValue = valueDialog.getValue(); final FragmentInstance fragmentInstance = selectedFragmentInstance; TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(fragmentInstance); CommandStack commandStack = domain.getCommandStack(); synchronized (commandStack) { commandStack.execute(new RecordingCommand(domain) { protected void doExecute() { fragmentInstance.getArguments().put(argumentName, attributeValue); } }); } } private String proposeAttribute(FragmentInstance fragmentInstance) { String proposal = "newAttribute"; for (String attribute : fragmentInstance.getArguments().keySet()) { return attribute; } return proposal; } private String proposeValue(FragmentInstance fragmentInstance, String argumentName) { String proposal = fragmentInstance.getArguments().get(argumentName); return proposal == null ? "value" : proposal; } }