had to rename the packages to make them compliant with buckminster
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / dialogs / filteredSelection / AbstractFilteredCdmResourceSelectionDialog.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.taxeditor.ui.dialogs.filteredSelection;
12
13 import java.text.Collator;
14 import java.util.Comparator;
15 import java.util.HashSet;
16 import java.util.List;
17 import java.util.Set;
18 import java.util.UUID;
19
20 import org.eclipse.core.runtime.CoreException;
21 import org.eclipse.core.runtime.IProgressMonitor;
22 import org.eclipse.core.runtime.IStatus;
23 import org.eclipse.core.runtime.OperationCanceledException;
24 import org.eclipse.core.runtime.Status;
25 import org.eclipse.jface.dialogs.IDialogSettings;
26 import org.eclipse.jface.viewers.ILabelProvider;
27 import org.eclipse.jface.viewers.LabelProvider;
28 import org.eclipse.jface.window.Window;
29 import org.eclipse.jface.wizard.WizardDialog;
30 import org.eclipse.swt.SWT;
31 import org.eclipse.swt.events.SelectionAdapter;
32 import org.eclipse.swt.events.SelectionEvent;
33 import org.eclipse.swt.events.SelectionListener;
34 import org.eclipse.swt.widgets.Composite;
35 import org.eclipse.swt.widgets.Control;
36 import org.eclipse.swt.widgets.Link;
37 import org.eclipse.swt.widgets.Shell;
38 import org.eclipse.swt.widgets.Text;
39 import org.eclipse.ui.IMemento;
40 import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
41
42 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
43 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
44 import eu.etaxonomy.cdm.model.common.CdmBase;
45 import eu.etaxonomy.cdm.model.common.ICdmBase;
46 import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;
47 import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;
48 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
49 import eu.etaxonomy.taxeditor.newWizard.AbstractNewEntityWizard;
50 import eu.etaxonomy.taxeditor.store.StoreUtil;
51 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
52
53 /**
54 * <p>Abstract AbstractFilteredCdmResourceSelectionDialog class.</p>
55 *
56 * @author n.hoffmann
57 * @created 04.06.2009
58 * @version 1.0
59 */
60 public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmBase> extends
61 FilteredItemsSelectionDialog implements IConversationEnabled {
62
63 private ConversationHolder conversation;
64
65 protected List<UuidAndTitleCache<T>> model;
66 private Set<T> transientCdmObjects = new HashSet<T>();
67 private String settings;
68
69 /**
70 * <p>Constructor for AbstractFilteredCdmResourceSelectionDialog.</p>
71 *
72 * @param shell a {@link org.eclipse.swt.widgets.Shell} object.
73 * @param conversation
74 * @param title a {@link java.lang.String} object.
75 * @param multi a boolean.
76 * @param settings a {@link java.lang.String} object.
77 * @param cdmObject a T object.
78 * @param <T> a T object.
79 */
80 protected AbstractFilteredCdmResourceSelectionDialog(Shell shell, ConversationHolder conversation, String title, boolean multi, String settings, T cdmObject) {
81 super(shell, multi);
82 setTitle(title);
83 setMessage("Use * for wildcard, or ? to see all entries");
84 this.settings = settings;
85
86 this.conversation = conversation;
87
88 init();
89
90 initModel();
91
92 if (cdmObject != null) {
93 setInitialPattern(getTitle(cdmObject));
94 }
95
96 ILabelProvider labelProvider = new FilteredCdmResourceLabelProvider();
97 setListLabelProvider(labelProvider);
98 setDetailsLabelProvider(labelProvider);
99
100 // setSelectionHistory(new ResourceSelectionHistory());
101 }
102
103 /**
104 * Override in suibclasses.
105 * Will run before initModel()
106 */
107 protected void init() {
108
109 }
110
111 /**
112 * <p>getSelectionFromDialog</p>
113 *
114 * @param dialog a {@link eu.etaxonomy.taxeditor.ui.dialogs.filteredSelection.AbstractFilteredCdmResourceSelectionDialog} object.
115 * @param <TYPE> a TYPE object.
116 * @return a TYPE object.
117 */
118 protected static <TYPE extends CdmBase> TYPE getSelectionFromDialog(AbstractFilteredCdmResourceSelectionDialog<TYPE> dialog) {
119 if (dialog.open() == Window.CANCEL) {
120 return null;
121 }
122
123 UUID uuid = dialog.getSelectedUuidAndTitleCache().getUuid();
124 if(uuid == null){
125 return null;
126 }
127 return dialog.getCdmObjectByUuid(uuid);
128 }
129
130 /**
131 * Check if object was created during the life of this dialog. If not,
132 * retrieve it from the CdmStore.
133 *
134 * @param cdmUuid a {@link java.util.UUID} object.
135 * @return a T object.
136 */
137 protected T getCdmObjectByUuid(UUID cdmUuid) {
138 for (T cdmObject : transientCdmObjects) {
139 if (cdmObject.getUuid().equals(cdmUuid)) {
140 return cdmObject;
141 }
142 }
143 return getPersistentObject(cdmUuid);
144 }
145
146 /**
147 * <p>getPersistentObject</p>
148 *
149 * @param uuid a {@link java.util.UUID} object.
150 * @return a T object.
151 */
152 abstract protected T getPersistentObject(UUID uuid);
153
154 /**
155 * @param cdmObject
156 */
157 // protected void addObjectToModel(T cdmObject) {
158 // model.add(new UuidAndTitleCache(cdmObject.getClass(), cdmObject.getUuid(), getTitle(cdmObject)));
159 // transientCdmObjects.add(cdmObject);
160 // }
161
162 /**
163 * <p>isObjectTransient</p>
164 *
165 * @param cdmObject a T object.
166 * @return a boolean.
167 */
168 protected boolean isObjectTransient(T cdmObject) {
169 return (getPersistentObject(cdmObject.getUuid()) == null);
170 }
171
172 /**
173 * <p>getTitle</p>
174 *
175 * @param cdmObject a T object.
176 * @return a {@link java.lang.String} object.
177 */
178 protected String getTitle(T cdmObject) {
179 if (cdmObject instanceof IIdentifiableEntity) {
180 return ((IIdentifiableEntity) cdmObject).getTitleCache();
181 }
182 return null;
183 }
184
185 /** {@inheritDoc} */
186 @Override
187 public void refresh() {
188 initModel();
189 super.refresh();
190 }
191
192 /**
193 * <p>initModel</p>
194 */
195 abstract protected void initModel();
196
197 /* (non-Javadoc)
198 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createFilter()
199 */
200 /** {@inheritDoc} */
201 @Override
202 protected ItemsFilter createFilter() {
203 return new ItemsFilter() {
204
205 @Override
206 public boolean isConsistentItem(Object item) {
207 return false;
208 }
209
210 @Override
211 public boolean matchItem(Object item) {
212 String text = null;
213 if(item instanceof UuidAndTitleCache){
214 text = ((UuidAndTitleCache) item).getTitleCache();
215 }else if(item instanceof String){
216 text = (String) item;
217 }
218 return text != null ? matches(text) : false;
219 }
220
221 };
222 }
223
224
225 /**
226 * Set the filter input to the Agent's title cache
227 *
228 * @param cdmObject a T object.
229 */
230 protected void setPattern(T cdmObject) {
231 ((Text) getPatternControl()).setText(getTitle(cdmObject));
232 }
233
234 /* (non-Javadoc)
235 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#fillContentProvider(org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.AbstractContentProvider, org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter, org.eclipse.core.runtime.IProgressMonitor)
236 */
237 /** {@inheritDoc} */
238 @Override
239 protected void fillContentProvider(AbstractContentProvider contentProvider,
240 ItemsFilter itemsFilter, IProgressMonitor progressMonitor)
241 throws CoreException {
242 try {
243 if(model != null){
244 progressMonitor.beginTask("Looking for entities", model.size());
245 for(UuidAndTitleCache<T> element : model){
246 contentProvider.add(element, itemsFilter);
247 if (progressMonitor.isCanceled()) {
248 throw new OperationCanceledException();
249 }
250 progressMonitor.worked(1);
251 }
252 }else{
253 StoreUtil.warn(getClass(), "Model for Filtered Selection is null:" + this.getClass().getSimpleName());
254 }
255 }
256 finally {
257 progressMonitor.done();
258 }
259 }
260
261 /* (non-Javadoc)
262 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getDialogSettings()
263 */
264 /** {@inheritDoc} */
265 @Override
266 protected IDialogSettings getDialogSettings() {
267 IDialogSettings settings = TaxeditorStorePlugin.getDefault().getDialogSettings().getSection(getSettings());
268
269 if (settings == null) {
270 settings = TaxeditorStorePlugin.getDefault().getDialogSettings().addNewSection(getSettings());
271 }
272 return settings;
273 }
274
275 /* (non-Javadoc)
276 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getElementName(java.lang.Object)
277 */
278 /** {@inheritDoc} */
279 @Override
280 public String getElementName(Object item) {
281 return ((UuidAndTitleCache) item).getTitleCache();
282 }
283
284 /* (non-Javadoc)
285 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getItemsComparator()
286 */
287 /** {@inheritDoc} */
288 @Override
289 protected Comparator getItemsComparator() {
290 return new Comparator<UuidAndTitleCache>() {
291 public int compare(UuidAndTitleCache entity1,
292 UuidAndTitleCache entity2) {
293 Collator collator = Collator.getInstance();
294 return collator.compare(entity1.getTitleCache(), entity2.getTitleCache());
295 }
296 };
297 }
298
299 /* (non-Javadoc)
300 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#validateItem(java.lang.Object)
301 */
302 /** {@inheritDoc} */
303 @Override
304 protected IStatus validateItem(Object item) {
305 return Status.OK_STATUS;
306 }
307
308 /**
309 * <p>getSelectedUuidAndTitleCache</p>
310 *
311 * @return a {@link eu.etaxonomy.cdm.model.common.UuidAndTitleCache} object.
312 */
313 protected UuidAndTitleCache getSelectedUuidAndTitleCache() {
314 Object[] result = getResult();
315 return result[0] == null ? null : (UuidAndTitleCache) result[0];
316 }
317
318 /**
319 * <p>Getter for the field <code>settings</code>.</p>
320 *
321 * @return a {@link java.lang.String} object.
322 */
323 public String getSettings() {
324 if(settings == null){
325 throw new IllegalStateException("No SETTINGS set.");
326 }
327 return settings;
328 }
329
330 /**
331 *
332 * @author n.hoffmann
333 * @created Oct 19, 2009
334 * @version 1.0
335 */
336 private class ResourceSelectionHistory extends SelectionHistory {
337 /*
338 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.SelectionHistory#restoreItemFromMemento(org.eclipse.ui.IMemento)
339 */
340 protected Object restoreItemFromMemento(IMemento element) {
341 return element.getString("resource"); //$NON-NLS-1$
342 }
343 /*
344 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.SelectionHistory#storeItemToMemento(java.lang.Object,
345 * org.eclipse.ui.IMemento)
346 */
347 protected void storeItemToMemento(Object item, IMemento element) {
348 element.putString("resource", item.toString()); //$NON-NLS-1$
349 }
350 }
351
352 /**
353 * <p>getNewWizardLinkText</p>
354 *
355 * @return a {@link java.lang.String} object.
356 */
357 protected abstract String getNewWizardLinkText();
358
359 /**
360 * <p>getNewEntityWizard</p>
361 * @param parameter
362 * @return a {@link eu.etaxonomy.taxeditor.newWizard.AbstractNewEntityWizard} object.
363 */
364 protected abstract AbstractNewEntityWizard getNewEntityWizard(String parameter);
365
366 public class FilteredCdmResourceLabelProvider extends LabelProvider {
367 public String getText(Object element) {
368 if (element == null) {
369 return null;
370 }
371 return ((UuidAndTitleCache) element).getTitleCache();
372 }
373 };
374
375 /* (non-Javadoc)
376 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createExtendedContentArea(org.eclipse.swt.widgets.Composite)
377 */
378 /** {@inheritDoc} */
379 @Override
380 protected Control createExtendedContentArea(Composite parent) {
381 if(getNewWizardLinkText() != null){
382 Link link = new Link(parent, SWT.NONE);
383 link.setText(getNewWizardLinkText());
384 link.addSelectionListener(getNewWizardLinkSelectionListener());
385 return link;
386 }
387 return null;
388 }
389
390 protected SelectionListener getNewWizardLinkSelectionListener(){
391 return new SelectionAdapter() {
392
393 /* (non-Javadoc)
394 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
395 */
396 @Override
397 public void widgetSelected(SelectionEvent e) {
398
399 AbstractNewEntityWizard wizard = getNewEntityWizard(e.text);
400 wizard.init(null, null);
401 WizardDialog dialog = new WizardDialog(getShell(), wizard);
402 int status = dialog.open();
403
404 if (status == IStatus.OK) {
405
406 T entity = (T) wizard.getEntity();
407
408 // addObjectToModel(teamOrPerson);
409 refresh();
410 setPattern(entity);
411 conversation.bind();
412 }
413 }
414 };
415 }
416
417 /**
418 * <p>getConversationHolder</p>
419 *
420 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
421 */
422 public ConversationHolder getConversationHolder() {
423 return conversation;
424 }
425
426 /** {@inheritDoc} */
427 public void update(CdmDataChangeMap changeEvents) {}
428 }