package org.archstudio.xarchadt.variability.ui; import java.util.List; import java.util.Set; import org.archstudio.xadl.XadlUtils; import org.archstudio.xadl3.variability_3_0.ChangeSet; import org.archstudio.xadl3.variability_3_0.Variability; import org.archstudio.xarchadt.ObjRef; import org.archstudio.xarchadt.XArchADTProxy; import org.archstudio.xarchadt.variability.IXArchADTVariability; import org.archstudio.xarchadt.variability.VariabilityUtils; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.Item; import com.google.common.collect.Lists; import com.google.common.collect.Sets; public class ChangeSetCellModifier implements ICellModifier { protected final TreeViewer viewer; protected final IXArchADTVariability xarch; public ChangeSetCellModifier(TreeViewer viewer, IXArchADTVariability xarch) { this.viewer = viewer; this.xarch = xarch; } @Override public boolean canModify(Object element, String property) { if ("Apply".equals(property)) { return true; } if ("View".equals(property)) { return true; } if ("Change Set".equals(property)) { return true; } return false; } @Override public Object getValue(Object element, String property) { if (element instanceof Item) { element = ((Item) element).getData(); } if ("Apply".equals(property)) { return true; } if ("View".equals(property)) { return true; } if ("Change Set".equals(property)) { return XadlUtils.getName(xarch, (ObjRef) element); } return null; } @Override public void modify(Object element, String property, Object value) { if (element instanceof Item) { element = ((Item) element).getData(); } try { if ("Apply".equals(property)) { ObjRef documentRootRef = xarch.getDocumentRootRef((ObjRef) element); if (documentRootRef != null) { List<ObjRef> appliedChangeSetRefs = xarch.getAppliedChangeSets(documentRootRef); if (!appliedChangeSetRefs.remove(element)) { Variability variability = VariabilityUtils.getVariability(xarch, documentRootRef); if (variability != null) { List<ChangeSet> appliedChangeSets = Lists.newArrayList(variability.getChangeSet()); Set<ChangeSet> filter = Sets.newHashSet(variability.getAppliedChangeSets()); filter.add((ChangeSet) XArchADTProxy.proxy(xarch, (ObjRef) element)); appliedChangeSets.retainAll(filter); appliedChangeSetRefs.clear(); appliedChangeSetRefs.addAll(XArchADTProxy.unproxy(appliedChangeSets)); } } xarch.applyChangeSets(documentRootRef, appliedChangeSetRefs); } } if ("View".equals(property)) { ObjRef documentRootRef = xarch.getDocumentRootRef((ObjRef) element); if (documentRootRef != null) { Set<ObjRef> explicitChangeSetRefs = xarch.getExplicitChangeSets(documentRootRef); if (!explicitChangeSetRefs.remove(element)) { explicitChangeSetRefs.add((ObjRef) element); } xarch.setExplicitChangeSets(documentRootRef, explicitChangeSetRefs); } } if ("Change Set".equals(property)) { if (value instanceof String) { xarch.set((ObjRef) element, "name", (String) value); } } } catch (Throwable e) { e.printStackTrace(); } } }