1 package org.simantics.scl.ui.modulebrowser;
3 import java.io.IOException;
4 import java.util.ArrayList;
6 import org.eclipse.core.runtime.Status;
7 import org.eclipse.jface.dialogs.Dialog;
8 import org.eclipse.jface.dialogs.ErrorDialog;
9 import org.eclipse.jface.dialogs.IDialogConstants;
10 import org.eclipse.jface.layout.GridDataFactory;
11 import org.eclipse.jface.layout.GridLayoutFactory;
12 import org.eclipse.swt.SWT;
13 import org.eclipse.swt.events.DisposeEvent;
14 import org.eclipse.swt.events.DisposeListener;
15 import org.eclipse.swt.events.ModifyEvent;
16 import org.eclipse.swt.events.ModifyListener;
17 import org.eclipse.swt.events.SelectionAdapter;
18 import org.eclipse.swt.events.SelectionEvent;
19 import org.eclipse.swt.graphics.Color;
20 import org.eclipse.swt.widgets.Button;
21 import org.eclipse.swt.widgets.Composite;
22 import org.eclipse.swt.widgets.Control;
23 import org.eclipse.swt.widgets.Label;
24 import org.eclipse.swt.widgets.Shell;
25 import org.eclipse.swt.widgets.Text;
26 import org.osgi.framework.Bundle;
27 import org.simantics.scl.osgi.SCLOsgi;
28 import org.simantics.scl.ui.editor2.OpenSCLModule;
29 import org.simantics.scl.ui.modulebrowser.PluginSelectionDialog.Entry;
31 import gnu.trove.map.hash.THashMap;
33 public class CreateModuleDialog extends Dialog {
35 SCLModuleBrowser parentBrowser;
37 String initialPackageName = "";
38 String initialPluginName = "";
43 private THashMap<String,Bundle> bundles;
45 private Color normalBackground;
46 private Color errorBackground;
48 protected CreateModuleDialog(Shell parentShell, SCLModuleBrowser parentBrowser) {
50 this.parentBrowser = parentBrowser;
51 setShellStyle(SWT.RESIZE | SWT.TITLE | SWT.BORDER);
52 bundles = CreateModuleAction.findGoodBundles();
54 normalBackground = parentShell.getDisplay().getSystemColor(SWT.COLOR_WHITE);
55 errorBackground = new Color(parentShell.getDisplay(), 255, 128, 128);
59 protected Control createDialogArea(Composite parent) {
60 getShell().setText("Create New Module");
61 getShell().addDisposeListener(new DisposeListener() {
63 public void widgetDisposed(DisposeEvent e) {
64 errorBackground.dispose();
68 final Composite composite = (Composite) super.createDialogArea(parent);
69 GridLayoutFactory.fillDefaults().margins(10,10).numColumns(2).applyTo(composite);
70 GridDataFactory.fillDefaults().grab(true,true).applyTo(composite);
73 Label packageNameLabel = new Label(composite, SWT.NONE);
74 packageNameLabel.setText("Package");
75 GridDataFactory.fillDefaults().applyTo(packageNameLabel);
77 packageName = new Text(composite, SWT.BORDER);
78 GridDataFactory.fillDefaults().grab(true, false).minSize(500, SWT.DEFAULT).applyTo(packageName);
79 packageName.setText(initialPackageName);
80 packageName.addModifyListener(modifyListener);
83 Label moduleNameLabel = new Label(composite, SWT.NONE);
84 moduleNameLabel.setText("Module name");
85 GridDataFactory.fillDefaults().applyTo(moduleNameLabel);
87 moduleName = new Text(composite, SWT.BORDER);
88 GridDataFactory.fillDefaults().grab(true, false).applyTo(moduleName);
89 moduleName.addModifyListener(modifyListener);
92 Label pluginNameLabel = new Label(composite, SWT.NONE);
93 pluginNameLabel.setText("Plugin");
94 GridDataFactory.fillDefaults().applyTo(pluginNameLabel);
96 Composite pluginNameComposite = new Composite(composite, SWT.NONE);
97 GridDataFactory.fillDefaults().grab(true, false).applyTo(pluginNameComposite);
98 GridLayoutFactory.fillDefaults().numColumns(2).applyTo(pluginNameComposite);
100 pluginName = new Text(pluginNameComposite, SWT.BORDER);
101 GridDataFactory.fillDefaults().grab(true, false).applyTo(pluginName);
102 pluginName.setText(initialPluginName);
103 pluginName.addModifyListener(modifyListener);
105 Button browsePlugins = new Button(pluginNameComposite, SWT.PUSH);
106 browsePlugins.setText("Browse...");
107 GridDataFactory.fillDefaults().applyTo(browsePlugins);
108 browsePlugins.addSelectionListener(new SelectionAdapter() {
110 public void widgetSelected(SelectionEvent e) {
116 moduleName.setFocus();
117 parent.getDisplay().asyncExec(new Runnable() {
127 private void browsePlugins() {
128 ArrayList<Entry> entries = new ArrayList<Entry>(bundles.size());
129 String currentPackageName = packageName.getText();
130 for(Bundle bundle : bundles.values())
131 entries.add(new Entry(bundle, CreateModuleAction.packageMatchLength(bundle, currentPackageName)));
132 PluginSelectionDialog dialog = new PluginSelectionDialog(getShell(), entries);
133 if(dialog.open() == Dialog.OK) {
134 Entry result = (Entry)dialog.getFirstResult();
136 pluginName.setText(result.bundle.getSymbolicName());
142 private void validate() {
143 boolean validPackageName = CreateModuleValidator.isValidPackageName(packageName.getText());
144 packageName.setBackground(validPackageName ? normalBackground : errorBackground);
146 boolean validModuleName = CreateModuleValidator.isValidModuleName(moduleName.getText());
147 if(validModuleName && validPackageName) {
148 String fullModuleName = packageName.getText() + "/" + moduleName.getText();
149 validModuleName = SCLOsgi.SOURCE_REPOSITORY.getModuleSource(fullModuleName, null) == null;
151 moduleName.setBackground(validModuleName ? normalBackground : errorBackground);
153 boolean validPluginName = bundles.containsKey(pluginName.getText());
154 pluginName.setBackground(validPluginName ? normalBackground : errorBackground);
156 getButton(IDialogConstants.OK_ID).setEnabled(validPackageName && validModuleName && validPackageName);
159 private ModifyListener modifyListener = new ModifyListener() {
161 public void modifyText(ModifyEvent e) {
166 public void setPackage(String initialPackageName) {
167 this.initialPackageName = initialPackageName;
168 this.initialPluginName = CreateModuleAction.findBestPlugin(bundles, initialPackageName);
172 protected void okPressed() {
174 Bundle bundle = bundles.get(pluginName.getText());
176 CreateModuleAction.createModule(bundle, packageName.getText(), moduleName.getText());
177 parentBrowser.refresh();
178 OpenSCLModule.openModule(packageName.getText() + "/" + moduleName.getText());
180 } catch (IOException e) {
181 ErrorDialog.openError(getParentShell(), "Module creation failed", e.getMessage(),
182 new Status(Status.ERROR, "org.simantics.scl.ui", e.getMessage()));