View Javadoc
1   package org.argeo.people.e4.parts;
2   
3   import javax.inject.Inject;
4   import javax.jcr.Node;
5   import javax.jcr.Property;
6   import javax.jcr.PropertyType;
7   import javax.jcr.RepositoryException;
8   import javax.jcr.Session;
9   import javax.jcr.Value;
10  
11  import org.apache.commons.logging.Log;
12  import org.apache.commons.logging.LogFactory;
13  import org.argeo.activities.ActivitiesService;
14  import org.argeo.activities.ui.RelatedActivityList;
15  import org.argeo.cms.ui.eclipse.forms.AbstractFormPart;
16  import org.argeo.cms.util.CmsUtils;
17  import org.argeo.connect.ConnectConstants;
18  import org.argeo.connect.e4.ConnectE4Msg;
19  import org.argeo.connect.resources.ResourcesNames;
20  import org.argeo.connect.resources.ResourcesService;
21  import org.argeo.connect.ui.ConnectUiConstants;
22  import org.argeo.connect.ui.ConnectUiUtils;
23  import org.argeo.connect.ui.ConnectWorkbenchUtils;
24  import org.argeo.connect.ui.parts.TagLikeListPart;
25  import org.argeo.connect.ui.util.LazyCTabControl;
26  import org.argeo.connect.util.ConnectJcrUtils;
27  import org.argeo.eclipse.ui.EclipseUiUtils;
28  import org.argeo.people.PeopleException;
29  import org.argeo.people.PeopleNames;
30  import org.argeo.people.PeopleService;
31  import org.argeo.people.PeopleTypes;
32  import org.argeo.people.e4.PeopleRapConstants;
33  import org.argeo.people.ui.PeopleMsg;
34  import org.argeo.people.ui.providers.PersonOverviewLabelProvider;
35  import org.eclipse.jface.viewers.ColumnLabelProvider;
36  import org.eclipse.swt.SWT;
37  import org.eclipse.swt.custom.CTabFolder;
38  import org.eclipse.swt.events.ModifyEvent;
39  import org.eclipse.swt.events.ModifyListener;
40  import org.eclipse.swt.layout.FormLayout;
41  import org.eclipse.swt.layout.GridData;
42  import org.eclipse.swt.layout.GridLayout;
43  import org.eclipse.swt.layout.RowLayout;
44  import org.eclipse.swt.widgets.Button;
45  import org.eclipse.swt.widgets.Composite;
46  import org.eclipse.swt.widgets.Event;
47  import org.eclipse.swt.widgets.Label;
48  import org.eclipse.swt.widgets.Listener;
49  import org.eclipse.swt.widgets.Text;
50  
51  /** Edit a person with corresponding details */
52  public class PersonEditor extends AbstractPeopleWithImgEditor implements PeopleNames {
53  	final static Log log = LogFactory.getLog(PersonEditor.class);
54  	// public final static String ID = PeopleRapPlugin.PLUGIN_ID + ".personEditor";
55  	// private BundleContext bc =
56  	// FrameworkUtil.getBundle(PersonEditor.class).getBundleContext();
57  
58  	// Context
59  	@Inject
60  	private ActivitiesService activitiesService;
61  	@Inject
62  	private PeopleService peopleService;
63  
64  	private Node person;
65  
66  	public PersonEditor() {
67  		// peopleService = bc.getService(bc.getServiceReference(PeopleService.class));
68  		// activitiesService =
69  		// bc.getService(bc.getServiceReference(ActivitiesService.class));
70  	}
71  
72  	public void init() {
73  		super.init();
74  		person = getNode();
75  	}
76  
77  	@Override
78  	protected void updatePartName() {
79  		String shortName = ConnectJcrUtils.get(getNode(), Property.JCR_TITLE);
80  		if (EclipseUiUtils.notEmpty(shortName)) {
81  			if (shortName.length() > SHORT_NAME_LENGHT)
82  				shortName = shortName.substring(0, SHORT_NAME_LENGHT - 1) + "...";
83  			setPartName(shortName);
84  		}
85  	}
86  
87  	@Override
88  	protected void populateHeader(Composite parent) {
89  		GridLayout gl = EclipseUiUtils.noSpaceGridLayout();
90  		gl.marginBottom = 10;
91  		parent.setLayout(gl);
92  
93  		// Main info
94  		Composite titleCmp = getFormToolkit().createComposite(parent, SWT.NO_FOCUS);
95  		titleCmp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
96  		populateTitleComposite(titleCmp);
97  
98  		// // Tags Management
99  		Composite tagsCmp = new TagLikeListPart(this, parent, SWT.NO_FOCUS, getResourcesService(),
100 				getSystemWorkbenchService(), ConnectConstants.RESOURCE_TAG, person, ResourcesNames.CONNECT_TAGS,
101 				ConnectE4Msg.addTag.lead());
102 		tagsCmp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
103 		//
104 		// // Mailing lists management
105 		// Composite mlCmp = new MailingListListPart(this, parent, SWT.NO_FOCUS,
106 		// getResourcesService(),
107 		// getSystemWorkbenchService(), PeopleTypes.PEOPLE_MAILING_LIST, person,
108 		// PEOPLE_MAILING_LISTS,
109 		// "Add a mailing");
110 		// mlCmp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
111 	}
112 
113 	@Override
114 	protected void populateTabFolder(CTabFolder folder) {
115 		// Contact informations
116 		String tooltip = "";// "Contact information for " + JcrUtils.get(person, Property.JCR_TITLE);
117 		LazyCTabControl cpc = new ContactListCTab(folder, SWT.NO_FOCUS, this, getNode(), getResourcesService(),
118 				getPeopleService(), getSystemWorkbenchService());
119 		cpc.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
120 		addLazyTabToFolder(folder, cpc, PeopleMsg.personDetails.lead(), PeopleRapConstants.CTAB_CONTACT_DETAILS,
121 				tooltip);
122 
123 		// Activities and tasks
124 		tooltip = "";// "Activities and tasks related to " + JcrUtils.get(person,
125 						// Property.JCR_TITLE);
126 		LazyCTabControl activitiesCmp = new RelatedActivityList(folder, SWT.NO_FOCUS, this, getUserAdminService(),
127 				getResourcesService(), getActivitiesService(), getSystemAppService(), getSystemWorkbenchService(),
128 				person);
129 		activitiesCmp.setLayoutData(EclipseUiUtils.fillAll());
130 		addLazyTabToFolder(folder, activitiesCmp, PeopleMsg.personActivityLog.lead(),
131 				PeopleRapConstants.CTAB_ACTIVITY_LOG, tooltip);
132 
133 		// Jobs panel
134 		tooltip = "";// "Organisations linked to " + JcrUtils.get(person, Property.JCR_TITLE);
135 		LazyCTabControl crewCmp = new JobListCTab(folder, SWT.NO_FOCUS, this, getResourcesService(), getPeopleService(),
136 				getSystemWorkbenchService(), person);
137 		crewCmp.setLayoutData(EclipseUiUtils.fillAll());
138 		addLazyTabToFolder(folder, crewCmp, PeopleMsg.personOrgs.lead(), PeopleRapConstants.CTAB_JOBS, tooltip);
139 
140 		// Security
141 		try {
142 			if (person.isNodeType(PeopleTypes.PEOPLE_USER)) {
143 				String dn = person.getProperty(PeopleNames.PEOPLE_USERNAME).getString();
144 				tooltip = "";// "Security";
145 				LazyCTabControl securityCmp = new PersonSecurityCTab(folder, SWT.NO_FOCUS, this, getUserAdminService(),
146 						dn);
147 				addLazyTabToFolder(folder, securityCmp, PeopleMsg.personSecurity.lead(),
148 						PeopleRapConstants.CTAB_SECURITY, tooltip);
149 			}
150 		} catch (RepositoryException e) {
151 			// TODO Auto-generated catch block
152 			e.printStackTrace();
153 		}
154 	}
155 
156 	protected void populateTitleComposite(Composite parent) {
157 		parent.setLayout(new FormLayout());
158 
159 		// READ ONLY
160 		final Composite readOnlyPanel = getFormToolkit().createComposite(parent, SWT.NO_FOCUS);
161 		ConnectUiUtils.setSwitchingFormData(readOnlyPanel);
162 		readOnlyPanel.setLayout(new GridLayout());
163 
164 		// Add a label with info provided by the PersonOverviewLabelProvider
165 		final Label readOnlyInfoLbl = getFormToolkit().createLabel(readOnlyPanel, "", SWT.WRAP);
166 		CmsUtils.markup(readOnlyInfoLbl);
167 		final ColumnLabelProvider personLP = new PersonOverviewLabelProvider(
168 				ConnectUiConstants.LIST_TYPE_OVERVIEW_TITLE, getResourcesService(), getPeopleService(),
169 				getSystemWorkbenchService());
170 
171 		// EDIT
172 		final Composite editPanelCmp = getFormToolkit().createComposite(parent, SWT.NO_FOCUS);
173 		ConnectUiUtils.setSwitchingFormData(editPanelCmp);
174 		editPanelCmp.setLayout(EclipseUiUtils.noSpaceGridLayout());
175 
176 		// First Line - display Name management
177 		Composite firstCmp = getFormToolkit().createComposite(editPanelCmp, SWT.NO_FOCUS);
178 		firstCmp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
179 		RowLayout rl = new RowLayout(SWT.HORIZONTAL);
180 		rl.wrap = false;
181 		firstCmp.setLayout(rl);
182 
183 		// Second Line main names
184 		Composite secondCmp = getFormToolkit().createComposite(editPanelCmp, SWT.NO_FOCUS);
185 		secondCmp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
186 		rl = new RowLayout(SWT.HORIZONTAL);
187 		rl.wrap = false;
188 		secondCmp.setLayout(rl);
189 
190 		// // Third Line: other Names
191 		// Composite thirdCmp = getFormToolkit().createComposite(editPanelCmp,
192 		// SWT.NO_FOCUS);
193 		// thirdCmp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
194 		// rl = new RowLayout(SWT.HORIZONTAL);
195 		// rl.wrap = false;
196 		// thirdCmp.setLayout(rl);
197 		//
198 		// // Fourth Line: Polite form & spoken languages
199 		// Composite fourthCmp = getFormToolkit().createComposite(editPanelCmp,
200 		// SWT.NO_FOCUS);
201 		// fourthCmp.setLayoutData(EclipseUiUtils.fillWidth());
202 		// fourthCmp.setLayout(new GridLayout(4, false));
203 
204 		// Create edit text
205 		// final Text displayNameTxt =
206 		// ConnectWorkbenchUtils.createRDText(getFormToolkit(), firstCmp, "Display
207 		// name",
208 		// "Default display name for this person", 300);
209 		// final Button defineDistinctBtn = getFormToolkit().createButton(firstCmp,
210 		// "Define a distinct display name",
211 		// SWT.CHECK);
212 		// if (!EclipseUiUtils.isEmpty(ConnectJcrUtils.get(person,
213 		// PeopleNames.PEOPLE_DISPLAY_NAME)))
214 		// defineDistinctBtn.setSelection(true);
215 
216 		final Text salutationTxt = ConnectUiUtils.createRDText(getFormToolkit(), secondCmp, PeopleMsg.salutation.lead(),
217 				"", 60);
218 		final Text firstNameTxt = ConnectUiUtils.createRDText(getFormToolkit(), secondCmp, PeopleMsg.firstName.lead(),
219 				"", 100);
220 		// final Text middleNameTxt =
221 		// ConnectWorkbenchUtils.createRDText(getFormToolkit(), secondCmp, "Middle
222 		// Name",
223 		// "The second name if it exists", 100);
224 		final Text lastNameTxt = ConnectUiUtils.createRDText(getFormToolkit(), secondCmp, PeopleMsg.lastName.lead(), "",
225 				100);
226 		// final Text suffixTxt = ConnectWorkbenchUtils.createRDText(getFormToolkit(),
227 		// secondCmp, "Suffix",
228 		// "Junior, the third...", 80);
229 
230 		// final Text genderTxt = entityTK.createText(thirdCmp, "Gender", "...",
231 		// 80);
232 		// final Text titleTxt = ConnectWorkbenchUtils.createRDText(getFormToolkit(),
233 		// thirdCmp, "Title", "Doc., Sir...",
234 		// 60);
235 		// final Text maidenNameTxt =
236 		// ConnectWorkbenchUtils.createRDText(getFormToolkit(), thirdCmp, "Maiden Name",
237 		// "Birth Name before getting maried", 100);
238 		// final Text nickNameTxt = ConnectWorkbenchUtils.createRDText(getFormToolkit(),
239 		// thirdCmp, "Nickame",
240 		// "A pseudonym...", 100);
241 		// final Text latinPhoneticTxt =
242 		// ConnectWorkbenchUtils.createRDText(getFormToolkit(), thirdCmp, "Latin
243 		// Phonetic",
244 		// "A helper to know how to pronounce this name", 100);
245 
246 		// Fourth Line
247 		// ConnectWorkbenchUtils.createBoldLabel(getFormToolkit(), fourthCmp, "Form Of
248 		// Address");
249 		// Composite politeCmp = getFormToolkit().createComposite(fourthCmp,
250 		// SWT.NO_FOCUS);
251 		// politeCmp.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
252 		// GridLayout layout = new GridLayout(2, false);
253 		// layout.marginHeight = layout.marginTop = layout.marginBottom =
254 		// layout.verticalSpacing = 0;
255 		// politeCmp.setLayout(layout);
256 		// final Button formalBtn = new Button(politeCmp, SWT.RADIO);
257 		// formalBtn.setText("Formal");
258 		// final Button informalBtn = new Button(politeCmp, SWT.RADIO);
259 		// informalBtn.setText("Informal");
260 		//
261 		// ConnectWorkbenchUtils.createBoldLabel(getFormToolkit(), fourthCmp,
262 		// "Language");
263 		// Composite languageCmp = getFormToolkit().createComposite(fourthCmp,
264 		// SWT.NO_FOCUS);
265 		// languageCmp.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
266 		// layout = new GridLayout(2, false);
267 		// layout.marginHeight = layout.marginTop = layout.marginBottom =
268 		// layout.verticalSpacing = 0;
269 		// languageCmp.setLayout(layout);
270 		// final Button deBtn = new Button(languageCmp, SWT.RADIO);
271 		// deBtn.setText("German");
272 		// final Button enBtn = new Button(languageCmp, SWT.RADIO);
273 		// enBtn.setText("English");
274 
275 		final AbstractFormPart editPart = new AbstractFormPart() {
276 			public void refresh() { // update display value
277 				// EDIT PART
278 				// boolean useDistinct = defineDistinctBtn.getSelection();
279 				//
280 				// if (useDistinct)
281 				// ConnectUiUtils.refreshTextWidgetValue(displayNameTxt, person,
282 				// PeopleNames.PEOPLE_DISPLAY_NAME);
283 				// else
284 				// displayNameTxt.setText(getPeopleService().getPersonService().getDefaultDisplayName(person));
285 				// displayNameTxt.setEnabled(useDistinct);
286 
287 				ConnectUiUtils.refreshTextWidgetValue(salutationTxt, person, PEOPLE_SALUTATION);
288 				ConnectUiUtils.refreshTextWidgetValue(firstNameTxt, person, PEOPLE_FIRST_NAME);
289 				// ConnectUiUtils.refreshTextWidgetValue(middleNameTxt, person,
290 				// PEOPLE_MIDDLE_NAME);
291 				ConnectUiUtils.refreshTextWidgetValue(lastNameTxt, person, PEOPLE_LAST_NAME);
292 				// ConnectUiUtils.refreshTextWidgetValue(nickNameTxt, person, PEOPLE_NICKNAME);
293 				// ConnectUiUtils.refreshTextWidgetValue(maidenNameTxt, person,
294 				// PEOPLE_MAIDEN_NAME);
295 				// ConnectUiUtils.refreshTextWidgetValue(titleTxt, person,
296 				// PEOPLE_HONORIFIC_TITLE);
297 				// ConnectUiUtils.refreshTextWidgetValue(suffixTxt, person, PEOPLE_NAME_SUFFIX);
298 				// ConnectUiUtils.refreshTextWidgetValue(latinPhoneticTxt, person,
299 				// PEOPLE_LATIN_PHONETIC_SPELLING);
300 
301 				// refreshFormalRadio(formalBtn, person);
302 				// refreshFormalRadio(informalBtn, person);
303 				// refreshLangRadio(deBtn, person);
304 				// refreshLangRadio(enBtn, person);
305 
306 				// READ ONLY PART
307 				String roText = personLP.getText(person);
308 				readOnlyInfoLbl.setText(roText);
309 
310 				// Manage switch
311 				if (isEditing())
312 					editPanelCmp.moveAbove(readOnlyPanel);
313 				else
314 					editPanelCmp.moveBelow(readOnlyPanel);
315 
316 				readOnlyInfoLbl.pack();
317 				editPanelCmp.getParent().layout();
318 				super.refresh();
319 			}
320 		};
321 
322 		// Listeners
323 
324 		ConnectWorkbenchUtils.addModifyListener(firstNameTxt, person, PeopleNames.PEOPLE_FIRST_NAME, editPart);
325 		ConnectWorkbenchUtils.addModifyListener(lastNameTxt, person, PeopleNames.PEOPLE_LAST_NAME, editPart);
326 		// addDNameModifyListener(displayNameTxt, defineDistinctBtn, person,
327 		// PeopleNames.PEOPLE_DISPLAY_NAME, editPart);
328 		//
329 		// defineDistinctBtn.addSelectionListener(new SelectionAdapter() {
330 		// private static final long serialVersionUID = 1L;
331 		//
332 		// @Override
333 		// public void widgetSelected(SelectionEvent e) {
334 		// try {
335 		// boolean defineDistinct = defineDistinctBtn.getSelection();
336 		// String displayName =
337 		// getPeopleService().getPersonService().getDefaultDisplayName(person);
338 		// if (defineDistinct) {
339 		// ConnectJcrUtils.setJcrProperty(person, PeopleNames.PEOPLE_DISPLAY_NAME,
340 		// PropertyType.STRING,
341 		// displayName);
342 		// } else if (person.hasProperty(PeopleNames.PEOPLE_DISPLAY_NAME)) {
343 		// displayNameTxt.setText(displayName);
344 		// person.getProperty(PeopleNames.PEOPLE_DISPLAY_NAME).remove();
345 		// }
346 		// displayNameTxt.setEnabled(defineDistinct);
347 		// editPart.markDirty();
348 		// } catch (RepositoryException e1) {
349 		// throw new PeopleException("Unable to reset display name management for " +
350 		// person, e1);
351 		// }
352 		// }
353 		// });
354 
355 		ConnectWorkbenchUtils.addTxtModifyListener(editPart, salutationTxt, person, PEOPLE_SALUTATION,
356 				PropertyType.STRING);
357 		// ConnectWorkbenchUtils.addTxtModifyListener(editPart, middleNameTxt, person,
358 		// PEOPLE_MIDDLE_NAME,
359 		// PropertyType.STRING);
360 		ConnectWorkbenchUtils.addTxtModifyListener(editPart, lastNameTxt, person, PEOPLE_LAST_NAME,
361 				PropertyType.STRING);
362 		// ConnectWorkbenchUtils.addTxtModifyListener(editPart, nickNameTxt, person,
363 		// PEOPLE_NICKNAME, PropertyType.STRING);
364 		// entityTK.addTxtModifyListener(editPart, genderTxt, person,
365 		// PEOPLE_GENDER, PropertyType.STRING);
366 		// ConnectWorkbenchUtils.addTxtModifyListener(editPart, maidenNameTxt, person,
367 		// PEOPLE_MAIDEN_NAME,
368 		// PropertyType.STRING);
369 		// ConnectWorkbenchUtils.addTxtModifyListener(editPart, titleTxt, person,
370 		// PEOPLE_HONORIFIC_TITLE,
371 		// PropertyType.STRING);
372 		// ConnectWorkbenchUtils.addTxtModifyListener(editPart, suffixTxt, person,
373 		// PEOPLE_NAME_SUFFIX,
374 		// PropertyType.STRING);
375 		// ConnectWorkbenchUtils.addTxtModifyListener(editPart, latinPhoneticTxt,
376 		// person, PEOPLE_LATIN_PHONETIC_SPELLING,
377 		// PropertyType.STRING);
378 
379 		// Listener formalRadioListener = new Listener() {
380 		// private static final long serialVersionUID = 1L;
381 		//
382 		// public void handleEvent(Event event) {
383 		// Button btn = (Button) event.widget;
384 		// if (!btn.getSelection())
385 		// return;
386 		// boolean value = "Formal".equals(btn.getText());
387 		// if (ConnectJcrUtils.setJcrProperty(person, PEOPLE_USE_POLITE_FORM,
388 		// PropertyType.BOOLEAN, value))
389 		// editPart.markDirty();
390 		// }
391 		// };
392 		// formalBtn.addListener(SWT.Selection, formalRadioListener);
393 		// informalBtn.addListener(SWT.Selection, formalRadioListener);
394 
395 		Listener langRadioListener = new Listener() {
396 			private static final long serialVersionUID = 1L;
397 
398 			public void handleEvent(Event event) {
399 				Button btn = (Button) event.widget;
400 				try {
401 					if (!btn.getSelection())
402 						return;
403 
404 					Session session = ConnectJcrUtils.getSession(person);
405 					String newValueIso = getResourcesService().getEncodedTagCodeFromValue(session,
406 							ConnectConstants.RESOURCE_LANG, btn.getText());
407 					String oldValueIso = null;
408 					if (person.hasProperty(PEOPLE_SPOKEN_LANGUAGES)) {
409 						Value[] values = person.getProperty(PEOPLE_SPOKEN_LANGUAGES).getValues();
410 						if (values[0] != null)
411 							oldValueIso = values[0].getString();
412 					}
413 					if (!newValueIso.equals(oldValueIso)) {
414 						String[] newVals = { newValueIso };
415 						person.setProperty(PEOPLE_SPOKEN_LANGUAGES, newVals);
416 						editPart.markDirty();
417 					}
418 				} catch (RepositoryException e) {
419 					throw new PeopleException("Unable to update " + "spooken language on " + person, e);
420 				}
421 			}
422 
423 		};
424 		// deBtn.addListener(SWT.Selection, langRadioListener);
425 		// enBtn.addListener(SWT.Selection, langRadioListener);
426 
427 		editPart.initialize(getManagedForm());
428 		getManagedForm().addPart(editPart);
429 	}
430 
431 	private void addDNameModifyListener(final Text text, final Button useDistinctBtn, final Node node,
432 			final String propName, final AbstractFormPart part) {
433 		text.addModifyListener(new ModifyListener() {
434 			private static final long serialVersionUID = 1L;
435 
436 			@Override
437 			public void modifyText(ModifyEvent event) {
438 				if (useDistinctBtn.getSelection()) {
439 					if (ConnectJcrUtils.setJcrProperty(node, propName, PropertyType.STRING, text.getText()))
440 						part.markDirty();
441 				}
442 			}
443 		});
444 	}
445 
446 	private void refreshFormalRadio(Button button, Node entity) {
447 		Boolean tmp = false;
448 		try {
449 			if (entity.hasProperty(PEOPLE_USE_POLITE_FORM)) {
450 				boolean value = entity.getProperty(PEOPLE_USE_POLITE_FORM).getBoolean();
451 				if ("Formal".equals(button.getText()) && value || "Informal".equals(button.getText()) && !value)
452 					tmp = true;
453 			}
454 			button.setSelection(tmp);
455 			button.setEnabled(isEditing());
456 		} catch (RepositoryException re) {
457 			throw new PeopleException("Error getting polite form property on " + entity, re);
458 		}
459 	}
460 
461 	private void refreshLangRadio(Button button, Node entity) {
462 		Boolean tmp = false;
463 		try {
464 			if (entity.hasProperty(PEOPLE_SPOKEN_LANGUAGES)) {
465 				Value[] values = entity.getProperty(PEOPLE_SPOKEN_LANGUAGES).getValues();
466 				String isoVal = null;
467 				if (values[0] != null)
468 					isoVal = values[0].getString();
469 				ResourcesService rs = getResourcesService();
470 				if (isoVal != null && rs.getEncodedTagValue(getSession(), ConnectConstants.RESOURCE_LANG, isoVal)
471 						.equals(button.getText()))
472 					tmp = true;
473 			}
474 			button.setSelection(tmp);
475 			button.setEnabled(isEditing());
476 		} catch (RepositoryException re) {
477 			throw new PeopleException("Error getting polite form property on " + entity, re);
478 		}
479 	}
480 
481 	protected ActivitiesService getActivitiesService() {
482 		return activitiesService;
483 	}
484 
485 	protected PeopleService getPeopleService() {
486 		return peopleService;
487 	}
488 
489 	/* DEPENDENCY INJECTION */
490 	public void setActivitiesService(ActivitiesService activitiesService) {
491 		this.activitiesService = activitiesService;
492 	}
493 
494 	public void setPeopleService(PeopleService peopleService) {
495 		this.peopleService = peopleService;
496 	}
497 }