1 package org.argeo.tracker.ui.dialogs;
2
3 import static javax.jcr.PropertyType.STRING;
4 import static org.argeo.connect.ConnectNames.CONNECT_UID;
5 import static org.argeo.connect.util.ConnectJcrUtils.get;
6 import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
7 import static org.argeo.tracker.TrackerNames.TRACKER_PROJECT_UID;
8
9 import java.util.Calendar;
10 import java.util.GregorianCalendar;
11
12 import javax.jcr.Node;
13 import javax.jcr.Property;
14 import javax.jcr.PropertyType;
15 import javax.jcr.RepositoryException;
16
17 import org.argeo.connect.ui.ConnectUiUtils;
18 import org.argeo.connect.ui.widgets.DateText;
19 import org.argeo.connect.util.ConnectJcrUtils;
20 import org.argeo.eclipse.ui.EclipseUiUtils;
21 import org.argeo.jcr.JcrUtils;
22 import org.argeo.tracker.TrackerException;
23 import org.argeo.tracker.TrackerNames;
24 import org.argeo.tracker.TrackerService;
25 import org.argeo.tracker.core.TrackerUtils;
26 import org.argeo.tracker.ui.controls.ProjectDropDown;
27 import org.eclipse.jface.dialogs.MessageDialog;
28 import org.eclipse.jface.wizard.Wizard;
29 import org.eclipse.jface.wizard.WizardPage;
30 import org.eclipse.swt.SWT;
31 import org.eclipse.swt.events.FocusAdapter;
32 import org.eclipse.swt.events.FocusEvent;
33 import org.eclipse.swt.events.ModifyEvent;
34 import org.eclipse.swt.events.ModifyListener;
35 import org.eclipse.swt.layout.GridData;
36 import org.eclipse.swt.layout.GridLayout;
37 import org.eclipse.swt.widgets.Composite;
38 import org.eclipse.swt.widgets.Label;
39 import org.eclipse.swt.widgets.Text;
40
41
42 public class ConfigureVersionWizard extends Wizard implements ModifyListener {
43 private static final long serialVersionUID = -8365425809976445458L;
44
45
46 private final Node project;
47 private Node version;
48
49
50 private ProjectDropDown projectDD;
51 private Text idTxt;
52 private DateText releaseDateCmp;
53 private Text descTxt;
54
55
56 private Node chosenProject;
57
58 public ConfigureVersionWizard(TrackerService trackerService, Node version) {
59 this.version = version;
60 project = TrackerUtils.getRelatedProject(trackerService, version);
61 chosenProject = project;
62 }
63
64 @Override
65 public void addPages() {
66 setWindowTitle("Create a new version");
67 ConfigureVersionPage page = new ConfigureVersionPage("Main page");
68 addPage(page);
69 }
70
71 @Override
72 public boolean performFinish() {
73 String msg = null;
74 Calendar now = new GregorianCalendar();
75 now.add(Calendar.DAY_OF_YEAR, 1);
76
77 String id = idTxt.getText();
78
79 if (chosenProject == null)
80 msg = "Please pick up a project";
81 else if (EclipseUiUtils.isEmpty(id))
82 MessageDialog.openError(getShell(), "Compulsory ID", "Please define the version ID");
83
84
85 else if (releaseDateCmp.getCalendar() == null)
86 msg = "Release date is compulsory, please define it";
87 else if (releaseDateCmp.getCalendar().after(now))
88 msg = "A release date can only be defined when the release "
89 + "has been done, and thus must be now or in the past.";
90
91 if (msg != null) {
92 MessageDialog.openError(getShell(), "Unvalid information", msg);
93 return false;
94 }
95
96 try {
97 ConnectJcrUtils.setJcrProperty(version, TRACKER_PROJECT_UID, STRING, get(chosenProject, CONNECT_UID));
98 ConnectJcrUtils.setJcrProperty(version, TrackerNames.TRACKER_ID, PropertyType.STRING, id);
99 ConnectJcrUtils.setJcrProperty(version, Property.JCR_TITLE, PropertyType.STRING, id);
100 ConnectJcrUtils.setJcrProperty(version, Property.JCR_DESCRIPTION, PropertyType.STRING, descTxt.getText());
101 ConnectJcrUtils.setJcrProperty(version, TrackerNames.TRACKER_RELEASE_DATE, PropertyType.DATE,
102 releaseDateCmp.getCalendar());
103
104 if (version.getSession().hasPendingChanges())
105 JcrUtils.updateLastModified(version);
106 } catch (RepositoryException e1) {
107 throw new TrackerException("Unable to create version with ID " + id + " on " + project, e1);
108 }
109
110 return true;
111 }
112
113 @Override
114 public boolean canFinish() {
115 if (EclipseUiUtils.isEmpty(idTxt.getText()))
116 return false;
117 else
118 return true;
119 }
120
121 @Override
122 public boolean performCancel() {
123 return true;
124 }
125
126 protected class ConfigureVersionPage extends WizardPage {
127 private static final long serialVersionUID = 3061153468301727903L;
128
129 private Text projectTxt;
130
131 public ConfigureVersionPage(String pageName) {
132 super(pageName);
133 setMessage("Please complete below information");
134 }
135
136 public void createControl(Composite parent) {
137 parent.setLayout(new GridLayout(2, false));
138
139
140 ConnectUiUtils.createBoldLabel(parent, "Project");
141 projectTxt = new Text(parent, SWT.BORDER);
142 projectTxt.setMessage("Choose relevant project");
143 projectTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
144
145 if (project == null) {
146 projectDD = new ProjectDropDown(ConnectJcrUtils.getSession(version), projectTxt, false);
147
148 projectTxt.addFocusListener(new FocusAdapter() {
149 private static final long serialVersionUID = 1L;
150
151 @Override
152 public void focusLost(FocusEvent event) {
153 Node project = projectDD.getChosenProject();
154 if (project == null)
155 setErrorMessage("Choose a valid project");
156 else {
157 setErrorMessage(null);
158 chosenProject = project;
159 }
160 }
161 });
162 } else
163 projectTxt.setEditable(false);
164
165 createLabel(parent, "ID", SWT.CENTER);
166 idTxt = new Text(parent, SWT.BORDER);
167 idTxt.setMessage("Major.Minor.Micro: 2.1.37");
168 idTxt.setLayoutData(EclipseUiUtils.fillWidth());
169 idTxt.addModifyListener(ConfigureVersionWizard.this);
170
171
172 createLabel(parent, "Release Date ", SWT.CENTER);
173
174
175
176 releaseDateCmp = new DateText(parent, SWT.NO_FOCUS);
177 releaseDateCmp.setToolTipText("The release date of the version to create,\n "
178 + "typically in the case of reporting a bug for a version that was not yet listed.");
179
180 createLabel(parent, "Description", SWT.TOP);
181 descTxt = new Text(parent, SWT.BORDER | SWT.MULTI | SWT.WRAP);
182 GridData gd = EclipseUiUtils.fillAll();
183 gd.heightHint = 150;
184 descTxt.setLayoutData(gd);
185 descTxt.setMessage("An optional description for this version");
186
187 String id = ConnectJcrUtils.get(version, TrackerNames.TRACKER_ID);
188 String desc = ConnectJcrUtils.get(version, Property.JCR_DESCRIPTION);
189 Calendar releaseDate = ConnectJcrUtils.getDateValue(version, TrackerNames.TRACKER_RELEASE_DATE);
190 if (project != null)
191 projectTxt.setText(ConnectJcrUtils.get(project, Property.JCR_TITLE));
192
193 if (EclipseUiUtils.notEmpty(id)) {
194 idTxt.setText(id);
195 idTxt.setEditable(false);
196 }
197 if (EclipseUiUtils.notEmpty(desc))
198 descTxt.setText(desc);
199 if (releaseDate != null)
200 releaseDateCmp.setText(releaseDate);
201
202 if (project == null) {
203 setControl(projectTxt);
204 projectTxt.setFocus();
205 } else if (isEmpty(id)) {
206 setControl(idTxt);
207 idTxt.setFocus();
208 } else
209 setControl(idTxt);
210 }
211 }
212
213
214 private Label createLabel(Composite parent, String label, int verticalAlign) {
215 Label lbl = new Label(parent, SWT.NONE);
216 lbl.setText(label);
217 lbl.setFont(EclipseUiUtils.getBoldFont(parent));
218 lbl.setLayoutData(new GridData(SWT.RIGHT, verticalAlign, false, false));
219 return lbl;
220 }
221
222 @Override
223 public void modifyText(ModifyEvent event) {
224 getContainer().updateButtons();
225 }
226 }