1 package org.simantics.modeling;
\r
3 import org.eclipse.jface.dialogs.Dialog;
\r
4 import org.eclipse.jface.dialogs.IDialogConstants;
\r
5 import org.eclipse.jface.layout.GridDataFactory;
\r
6 import org.eclipse.jface.layout.GridLayoutFactory;
\r
7 import org.eclipse.swt.SWT;
\r
8 import org.eclipse.swt.events.ModifyEvent;
\r
9 import org.eclipse.swt.events.ModifyListener;
\r
10 import org.eclipse.swt.graphics.Point;
\r
11 import org.eclipse.swt.widgets.Composite;
\r
12 import org.eclipse.swt.widgets.Control;
\r
13 import org.eclipse.swt.widgets.Label;
\r
14 import org.eclipse.swt.widgets.Shell;
\r
15 import org.eclipse.swt.widgets.Text;
\r
16 import org.simantics.db.common.utils.VersionInfo;
\r
17 import org.simantics.utils.strings.AlphanumComparator;
\r
19 public class CreateVersionDialog extends Dialog {
\r
21 private final VersionInfo info;
\r
23 private Label errors;
\r
24 private Text versionTxT;
\r
25 private String result;
\r
27 public CreateVersionDialog(Shell parentShell, VersionInfo info) {
\r
32 public String mutate(String ver) {
\r
34 int currentInt = Integer.parseInt(ver);
\r
35 return "" + (currentInt+1);
\r
36 } catch (NumberFormatException e) {
\r
37 if(ver.length() == 1) {
\r
38 char c = ver.charAt(0);
\r
41 if(Character.isLetter(ch) && Character.isUpperCase(ch)) return ch.toString();
\r
47 public String getSuggestion() {
\r
49 String ver = info.version;
\r
50 while(validateVersion(ver) != null) ver = mutate(ver);
\r
56 protected Control createDialogArea(Composite parent) {
\r
57 Composite c = (Composite) super.createDialogArea(parent);
\r
59 GridLayoutFactory.fillDefaults().margins(8, 8).numColumns(2).applyTo(c);
\r
60 GridDataFactory gd1 = GridDataFactory.fillDefaults().span(2, 1);
\r
63 Label label = new Label(c, 0);
\r
64 label.setText("Current version identifier is: " + info.version);
\r
68 label = new Label(c, 0);
\r
69 label.setText("New identifier:");
\r
70 GridDataFactory.fillDefaults().applyTo(label);
\r
72 versionTxT = new Text(c, SWT.BORDER);
\r
73 versionTxT.setText(getSuggestion());
\r
75 GridDataFactory.fillDefaults().grab(true, false).applyTo(versionTxT);
\r
77 versionTxT.addModifyListener(new ModifyListener() {
\r
80 public void modifyText(ModifyEvent e) {
\r
82 String result = validateVersion(versionTxT.getText());
\r
83 if(result != null) {
\r
84 errors.setText(result);
\r
85 getButton(IDialogConstants.OK_ID).setEnabled(false);
\r
86 Shell shell = errors.getShell();
\r
87 Point ns = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
\r
88 Point cs = shell.getSize();
\r
89 shell.setSize(Math.max(cs.x, ns.x), Math.max(cs.y, ns.y));
\r
92 getButton(IDialogConstants.OK_ID).setEnabled(true);
\r
100 errors= new Label(c, 0);
\r
101 errors.setText("");
\r
102 errors.setForeground(errors.getDisplay().getSystemColor(SWT.COLOR_RED));
\r
104 gd1.applyTo(errors);
\r
109 private String validateVersion(final String version) {
\r
111 if(info.containsVersion(version)) return "Version already in use";
\r
112 if(AlphanumComparator.COMPARATOR.compare(version, info.version) < 0) return "New version must be lexically greater than current";
\r
118 protected void okPressed() {
\r
119 result = versionTxT.getText();
\r
123 public String getResult() {
\r
128 protected int getShellStyle() {
\r
129 return SWT.RESIZE | SWT.TITLE | SWT.CLOSE | SWT.BORDER;
\r
133 protected void configureShell(Shell newShell) {
\r
134 super.configureShell(newShell);
\r
135 newShell.setText("Create new version of " + info.baseName);
\r