View Javadoc
1   package org.argeo.people.ui.composites;
2   
3   import javax.jcr.Node;
4   import javax.jcr.Property;
5   import javax.jcr.PropertyType;
6   import javax.jcr.RepositoryException;
7   import javax.jcr.Session;
8   
9   import org.argeo.cms.ui.eclipse.forms.AbstractFormPart;
10  import org.argeo.cms.ui.eclipse.forms.FormToolkit;
11  import org.argeo.connect.ConnectConstants;
12  import org.argeo.connect.ConnectNames;
13  import org.argeo.connect.resources.ResourcesService;
14  import org.argeo.connect.ui.ConnectEditor;
15  import org.argeo.connect.ui.ConnectUiConstants;
16  import org.argeo.connect.ui.ConnectUiUtils;
17  import org.argeo.connect.ui.ConnectWorkbenchUtils;
18  import org.argeo.connect.ui.SystemWorkbenchService;
19  import org.argeo.connect.ui.widgets.TagLikeDropDown;
20  import org.argeo.connect.util.ConnectJcrUtils;
21  import org.argeo.eclipse.ui.EclipseUiUtils;
22  import org.argeo.people.PeopleException;
23  import org.argeo.people.PeopleNames;
24  import org.argeo.people.PeopleService;
25  import org.argeo.people.PeopleTypes;
26  import org.argeo.people.ui.PeopleMsg;
27  import org.argeo.people.ui.PeopleUiSnippets;
28  import org.argeo.people.ui.dialogs.PickUpOrgDialog;
29  import org.argeo.people.util.PeopleJcrUtils;
30  //import org.argeo.people.workbench.rap.dialogs.PickUpOrgDialog;
31  import org.eclipse.rap.rwt.RWT;
32  import org.eclipse.swt.SWT;
33  import org.eclipse.swt.events.ModifyEvent;
34  import org.eclipse.swt.events.ModifyListener;
35  import org.eclipse.swt.events.SelectionAdapter;
36  import org.eclipse.swt.events.SelectionEvent;
37  import org.eclipse.swt.layout.GridData;
38  import org.eclipse.swt.layout.GridLayout;
39  import org.eclipse.swt.layout.RowLayout;
40  import org.eclipse.swt.widgets.Combo;
41  import org.eclipse.swt.widgets.Composite;
42  import org.eclipse.swt.widgets.Label;
43  import org.eclipse.swt.widgets.Link;
44  import org.eclipse.swt.widgets.Text;
45  //import org.eclipse.ui.forms.AbstractFormPart;
46  //import org.eclipse.ui.forms.widgets.FormToolkit;
47  
48  /**
49   * Simple widget composite to display and edit a contact of type post mail
50   * address information.
51   */
52  public class ContactAddressComposite extends Composite implements PeopleNames {
53  	private static final long serialVersionUID = 4475049051062923873L;
54  
55  	// private final static Log log = LogFactory
56  	// .getLog(ContactAddressComposite.class);
57  
58  	private final ResourcesService resourcesService;
59  	private final PeopleService peopleService;
60  	private final SystemWorkbenchService systemWorkbenchService;
61  	private final Node contactNode;
62  	private final Node parentVersionableNode;
63  
64  	private final ConnectEditor editor;
65  	private final AbstractFormPart formPart;
66  	private final FormToolkit toolkit;
67  
68  	/**
69  	 * 
70  	 * @param parent
71  	 * @param style
72  	 * @param editor
73  	 * @param formPart
74  	 * @param resourcesService
75  	 * @param peopleService
76  	 * @param systemWorkbenchService
77  	 * @param contactNode
78  	 * @param parentVersionableNode
79  	 */
80  	public ContactAddressComposite(Composite parent, int style, ConnectEditor editor, AbstractFormPart formPart,
81  			ResourcesService resourcesService, PeopleService peopleService,
82  			SystemWorkbenchService systemWorkbenchService, Node contactNode, Node parentVersionableNode) {
83  		super(parent, style);
84  		this.resourcesService = resourcesService;
85  		this.peopleService = peopleService;
86  		this.systemWorkbenchService = systemWorkbenchService;
87  		this.contactNode = contactNode;
88  
89  		this.editor = editor;
90  		this.toolkit = editor.getFormToolkit();
91  		this.formPart = formPart;
92  		this.parentVersionableNode = parentVersionableNode;
93  		populate();
94  	}
95  
96  	private void populate() {
97  		// Initialization
98  		final Composite parent = this;
99  		parent.setLayout(ConnectUiUtils.noSpaceGridLayout(2));
100 
101 		// BUTTONS
102 		Composite buttCmp = new ContactButtonsComposite(editor, formPart, parent, SWT.NONE, contactNode,
103 				parentVersionableNode, resourcesService, peopleService, systemWorkbenchService);
104 		toolkit.adapt(buttCmp, false, false);
105 		buttCmp.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
106 
107 		// DATA
108 		Composite dataCmp = toolkit.createComposite(parent);
109 		dataCmp.setLayoutData(EclipseUiUtils.fillWidth());
110 
111 		if (editor.isEditing())
112 			populateEditPanel(dataCmp);
113 		else
114 			populateReadOnlyPanel(dataCmp);
115 	}
116 
117 	protected void populateReadOnlyPanel(Composite readOnlyPanel) {
118 		readOnlyPanel.setLayout(new GridLayout());
119 
120 		String refUid = ConnectJcrUtils.get(contactNode, PeopleNames.PEOPLE_REF_UID);
121 		if (ConnectJcrUtils.isNodeType(contactNode, PeopleTypes.PEOPLE_CONTACT_REF)
122 				&& EclipseUiUtils.notEmpty(refUid)) {
123 
124 			final Node referencedEntity = peopleService.getEntityByUid(ConnectJcrUtils.getSession(contactNode), null,
125 					refUid);
126 
127 			Link readOnlyInfoLk = new Link(readOnlyPanel, SWT.WRAP);
128 			// CmsUtils.markup(readOnlyInfoLk);
129 			StringBuilder builder = new StringBuilder();
130 			// the referenced org
131 			if (referencedEntity != null) {
132 				String label = ConnectJcrUtils.get(referencedEntity, Property.JCR_TITLE);
133 				builder.append("<a>").append(label).append("</a> ");
134 			}
135 			// current contact meta data
136 			String meta = PeopleUiSnippets.getContactMetaData(contactNode);
137 			// work around to remove the encoded space. To be cleaned.
138 			if (meta.startsWith(ConnectUiConstants.NB_DOUBLE_SPACE))
139 				meta = meta.substring(ConnectUiConstants.NB_DOUBLE_SPACE.length());
140 			builder.append(meta);
141 
142 			// Referenced org primary address
143 			if (referencedEntity != null) {
144 				Node primaryAddress = PeopleJcrUtils.getPrimaryContact(referencedEntity,
145 						PeopleTypes.PEOPLE_POSTAL_ADDRESS);
146 				if (primaryAddress != null) {
147 					builder.append("\n");
148 					builder.append(PeopleUiSnippets.getAddressDisplayValue(resourcesService, primaryAddress));
149 				}
150 			}
151 			readOnlyInfoLk.setText(ConnectUiUtils.replaceAmpersandforSWTLink(builder.toString()));
152 			OrgLinkListener oll = new OrgLinkListener();
153 			oll.setOrg(referencedEntity);
154 			readOnlyInfoLk.addSelectionListener(oll);
155 		} else {
156 			Label readOnlyInfoLbl = toolkit.createLabel(readOnlyPanel, "", SWT.WRAP);
157 			readOnlyInfoLbl.setData(RWT.MARKUP_ENABLED, Boolean.TRUE);
158 			String addressHtml = PeopleUiSnippets.getContactDisplaySnippet(resourcesService, contactNode);
159 			readOnlyInfoLbl.setText(addressHtml);
160 		}
161 	}
162 
163 	protected void populateEditPanel(Composite parent) {
164 		RowLayout rl = new RowLayout(SWT.WRAP);
165 		rl.type = SWT.HORIZONTAL;
166 		rl.center = true;
167 		parent.setLayout(rl);
168 
169 		String refUid = ConnectJcrUtils.get(contactNode, PeopleNames.PEOPLE_REF_UID);
170 		if (ConnectJcrUtils.isNodeType(contactNode, PeopleTypes.PEOPLE_CONTACT_REF) && EclipseUiUtils.notEmpty(refUid))
171 			populateWorkAdresseCmp(parent, contactNode);
172 		else
173 			populateAdresseCmp(parent, contactNode);
174 	}
175 
176 	private void populateWorkAdresseCmp(Composite parent, final Node contactNode) {
177 		try {
178 			final Link nameLk = new Link(parent, SWT.LEFT | SWT.BOTTOM);
179 			final OrgLinkListener nameLkListener = new OrgLinkListener();
180 			nameLk.addSelectionListener(nameLkListener);
181 
182 			Link chooseOrgLk = new Link(parent, SWT.LEFT | SWT.BOTTOM);
183 			chooseOrgLk.setText("<a>Change</a>");
184 
185 			Text labelTxt = ConnectUiUtils.createRDText(toolkit, parent, PeopleMsg.aCustomLabel.lead(),  PeopleMsg.aCustomLabel.lead(), 120);
186 
187 			Combo catCmb = new Combo(parent, SWT.BOTTOM | SWT.READ_ONLY);
188 			catCmb.setItems(peopleService.getContactService().getContactPossibleCategories(contactNode));
189 
190 			final PickUpOrgDialog diag = new PickUpOrgDialog(chooseOrgLk.getShell(), PeopleMsg.chooseAnOrganisation.lead(),
191 					contactNode.getSession(), systemWorkbenchService, contactNode.getParent().getParent());
192 
193 			// REFRESH VALUES
194 			ConnectWorkbenchUtils.refreshFormCombo(editor, catCmb, contactNode, Property.JCR_TITLE);
195 			ConnectWorkbenchUtils.refreshFormText(editor, labelTxt, contactNode, Property.JCR_DESCRIPTION,
196 					"Description");
197 
198 			if (contactNode.hasProperty(PeopleNames.PEOPLE_REF_UID)) {
199 				Node linkedOrg = peopleService.getEntityByUid(contactNode.getSession(), null,
200 						contactNode.getProperty(PeopleNames.PEOPLE_REF_UID).getString());
201 				if (linkedOrg != null) {
202 					nameLkListener.setOrg(linkedOrg);
203 					nameLk.setText("<a>" + ConnectJcrUtils.get(linkedOrg, Property.JCR_TITLE) + "</a>");
204 				}
205 			}
206 
207 			// Listeners
208 			ConnectWorkbenchUtils.addTxtModifyListener(formPart, catCmb, contactNode, Property.JCR_TITLE,
209 					PropertyType.STRING);
210 			ConnectWorkbenchUtils.addTxtModifyListener(formPart, labelTxt, contactNode, Property.JCR_DESCRIPTION,
211 					PropertyType.STRING);
212 
213 			chooseOrgLk.addSelectionListener(new SelectionAdapter() {
214 				private static final long serialVersionUID = -7118320199160680131L;
215 
216 				@Override
217 				public void widgetSelected(final SelectionEvent event) {
218 					diag.open();
219 					Node currNode = diag.getSelected();
220 					if (currNode != null) {
221 						nameLkListener.setOrg(currNode);
222 						nameLk.setText("<a>" + ConnectJcrUtils.get(currNode, Property.JCR_TITLE) + "</a>");
223 
224 						String uid = ConnectJcrUtils.get(currNode, ConnectNames.CONNECT_UID);
225 						if (ConnectJcrUtils.setJcrProperty(contactNode, PeopleNames.PEOPLE_REF_UID, PropertyType.STRING,
226 								uid))
227 							formPart.markDirty();
228 					}
229 				}
230 			});
231 			parent.pack(true);
232 		} catch (RepositoryException e1) {
233 			throw new PeopleException("Unable to refresh editable panel for work address", e1);
234 		}
235 	}
236 
237 	private class OrgLinkListener extends SelectionAdapter {
238 		private static final long serialVersionUID = 1L;
239 		private Node org;
240 
241 		protected void setOrg(Node org) {
242 			this.org = org;
243 		}
244 
245 		@Override
246 		public void widgetSelected(final SelectionEvent event) {
247 			if (org != null) {
248 				// CommandUtils.callCommand(systemWorkbenchService.getOpenEntityEditorCmdId(),
249 				// ConnectEditor.PARAM_JCR_ID, ConnectJcrUtils.getIdentifier(org));
250 				systemWorkbenchService.openEntityEditor(org);
251 			}
252 
253 		}
254 	}
255 
256 	private void populateAdresseCmp(Composite parent, Node contactNode) {
257 
258 		EclipseUiUtils.clear(parent);
259 		if (editor.isEditing()) {
260 			// specific for addresses
261 			final Text streetTxt = ConnectUiUtils.createRDText(toolkit, parent, PeopleMsg.street.lead(), PeopleMsg.street.lead(), 0);
262 			final Text street2Txt = ConnectUiUtils.createRDText(toolkit, parent, PeopleMsg.streetComplement.lead(), "", 0);
263 			final Text zipTxt = ConnectUiUtils.createRDText(toolkit, parent, PeopleMsg.zipCode.lead(), "", 0);
264 			final Text cityTxt = ConnectUiUtils.createRDText(toolkit, parent, PeopleMsg.city.lead(), "", 0);
265 			final Text stateTxt = ConnectUiUtils.createRDText(toolkit, parent,PeopleMsg.state.lead(), "", 0);
266 			Text countryTxt = ConnectUiUtils.createRDText(toolkit, parent, PeopleMsg.country.lead(), "", 110);
267 
268 			// The country drop down
269 			Session session = ConnectJcrUtils.getSession(contactNode);
270 			final TagLikeDropDown countryDD = new TagLikeDropDown(session, resourcesService,
271 					ConnectConstants.RESOURCE_COUNTRY, countryTxt);
272 
273 			final Text geoPointTxt = ConnectUiUtils.createRDText(toolkit, parent, PeopleMsg.geopoint.lead(), "", 0);
274 			final Text labelTxt = ConnectUiUtils.createRDText(toolkit, parent, PeopleMsg.label.lead(), "", 0);
275 
276 			Combo catCmb = new Combo(parent, SWT.READ_ONLY);
277 			catCmb.setItems(peopleService.getContactService().getContactPossibleCategories(contactNode));
278 
279 			// Refresh
280 			ConnectWorkbenchUtils.refreshFormText(editor, streetTxt, contactNode, PeopleNames.PEOPLE_STREET, PeopleMsg.street.lead());
281 			ConnectWorkbenchUtils.refreshFormText(editor, street2Txt, contactNode, PeopleNames.PEOPLE_STREET_COMPLEMENT,
282 					PeopleMsg.streetComplement.lead());
283 			ConnectWorkbenchUtils.refreshFormText(editor, zipTxt, contactNode, PeopleNames.PEOPLE_ZIP_CODE, PeopleMsg.zipCode.lead());
284 			ConnectWorkbenchUtils.refreshFormText(editor, cityTxt, contactNode, PeopleNames.PEOPLE_CITY, PeopleMsg.city.lead());
285 			ConnectWorkbenchUtils.refreshFormText(editor, stateTxt, contactNode, PeopleNames.PEOPLE_STATE, PeopleMsg.state.lead());
286 			ConnectWorkbenchUtils.refreshFormText(editor, geoPointTxt, contactNode, PeopleNames.PEOPLE_GEOPOINT,
287 					PeopleMsg.geopoint.lead());
288 			ConnectWorkbenchUtils.refreshFormText(editor, labelTxt, contactNode, Property.JCR_DESCRIPTION,
289 					PeopleMsg.description.lead());
290 			ConnectWorkbenchUtils.refreshFormCombo(editor, catCmb, contactNode, Property.JCR_TITLE);
291 
292 			// add listeners
293 			addAddressTxtModifyListener(formPart, streetTxt, contactNode, PeopleNames.PEOPLE_STREET,
294 					PropertyType.STRING);
295 			addAddressTxtModifyListener(formPart, street2Txt, contactNode, PeopleNames.PEOPLE_STREET_COMPLEMENT,
296 					PropertyType.STRING);
297 			addAddressTxtModifyListener(formPart, zipTxt, contactNode, PeopleNames.PEOPLE_ZIP_CODE,
298 					PropertyType.STRING);
299 			addAddressTxtModifyListener(formPart, cityTxt, contactNode, PeopleNames.PEOPLE_CITY, PropertyType.STRING);
300 			addAddressTxtModifyListener(formPart, stateTxt, contactNode, PeopleNames.PEOPLE_STATE, PropertyType.STRING);
301 			ConnectWorkbenchUtils.addTxtModifyListener(formPart, geoPointTxt, contactNode, PeopleNames.PEOPLE_GEOPOINT,
302 					PropertyType.STRING);
303 			ConnectWorkbenchUtils.addTxtModifyListener(formPart, catCmb, contactNode, Property.JCR_TITLE,
304 					PropertyType.STRING);
305 			ConnectWorkbenchUtils.addTxtModifyListener(formPart, labelTxt, contactNode, Property.JCR_DESCRIPTION,
306 					PropertyType.STRING);
307 
308 			// specific for drop downs
309 			String countryIso = ConnectJcrUtils.get(contactNode, PeopleNames.PEOPLE_COUNTRY);
310 			if (EclipseUiUtils.notEmpty(countryIso)) {
311 				String countryVal = resourcesService.getEncodedTagValue(session, ConnectConstants.RESOURCE_COUNTRY,
312 						countryIso);
313 				countryDD.reset(countryVal);
314 			}
315 			addCountryTxtModifyListener(formPart, countryTxt);
316 		}
317 	}
318 
319 	private void addCountryTxtModifyListener(final AbstractFormPart part, final Text text) {
320 
321 		text.addModifyListener(new ModifyListener() {
322 			private static final long serialVersionUID = 1549789407363632491L;
323 
324 			@Override
325 			public void modifyText(ModifyEvent event) {
326 
327 				String label = text.getText();
328 				if (EclipseUiUtils.isEmpty(label))
329 					return;
330 				Session session = ConnectJcrUtils.getSession(contactNode);
331 				String iso = resourcesService.getEncodedTagCodeFromValue(session, ConnectConstants.RESOURCE_COUNTRY,
332 						label);
333 				if (EclipseUiUtils.notEmpty(iso) && ConnectJcrUtils.setJcrProperty(contactNode,
334 						PeopleNames.PEOPLE_COUNTRY, PropertyType.STRING, iso)) {
335 					part.markDirty();
336 				}
337 			}
338 		});
339 	}
340 
341 	private void addAddressTxtModifyListener(final AbstractFormPart part, final Text text, final Node entity,
342 			final String propName, final int propType) {
343 		text.addModifyListener(new ModifyListener() {
344 			private static final long serialVersionUID = 1549789407363632491L;
345 
346 			@Override
347 			public void modifyText(ModifyEvent event) {
348 				if (ConnectJcrUtils.setJcrProperty(entity, propName, propType, text.getText())) {
349 					part.markDirty();
350 					PeopleJcrUtils.updateDisplayAddress(resourcesService, entity);
351 				}
352 			}
353 		});
354 	}
355 }