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
49
50
51 public class RelatedActivityList extends LazyCTabControl {
52 private static final long serialVersionUID = 5906357274592489553L;
53
54
55
56
57
58 public final static String CTAB_ID = "activityList";
59
60
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
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
99
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
129 addActivityBar.setLayoutData(EclipseUiUtils.fillWidth());
130 addActivityBar.setLayout(new GridLayout(7, false));
131
132
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
143 final Text titleTxt = ConnectUiUtils.createGDText(toolkit, addActivityBar, "Title",
144 "Enter a short title for the activity to create", 150, 1);
145
146
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
153
154
155
156
157
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
183
184
185
186
187
188
189
190
191 }
192
193
194
195 private class ActivityTableDCL implements IDoubleClickListener {
196
197
198
199 private AppWorkbenchService appWorkbenchService;
200
201 public ActivityTableDCL(AppWorkbenchService appWorkbenchService) {
202
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
211 Node currNode;
212 if (obj instanceof Node)
213 currNode = (Node) obj;
214 else
215 return;
216
217
218 appWorkbenchService.openEntityEditor(currNode);
219
220
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 }