/******************************************************************************* * 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.editor.editparts.rule.tree; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.henshin.model.BinaryFormula; import org.eclipse.emf.henshin.model.Formula; import org.eclipse.emf.henshin.model.Graph; import org.eclipse.emf.henshin.model.HenshinPackage; import org.eclipse.emf.henshin.model.Rule; import org.eclipse.gef.Request; import org.eclipse.gef.editparts.AbstractTreeEditPart; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.IViewPart; import org.eclipse.ui.views.properties.IPropertySource; import de.tub.tfs.henshin.editor.model.properties.rule.LhsRhsPropertySource; import de.tub.tfs.henshin.editor.ui.condition.ConditionView; import de.tub.tfs.henshin.editor.ui.rule.RulePage; import de.tub.tfs.henshin.editor.ui.rule.RuleView; import de.tub.tfs.henshin.editor.util.FormulaUtil; import de.tub.tfs.henshin.editor.util.HenshinNotification; import de.tub.tfs.henshin.editor.util.ResourceUtil; import de.tub.tfs.henshin.model.layout.EContainerDescriptor; import de.tub.tfs.henshin.model.layout.HenshinLayoutFactory; import de.tub.tfs.muvitor.gef.editparts.AdapterTreeEditPart; import de.tub.tfs.muvitor.ui.MuvitorTreeEditor; /** * The Class LhsRhsTreeEditPart. * * @author Johann */ public class LhsRhsTreeEditPart extends AdapterTreeEditPart<Graph> { private final EContainerDescriptor graphElements; /** * @param model */ public LhsRhsTreeEditPart(Graph model) { super(model); Map<EClass, EStructuralFeature> elementsContainmentMap = new HashMap<EClass, EStructuralFeature>(); elementsContainmentMap.put(HenshinPackage.Literals.NODE, HenshinPackage.Literals.GRAPH__NODES); elementsContainmentMap.put(HenshinPackage.Literals.EDGE, HenshinPackage.Literals.GRAPH__EDGES); graphElements = HenshinLayoutFactory.eINSTANCE .createEContainerDescriptor(); graphElements.setContainer(model); graphElements.setContainmentMap(elementsContainmentMap); } /* * (non-Javadoc) * * @see * de.tub.tfs.muvitor.gef.editparts.AdapterTreeEditPart#getGraphicalViewModel * () */ @Override public EObject getGraphicalViewModel() { return (EObject) getParent().getModel(); } /* * (non-Javadoc) * * @see muvitorkit.gef.editparts.AdapterTreeEditPart#performOpen() */ @Override protected void performOpen() { MuvitorTreeEditor.showView((Rule) getParent().getModel()); super.performOpen(); } /* * (non-Javadoc) * * @see muvitorkit.gef.editparts.AdapterTreeEditPart#createPropertySource() */ @Override protected IPropertySource createPropertySource() { return new LhsRhsPropertySource(getCastedModel()); } /* * (non-Javadoc) * * @see * org.eclipse.gef.editparts.AbstractGraphicalEditPart#createEditPolicies() */ @Override protected void createEditPolicies() { } /* * (non-Javadoc) * * @see muvitorkit.gef.editparts.AdapterTreeEditPart#getText() */ @Override protected String getText() { return getCastedModel().getName(); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren() */ @Override protected List<Object> getModelChildren() { List<Object> list = new ArrayList<Object>(); if (isLhs()) { if (getCastedModel().getFormula() != null) { list.add(getCastedModel().getFormula()); } list.add(graphElements); } else { list.addAll(getCastedModel().getNodes()); list.addAll(getCastedModel().getEdges()); } return list; } /* * (non-Javadoc) * * @see * muvitorkit.gef.editparts.AdapterTreeEditPart#notifyChanged(org.eclipse * .emf.common.notify.Notification) */ @Override protected void notifyChanged(Notification notification) { final int eventType = notification.getEventType(); final Object oldValue = notification.getOldValue(); final Object newValue = notification.getNewValue(); switch (eventType) { case HenshinNotification.BINARY_FORMULA_SWAP: final ConditionView openedView = FormulaUtil .getOpenedConditionView((Formula) oldValue); if (openedView != null) { FormulaUtil.closeView(openedView); refreshChildren(); AbstractTreeEditPart childEditpart = findEditPartFor(newValue); if (childEditpart != null) { childEditpart.performRequest(new Request(REQ_OPEN)); } } break; case Notification.REMOVE: case Notification.ADD: case Notification.SET: if (oldValue instanceof Formula && !(oldValue instanceof BinaryFormula) && !(newValue instanceof BinaryFormula)) { FormulaUtil.closeConditionViewsShowing((Formula) oldValue); } List<IViewPart> viewsShowing = FormulaUtil.getViewsShowing(); for (IViewPart viewPart : viewsShowing) { if (viewPart instanceof RuleView) { final RulePage rulePage = ((RuleView) viewPart) .getCurrentRulePage(); rulePage.refreshFormula(); } } refreshChildren(); refreshVisuals(); default: break; } } /* * (non-Javadoc) * * @see * org.eclipse.gef.editparts.AbstractEditPart#understandsRequest(org.eclipse * .gef.Request) */ @Override public boolean understandsRequest(Request req) { return super.understandsRequest(req) && !REQ_DIRECT_EDIT.equals(req.getType()); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractTreeEditPart#getImage() */ @Override protected Image getImage() { return ResourceUtil.ICONS.GRAPH.img(18); } /** * Checks if is lhs. * * @return true, if is lhs */ private boolean isLhs() { Rule parent = getCastedModel().getRule(); return getCastedModel() == parent.getLhs(); } }