package org.archstudio.xadl.swt;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.archstudio.resources.IResources;
import org.archstudio.xarchadt.IXArchADT;
import org.archstudio.xarchadt.ObjRef;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
public class XadlSelectorDialog {
public static ObjRef showSelectorDialog(Shell parentShell, String text, IXArchADT xarch, IResources resources,
ObjRef rootRef, Set<XadlTreeUtils.Type> showFlags, Set<XadlTreeUtils.Type> selectionFlags) {
ObjRef[] results = showSelectorDialog(parentShell, text, xarch, resources, rootRef, showFlags, selectionFlags,
false);
if (results == null) {
return null;
}
return results[0];
}
public static ObjRef[] showSelectorDialog(Shell parentShell, String text, IXArchADT xarch, IResources resources,
ObjRef rootRef, Set<XadlTreeUtils.Type> showFlags, Set<XadlTreeUtils.Type> selectionFlags,
final boolean allowMultipleSelections) {
final Shell dialog = new Shell(parentShell, SWT.RESIZE | SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
dialog.setText(text);
dialog.setLayout(new GridLayout(1, false));
int treeViewerFlags = allowMultipleSelections ? SWT.MULTI | SWT.BORDER : SWT.SINGLE | SWT.BORDER;
final TreeViewer treeViewer = new TreeViewer(dialog, treeViewerFlags);
treeViewer.setContentProvider(new XadlTreeContentProvider(xarch, rootRef, showFlags));
treeViewer.setLabelProvider(new XadlTreeLabelProvider(xarch, resources));
treeViewer.setInput(new XadlTreeContentProvider.XadlTreeInput());
treeViewer.expandAll();
GridData treeData = new GridData();
treeData.horizontalAlignment = GridData.FILL;
treeData.grabExcessHorizontalSpace = true;
treeData.verticalAlignment = GridData.FILL;
treeData.grabExcessVerticalSpace = true;
treeData.widthHint = 400;
treeData.heightHint = 300;
treeViewer.getControl().setLayoutData(treeData);
Composite cButtons = new Composite(dialog, SWT.NONE);
GridLayout cButtonsLayout = new GridLayout(2, false);
cButtonsLayout.horizontalSpacing = 5;
cButtonsLayout.marginTop = 5;
cButtonsLayout.marginBottom = 5;
cButtonsLayout.marginLeft = 5;
cButtonsLayout.marginRight = 5;
cButtons.setLayout(cButtonsLayout);
cButtons.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false));
Button bOK = new Button(cButtons, SWT.PUSH);
bOK.setText("OK");
GridData bOKData = new GridData();
bOKData.horizontalAlignment = GridData.FILL;
//bOKData.grabExcessHorizontalSpace = true;
bOKData.widthHint = 100;
bOK.setLayoutData(bOKData);
final java.util.List<ObjRef> results = new ArrayList<ObjRef>();
final IXArchADT fxarch = xarch;
final Set<XadlTreeUtils.Type> fselectionFlags = selectionFlags;
final Listener okListener = new Listener() {
@Override
public void handleEvent(Event event) {
IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
if (!validateSelection(fxarch, selection, fselectionFlags)) {
MessageBox messageBox = new MessageBox(dialog, SWT.ICON_ERROR | SWT.OK);
messageBox.setText("Error - Invalid Selection");
messageBox.setMessage("Please select one " + (allowMultipleSelections ? "or more " : "")
+ "of the following: " + getSelectionString(fselectionFlags) + ".");
messageBox.open();
}
else {
for (Object result : selection.toList()) {
if (result instanceof ObjRef) {
results.add((ObjRef) result);
}
}
dialog.close();
}
}
};
bOK.addListener(SWT.Selection, okListener);
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
okListener.handleEvent(null);
}
});
Button bCancel = new Button(cButtons, SWT.PUSH);
bCancel.setText("Cancel");
bCancel.setSize(bCancel.computeSize(100, SWT.DEFAULT));
GridData bCancelData = new GridData();
bCancelData.horizontalAlignment = GridData.FILL;
//bCancelData.grabExcessHorizontalSpace = true;
bCancelData.widthHint = 100;
bCancel.setLayoutData(bCancelData);
Listener cancelListener = new Listener() {
@Override
public void handleEvent(Event event) {
dialog.close();
}
};
bCancel.addListener(SWT.Selection, cancelListener);
dialog.pack();
dialog.open();
while (!dialog.isDisposed()) {
if (!dialog.getDisplay().readAndDispatch()) {
dialog.getDisplay().sleep();
}
}
//IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection();
if (results.size() == 0) {
return null;
}
else {
ObjRef[] resultArray = results.toArray(new ObjRef[results.size()]);
return resultArray;
}
}
protected static String getSelectionString(Set<XadlTreeUtils.Type> flags) {
List<String> strings = XadlTreeUtils.typesToStrings(flags);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < strings.size(); i++) {
if (i != 0) {
if (i == strings.size() - 1) {
sb.append(" or ");
}
else {
sb.append(", ");
}
}
sb.append(strings.get(i));
}
return sb.toString();
}
protected static boolean validateSelection(IXArchADT xarch, IStructuredSelection selection,
Set<XadlTreeUtils.Type> selectionFlags) {
Object[] selectedObjects = selection.toArray();
if (selectedObjects.length == 0) {
return false;
}
for (Object selectedObject : selectedObjects) {
if (selectedObject instanceof ObjRef) {
ObjRef ref = (ObjRef) selectedObject;
XadlTreeUtils.Type typeOfRef = XadlTreeUtils.getType(xarch, ref);
if (!selectionFlags.contains(typeOfRef)) {
return false;
}
}
}
return true;
}
}