package org.archstudio.xarchadt.variability.ui; import org.archstudio.swtutils.SWTWidgetUtils; import org.archstudio.xadl3.variability_3_0.Variability; import org.archstudio.xarchadt.IXArchADTModelListener; import org.archstudio.xarchadt.ObjRef; import org.archstudio.xarchadt.XArchADTModelEvent; import org.archstudio.xarchadt.XArchADTProxy; import org.archstudio.xarchadt.variability.IXArchADTVariability; import org.archstudio.xarchadt.variability.VariabilityUtils; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; public class ChangeSetContentProvider implements ITreeContentProvider, IXArchADTModelListener { protected final IXArchADTVariability xarch; protected Viewer viewer = null; protected ObjRef documentRootRef = null; protected Variability variability = null; public ChangeSetContentProvider(IXArchADTVariability xarch) { this.xarch = xarch; } @Override public void dispose() { viewer = null; documentRootRef = null; } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = viewer; this.documentRootRef = (ObjRef) newInput; this.variability = VariabilityUtils.getVariability(xarch, documentRootRef); } @Override public Object[] getElements(Object inputElement) { if (variability != null) { return XArchADTProxy.unproxy(variability.getChangeSet()).toArray(new ObjRef[0]); } return new ObjRef[0]; } @Override public Object getParent(Object element) { return null; } @Override public boolean hasChildren(Object element) { return false; } @Override public Object[] getChildren(Object parentElement) { return new Object[0]; } @Override public void handleXArchADTModelEvent(XArchADTModelEvent evt) { switch (evt.getEventType()) { case ADD: if (evt.getNewValuePath().equals("xADL/variability")) { inputChanged(viewer, this.documentRootRef, this.documentRootRef); } if (evt.getNewValuePath().equals("xADL/variability/changeSet")) { refresh(); } break; case REMOVE: if (evt.getOldValuePath().equals("xADL/variability/changeSet")) { refresh(); } break; default: break; } } boolean needsRefresh = false; private void refresh() { needsRefresh = true; SWTWidgetUtils.async(viewer, new Runnable() { @Override public void run() { if (needsRefresh) { needsRefresh = false; viewer.refresh(); } } }); } }