View Javadoc
1   package org.argeo.activities.e4.parts;
2   
3   import javax.annotation.PostConstruct;
4   import javax.inject.Inject;
5   import javax.jcr.Node;
6   import javax.jcr.Property;
7   
8   import org.apache.commons.logging.Log;
9   import org.apache.commons.logging.LogFactory;
10  import org.argeo.activities.ActivitiesNames;
11  import org.argeo.activities.ActivitiesService;
12  import org.argeo.activities.ui.LinkListPart;
13  import org.argeo.cms.ui.eclipse.forms.AbstractFormPart;
14  import org.argeo.cms.ui.eclipse.forms.FormToolkit;
15  import org.argeo.cms.ui.eclipse.forms.IManagedForm;
16  import org.argeo.connect.UserAdminService;
17  import org.argeo.connect.e4.parts.AbstractConnectEditor;
18  import org.argeo.connect.ui.ConnectUiUtils;
19  import org.argeo.connect.ui.ConnectWorkbenchUtils;
20  import org.argeo.connect.ui.parts.DateTextPart;
21  import org.argeo.connect.util.ConnectJcrUtils;
22  import org.argeo.eclipse.ui.EclipseUiUtils;
23  import org.eclipse.swt.SWT;
24  import org.eclipse.swt.layout.GridData;
25  import org.eclipse.swt.layout.GridLayout;
26  import org.eclipse.swt.widgets.Composite;
27  import org.eclipse.swt.widgets.Label;
28  import org.eclipse.swt.widgets.Text;
29  
30  /** Default People activity editor */
31  public class ActivityEditor extends AbstractConnectEditor {
32  	final static Log log = LogFactory.getLog(ActivityEditor.class);
33  
34  //	 public final static String ID = ActivitiesUiPlugin.PLUGIN_ID +
35  //	 ".activityEditor";
36  
37  	// Context
38  	private Node activity;
39  	
40  	@Inject
41  	private ActivitiesService activitiesService;
42  
43  	// Workaround to align first column of header and body.
44  	private int firstColWHint = 85;
45  
46  	@PostConstruct
47  	public void init() {
48  		super.init();
49  		activity = getNode();
50  	}
51  
52  	@Override
53  	protected void updatePartName() {
54  		String name = activitiesService.getActivityLabel(getNode());
55  		if (EclipseUiUtils.notEmpty(name))
56  			setPartName(name);
57  	}
58  
59  	protected void populateHeader(Composite parent) {
60  		parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
61  		Composite headerCmp = new ActivityHeader(getFormToolkit(), getManagedForm(), parent, SWT.NO_FOCUS,
62  				getUserAdminService(), activitiesService, activity);
63  		headerCmp.setLayoutData(EclipseUiUtils.fillWidth());
64  	}
65  
66  	@Override
67  	protected void populateBody(Composite parent) {
68  		parent.setLayout(new GridLayout(2, false));
69  
70  		FormToolkit toolkit = getFormToolkit();
71  		// 3rd line: title
72  		Label label = ConnectUiUtils.createBoldLabel(toolkit, parent, "Title");
73  		GridData gd = new GridData(SWT.RIGHT, SWT.CENTER, false, false);
74  		gd.widthHint = firstColWHint;
75  		label.setLayoutData(gd);
76  		final Text titleTxt = toolkit.createText(parent, "", SWT.BORDER | SWT.SINGLE);
77  		titleTxt.setLayoutData(EclipseUiUtils.fillWidth());
78  
79  		// Bottom part: description
80  		label = ConnectUiUtils.createBoldLabel(toolkit, parent, "Description");
81  		gd = new GridData(SWT.RIGHT, SWT.TOP, false, false);
82  		gd.widthHint = firstColWHint;
83  		gd.verticalIndent = 2;
84  		label.setLayoutData(gd);
85  		final Text descTxt = toolkit.createText(parent, "", SWT.BORDER | SWT.MULTI | SWT.WRAP);
86  		descTxt.setLayoutData(EclipseUiUtils.fillAll());
87  
88  		final AbstractFormPart formPart = new AbstractFormPart() {
89  			public void refresh() {
90  				super.refresh();
91  				ConnectWorkbenchUtils.refreshFormTextWidget(ActivityEditor.this, titleTxt, activity,
92  						Property.JCR_TITLE);
93  				ConnectWorkbenchUtils.refreshFormTextWidget(ActivityEditor.this, descTxt, activity,
94  						Property.JCR_DESCRIPTION);
95  			}
96  		};
97  
98  		ConnectWorkbenchUtils.addModifyListener(titleTxt, activity, Property.JCR_TITLE, formPart);
99  		ConnectWorkbenchUtils.addModifyListener(descTxt, activity, Property.JCR_DESCRIPTION, formPart);
100 
101 		formPart.initialize(getManagedForm());
102 		getManagedForm().addPart(formPart);
103 	}
104 
105 	private class ActivityHeader extends Composite {
106 		private static final long serialVersionUID = 6434106955847719839L;
107 
108 		private final ActivitiesService activityService;
109 		private final UserAdminService userAdminService;
110 		private final Node activity;
111 
112 		// UI Context
113 		private final MyFormPart myFormPart;
114 		private final FormToolkit toolkit;
115 
116 		// UI Objects
117 		private Label typeLbl;
118 		private Label managerLbl;
119 		private DateTextPart dateComposite;
120 		private LinkListPart relatedCmp;
121 
122 		public ActivityHeader(FormToolkit toolkit, IManagedForm form, Composite parent, int style,
123 				UserAdminService userAdminService, ActivitiesService activityService, Node activity) {
124 			super(parent, style);
125 			this.userAdminService = userAdminService;
126 			this.activityService = activityService;
127 			this.toolkit = toolkit;
128 			this.activity = activity;
129 
130 			// Initialise the form
131 			myFormPart = new MyFormPart();
132 			myFormPart.initialize(form);
133 			form.addPart(myFormPart);
134 		}
135 
136 		private class MyFormPart extends AbstractFormPart {
137 
138 			@Override
139 			public void refresh() {
140 				if (ActivityHeader.this.isDisposed())
141 					return;
142 
143 				if (ActivityHeader.this.getChildren().length == 0)
144 					populate(ActivityHeader.this);
145 
146 				typeLbl.setText(activityService.getActivityLabel(activity));
147 				String manager = ConnectJcrUtils.get(activity, ActivitiesNames.ACTIVITIES_REPORTED_BY);
148 				if (EclipseUiUtils.notEmpty(manager))
149 					managerLbl.setText(userAdminService.getUserDisplayName(manager));
150 
151 				dateComposite.refresh();
152 
153 				// We force full refresh with this workaround at each refresh to
154 				// insure the editable state will change even if no related
155 				// object has been added. Might be later cleaned
156 				if (relatedCmp != null && !relatedCmp.isDisposed()) {
157 					EclipseUiUtils.clear(relatedCmp);
158 					relatedCmp.refresh();
159 				}
160 				ActivityHeader.this.layout(true, true);
161 			}
162 
163 			private void populate(Composite parent) {
164 				parent.setLayout(new GridLayout(6, false));
165 
166 				// 1st line (NOTE: it defines the grid data layout of this part)
167 				// Work around to be able to kind of also align bold labels of
168 				// the body
169 				Label label = ConnectUiUtils.createBoldLabel(toolkit, parent, "Type");
170 				GridData gd = new GridData(SWT.RIGHT, SWT.CENTER, false, false);
171 				gd.widthHint = firstColWHint;
172 				label.setLayoutData(gd);
173 				typeLbl = toolkit.createLabel(parent, "");
174 
175 				gd = EclipseUiUtils.fillWidth();
176 				gd.verticalIndent = 3;
177 				typeLbl.setLayoutData(gd);
178 
179 				ConnectUiUtils.createBoldLabel(toolkit, parent, "Reported by");
180 				managerLbl = toolkit.createLabel(parent, "");
181 
182 				gd = EclipseUiUtils.fillWidth();
183 				gd.verticalIndent = 3;
184 				managerLbl.setLayoutData(gd);
185 
186 				// ACTIVITY DATE
187 				ConnectUiUtils.createBoldLabel(toolkit, parent, "Date");
188 				dateComposite = new DateTextPart(ActivityEditor.this, parent, SWT.NO_FOCUS, myFormPart, activity,
189 						ActivitiesNames.ACTIVITIES_ACTIVITY_DATE);
190 				dateComposite.setLayoutData(EclipseUiUtils.fillWidth());
191 
192 				// 2nd line - RELATED ENTITIES
193 				label = ConnectUiUtils.createBoldLabel(toolkit, parent, "Related to");
194 				gd = new GridData(SWT.RIGHT, SWT.CENTER, false, false);
195 				gd.verticalIndent = 2;
196 				label.setLayoutData(gd);
197 				relatedCmp = new LinkListPart(ActivityEditor.this, myFormPart, parent, SWT.NO_FOCUS,
198 						getSystemWorkbenchService(), activity, ActivitiesNames.ACTIVITIES_RELATED_TO);
199 				relatedCmp.setLayoutData(EclipseUiUtils.fillWidth(5));
200 			}
201 		}
202 	}
203 
204 	/* DEPENDENCY INJECTION */
205 	public void setActivitiesService(ActivitiesService activitiesService) {
206 		this.activitiesService = activitiesService;
207 	}
208 }