View Javadoc
1   package org.argeo.people.ui.composites;
2   
3   import javax.jcr.Node;
4   import javax.jcr.RepositoryException;
5   
6   import org.argeo.cms.ui.eclipse.forms.AbstractFormPart;
7   import org.argeo.cms.util.CmsUtils;
8   import org.argeo.connect.resources.ResourcesService;
9   import org.argeo.connect.ui.ConnectEditor;
10  import org.argeo.connect.ui.ConnectImages;
11  import org.argeo.connect.ui.ConnectUiStyles;
12  import org.argeo.connect.ui.ConnectUiUtils;
13  import org.argeo.connect.ui.SystemWorkbenchService;
14  import org.argeo.people.PeopleException;
15  import org.argeo.people.PeopleNames;
16  import org.argeo.people.PeopleService;
17  import org.argeo.people.util.PeopleJcrUtils;
18  import org.eclipse.swt.SWT;
19  import org.eclipse.swt.events.SelectionAdapter;
20  import org.eclipse.swt.events.SelectionEvent;
21  import org.eclipse.swt.layout.GridData;
22  import org.eclipse.swt.layout.GridLayout;
23  import org.eclipse.swt.widgets.Button;
24  import org.eclipse.swt.widgets.Composite;
25  import org.eclipse.swt.widgets.Label;
26  //import org.eclipse.ui.forms.AbstractFormPart;
27  
28  /** Centralise management of contacts buttons */
29  public class ContactButtonsComposite extends Composite {
30  	private static final long serialVersionUID = 2331713954300845292L;
31  
32  	// Context
33  	private final ResourcesService resourcesService;
34  	private final PeopleService peopleService;
35  	private final SystemWorkbenchService systemWorkbenchService;
36  	private final Node contactNode;
37  	private final boolean isEditing;
38  	private final Node parentVersionableNode;
39  	private final AbstractFormPart formPart;
40  
41  	/**
42  	 * 
43  	 * @param editor
44  	 * @param formPart
45  	 * @param parent
46  	 * @param style
47  	 * @param contactNode
48  	 * @param parentVersionableNode
49  	 * @param resourcesService
50  	 * @param peopleService
51  	 * @param systemWorkbenchService
52  	 */
53  	public ContactButtonsComposite(ConnectEditor editor, AbstractFormPart formPart, Composite parent, int style,
54  			Node contactNode, Node parentVersionableNode, ResourcesService resourcesService,
55  			PeopleService peopleService, SystemWorkbenchService systemWorkbenchService) {
56  		super(parent, style);
57  		this.resourcesService = resourcesService;
58  		this.peopleService = peopleService;
59  		this.systemWorkbenchService = systemWorkbenchService;
60  		this.contactNode = contactNode;
61  		this.parentVersionableNode = parentVersionableNode;
62  		this.formPart = formPart;
63  		this.isEditing = editor.isEditing();
64  		populate();
65  	}
66  
67  	private void populate() {
68  		// Initialization
69  		Composite buttCmp = this;
70  		GridLayout gl = ConnectUiUtils.noSpaceGridLayout(isEditing ? 3 : 2);
71  		buttCmp.setLayout(gl);
72  
73  		// final Button categoryBtn =
74  		createCategoryButton(buttCmp);
75  
76  		// Primary management
77  		Button primaryBtn = createPrimaryButton(buttCmp);
78  		if (primaryBtn != null)
79  			configurePrimaryButton(primaryBtn);
80  
81  		// Deletion
82  		if (isEditing) {
83  			Button deleteBtn = createDeleteButton(buttCmp);
84  			configureDeleteButton(deleteBtn);
85  		}
86  	}
87  
88  	private void createCategoryButton(Composite parent) {
89  		Label btn = new Label(parent, SWT.NONE);
90  		// CmsUtils.style(btn, ConnectUiStyles.FLAT_BTN);
91  
92  		btn.setImage(systemWorkbenchService.getIconForType(contactNode));
93  		GridData gd = new GridData();
94  		// gd.widthHint = 16;
95  		// gd.heightHint = 16;
96  		btn.setLayoutData(gd);
97  		// return btn;
98  	}
99  
100 	private Button createDeleteButton(Composite parent) {
101 		Button btn = new Button(parent, SWT.FLAT | SWT.CENTER);
102 		CmsUtils.style(btn, ConnectUiStyles.FLAT_BTN);
103 		btn.setImage(ConnectImages.DELETE);
104 		GridData gd = new GridData();
105 		gd.widthHint = 20;
106 		gd.heightHint = 16;
107 		btn.setLayoutData(gd);
108 		return btn;
109 	}
110 
111 	private Button createPrimaryButton(Composite parent) {
112 		try {
113 			// update image
114 			boolean isPrimary = (contactNode.hasProperty(PeopleNames.PEOPLE_IS_PRIMARY)
115 					&& contactNode.getProperty(PeopleNames.PEOPLE_IS_PRIMARY).getBoolean());
116 			if (isEditing) {
117 				Button btn = new Button(parent, SWT.FLAT | SWT.CENTER);
118 				// CmsUtils.style(btn, ConnectUiStyles.FLAT_BTN);
119 
120 				btn.setImage(isPrimary ? ConnectImages.PRIMARY : ConnectImages.PRIMARY_NOT);
121 				// btn.setEnabled(isEditing);
122 				GridData gd = new GridData();
123 				gd.widthHint = 20;
124 				gd.heightHint = 16;
125 				btn.setLayoutData(gd);
126 				return btn;
127 			} else {
128 				Label lbl = new Label(parent, SWT.NONE);
129 				lbl.setImage(isPrimary ? ConnectImages.PRIMARY : ConnectImages.PRIMARY_NOT);
130 				return null;
131 			}
132 			// primaryBtn.setGrayed(false);
133 		} catch (RepositoryException re) {
134 			throw new PeopleException("Unable to create primary button for node " + contactNode, re);
135 		}
136 	}
137 
138 	private void configureDeleteButton(final Button btn) {
139 		btn.addSelectionListener(new SelectionAdapter() {
140 			private static final long serialVersionUID = 1L;
141 
142 			@Override
143 			public void widgetSelected(final SelectionEvent event) {
144 				try {
145 					// update primary cache
146 					if (PeopleJcrUtils.isPrimary(parentVersionableNode, contactNode))
147 						PeopleJcrUtils.updatePrimaryCache(resourcesService, peopleService, parentVersionableNode,
148 								contactNode, false);
149 
150 					contactNode.remove();
151 					formPart.markDirty();
152 					formPart.refresh();
153 				} catch (RepositoryException e) {
154 					throw new PeopleException("unable to initialise deletion", e);
155 				}
156 			}
157 		});
158 	}
159 
160 	private void configurePrimaryButton(final Button btn) {
161 		btn.addSelectionListener(new SelectionAdapter() {
162 			private static final long serialVersionUID = 1L;
163 
164 			@Override
165 			public void widgetSelected(final SelectionEvent event) {
166 				boolean hasChanged = PeopleJcrUtils.markAsPrimary(resourcesService, peopleService,
167 						parentVersionableNode, contactNode);
168 
169 				if (hasChanged) {
170 					formPart.markDirty();
171 					formPart.refresh();
172 				}
173 			}
174 		});
175 	}
176 
177 	@Override
178 	public boolean setFocus() {
179 		return true;
180 	}
181 }