/*******************************************************************************
* 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.editparts.tree;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.henshin.model.HenshinFactory;
import org.eclipse.emf.henshin.model.HenshinPackage;
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.swt.graphics.Image;
import org.eclipse.swt.widgets.TreeItem;
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.editparts.tree.critical.CheckedRulePairFolder;
import de.tub.tfs.henshin.tggeditor.editparts.tree.graphical.GraphFolder;
import de.tub.tfs.henshin.tggeditor.editparts.tree.rule.RuleFolder;
import de.tub.tfs.henshin.tggeditor.util.IconUtil;
import de.tub.tfs.henshin.tggeditor.util.GraphicalNodeUtil;
import de.tub.tfs.muvitor.gef.editparts.AdapterTreeEditPart;
public class TransformationSystemTreeEditPart extends AdapterTreeEditPart<TGG> {
private CheckedRulePairFolder checkedRulePairFolder;
private ImportFolder importFolder;
private GraphFolder graphFolder;
public TransformationSystemTreeEditPart(TGG model) {
super(model);
}
@Override
protected String getText() {
//return getCastedModel().getName();
return "Transformation System";
}
@Override
protected List<EObject> getModelChildren() {
if (checkedRulePairFolder == null)
checkedRulePairFolder = new CheckedRulePairFolder(getCastedModel());
else
checkedRulePairFolder.update();
if (importFolder == null)
importFolder = new ImportFolder(getCastedModel());
else
importFolder.update();
if (graphFolder == null)
graphFolder = new GraphFolder((TGG)getCastedModel());
else
graphFolder.update();
List<EObject> list = new ArrayList<EObject>();
list.add(importFolder);
list.add(graphFolder);
//list.add(new RuleFolder(getCastedModel()));
//FTRules ftRules = new FTRules(getCastedModel());
//list.add(new FTRuleFolder(getCastedModel()));
List<Unit> l = new LinkedList<Unit>();
HashSet<IndependentUnit> folders = new HashSet<IndependentUnit>();
for (Unit unit : getCastedModel().getUnits()) {
if (unit instanceof IndependentUnit){
l.addAll(((IndependentUnit) unit).getSubUnits());
folders.add((IndependentUnit) unit);
}
}
list.addAll(getCastedModel().getUnits());
list.removeAll(l);
list.add(checkedRulePairFolder);
return list;
}
@Override
protected void notifyChanged(Notification notification) {
final int featureId = notification.getFeatureID(HenshinPackage.class);
if(notification.getEventType() == 9)
return ;
if (notification.getNotifier() != this.getCastedModel()){
sortRulesIntoCategories(getCastedModel());
for (Unit folder : getCastedModel().getUnits()) {
if (folder instanceof IndependentUnit && notification.getNotifier() != folder){
folder.eNotify(notification);
}
}
refresh();
return;
}
switch (featureId){
case HenshinPackage.MODULE__IMPORTS:
importFolder.update();
case HenshinPackage.MODULE__INSTANCES:
refreshChildren();
break;
case HenshinPackage.MODULE__UNITS:
sortRulesIntoCategories(getCastedModel());
for (Unit folder : getCastedModel().getUnits()) {
if (folder instanceof IndependentUnit){
folder.eNotify(notification);
}
}
refreshChildren();
break;
case HenshinPackage.MODULE__NAME:
refreshVisuals();
break;
case HenshinPackage.MODULE__DESCRIPTION:
break;
default:
// check that the TGGLayout of the transformation system is present (e.g. can disappear when another editor is in use)
if (GraphicalNodeUtil.getLayoutSystem(getCastedModel()) != null)
refresh();
break;
}
}
@Override
protected Image getImage() {
try {
return IconUtil.getIcon("transformationsystem18.png");
} catch (Exception e) {
return null;
}
}
@Override
protected void performOpen() {
if (this.widget instanceof TreeItem) {
TreeItem item = (TreeItem) this.widget;
item.setExpanded(!item.getExpanded());
}
}
public static void sortRulesIntoCategories(Module module){
module.eSetDeliver(false);
Unit ruleFolder = module.getUnit("unmarked Rules");
if (ruleFolder instanceof IndependentUnit){
if (((IndependentUnit) ruleFolder).getSubUnits().isEmpty())
module.getUnits().remove(ruleFolder);
}
ruleFolder = module.getUnit("RuleFolder");
if (!(ruleFolder instanceof IndependentUnit)){
if (ruleFolder != null){
ruleFolder.setName("Rule_" + ruleFolder.getName());
}
ruleFolder = HenshinFactory.eINSTANCE.createIndependentUnit();
ruleFolder.setName("RuleFolder");
ruleFolder.setDescription("ruleFolder.png");
module.getUnits().add(ruleFolder);
}
//NEW
ruleFolder = module.getUnit("ITRuleFolder");
if (!(ruleFolder instanceof IndependentUnit)){
if (ruleFolder != null){
ruleFolder.setName("ITRule_" + ruleFolder.getName());
}
ruleFolder = HenshinFactory.eINSTANCE.createIndependentUnit();
ruleFolder.setName("ITRuleFolder");
ruleFolder.setDescription("ITRules.png");
module.getUnits().add(ruleFolder);
}//NEW end
ruleFolder = module.getUnit("FTRuleFolder");
if (!(ruleFolder instanceof IndependentUnit)){
if (ruleFolder != null){
ruleFolder.setName("FTRule_" + ruleFolder.getName());
}
ruleFolder = HenshinFactory.eINSTANCE.createIndependentUnit();
ruleFolder.setName("FTRuleFolder");
ruleFolder.setDescription("FTRules.png");
module.getUnits().add(ruleFolder);
}
ruleFolder = module.getUnit("BTRuleFolder");
if (!(ruleFolder instanceof IndependentUnit)){
if (ruleFolder != null){
ruleFolder.setName("BTRule_" + ruleFolder.getName());
}
ruleFolder = HenshinFactory.eINSTANCE.createIndependentUnit();
ruleFolder.setName("BTRuleFolder");
ruleFolder.setDescription("BTRules.png");
module.getUnits().add(ruleFolder);
}
ruleFolder = module.getUnit("CCRuleFolder");
if (!(ruleFolder instanceof IndependentUnit)){
if (ruleFolder != null){
ruleFolder.setName("CCRule_" + ruleFolder.getName());
}
ruleFolder = HenshinFactory.eINSTANCE.createIndependentUnit();
ruleFolder.setName("CCRuleFolder");
ruleFolder.setDescription("CCRules.png");
module.getUnits().add(ruleFolder);
}
HashSet<Unit> ignored = new HashSet<Unit>();
for (Unit unit : module.getUnits()) {
if (unit instanceof IndependentUnit){
ignored.addAll(unit.getSubUnits(true));
}
}
Iterator<Unit> unitIter = module.getUnits().iterator();
while (unitIter.hasNext()) {
Unit unit = unitIter.next();
if (ignored.contains(unit))
continue;
if (!(unit instanceof IndependentUnit)){
ruleFolder = null;
if (unit instanceof Rule){
if (((TGGRule) unit).getMarkerType() == null){
ruleFolder = module.getUnit("unmarked Rules");
if (!(ruleFolder instanceof IndependentUnit)){
if (ruleFolder != null){
ruleFolder.setName("Rule_" + ruleFolder.getName());
}
ruleFolder = HenshinFactory.eINSTANCE.createIndependentUnit();
ruleFolder.setName("unmarked Rules");
ruleFolder.setDescription("rule.png");
module.getUnits().add(ruleFolder);
unitIter = module.getUnits().iterator();
}
} else if (((TGGRule) unit).getMarkerType().equals(RuleUtil.TGG_RULE)){
ruleFolder = module.getUnit("RuleFolder");
} else if (((TGGRule) unit).getMarkerType().equals(RuleUtil.TGG_FT_RULE)){
ruleFolder = module.getUnit("FTRuleFolder");
} else if (((TGGRule) unit).getMarkerType().equals(RuleUtil.TGG_BT_RULE)){
ruleFolder = module.getUnit("BTRuleFolder");
} else if (((TGGRule) unit).getMarkerType().equals(RuleUtil.TGG_CC_RULE)){
ruleFolder = module.getUnit("CCRuleFolder");
//NEW
}else if (((TGGRule) unit).getMarkerType().equals(RuleUtil.TGG_IT_RULE)){
ruleFolder = module.getUnit("ITRuleFolder");
}//NEW end
if (!((IndependentUnit)ruleFolder).getSubUnits().contains(unit))
((IndependentUnit)ruleFolder).getSubUnits().add(unit);
}
}
}
module.eSetDeliver(true);
}
}