View Javadoc
1   package org.argeo.activities.ui;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   
6   import javax.jcr.Node;
7   import javax.jcr.Property;
8   import javax.jcr.PropertyIterator;
9   import javax.jcr.RepositoryException;
10  import javax.jcr.Session;
11  
12  import org.argeo.activities.ActivitiesException;
13  import org.argeo.activities.ActivitiesNames;
14  import org.argeo.activities.ActivitiesService;
15  import org.argeo.activities.ActivitiesTypes;
16  import org.argeo.activities.ActivityValueCatalogs;
17  import org.argeo.cms.ui.eclipse.forms.AbstractFormPart;
18  import org.argeo.cms.ui.eclipse.forms.FormToolkit;
19  import org.argeo.connect.SystemAppService;
20  import org.argeo.connect.UserAdminService;
21  import org.argeo.connect.resources.ResourcesService;
22  import org.argeo.connect.ui.AppWorkbenchService;
23  import org.argeo.connect.ui.ConnectEditor;
24  import org.argeo.connect.ui.ConnectUiUtils;
25  import org.argeo.connect.ui.SystemWorkbenchService;
26  import org.argeo.connect.ui.util.LazyCTabControl;
27  import org.argeo.connect.util.ConnectJcrUtils;
28  import org.argeo.eclipse.ui.EclipseUiUtils;
29  import org.argeo.jcr.JcrUtils;
30  import org.eclipse.jface.viewers.DoubleClickEvent;
31  import org.eclipse.jface.viewers.IDoubleClickListener;
32  import org.eclipse.jface.viewers.IStructuredSelection;
33  import org.eclipse.jface.window.Window;
34  import org.eclipse.jface.wizard.Wizard;
35  import org.eclipse.jface.wizard.WizardDialog;
36  import org.eclipse.swt.SWT;
37  import org.eclipse.swt.events.SelectionAdapter;
38  import org.eclipse.swt.events.SelectionEvent;
39  import org.eclipse.swt.events.TraverseEvent;
40  import org.eclipse.swt.events.TraverseListener;
41  import org.eclipse.swt.layout.GridData;
42  import org.eclipse.swt.layout.GridLayout;
43  import org.eclipse.swt.widgets.Button;
44  import org.eclipse.swt.widgets.Combo;
45  import org.eclipse.swt.widgets.Composite;
46  import org.eclipse.swt.widgets.Shell;
47  import org.eclipse.swt.widgets.Text;
48  //import org.eclipse.ui.forms.AbstractFormPart;
49  //import org.eclipse.ui.forms.widgets.FormToolkit;
50  
51  public class RelatedActivityList extends LazyCTabControl {
52  	private static final long serialVersionUID = 5906357274592489553L;
53  
54  	// private final static Log log = LogFactory.getLog(ActivityList.class);
55  
56  	// public final static String CTAB_ID = ActivitiesUiPlugin.PLUGIN_ID +
57  	// ".ctab.activityList";
58  	public final static String CTAB_ID = "activityList";
59  
60  	// Context
61  	private final UserAdminService userAdminService;
62  	private final ResourcesService resourcesService;
63  	private final ActivitiesService activitiesService;
64  	private final SystemAppService systemAppService;
65  	private final SystemWorkbenchService systemWorkbenchService;
66  	private final Node entity;
67  	private final ConnectEditor editor;
68  	private final FormToolkit toolkit;
69  
70  	// UI Objects
71  	private MyFormPart myFormPart;
72  	private MyActivityTableCmp activityTable;
73  
74  	@Override
75  	public void refreshPartControl() {
76  		myFormPart.refresh();
77  		RelatedActivityList.this.layout(true, true);
78  	}
79  
80  	public RelatedActivityList(Composite parent, int style, ConnectEditor editor,
81  			UserAdminService userAdminService, ResourcesService resourcesService, ActivitiesService activitiesService,
82  			SystemAppService systemAppService, SystemWorkbenchService systemWorkbenchService, Node entity) {
83  		super(parent, style);
84  		this.userAdminService = userAdminService;
85  		this.resourcesService = resourcesService;
86  		this.activitiesService = activitiesService;
87  		this.systemAppService = systemAppService;
88  		this.systemWorkbenchService = systemWorkbenchService;
89  		this.entity = entity;
90  		this.editor = editor;
91  		this.toolkit = editor.getFormToolkit();
92  	}
93  
94  	@Override
95  	public void createPartControl(Composite parent) {
96  		parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
97  
98  		// if (peopleService.getUserAdminService().amIInRole(
99  		// PeopleConstants.ROLE_MEMBER)) {
100 		Composite addCmp = null;
101 		if (ConnectJcrUtils.canEdit(entity)) {
102 			addCmp = toolkit.createComposite(parent);
103 			addCmp.setLayoutData(EclipseUiUtils.fillWidth());
104 		}
105 
106 		activityTable = new MyActivityTableCmp(parent, SWT.MULTI, entity);
107 		activityTable.setLayoutData(EclipseUiUtils.fillAll());
108 		activityTable.getTableViewer().addDoubleClickListener(new ActivityTableDCL(systemWorkbenchService));
109 
110 		if (addCmp != null)
111 			addNewActivityPanel(addCmp, activityTable);
112 
113 		myFormPart = new MyFormPart();
114 		myFormPart.initialize(editor.getManagedForm());
115 		editor.getManagedForm().addPart(myFormPart);
116 	}
117 
118 	private class MyFormPart extends AbstractFormPart {
119 
120 		@Override
121 		public void refresh() {
122 			activityTable.refresh();
123 			super.refresh();
124 		}
125 	}
126 
127 	private void addNewActivityPanel(final Composite addActivityBar, final MyActivityTableCmp activityTable) {
128 		// The Add Activity bar
129 		addActivityBar.setLayoutData(EclipseUiUtils.fillWidth());
130 		addActivityBar.setLayout(new GridLayout(7, false));
131 
132 		// Activity type
133 		final Combo typeCmb = new Combo(addActivityBar, SWT.NONE | SWT.READ_ONLY);
134 		GridData gd = new GridData(SWT.LEFT, SWT.CENTER, false, false);
135 		gd.widthHint = 100;
136 		typeCmb.setLayoutData(gd);
137 		typeCmb.setItems(ActivityValueCatalogs.getActivityTypeLabels());
138 		typeCmb.select(0);
139 
140 		toolkit.adapt(typeCmb, true, true);
141 
142 		// Title
143 		final Text titleTxt = ConnectUiUtils.createGDText(toolkit, addActivityBar, "Title",
144 				"Enter a short title for the activity to create", 150, 1);
145 
146 		// Description
147 		final Text descTxt = ConnectUiUtils.createGDText(toolkit, addActivityBar, "Description",
148 				"Enter a description for the activity to create", 300, 1);
149 
150 		Button validBtn = toolkit.createButton(addActivityBar, "Add activity", SWT.PUSH);
151 
152 		// toolkit.createLabel(addActivityBar, " OR ", SWT.NONE);
153 		//
154 		// final Link addTaskLk = new Link(addActivityBar, SWT.NONE);
155 		// addTaskLk.setText("<a>Add a task</a>");
156 
157 		// Selection and traverse listeners
158 		validBtn.addSelectionListener(new SelectionAdapter() {
159 			private static final long serialVersionUID = 1L;
160 
161 			@Override
162 			public void widgetSelected(SelectionEvent e) {
163 				createActivity(entity, typeCmb, titleTxt, descTxt, activityTable);
164 			}
165 		});
166 
167 		TraverseListener travList = new TraverseListener() {
168 			private static final long serialVersionUID = 1L;
169 
170 			@Override
171 			public void keyTraversed(TraverseEvent e) {
172 				if (e.keyCode == SWT.CR) {
173 					e.doit = false;
174 					createActivity(entity, typeCmb, titleTxt, descTxt, activityTable);
175 				}
176 			}
177 		};
178 
179 		titleTxt.addTraverseListener(travList);
180 		descTxt.addTraverseListener(travList);
181 
182 		// addTaskLk.addSelectionListener(new SelectionAdapter() {
183 		// private static final long serialVersionUID = 1L;
184 		//
185 		// @Override
186 		// public void widgetSelected(SelectionEvent e) {
187 		// if (createTask(addTaskLk.getShell(), entity))
188 		// activityTable.refresh();
189 		// }
190 		// });
191 	}
192 
193 	// LOCAL UI HELPERS
194 
195 	private class ActivityTableDCL implements IDoubleClickListener {
196 
197 		// private String openEditorCmdId;
198 
199 		private AppWorkbenchService appWorkbenchService;
200 
201 		public ActivityTableDCL(AppWorkbenchService appWorkbenchService) {
202 			// this.openEditorCmdId = openEditorCmdId;
203 			this.appWorkbenchService = appWorkbenchService;
204 		}
205 
206 		public void doubleClick(DoubleClickEvent event) {
207 			if (event.getSelection() == null || event.getSelection().isEmpty())
208 				return;
209 			Object obj = ((IStructuredSelection) event.getSelection()).getFirstElement();
210 			// try {
211 			Node currNode;
212 			if (obj instanceof Node)
213 				currNode = (Node) obj;
214 			else
215 				return;
216 			// String jcrId = currNode.getIdentifier();
217 			// CommandUtils.callCommand(openEditorCmdId, ConnectEditor.PARAM_JCR_ID, jcrId);
218 			appWorkbenchService.openEntityEditor(currNode);
219 			// } catch (RepositoryException re) {
220 			// throw new ActivitiesException("Unable to open editor for node", re);
221 			// }
222 		}
223 	}
224 
225 	private class MyActivityTableCmp extends ActivityTable {
226 		private static final long serialVersionUID = 1L;
227 
228 		public MyActivityTableCmp(Composite parent, int style, Node entity) {
229 			super(parent, style, userAdminService, resourcesService, activitiesService, systemWorkbenchService, entity);
230 		}
231 
232 		protected void refreshFilteredList() {
233 			try {
234 				List<Node> nodes = new ArrayList<Node>();
235 				PropertyIterator pit = entity.getReferences(ActivitiesNames.ACTIVITIES_RELATED_TO); //
236 				while (pit.hasNext()) {
237 					Property currProp = pit.nextProperty();
238 					Node currNode = currProp.getParent();
239 					if (currNode.isNodeType(ActivitiesTypes.ACTIVITIES_ACTIVITY) && !nodes.contains(currNode))
240 						nodes.add(currNode);
241 				}
242 				getTableViewer().setInput(nodes.toArray());
243 			} catch (RepositoryException e) {
244 				throw new ActivitiesException("Unable to list activities", e);
245 			}
246 		}
247 	}
248 
249 	private void createActivity(Node entity, Combo typeLbCmb, Text titleTxt, Text descTxt, ActivityTable table) {
250 		String typeLbl = typeLbCmb.getText();
251 		String title = titleTxt.getText();
252 		String desc = descTxt.getText();
253 		String type = ActivityValueCatalogs.getKeyByValue(ActivityValueCatalogs.MAPS_ACTIVITY_TYPES, typeLbl);
254 		if (createActivity(entity, type, title, desc)) {
255 			table.refresh();
256 			typeLbCmb.select(0);
257 			titleTxt.setText("");
258 			descTxt.setText("");
259 			typeLbCmb.setFocus();
260 		}
261 	}
262 
263 	private boolean createTask(Shell shell, Node relatedEntity) {
264 		Session tmpSession = null;
265 		Session targetSession = null;
266 		try {
267 			tmpSession = relatedEntity.getSession().getRepository().login();
268 			Node draftTask = systemAppService.createDraftEntity(tmpSession, ActivitiesTypes.ACTIVITIES_TASK);
269 			Wizard wizard = systemWorkbenchService.getCreationWizard(draftTask);
270 
271 			WizardDialog dialog = new WizardDialog(shell, wizard);
272 			if (dialog.open() == Window.OK) {
273 				List<Node> relatedTo = new ArrayList<Node>();
274 				relatedTo.add(tmpSession.getNode(relatedEntity.getPath()));
275 				ConnectJcrUtils.setMultipleReferences(draftTask, ActivitiesNames.ACTIVITIES_RELATED_TO, relatedTo);
276 
277 				targetSession = relatedEntity.getSession().getRepository().login();
278 				Node targetParent = targetSession
279 						.getNode("/" + systemAppService.getBaseRelPath(ActivitiesTypes.ACTIVITIES_TASK));
280 				String currMainType = systemAppService.getMainNodeType(draftTask);
281 				Node newTask = systemAppService.publishEntity(targetParent, currMainType, draftTask);
282 				systemAppService.saveEntity(newTask, false);
283 				relatedEntity.getSession().refresh(true);
284 				return true;
285 			}
286 		} catch (RepositoryException e) {
287 			throw new ActivitiesException("Unable to create task node related to " + relatedEntity, e);
288 		} finally {
289 			JcrUtils.logoutQuietly(tmpSession);
290 			JcrUtils.logoutQuietly(targetSession);
291 		}
292 		return false;
293 	}
294 
295 	private boolean createActivity(Node relatedEntity, String type, String title, String desc) {
296 		Session tmpSession = null;
297 		Session targetSession = null;
298 
299 		try {
300 			tmpSession = relatedEntity.getSession().getRepository().login();
301 			List<Node> relatedTo = new ArrayList<Node>();
302 			relatedTo.add(tmpSession.getNode(relatedEntity.getPath()));
303 			Node draftActivity = systemAppService.createDraftEntity(tmpSession, type);
304 			activitiesService.configureActivity(draftActivity, type, title, desc, relatedTo);
305 
306 			targetSession = relatedEntity.getSession().getRepository().login();
307 			Node targetParent = targetSession
308 					.getNode("/" + systemAppService.getBaseRelPath(ActivitiesTypes.ACTIVITIES_ACTIVITY));
309 			Node createdActivity = systemAppService.publishEntity(targetParent, type, draftActivity);
310 			systemAppService.saveEntity(createdActivity, false);
311 			relatedEntity.getSession().refresh(true);
312 			return true;
313 		} catch (RepositoryException e) {
314 			throw new ActivitiesException("Unable to create activity node related to " + relatedEntity, e);
315 		} finally {
316 			JcrUtils.logoutQuietly(tmpSession);
317 			JcrUtils.logoutQuietly(targetSession);
318 		}
319 	}
320 }