--- /dev/null
+package org.simantics.modeling;\r
+\r
+import org.eclipse.jface.dialogs.Dialog;\r
+import org.eclipse.jface.dialogs.IDialogConstants;\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.layout.GridLayoutFactory;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.ModifyEvent;\r
+import org.eclipse.swt.events.ModifyListener;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.swt.widgets.Text;\r
+import org.simantics.db.common.utils.VersionInfo;\r
+import org.simantics.utils.strings.AlphanumComparator;\r
+\r
+public class CreateVersionDialog extends Dialog {\r
+\r
+ private final VersionInfo info;\r
+\r
+ private Label errors;\r
+ private Text versionTxT;\r
+ private String result;\r
+ \r
+ public CreateVersionDialog(Shell parentShell, VersionInfo info) {\r
+ super(parentShell);\r
+ this.info = info;\r
+ }\r
+ \r
+ public String mutate(String ver) {\r
+ try {\r
+ int currentInt = Integer.parseInt(ver);\r
+ return "" + (currentInt+1);\r
+ } catch (NumberFormatException e) {\r
+ if(ver.length() == 1) {\r
+ char c = ver.charAt(0);\r
+ c++;\r
+ Character ch = c; \r
+ if(Character.isLetter(ch) && Character.isUpperCase(ch)) return ch.toString();\r
+ }\r
+ }\r
+ return ver + "_1";\r
+ }\r
+ \r
+ public String getSuggestion() {\r
+ \r
+ String ver = info.version;\r
+ while(validateVersion(ver) != null) ver = mutate(ver);\r
+ return ver;\r
+ \r
+ }\r
+\r
+ @Override\r
+ protected Control createDialogArea(Composite parent) {\r
+ Composite c = (Composite) super.createDialogArea(parent);\r
+ \r
+ GridLayoutFactory.fillDefaults().margins(8, 8).numColumns(2).applyTo(c);\r
+ GridDataFactory gd1 = GridDataFactory.fillDefaults().span(2, 1);\r
+\r
+ // 1st line\r
+ Label label = new Label(c, 0);\r
+ label.setText("Current version identifier is: " + info.version);\r
+ gd1.applyTo(label);\r
+ \r
+ // 2nd line\r
+ label = new Label(c, 0);\r
+ label.setText("New identifier:");\r
+ GridDataFactory.fillDefaults().applyTo(label);\r
+\r
+ versionTxT = new Text(c, SWT.BORDER);\r
+ versionTxT.setText(getSuggestion());\r
+ \r
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(versionTxT);\r
+ \r
+ versionTxT.addModifyListener(new ModifyListener() {\r
+\r
+ @Override\r
+ public void modifyText(ModifyEvent e) {\r
+\r
+ String result = validateVersion(versionTxT.getText()); \r
+ if(result != null) {\r
+ errors.setText(result);\r
+ getButton(IDialogConstants.OK_ID).setEnabled(false);\r
+ Shell shell = errors.getShell();\r
+ Point ns = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);\r
+ Point cs = shell.getSize();\r
+ shell.setSize(Math.max(cs.x, ns.x), Math.max(cs.y, ns.y));\r
+ } else {\r
+ errors.setText("");\r
+ getButton(IDialogConstants.OK_ID).setEnabled(true);\r
+ }\r
+ \r
+ }\r
+ \r
+ });\r
+ \r
+ // Errors\r
+ errors= new Label(c, 0);\r
+ errors.setText("");\r
+ errors.setForeground(errors.getDisplay().getSystemColor(SWT.COLOR_RED));\r
+ \r
+ gd1.applyTo(errors);\r
+ \r
+ return c;\r
+ }\r
+ \r
+ private String validateVersion(final String version) {\r
+ \r
+ if(info.containsVersion(version)) return "Version already in use";\r
+ if(AlphanumComparator.COMPARATOR.compare(version, info.version) < 0) return "New version must be lexically greater than current";\r
+ return null;\r
+ \r
+ }\r
+ \r
+ @Override\r
+ protected void okPressed() {\r
+ result = versionTxT.getText();\r
+ super.okPressed();\r
+ }\r
+ \r
+ public String getResult() {\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ protected int getShellStyle() {\r
+ return SWT.RESIZE | SWT.TITLE | SWT.CLOSE | SWT.BORDER;\r
+ }\r
+\r
+ @Override\r
+ protected void configureShell(Shell newShell) {\r
+ super.configureShell(newShell);\r
+ newShell.setText("Create new version of " + info.baseName);\r
+ }\r
+}\r