blob: c56441bb0e7193b33b3bc83caacfad375a23ea2b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Zeligsoft (2009) Limited 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:
* Young-Soo Roh - Initial API and implementation
*******************************************************************************/
package org.eclipse.papyrus.aas.tables.configurations.manager.cell;
import java.util.Collections;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.papyrus.infra.nattable.manager.cell.AbstractCellManager;
import org.eclipse.papyrus.infra.nattable.manager.table.INattableModelManager;
import org.eclipse.papyrus.infra.nattable.utils.AxisUtils;
import org.eclipse.uml2.common.util.UML2Util;
import org.eclipse.uml2.uml.Constraint;
import org.eclipse.uml2.uml.OpaqueExpression;
import org.eclipse.uml2.uml.Transition;
import org.eclipse.uml2.uml.Trigger;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.ValueSpecification;
/**
* Trigger guard cell manager.
*
* @author ysroh
*
*/
public class TriggerGuardCellManager extends AbstractCellManager {
/**
* @see org.eclipse.papyrus.infra.nattable.manager.cell.ICellManager#handles(java.lang.Object, java.lang.Object)
*
* @param columnElement
* @param rowElement
* @return
*/
@Override
public boolean handles(Object columnElement, Object rowElement, INattableModelManager tableManager) {
final Object row = AxisUtils.getRepresentedElement(rowElement);
final Object column = AxisUtils.getRepresentedElement(columnElement);
if (row instanceof Trigger && UMLPackage.Literals.TRANSITION__GUARD.equals(column)) {
return true;
}
return false;
}
/**
* @see org.eclipse.papyrus.infra.nattable.manager.cell.AbstractCellManager#isCellEditable(java.lang.Object, java.lang.Object)
*
* @param columnElement
* @param rowElement
* @return
*/
@Override
public boolean isCellEditable(Object columnElement, Object rowElement, INattableModelManager tableManager) {
final Object row = AxisUtils.getRepresentedElement(rowElement);
Object column = AxisUtils.getRepresentedElement(columnElement);
if (row instanceof Trigger && UMLPackage.Literals.TRANSITION__GUARD.equals(column)) {
return true;
}
return super.isCellEditable(columnElement, rowElement, tableManager);
}
/**
* @see org.eclipse.papyrus.infra.nattable.manager.cell.AbstractCellManager#doGetValue(java.lang.Object, java.lang.Object, org.eclipse.papyrus.infra.nattable.manager.table.INattableModelManager)
*
* @param columnElement
* @param rowElement
* @param tableManager
* @return
*/
@Override
protected Object doGetValue(Object columnElement, Object rowElement, INattableModelManager tableManager) {
Trigger trigger = (Trigger) AxisUtils.getRepresentedElement(rowElement);
Constraint guard = getTriggerGuard(trigger, false);
if (guard != null && guard.getSpecification() != null) {
ValueSpecification spec = guard.getSpecification();
if (spec instanceof OpaqueExpression) {
if (!((OpaqueExpression) spec).getBodies().isEmpty()) {
return ((OpaqueExpression) spec).getBodies().get(0);
}
}
}
return "";
}
/**
* Get or create trigger guard.
*
* @param rowElement
* row element
* @param createOnDemand
* create if true
* @return trigger guard
*/
private Constraint getTriggerGuard(Trigger trigger, boolean createOnDemand) {
Transition transition = (Transition) trigger.eContainer();
Constraint result = CodeSnippetUtils.getTriggerGuard(trigger);
if (result == null && createOnDemand) {
result = CodeSnippetUtils.createGuard(transition, Collections.singletonList(trigger));
}
return result;
}
/**
* @see org.eclipse.papyrus.infra.nattable.manager.cell.AbstractCellManager#setValue(org.eclipse.emf.transaction.TransactionalEditingDomain, java.lang.Object, java.lang.Object, java.lang.Object,
* org.eclipse.papyrus.infra.nattable.manager.table.INattableModelManager)
*
* @param domain
* @param columnElement
* @param rowElement
* @param newValue
* @param tableManager
*/
@Override
public void setValue(TransactionalEditingDomain domain, Object columnElement, Object rowElement, Object newValue, INattableModelManager tableManager) {
Trigger trigger = (Trigger) AxisUtils.getRepresentedElement(rowElement);
if (UML2Util.isEmpty(newValue.toString())) {
// remove guard if empty
Constraint guard = getTriggerGuard(trigger, false);
if (guard != null) {
guard.destroy();
}
} else {
Constraint guard = getTriggerGuard(trigger, true);
ValueSpecification valueSpec = guard.getSpecification();
if (valueSpec != null && !(valueSpec instanceof OpaqueExpression)) {
// trigger guard spec should be opaque expression
valueSpec.destroy();
valueSpec = null;
}
if (valueSpec == null) {
valueSpec = CodeSnippetUtils.createOpaqueExpressionWithDefaultLanguage(trigger);
guard.setSpecification(valueSpec);
}
OpaqueExpression op = (OpaqueExpression) valueSpec;
if (op.getBodies().isEmpty()) {
op.getBodies().add(newValue.toString());
} else {
String oldValue = op.getBodies().get(0);
if (!oldValue.equals(newValue)) {
op.getBodies().clear();
op.getBodies().add(newValue.toString());
}
}
}
}
}