package org.archstudio.xarchadt.variability.ui;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.archstudio.archipelago2.ObjRefTransfer;
import org.archstudio.eclipse.ui.views.AbstractArchStudioView;
import org.archstudio.myx.fw.MyxRegistry;
import org.archstudio.swtutils.SWTWidgetUtils;
import org.archstudio.sysutils.DelayedExecuteOnceThread;
import org.archstudio.sysutils.SystemUtils;
import org.archstudio.xadl.XadlUtils;
import org.archstudio.xadl3.variability_3_0.ChangeSet;
import org.archstudio.xadl3.variability_3_0.JavaTransformChangeSetOfChanges;
import org.archstudio.xadl3.variability_3_0.Variability;
import org.archstudio.xadl3.variability_3_0.Variability_3_0Package;
import org.archstudio.xarchadt.IXArchADT;
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.ChangeSetTransform;
import org.archstudio.xarchadt.variability.IXArchADTVariability;
import org.archstudio.xarchadt.variability.VariabilityUtils;
import org.archstudio.xarchadt.variability.ui.actions.AddChangeSetAction;
import org.archstudio.xarchadt.variability.ui.actions.IHasXArchRef;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.INullSelectionListener;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.osgi.framework.Bundle;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
public class VariabilityViewPart extends AbstractArchStudioView<VariabilityMyxComponent> implements ISelectionProvider,
IXArchADTModelListener, IPartListener, ISelectionChangedListener, INullSelectionListener, Listener {
List<ISelectionChangedListener> selectionChangedListeners = Lists.newCopyOnWriteArrayList();
List<ObjRef> selectedRefs = new ArrayList<ObjRef>();
IAction overviewModeAction = null;
protected static GridData excludeGridData() {
GridData d = new GridData();
d.exclude = true;
return d;
}
protected static void addCellEditor(TreeViewer viewer, CellEditor editor) {
CellEditor[] editors = viewer.getCellEditors();
if (editors == null) {
editors = new CellEditor[0];
}
CellEditor[] newEditors = new CellEditor[editors.length + 1];
System.arraycopy(editors, 0, newEditors, 0, editors.length);
newEditors[newEditors.length - 1] = editor;
viewer.setCellEditors(newEditors);
}
protected static void addColumnProperty(TreeViewer viewer, String property) {
String[] properties = (String[]) viewer.getColumnProperties();
if (properties == null) {
properties = new String[0];
}
String[] newProperties = new String[properties.length + 1];
System.arraycopy(properties, 0, newProperties, 0, properties.length);
newProperties[newProperties.length - 1] = property;
viewer.setColumnProperties(newProperties);
}
protected static int indexOf(Item[] items, Object element) {
for (int i = 0; i < items.length; i++) {
if (SystemUtils.nullEquals(items[i].getData(), element)) {
return i;
}
}
return -1;
}
protected IXArchADTVariability xarch;
protected TreeViewer changeSetViewer = null;
protected ChangeSetSorter changeSetSorter = null;
protected ChangeSetLabelProvider changeSetLabelProvider = null;
protected Composite notificationComposite = null;
protected Object ignoreEventsLock = new Object();
protected int ignoreChangeSetSelectionEvents = 0;
public VariabilityViewPart() {
super(VariabilityMyxComponent.class);
}
protected Collection<Object> myxMapped = new ArrayList<Object>();
protected void myxMap(Object o) {
if (o != null) {
myxMapped.add(o);
MyxRegistry.getSharedInstance().registerObject(brick, o);
}
}
@Override
public void handleEvent(Event event) {
if (hideSelection) {
event.detail &= ~SWT.SELECTED;
event.detail &= ~SWT.FOCUSED;
event.detail &= ~SWT.HOT;
event.detail |= SWT.BACKGROUND;
event.detail |= SWT.FOREGROUND;
if (event.item instanceof TreeItem) {
Tree tree = (Tree) event.widget;
TreeItem treeItem = (TreeItem) event.item;
int column = event.index;
TreeColumn treeColumn = tree.getColumn(column);
CellLabelProvider labelProvider = changeSetViewer.getLabelProvider(column);
Object data = treeColumn.getData();
if (data == null) {
data = treeItem.getData();
}
if (labelProvider instanceof IColorProvider) {
IColorProvider colorProvider = (IColorProvider) labelProvider;
Color fc = colorProvider.getForeground(data);
if (fc != null) {
event.gc.setForeground(fc);
}
Color bc = colorProvider.getBackground(data);
if (bc != null) {
event.gc.setBackground(bc);
event.gc.fillRectangle(event.gc.getClipping());
}
}
}
}
}
protected void createMainMyxPartControl(Composite parent) {
changeSetViewer = new TreeViewer(parent, SWT.MULTI | SWT.FULL_SELECTION) {
boolean needsLabelUpdate = false;
DelayedExecuteOnceThread labelUpdater = null;
@Override
protected synchronized void handleLabelProviderChanged(LabelProviderChangedEvent event) {
/*
* We catch calls to this method and then perform a single call at a later time.
*/
if (labelUpdater == null) {
labelUpdater = new DelayedExecuteOnceThread(250, new Runnable() {
@Override
public void run() {
SWTWidgetUtils.async(changeSetViewer, new Runnable() {
@Override
public void run() {
superHandleLabelProviderChanged(new LabelProviderChangedEvent(changeSetViewer
.getLabelProvider()));
}
});
}
});
labelUpdater.start();
}
needsLabelUpdate = true;
labelUpdater.execute();
}
private void superHandleLabelProviderChanged(LabelProviderChangedEvent event) {
if (needsLabelUpdate) {
needsLabelUpdate = false;
super.handleLabelProviderChanged(event);
}
}
};
changeSetViewer.getTree().addListener(SWT.EraseItem, this);
//changeSetViewer.getTree().addListener(SWT.PaintItem, this);
changeSetViewer.getControl().setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
changeSetViewer.setUseHashlookup(true);
changeSetViewer.setContentProvider(new ChangeSetContentProvider(xarch));
changeSetViewer.setComparator(changeSetSorter = new ChangeSetSorter(xarch));
changeSetViewer.setLabelProvider(changeSetLabelProvider = new ChangeSetLabelProvider(changeSetViewer, xarch));
changeSetViewer.setCellModifier(new ChangeSetCellModifier(changeSetViewer, xarch));
changeSetViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
synchronized (ignoreEventsLock) {
if (ignoreChangeSetSelectionEvents > 0) {
ignoreChangeSetSelectionEvents--;
return;
}
}
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection) {
ObjRef csRef = null;
IStructuredSelection ss = (IStructuredSelection) selection;
if (ss.size() == 1) {
csRef = (ObjRef) ss.getFirstElement();
}
ObjRef xArchRef = (ObjRef) changeSetViewer.getInput();
if (xArchRef != null) {
if (xarch.isChangeSetsEnabled(xArchRef)) {
xarch.setActiveChangeSet(xArchRef, csRef);
}
}
}
}
});
changeSetViewer.addOpenListener(new IOpenListener() {
@Override
public void open(OpenEvent event) {
for (Object element : ((IStructuredSelection) event.getSelection()).toArray()) {
changeSetViewer.getCellModifier().modify(element, "Apply",
!xarch.getAppliedChangeSets((ObjRef) changeSetViewer.getInput()).contains(element));
}
}
});
changeSetViewer.addSelectionChangedListener(this);
changeSetViewer.addDragSupport(DND.DROP_MOVE, new Transfer[] { ObjRefTransfer.getInstance() },
new DragSourceAdapter() {
ObjRef[] data = null;
@Override
@SuppressWarnings("unchecked")
public void dragStart(DragSourceEvent event) {
ISelection selection = changeSetViewer.getSelection();
if (selection instanceof IStructuredSelection) {
data = (ObjRef[]) ((IStructuredSelection) selection).toList().toArray(new ObjRef[0]);
}
event.doit &= data != null;
// it seems like this should be done automatically!?
if (changeSetViewer.isCellEditorActive()) {
for (CellEditor e : changeSetViewer.getCellEditors()) {
if (e != null) {
e.deactivate();
}
}
}
}
@Override
public void dragSetData(DragSourceEvent event) {
if (ObjRefTransfer.getInstance().isSupportedType(event.dataType) && data != null) {
event.data = data.clone();
}
}
@Override
public void dragFinished(DragSourceEvent event) {
if (!event.doit) {
return;
}
}
});
changeSetViewer.addDropSupport(DND.DROP_MOVE, new Transfer[] { ObjRefTransfer.getInstance() },
new ViewerDropAdapter(changeSetViewer) {
@Override
protected int determineLocation(DropTargetEvent event) {
if (!(event.item instanceof Item)) {
return ViewerDropAdapter.LOCATION_NONE;
}
Item item = (Item) event.item;
Point coordinates = new Point(event.x, event.y);
coordinates = changeSetViewer.getControl().toControl(coordinates);
if (item != null) {
Rectangle bounds = getBounds(item);
if (bounds == null) {
return ViewerDropAdapter.LOCATION_NONE;
}
if (coordinates.y - (bounds.y + bounds.height / 2) < 0) {
return ViewerDropAdapter.LOCATION_BEFORE;
}
else {
return ViewerDropAdapter.LOCATION_AFTER;
}
}
return ViewerDropAdapter.LOCATION_ON;
}
@Override
public boolean validateDrop(Object target, int operation, TransferData transferType) {
return ObjRefTransfer.getInstance().isSupportedType(transferType);
}
@Override
public boolean performDrop(Object data) {
if (data instanceof ObjRef[] && ((ObjRef[]) data).length > 0) {
ObjRef[] dataRefs = (ObjRef[]) data;
if (XadlUtils.isInstanceOf(xarch, dataRefs[0], Variability_3_0Package.Literals.CHANGE_SET)) {
int newIndex = indexOf(changeSetViewer.getTree().getItems(), getCurrentTarget());
if (newIndex >= 0) {
if (getCurrentLocation() == ViewerDropAdapter.LOCATION_AFTER) {
newIndex++;
}
move(xarch, xarch.getParent(dataRefs[0]), dataRefs, -newIndex - 1);
return true;
}
}
}
return false;
}
private void move(IXArchADTVariability xarch, ObjRef variabilityRef, ObjRef[] changeSetRefs,
int index) {
Variability variability = XArchADTProxy.proxy(xarch, variabilityRef);
List<ChangeSet> newChangeSets = Lists.newArrayList(variability.getChangeSet());
List<ChangeSet> movedChangeSets = XArchADTProxy.proxy(xarch, changeSetRefs);
// reorder change sets
newChangeSets.add(index < 0 ? newChangeSets.size() + index + 1 : index, null);
newChangeSets.removeAll(movedChangeSets);
newChangeSets.addAll(newChangeSets.indexOf(null), Lists.reverse(movedChangeSets));
newChangeSets.remove(null);
variability.getChangeSet().clear();
variability.getChangeSet().addAll(newChangeSets);
// apply change sets in new order
List<ChangeSet> appliedChangeSets = variability.getAppliedChangeSets();
Set<ChangeSet> appliedChangeSetsSet = Sets.newHashSet(appliedChangeSets);
newChangeSets.retainAll(appliedChangeSetsSet);
xarch.applyChangeSets(xarch.getDocumentRootRef(variabilityRef),
XArchADTProxy.unproxy(newChangeSets));
}
});
// Tree tree = changeSetViewer.getTree();
// tree.setHeaderVisible(true);
// tree.setLinesVisible(true);
// //tree.setLayout(new TableLayout());
//
// TreeViewerColumn vColumn;
// TreeColumn tColumn;
//
// vColumn = new TreeViewerColumn(changeSetViewer, SWT.LEFT);
// vColumn.setEditingSupport(new
// ChangeSetColumnEditorSupport(changeSetViewer, xarch));
// vColumn.setLabelProvider(new ChangeSetColumnLabelProvider(xarch));
// tColumn = vColumn.getColumn();
// tColumn.setText("Change Set");
// tColumn.setAlignment(SWT.LEFT);
// tColumn.setMoveable(false);
// tColumn.setResizable(true);
// tColumn.setWidth(20);
Tree tree = changeSetViewer.getTree();
TreeColumn column;
CellEditor editor;
TableLayout layout = new TableLayout();
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
tree.setLayout(layout);
/*
* Feature in Windows. The first column in a windows table reserves room for a check box. The fix is to have
* this column with a width of zero to hide it.
*/
column = new TreeColumn(tree, SWT.CENTER);
column.setText("Windows first column fix");
column.setImage(null);
column.setResizable(false);
column.setAlignment(SWT.CENTER);
layout.addColumnData(new ColumnPixelData(1, column.getResizable()));
editor = null;
addCellEditor(changeSetViewer, editor);
addColumnProperty(changeSetViewer, column.getText());
column = new TreeColumn(tree, SWT.CENTER);
column.setText("");
//column.setImage(XArchCSActivator.getDefault().getImageRegistry().get("res/icons/applied.gif"));
column.setResizable(false);
column.setAlignment(SWT.CENTER);
layout.addColumnData(new ColumnPixelData(20, column.getResizable()));
editor = new CheckboxCellEditor(tree);
addCellEditor(changeSetViewer, editor);
addColumnProperty(changeSetViewer, "Apply");
column = new TreeColumn(tree, SWT.CENTER);
column.setText("");
//column.setImage(XArchCSActivator.getDefault().getImageRegistry().get("res/icons/explicit.gif"));
column.setResizable(false);
column.setAlignment(SWT.CENTER);
layout.addColumnData(new ColumnPixelData(20, column.getResizable()));
editor = new CheckboxCellEditor(tree);
addCellEditor(changeSetViewer, editor);
addColumnProperty(changeSetViewer, "View");
column = new TreeColumn(tree, SWT.LEFT);
column.setText("Change Set");
column.setResizable(true);
column.setAlignment(SWT.LEFT);
layout.addColumnData(new ColumnWeightData(1, column.getResizable()));
editor = new TextCellEditor(tree);
addCellEditor(changeSetViewer, editor);
addColumnProperty(changeSetViewer, column.getText());
ObjRef xArchRef = null;
IEditorPart editorPart = getSite().getPage().getActiveEditor();
if (editorPart != null && editorPart.getEditorInput() instanceof IURIEditorInput) {
IURIEditorInput uriEditorInput = (IURIEditorInput) editorPart.getEditorInput();
xArchRef = xarch.getDocumentRootRef(URI.createURI(uriEditorInput.getURI().toString()));
}
setInput(xArchRef);
getViewSite().getActionBars().getToolBarManager().add(new AddChangeSetAction(xarch));
getViewSite().getActionBars().updateActionBars();
MenuManager contextMenuManager = new MenuManager();
contextMenuManager.setRemoveAllWhenShown(true);
contextMenuManager.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
final ObjRef changeSetRef = (ObjRef) ((IStructuredSelection) changeSetViewer.getSelection())
.getFirstElement();
if (XadlUtils.isInstanceOf(xarch, changeSetRef,
Variability_3_0Package.Literals.TRANSFORM_CHANGE_SET_OF_CHANGES)) {
manager.add(new Action("Apply Transform") {
@Override
public void run() {
applyTransform(changeSetRef);
}
});
}
else {
Action a = new Action("Apply Transform") {
@Override
public void run() {
}
};
a.setEnabled(false);
manager.add(a);
}
}
});
Menu menu = contextMenuManager.createContextMenu(changeSetViewer.getControl());
changeSetViewer.getControl().setMenu(menu);
getSite().registerContextMenu(contextMenuManager, changeSetViewer);
/*
* This needs to be here since we always want to update the change sets viewer before the relationships viewer.
*/
myxMap(this);
myxMap(changeSetViewer.getContentProvider());
myxMap(changeSetViewer.getLabelProvider());
myxMap(changeSetViewer.getSorter());
getViewSite().setSelectionProvider(this);
IMenuManager menuManager = getViewSite().getActionBars().getMenuManager();
overviewModeAction = new Action("Overview Mode", IAction.AS_CHECK_BOX) {
@Override
public void run() {
ObjRef xArchRef = (ObjRef) changeSetViewer.getInput();
if (xArchRef != null) {
xarch.setOverviewModeEnabled(xArchRef, !xarch.isOverviewModeEnabled(xArchRef));
overviewModeAction.setChecked(xarch.isOverviewModeEnabled(xArchRef));
}
}
};
menuManager.add(overviewModeAction);
// IAction diffToExternalFile = new Action("(Experimental) Create Diff to External File") {
//
//
// public void run() {
// FileDialog fileDialog = new FileDialog(changeSetViewer.getControl().getShell(), SWT.OPEN);
// fileDialog.setFilterExtensions(new String[] { "*.xml" });
// fileDialog.setFilterNames(new String[] { "XML Files (*.xml)" });
// fileDialog.setText("Select File");
// fileDialog.open();
// String fileName = fileDialog.getFileName();
// String filePath = fileDialog.getFilterPath();
// if (fileName != null && !"".equals(fileName.trim())) {
// try {
// ObjRef targetXArchRef = xarch.parseFromFile(filePath + java.io.File.separator + fileName);
// ObjRef sourceXArchRef = (ObjRef) changeSetViewer.getInput();
// xarch.diffToExternalFile(sourceXArchRef, targetXArchRef);
// }
// catch (Exception e) {
// MessageDialog.openError(changeSetViewer.getControl().getShell(), "Error", e.getMessage());
// }
// }
// }
// };
// menuManager.add(diffToExternalFile);
// IAction diffFromExternalFile = new
// Action("Create Diff from External File"){
//
//
// public void run(){
// FileDialog fileDialog = new
// FileDialog(changeSetViewer.getControl().getShell(), SWT.OPEN);
// fileDialog.setFilterExtensions(new String[]{"*.xml"});
// fileDialog.setFilterNames(new String[]{"XML Files (*.xml)"});
// fileDialog.open();
// String fileName = fileDialog.getFileName();
// String filePath = fileDialog.getFilterPath();
// if(fileName != null && !"".equals(fileName.trim())){
// try{
// ObjRef targetXArchRef = xarch.parseFromFile(filePath +
// java.io.File.separator + fileName);
// ObjRef sourceXArchRef = (ObjRef)changeSetViewer.getInput();
// xarch.diffFromExternalFile(sourceXArchRef, targetXArchRef);
// }
// catch(Exception e){
// String[] labels = {"Ok"};
// MessageDialog dialog = new
// MessageDialog(changeSetViewer.getControl().getShell(), "Error", null,
// e.getMessage(), MessageDialog.ERROR, labels, 0);
// dialog.open();
// }
// }
// }
// };
// menuManager.add(diffFromExternalFile);
}
private void applyTransform(ObjRef transformChangeSetRef) {
JavaTransformChangeSetOfChanges javaTransformChangeSet = XArchADTProxy.proxy(xarch, transformChangeSetRef);
ObjRef documentRootRef = xarch.getDocumentRootRef(transformChangeSetRef);
/*
* There are three possibilities for how this is run: (1) as a plug-in project in the current workspace, (2) as
* a java project in the current workspace, and (3) as an installed plugin in the current runtime environment.
*
* TODO: We only support (3) right now...
*/
try {
Bundle b = null;
for (Bundle b2 : Activator.getContext().getBundles()) {
if (b2.getSymbolicName().equals(javaTransformChangeSet.getBundle())) {
b = b2;
break;
}
}
@SuppressWarnings("unchecked")
final Class<ChangeSetTransform> c = (Class<ChangeSetTransform>) b.loadClass(javaTransformChangeSet
.getClass_());
VariabilityUtils.updateDynamicChangeSet(xarch, documentRootRef, transformChangeSetRef,
new ChangeSetTransform() {
@Override
public void transform(IXArchADT xarch, ObjRef documentRootRef) {
try {
c.newInstance().transform(xarch, documentRootRef);
}
catch (Throwable t) {
throw new RuntimeException(t);
}
}
});
}
catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void createPartControl(Composite parent) {
xarch = brick.xarch;
parent.setLayout(new GridLayout());
notificationComposite = new Composite(parent, SWT.BORDER);
notificationComposite.setLayoutData(excludeGridData());
notificationComposite.setVisible(false);
createMainMyxPartControl(parent);
getSite().getWorkbenchWindow().getPartService().addPartListener(this);
getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(this);
updateStatus();
}
protected boolean hideSelection = false;
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
// hideSelection = false;
// if (this != part) {
// ObjRef[] selectedRefs = HasObjRefUtil.getObjRefs(selection);
// if (selectedRefs.length <= 1) {
// ObjRef selectedRef = selectedRefs.length > 0 ? selectedRefs[0] : null;
// hideSelection = true;
// changeSetLabelProvider.setChangeColors(selectedRef);
// return;
// }
// changeSetLabelProvider.setChangeColors(null);
// }
}
@Override
public void dispose() {
for (Object o : myxMapped) {
MyxRegistry.getSharedInstance().unregisterObject(brick, o);
}
getSite().getWorkbenchWindow().getPartService().removePartListener(this);
getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(this);
super.dispose();
}
@Override
public void setFocus() {
changeSetViewer.getControl().setFocus();
}
// public void handleXArchChangeSetEvent(final XArchChangeSetEvent evt) {
// if (evt.getEventType() == XArchChangeSetEvent.ChangeSetEventType.UPDATED_ACTIVE_CHANGE_SET) {
// SWTWidgetUtils.async(changeSetViewer, new Runnable() {
//
// public void run() {
// if (equalz(evt.getXArchRef(), changeSetViewer.getInput())) {
// ObjRef activeChangeSetRef = evt.getActiveChangeSet();
// StructuredSelection selection = StructuredSelection.EMPTY;
// if (activeChangeSetRef != null) {
// selection = new StructuredSelection(activeChangeSetRef);
// }
// ignoreChangeSetSelectionEvents++;
// changeSetViewer.setSelection(selection);
// }
// }
// });
// }
// if (evt.getEventType() == XArchChangeSetEvent.ChangeSetEventType.UPDATED_ENABLED) {
// SWTWidgetUtils.async(changeSetViewer, new Runnable() {
//
// public void run() {
// if (equalz(evt.getXArchRef(), changeSetViewer.getInput())) {
// updateStatus();
// }
// }
// });
// }
// }
@Override
public void handleXArchADTModelEvent(XArchADTModelEvent evt) {
if (changeSetSorter != null) {
changeSetSorter.handleXArchADTModelEvent(evt);
}
}
protected void setInput(ObjRef xArchRef) {
if (!SystemUtils.nullEquals(changeSetViewer.getInput(), xArchRef)) {
changeSetViewer.setInput(xArchRef);
changeSetLabelProvider.refresh();
updateStatus();
}
}
@Override
public void partActivated(final IWorkbenchPart part) {
if (part instanceof IEditorPart) {
IEditorPart editorPart = (IEditorPart) part;
if (editorPart.getEditorInput() instanceof IURIEditorInput) {
IURIEditorInput uriEditorInput = (IURIEditorInput) editorPart.getEditorInput();
setInput(xarch.getDocumentRootRef(URI.createURI(uriEditorInput.getURI().toString())));
}
}
}
@Override
public void partDeactivated(IWorkbenchPart part) {
}
@Override
public void partClosed(final IWorkbenchPart part) {
if (part instanceof IEditorPart) {
IEditorPart editorPart = (IEditorPart) part;
if (editorPart.getEditorInput() instanceof IURIEditorInput) {
IURIEditorInput uriEditorInput = (IURIEditorInput) editorPart.getEditorInput();
ObjRef xArchRef = xarch.getDocumentRootRef(URI.createURI(uriEditorInput.getURI().toString()));
if (xArchRef == null || xArchRef.equals(changeSetViewer.getInput())) {
setInput(null);
}
}
}
else {
setInput(null);
}
}
@Override
public void partBroughtToTop(IWorkbenchPart part) {
}
@Override
public void partOpened(IWorkbenchPart part) {
}
protected void updateStatus() {
boolean enabled = false;
for (Control c : notificationComposite.getChildren()) {
c.dispose();
}
ObjRef xArchRef = (ObjRef) changeSetViewer.getInput();
if (xArchRef == null) {
notificationComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
notificationComposite.setVisible(true);
notificationComposite.setLayout(new GridLayout());
notificationComposite.setBackground(notificationComposite.getDisplay().getSystemColor(SWT.COLOR_WHITE));
Label message = new Label(notificationComposite, SWT.CENTER | SWT.WRAP);
message.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
message.setText("Open a xADL document to use change sets.");
message.setBackground(notificationComposite.getBackground());
message.setForeground(message.getDisplay().getSystemColor(SWT.COLOR_BLACK));
// notificationComposite.setLayoutData(excludeGridData());
// notificationComposite.setVisible(false);
}
else if (!xarch.isChangeSetsEnabled(xArchRef)) {
notificationComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
notificationComposite.setVisible(true);
notificationComposite.setLayout(new GridLayout());
notificationComposite.setBackground(notificationComposite.getDisplay().getSystemColor(SWT.COLOR_WHITE));
Label message = new Label(notificationComposite, SWT.CENTER | SWT.WRAP);
message.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
message.setText("Change sets not enabled for this document");
message.setBackground(notificationComposite.getBackground());
message.setForeground(message.getDisplay().getSystemColor(SWT.COLOR_BLACK));
final Button enableButton = new Button(notificationComposite, SWT.PUSH);
enableButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
enableButton.setText("Enable Change Sets");
enableButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
final ObjRef xArchRef = (ObjRef) changeSetViewer.getInput();
if (xArchRef != null) {
try {
new ProgressMonitorDialog(changeSetViewer.getControl().getShell()).run(true, true,
new IRunnableWithProgress() {
@Override
public void run(final IProgressMonitor monitor) {
monitor.beginTask(
"Creating a baseline change set for the current document...",
IProgressMonitor.UNKNOWN);
xarch.setChangeSetsEnabled(xArchRef, true);
monitor.done();
SWTWidgetUtils.async(enableButton, new Runnable() {
@Override
public void run() {
updateStatus();
}
});
}
});
}
catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
else {
enabled = true;
notificationComposite.setLayoutData(excludeGridData());
notificationComposite.setVisible(false);
ObjRef activeChangeSetRef = xarch.getActiveChangeSet(xArchRef);
++ignoreChangeSetSelectionEvents;
changeSetViewer.setSelection(activeChangeSetRef != null ? new StructuredSelection(activeChangeSetRef)
: StructuredSelection.EMPTY);
if (overviewModeAction != null) {
overviewModeAction.setChecked(xarch.isOverviewModeEnabled(xArchRef));
}
}
changeSetViewer.getControl().setEnabled(enabled);
for (IContributionItem item : getViewSite().getActionBars().getToolBarManager().getItems()) {
if (item instanceof ActionContributionItem) {
IAction action = ((ActionContributionItem) item).getAction();
if (action instanceof IHasXArchRef) {
((IHasXArchRef) action).setXArchRef(enabled ? xArchRef : null);
}
}
}
notificationComposite.layout();
notificationComposite.getParent().layout();
}
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
selectionChangedListeners.add(listener);
}
@Override
public ISelection getSelection() {
return new StructuredSelection(selectedRefs);
}
@Override
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
selectionChangedListeners.remove(listener);
}
@Override
public void setSelection(ISelection selection) {
// TODO Auto-generated method stub
}
protected void fireSelectionChangedEvent(ISelection selection) {
SelectionChangedEvent evt = new SelectionChangedEvent(this, selection);
for (ISelectionChangedListener l : selectionChangedListeners) {
l.selectionChanged(evt);
}
}
@Override
public void selectionChanged(SelectionChangedEvent event) {
Iterator<?> iterator = ((IStructuredSelection) event.getSelection()).iterator();
if (iterator != null) {
selectedRefs.clear();
while (iterator.hasNext()) {
Object obj = iterator.next();
if (obj != null && obj instanceof ObjRef) {
ObjRef ref = (ObjRef) obj;
selectedRefs.add(ref);
}
}
fireSelectionChangedEvent(new StructuredSelection(selectedRefs));
}
}
}