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
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
46
47
48
49
50
51
52 public class ContactAddressComposite extends Composite implements PeopleNames {
53 private static final long serialVersionUID = 4475049051062923873L;
54
55
56
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
71
72
73
74
75
76
77
78
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
98 final Composite parent = this;
99 parent.setLayout(ConnectUiUtils.noSpaceGridLayout(2));
100
101
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
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
129 StringBuilder builder = new StringBuilder();
130
131 if (referencedEntity != null) {
132 String label = ConnectJcrUtils.get(referencedEntity, Property.JCR_TITLE);
133 builder.append("<a>").append(label).append("</a> ");
134 }
135
136 String meta = PeopleUiSnippets.getContactMetaData(contactNode);
137
138 if (meta.startsWith(ConnectUiConstants.NB_DOUBLE_SPACE))
139 meta = meta.substring(ConnectUiConstants.NB_DOUBLE_SPACE.length());
140 builder.append(meta);
141
142
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
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
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
249
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
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
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
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
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
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 }