View Javadoc
1   package org.argeo.tracker.e4.parts;
2   
3   import java.text.DateFormat;
4   import java.text.SimpleDateFormat;
5   import java.util.ArrayList;
6   import java.util.List;
7   
8   import javax.inject.Inject;
9   import javax.jcr.Node;
10  import javax.jcr.Property;
11  import javax.jcr.RepositoryException;
12  import javax.jcr.Session;
13  import javax.jcr.nodetype.NodeType;
14  import javax.jcr.version.VersionManager;
15  
16  import org.argeo.activities.ActivitiesService;
17  import org.argeo.cms.ui.CmsEditable;
18  import org.argeo.cms.ui.eclipse.forms.FormToolkit;
19  import org.argeo.cms.ui.eclipse.forms.IManagedForm;
20  import org.argeo.cms.ui.eclipse.forms.ManagedForm;
21  import org.argeo.connect.AppService;
22  import org.argeo.connect.ConnectConstants;
23  import org.argeo.connect.ConnectException;
24  import org.argeo.connect.SystemAppService;
25  import org.argeo.connect.e4.parts.AbstractConnectCTabEditor;
26  import org.argeo.connect.ui.AppWorkbenchService;
27  import org.argeo.connect.ui.IStatusLineProvider;
28  import org.argeo.connect.ui.Refreshable;
29  import org.argeo.connect.ui.SystemWorkbenchService;
30  import org.argeo.connect.util.ConnectJcrUtils;
31  import org.argeo.documents.DocumentsService;
32  import org.argeo.eclipse.ui.EclipseUiUtils;
33  import org.argeo.jcr.JcrUtils;
34  import org.argeo.tracker.TrackerService;
35  import org.eclipse.core.runtime.IProgressMonitor;
36  import org.eclipse.e4.ui.di.Persist;
37  import org.eclipse.swt.SWT;
38  import org.eclipse.swt.custom.CTabFolder;
39  import org.eclipse.swt.custom.CTabItem;
40  import org.eclipse.swt.custom.ScrolledComposite;
41  import org.eclipse.swt.layout.GridData;
42  import org.eclipse.swt.widgets.Composite;
43  import org.eclipse.swt.widgets.Label;
44  
45  /**
46   * Base Editor for a tracker entity. Centralise some methods to ease business
47   * specific development
48   */
49  public abstract class AbstractTrackerEditor extends AbstractConnectCTabEditor
50  		implements CmsEditable, Refreshable, IStatusLineProvider {
51  	// private static final long serialVersionUID = -6765842363698806619L;
52  
53  	/* DEPENDENCY INJECTION */
54  	// @Inject
55  	// private Repository repository;
56  	// @Inject
57  	// private UserAdminService userAdminService;
58  	// @Inject
59  	// private ResourcesService resourcesService;
60  	@Inject
61  	private ActivitiesService activitiesService;
62  	@Inject
63  	private DocumentsService documentsService;
64  	@Inject
65  	private TrackerService trackerService;
66  
67  	@Inject
68  	private SystemAppService appService;
69  	@Inject
70  	private SystemWorkbenchService appWorkbenchService;
71  
72  	List<AbstractEditorPage> pages = new ArrayList<>();
73  	// @Inject
74  	// private MPart mPart;
75  
76  	// Context
77  	// private Session session;
78  	// private Node node;
79  
80  	private final static DateFormat df = new SimpleDateFormat(ConnectConstants.DEFAULT_DATE_TIME_FORMAT);
81  
82  	// public void init() {
83  	// try {
84  	// session = repository.login();
85  	// // EntityEditorInput sei = (EntityEditorInput) getEditorInput();
86  	// // FIXME
87  	// String uid = null;
88  	// node = session.getNodeByIdentifier(uid);
89  	// // Set a default part name and tooltip
90  	// updatePartName();
91  	// updateToolTip();
92  	// } catch (RepositoryException e) {
93  	// throw new TrackerException("Unable to create new session" + " to use with
94  	// current editor", e);
95  	// }
96  	// }
97  
98  	/** Overwrite to provide a specific part Name */
99  	// protected void updatePartName() {
100 	// String name = ConnectJcrUtils.get(node, Property.JCR_TITLE);
101 	// setPartName(name);
102 	// }
103 
104 	// protected void setPartName(String name) {
105 	// if (notEmpty(name))
106 	// mPart.setLabel(name);
107 	// }
108 
109 	/** Overwrite to provide a specific part tooltip */
110 	// protected void updateToolTip() {
111 	// // EntityEditorInput sei = (EntityEditorInput) getEditorInput();
112 	// // String displayName = ConnectJcrUtils.get(node, Property.JCR_TITLE);
113 	// // if (isEmpty(displayName))
114 	// // displayName = "current objet";
115 	// // sei.setTooltipText("Display and edit information for " + displayName);
116 	// }
117 
118 	protected abstract void addPages();
119 
120 	@Override
121 	protected void init() {
122 		super.init();
123 		addPages();
124 	}
125 
126 	protected void addPage(AbstractEditorPage page) {
127 		pages.add(page);
128 	}
129 
130 	protected void commitPages(boolean b) {
131 		// TODO implement
132 	}
133 
134 	protected AbstractEditorPage getActivePageInstance() {
135 		return null;
136 	}
137 
138 	@Override
139 	protected void populateTabFolder(CTabFolder tabFolder) {
140 		for (AbstractEditorPage page : pages) {
141 			// Composite body = addTabToFolder(tabFolder, SWT.NONE, page.getLabel(),
142 			// page.getPageId(), "TOOLTIP");
143 			// body.setLayout(new GridLayout());
144 			// page.createUi(body);
145 
146 			ScrolledComposite form = addScrolledTabToFolder(tabFolder, SWT.NONE, page.getLabel(), page.getPageId(),
147 					null);
148 			IManagedForm managedForm = new ManagedForm(getManagedForm().getToolkit(), form);
149 			// managedForm.getForm().setLayout(new GridLayout());
150 
151 			// Composite body = getFormToolkit().createComposite(managedForm.getForm());
152 			// managedForm.getForm().setContent(body);
153 			// body.setLayout(new GridLayout());
154 			// for (int i = 0; i < 3; i++)
155 			// new Label(body, SWT.BORDER).setText("TEST");
156 
157 			// IManagedForm managedForm = getManagedForm();
158 			// IManagedForm managedForm = new ManagedForm(body);
159 			page.createUi(managedForm);
160 			
161 //			page.createUi(getManagedForm());
162 		}
163 
164 	}
165 
166 	protected ScrolledComposite addScrolledTabToFolder(CTabFolder tabFolder, int style, String label, String id,
167 			String tooltip) {
168 		CTabItem item = new CTabItem(tabFolder, style);
169 		item.setData(CTAB_INSTANCE_ID, id);
170 		item.setText(label);
171 		item.setToolTipText(tooltip);
172 		ScrolledComposite innerPannel = getFormToolkit().createScrolledForm(tabFolder);
173 		// must set control
174 		item.setControl(innerPannel);
175 		return innerPannel;
176 	}
177 
178 	@Override
179 	protected void populateHeader(Composite parent) {
180 		// TODO Auto-generated method stub
181 
182 	}
183 
184 	@Override
185 	public String getStatusLineMessage() {
186 		Node currNode = getNode();
187 		StringBuilder builder = new StringBuilder();
188 		try {
189 			if (currNode.isNodeType(NodeType.MIX_TITLE)) {
190 				builder.append(ConnectJcrUtils.get(currNode, Property.JCR_TITLE)).append(" - ");
191 			}
192 			if (currNode.isNodeType(NodeType.MIX_LAST_MODIFIED)) {
193 				builder.append("Last updated on ");
194 				builder.append(df.format(currNode.getProperty(Property.JCR_LAST_MODIFIED).getDate().getTime()));
195 				builder.append(", by ");
196 				String lstModByDn = currNode.getProperty(Property.JCR_LAST_MODIFIED_BY).getString();
197 				builder.append(getUserAdminService().getUserDisplayName(lstModByDn));
198 				builder.append(". ");
199 			}
200 			return builder.toString();
201 		} catch (RepositoryException re) {
202 			throw new ConnectException("Unable to create last " + "modified message for " + currNode, re);
203 		}
204 	}
205 
206 	// Exposes
207 	// protected Node getNode() {
208 	// return node;
209 	// }
210 
211 	// protected Session getSession() {
212 	// return ConnectJcrUtils.getSession(node);
213 	// }
214 	//
215 	// protected Repository getRepository() {
216 	// return repository;
217 	// }
218 	//
219 	// protected UserAdminService getUserAdminService() {
220 	// return userAdminService;
221 	// }
222 	//
223 	// protected ResourcesService getResourcesService() {
224 	// return resourcesService;
225 	// }
226 
227 	protected DocumentsService getDocumentsService() {
228 		return documentsService;
229 	}
230 
231 	protected ActivitiesService getActivitiesService() {
232 		return activitiesService;
233 	}
234 
235 	protected TrackerService getTrackerService() {
236 		return trackerService;
237 	}
238 
239 	protected AppWorkbenchService getAppWorkbenchService() {
240 		return appWorkbenchService;
241 	}
242 
243 	protected AppService getAppService() {
244 		return appService;
245 	}
246 
247 	// Editor life cycle
248 	@Persist
249 	public void doSave(IProgressMonitor monitor) {
250 		// Perform pre-saving specific action in each form part
251 		commitPages(true);
252 		// Effective save
253 		try {
254 			boolean changed = false;
255 			Session session = getNode().getSession();
256 			if (session.hasPendingChanges()) {
257 				JcrUtils.updateLastModified(getNode());
258 				session.save();
259 				changed = true;
260 			}
261 			if (changed && ConnectJcrUtils.isVersionable(getNode())) {
262 				VersionManager vm = session.getWorkspace().getVersionManager();
263 				String path = getNode().getPath();
264 				vm.checkpoint(path);
265 			}
266 		} catch (RepositoryException re) {
267 			throw new ConnectException("Unable to perform check point on " + getNode(), re);
268 		}
269 
270 		// firePropertyChange(PROP_DIRTY);
271 	}
272 
273 	// @Override
274 	// public void forceRefresh(Object object) {
275 	// // TODO implement a better refresh mechanism
276 	// // IManagedForm mf = getActivePageInstance().getManagedForm();
277 	// IManagedForm mf = getManagedForm();
278 	// for (IFormPart part : mf.getParts())
279 	// if (part instanceof AbstractFormPart)
280 	// ((AbstractFormPart) part).markStale();
281 	//
282 	// mf.refresh();
283 	// }
284 
285 	// @PreDestroy
286 	// public void dispose() {
287 	// JcrUtils.logoutQuietly(session);
288 	// }
289 	//
290 	// // CmsEditable LIFE CYCLE
291 	// @Override
292 	// public Boolean canEdit() {
293 	// // TODO refine this
294 	// String roleStr = TrackerRole.editor.dn();
295 	// return CurrentUser.isInRole(roleStr);
296 	// }
297 
298 	// @Override
299 	// public Boolean isEditing() {
300 	// return true;
301 	// }
302 	//
303 	// @Override
304 	// public void startEditing() {
305 	// }
306 	//
307 	// @Override
308 	// public void stopEditing() {
309 	// }
310 
311 	/* DEPENDENCY INJECTION */
312 	// public void setRepository(Repository repository) {
313 	// this.repository = repository;
314 	// }
315 	//
316 	// public void setUserAdminService(UserAdminService userAdminService) {
317 	// this.userAdminService = userAdminService;
318 	// }
319 
320 	// public void setResourcesService(ResourcesService resourcesService) {
321 	// this.resourcesService = resourcesService;
322 	// }
323 
324 	// public void setActivitiesService(ActivitiesService activitiesService) {
325 	// this.activitiesService = activitiesService;
326 	// }
327 	//
328 	// public void setDocumentsService(DocumentsService documentsService) {
329 	// this.documentsService = documentsService;
330 	// }
331 	//
332 	// public void setTrackerService(TrackerService trackerService) {
333 	// this.trackerService = trackerService;
334 	// }
335 
336 	// public void setAppService(AppService appService) {
337 	// this.appService = appService;
338 	// }
339 	//
340 	// public void setAppWorkbenchService(AppWorkbenchService appWorkbenchService) {
341 	// this.appWorkbenchService = appWorkbenchService;
342 	// }
343 	/** @deprecated Use {@link #createFormBoldLabel(Composite, String)} */
344 	@Deprecated
345 	protected Label createFormBoldLabel(FormToolkit toolkit, Composite parent, String value) {
346 		return createFormBoldLabel(parent, value);
347 	}
348 
349 	protected Label createFormBoldLabel(Composite parent, String value) {
350 		Label label = new Label(parent, SWT.END);
351 		label.setText(" " + value);
352 		label.setFont(EclipseUiUtils.getBoldFont(parent));
353 		GridData twd = new GridData(SWT.END, SWT.FILL, false, false);
354 		label.setLayoutData(twd);
355 		return label;
356 	}
357 
358 }