]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/CreateVersionDialog.java
Merge commit 'd7afa23'
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / CreateVersionDialog.java
1 package org.simantics.modeling;\r
2 \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
18 \r
19 public class CreateVersionDialog extends Dialog {\r
20 \r
21         private final VersionInfo info;\r
22 \r
23         private Label errors;\r
24         private Text versionTxT;\r
25         private String result;\r
26         \r
27         public CreateVersionDialog(Shell parentShell, VersionInfo info) {\r
28                 super(parentShell);\r
29                 this.info = info;\r
30         }\r
31         \r
32         public String mutate(String ver) {\r
33         try {\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
39                         c++;\r
40                         Character ch = c; \r
41                         if(Character.isLetter(ch) && Character.isUpperCase(ch)) return ch.toString();\r
42                 }\r
43         }\r
44         return ver + "_1";\r
45         }\r
46         \r
47         public String getSuggestion() {\r
48                 \r
49                 String ver = info.version;\r
50                 while(validateVersion(ver) != null) ver = mutate(ver);\r
51                 return ver;\r
52                 \r
53         }\r
54 \r
55         @Override\r
56         protected Control createDialogArea(Composite parent) {\r
57                 Composite c = (Composite) super.createDialogArea(parent);\r
58                 \r
59         GridLayoutFactory.fillDefaults().margins(8, 8).numColumns(2).applyTo(c);\r
60         GridDataFactory gd1 = GridDataFactory.fillDefaults().span(2, 1);\r
61 \r
62         // 1st line\r
63         Label label = new Label(c, 0);\r
64         label.setText("Current version identifier is: " + info.version);\r
65         gd1.applyTo(label);\r
66         \r
67         // 2nd line\r
68         label = new Label(c, 0);\r
69         label.setText("New identifier:");\r
70         GridDataFactory.fillDefaults().applyTo(label);\r
71 \r
72         versionTxT = new Text(c, SWT.BORDER);\r
73         versionTxT.setText(getSuggestion());\r
74         \r
75         GridDataFactory.fillDefaults().grab(true, false).applyTo(versionTxT);\r
76         \r
77         versionTxT.addModifyListener(new ModifyListener() {\r
78 \r
79                         @Override\r
80                         public void modifyText(ModifyEvent e) {\r
81 \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
90                                 } else {\r
91                                         errors.setText("");\r
92                                         getButton(IDialogConstants.OK_ID).setEnabled(true);\r
93                                 }\r
94                                 \r
95                         }\r
96                 \r
97         });\r
98         \r
99         // Errors\r
100         errors= new Label(c, 0);\r
101         errors.setText("");\r
102         errors.setForeground(errors.getDisplay().getSystemColor(SWT.COLOR_RED));\r
103         \r
104         gd1.applyTo(errors);\r
105         \r
106                 return c;\r
107         }\r
108         \r
109         private String validateVersion(final String version) {\r
110                 \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
113                 return null;\r
114                 \r
115         }\r
116         \r
117         @Override\r
118         protected void okPressed() {\r
119                 result = versionTxT.getText();\r
120         super.okPressed();\r
121         }\r
122         \r
123         public String getResult() {\r
124                 return result;\r
125         }\r
126 \r
127         @Override\r
128     protected int getShellStyle() {\r
129         return SWT.RESIZE | SWT.TITLE | SWT.CLOSE | SWT.BORDER;\r
130     }\r
131 \r
132     @Override\r
133     protected void configureShell(Shell newShell) {\r
134         super.configureShell(newShell);\r
135         newShell.setText("Create new version of " + info.baseName);\r
136     }\r
137 }\r