/******************************************************************************* * Copyright (c) 2010-2015 Henshin developers. 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: * TU Berlin, University of Luxembourg, SES S.A. *******************************************************************************/ package de.tub.tfs.henshin.tggeditor.actions.create.rule; import java.util.List; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.henshin.model.IndependentUnit; import org.eclipse.emf.henshin.model.Module; import org.eclipse.emf.henshin.model.Rule; import org.eclipse.emf.henshin.model.Unit; import org.eclipse.gef.EditPart; import org.eclipse.gef.ui.actions.SelectionAction; import org.eclipse.ui.IWorkbenchPart; import de.tub.tfs.henshin.tgg.TGG; import de.tub.tfs.henshin.tgg.TGGRule; import de.tub.tfs.henshin.tgg.interpreter.util.RuleUtil; import de.tub.tfs.henshin.tggeditor.commands.create.rule.GenerateOpRuleCommand; import de.tub.tfs.henshin.tggeditor.commands.create.rule.ProcessRuleCommand; import de.tub.tfs.henshin.tggeditor.editparts.tree.rule.RuleTreeEditPart; import de.tub.tfs.henshin.tggeditor.util.GraphicalNodeUtil; /** * The class GenerateOpRuleAction generates Translation-Rule from a simple Rule. The Action * is registered in the Contextmenu of the Tree Editor. * @see GenerateOpRuleToolBarAction * @see ProcessRuleCommand */ public abstract class GenerateOpRuleAction extends SelectionAction { /** The Constant DESC for the description. */ protected String DESC = "Generate Op_Rule"; /** The Constant TOOLTIP for the tooltip. */ protected String TOOLTIP = "Generates Operational Rule for this TGG Rule"; protected GenerateOpRuleCommand command; /** * The rule which is used as base for the FT-Rule. */ protected TGGRule rule; /** * the constructor * @param part */ public GenerateOpRuleAction(IWorkbenchPart part) { super(part); } /** Is only enabled for the context menu of a rule. * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#calculateEnabled() */ @Override protected boolean calculateEnabled() { List<?> selectedObjects = getSelectedObjects(); if (selectedObjects.size() != 1) { return false; } Object selectedObject = selectedObjects.get(0); if ((selectedObject instanceof EditPart)) { EditPart editpart = (EditPart) selectedObject; if (editpart instanceof RuleTreeEditPart) { rule = (TGGRule) editpart.getModel(); TGG layoutSystem = GraphicalNodeUtil.getLayoutSystem(rule); if(layoutSystem == null) return false; //NEW Gerard generalization from FT to op if (!GenerateOpRulesAction.calcInProgress) if(rule==null || !RuleUtil.TGG_RULE.equals(rule.getMarkerType())) { return false; } return true; } } return false; } /** * Executes the GenerateFTRuleCommand. * @see ProcessRuleCommand * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { IndependentUnit container = findContainer((IndependentUnit) ((Module)EcoreUtil.getRootContainer(rule)).getUnit("RuleFolder") ,rule); setCommand(rule, container); super.execute(command); } protected abstract void setCommand(Rule rule, IndependentUnit container); /** * Gets the rule. * * @return the rule */ private Rule getRule() { //TODO //NEW by Jerry: What if rule==null like in run? one has to get the module from somewhere else // ANSWER by Frank: method is not in use any more // return DialogUtil.runRuleChoiceDialog(getWorkbenchPart().getSite() // .getShell(),ModelUtil.getRules(rule.getModule()) ); return null; } private IndependentUnit findContainer(IndependentUnit ftFolder, Object obj) { for (Unit unit : ftFolder.getSubUnits()) { if (unit instanceof IndependentUnit) { IndependentUnit u = findContainer((IndependentUnit) unit, obj); if (u != null) return u; } else if (unit.equals(obj)) return ftFolder; } return null; } }