View Javadoc
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  /** Dialog to simply configure a new milestone or version */
42  public class ConfigureVersionWizard extends Wizard implements ModifyListener {
43  	private static final long serialVersionUID = -8365425809976445458L;
44  
45  	// Context
46  	private final Node project;
47  	private Node version;
48  
49  	// UI objects
50  	private ProjectDropDown projectDD;
51  	private Text idTxt;
52  	private DateText releaseDateCmp;
53  	private Text descTxt;
54  
55  	// Ease implementation
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  //		else if (TrackerUtils.getVersionById(project, id) != null)
84  //			msg = "A version with ID " + id + " already exists, cannot create";
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 			// Project
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 			// Label lbl =
172 			createLabel(parent, "Release Date ", SWT.CENTER);
173 			// gd = new GridData();
174 			// gd.horizontalIndent = 15;
175 			// lbl.setLayoutData(gd);
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 	// local helpers
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 }