package org.archstudio.graphlayout.gui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.archstudio.graphlayout.GraphLayout;
import org.archstudio.graphlayout.GraphLayoutException;
import org.archstudio.graphlayout.GraphLayoutParameters;
import org.archstudio.graphlayout.IGraphLayout;
import org.archstudio.xarchadt.ObjRef;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class GraphLayoutDialog extends Dialog {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Dialog Example");
shell.setSize(300, 200);
shell.open();
IGraphLayout fakeGraphLayout = new IGraphLayout() {
@Override
public String[] getEngineIDs() {
return new String[] { "dot", "neato" };
}
@Override
public String getEngineDescription(String engineID) {
if (engineID.equals("dot")) {
return "GraphViz Dot Engine";
}
else if (engineID.equals("neato")) {
return "GraphViz Neato Engine";
}
else {
return "???";
}
}
@Override
public GraphLayout layoutGraph(String engineID, ObjRef rootRef, GraphLayoutParameters params)
throws GraphLayoutException {
System.err.println("laying out now.");
return null;
}
};
GraphLayoutDialog gld = new GraphLayoutDialog(shell);
System.err.println("opening");
GraphLayoutParameters result = gld.open(fakeGraphLayout);
System.err.println("opened done: " + result);
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
System.err.println("exit");
}
protected GraphLayoutParameters result = null;
private Shell shell = null;
protected Composite panelParent = null;
protected IGraphLayoutParameterPanel[] parameterPanels = null;
public GraphLayoutDialog(Shell parent, int style) {
super(parent, style);
initPanelProviders();
initPresets();
}
public GraphLayoutDialog(Shell parent) {
this(parent, 0); // your default style bits go here (not the Shell's style bits)
}
protected void initPanelProviders() {
addPanelProvider(new DotPanelProvider());
addPanelProvider(new NeatoPanelProvider());
}
protected void initPresets() {
GraphLayoutParameters defaultParams = new GraphLayoutParameters();
defaultParams.setRelativeComponentWidth(1.0);
defaultParams.setRelativeComponentHeight(1.0);
defaultParams.setRelativeConnectorWidth(1.0);
defaultParams.setRelativeConnectorHeight(1.0);
defaultParams.setScale(100.0);
defaultParams.setProperty("rankSep", 1.0);
defaultParams.setProperty("nodeSep", 1.0);
defaultParams.setProperty("orientInterfaces", false);
addPreset("Default", defaultParams);
GraphLayoutParameters niceParams = new GraphLayoutParameters();
niceParams.setRelativeComponentWidth(5.0);
niceParams.setRelativeComponentHeight(4.0);
niceParams.setRelativeConnectorWidth(3.0);
niceParams.setRelativeConnectorHeight(2.0);
niceParams.setScale(25.0);
niceParams.setProperty("dontRouteLinks", true);
niceParams.setProperty("dontMoveInterfaces", false);
niceParams.setProperty("rankSep", 1.75);
niceParams.setProperty("nodeSep", 1.5);
niceParams.setProperty("orientInterfaces", false);
addPreset("Nice", niceParams);
GraphLayoutParameters c2Params = new GraphLayoutParameters();
c2Params.setRelativeComponentWidth(5.0);
c2Params.setRelativeComponentHeight(4.0);
c2Params.setRelativeConnectorWidth(10.0);
c2Params.setRelativeConnectorHeight(1.0);
c2Params.setScale(25.0);
c2Params.setProperty("dontRouteLinks", true);
c2Params.setProperty("dontMoveInterfaces", false);
c2Params.setProperty("rankSep", 1.75);
c2Params.setProperty("nodeSep", 1.5);
c2Params.setProperty("orientInterfaces", true);
addPreset("C2 Style", c2Params);
}
protected void done(GraphLayoutParameters result) {
this.result = result;
this.shell.dispose();
}
public GraphLayoutParameters open(IGraphLayout graphLayout) {
final Shell parent = getParent();
final String[] engineIDs = graphLayout.getEngineIDs();
if (engineIDs == null || engineIDs.length == 0) {
MessageDialog.openError(parent, "Error", "No graph layout engines available.");
return null;
}
this.shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
String text = getText();
if (text == null || text.trim().equals("")) {
text = "Graph Layout Options";
}
shell.setText(text);
shell.setLayout(new FillLayout());
Composite mainComposite = new Composite(shell, SWT.NONE);
mainComposite.setLayout(new GridLayout(1, false));
Composite cSelectEngine = new Composite(mainComposite, SWT.NONE);
cSelectEngine.setLayout(new GridLayout(2, false));
Label lSelectEngine = new Label(cSelectEngine, SWT.NONE);
lSelectEngine.setText("Layout Engine:");
String[] engineDescriptions = new String[engineIDs.length];
for (int i = 0; i < engineDescriptions.length; i++) {
engineDescriptions[i] = graphLayout.getEngineDescription(engineIDs[i]);
if (engineDescriptions[i] == null) {
engineDescriptions[i] = engineIDs[i];
}
}
final Combo cmbSelectEngine = new Combo(cSelectEngine, SWT.READ_ONLY);
cmbSelectEngine.setItems(engineDescriptions);
cmbSelectEngine.select(0);
panelParent = new Composite(mainComposite, SWT.NONE);
panelParent.setLayout(new GridLayout(1, false));
cmbSelectEngine.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
int selectionIndex = cmbSelectEngine.getSelectionIndex();
setupEnginePanels(engineIDs[selectionIndex]);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
setupEnginePanels(engineIDs[0]);
Group gPresets = new Group(mainComposite, SWT.NONE);
gPresets.setText("Load Settings");
gPresets.setLayout(new FillLayout());
Composite cPresets = new Composite(gPresets, SWT.NONE);
cPresets.setLayout(new GridLayout(2, false));
NamedGraphLayoutParameters[] presets = getPresets();
final String[] presetNames = new String[presets.length];
for (int i = 0; i < presets.length; i++) {
presetNames[i] = presets[i].name;
}
final Combo cmbPresets = new Combo(cPresets, SWT.READ_ONLY);
cmbPresets.setItems(presetNames);
cmbPresets.select(0);
Button bLoadPreset = new Button(cPresets, SWT.PUSH);
bLoadPreset.setText("Load");
bLoadPreset.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if (parameterPanels != null) {
NamedGraphLayoutParameters[] presets = getPresets();
NamedGraphLayoutParameters preset = presets[cmbPresets.getSelectionIndex()];
for (IGraphLayoutParameterPanel parameterPanel : parameterPanels) {
parameterPanel.loadParameters(preset.params);
}
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
Composite cButtons = new Composite(mainComposite, SWT.NONE);
cButtons.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false));
cButtons.setLayout(new GridLayout(2, false));
Button bOK = new Button(cButtons, SWT.PUSH);
bOK.setText("OK");
bOK.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if (parameterPanels == null) {
done(null);
return;
}
int selectionIndex = cmbSelectEngine.getSelectionIndex();
String engineID = engineIDs[selectionIndex];
GraphLayoutParameters glp = new GraphLayoutParameters();
try {
for (IGraphLayoutParameterPanel parameterPanel : parameterPanels) {
parameterPanel.storeParameters(glp);
}
glp.setProperty("engineID", engineID);
done(glp);
return;
}
catch (DataValidationException dve) {
MessageDialog.openError(parent, "Error", dve.getMessage());
return;
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
Button bCancel = new Button(cButtons, SWT.PUSH);
bCancel.setText("Cancel");
bCancel.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
done(null);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
shell.pack();
shell.open();
Display display = parent.getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return result;
}
protected void setupEnginePanels(String engineID) {
//dispose old controls
Control[] children = panelParent.getChildren();
for (Control element : children) {
element.dispose();
}
parameterPanels = null;
IGraphLayoutParameterPanelProvider[] panelProviders = getPanelProviders();
IGraphLayoutParameterPanelProvider panelProvider = null;
for (IGraphLayoutParameterPanelProvider panelProvider2 : panelProviders) {
if (panelProvider2.getEngineID().equals(engineID)) {
panelProvider = panelProvider2;
break;
}
}
if (panelProvider == null) {
Label l = new Label(panelParent, SWT.NONE);
l.setText("Select a valid engine.");
}
else {
parameterPanels = panelProvider.getPanels();
for (IGraphLayoutParameterPanel parameterPanel : parameterPanels) {
parameterPanel.createPanel(panelParent);
}
}
shell.layout(true, true);
shell.pack(true);
}
protected List<NamedGraphLayoutParameters> presetList = Collections
.synchronizedList(new ArrayList<NamedGraphLayoutParameters>());
protected void addPreset(String name, GraphLayoutParameters params) {
presetList.add(new NamedGraphLayoutParameters(name, params));
}
protected NamedGraphLayoutParameters[] getPresets() {
return presetList.toArray(new NamedGraphLayoutParameters[presetList.size()]);
}
private static class NamedGraphLayoutParameters {
public String name;
public GraphLayoutParameters params;
public NamedGraphLayoutParameters(String name, GraphLayoutParameters params) {
this.name = name;
this.params = params;
}
}
protected List<IGraphLayoutParameterPanelProvider> panelProviderList = Collections
.synchronizedList(new ArrayList<IGraphLayoutParameterPanelProvider>());
protected void addPanelProvider(IGraphLayoutParameterPanelProvider panelProvider) {
panelProviderList.add(panelProvider);
}
protected void removePanelProvider(IGraphLayoutParameterPanelProvider panelProvider) {
panelProviderList.remove(panelProvider);
}
protected IGraphLayoutParameterPanelProvider[] getPanelProviders() {
return panelProviderList.toArray(new IGraphLayoutParameterPanelProvider[panelProviderList.size()]);
}
}