3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
11 package eu
.etaxonomy
.taxeditor
.ui
.dialogs
.filteredSelection
;
13 import java
.text
.Collator
;
14 import java
.util
.Comparator
;
15 import java
.util
.HashSet
;
16 import java
.util
.List
;
18 import java
.util
.UUID
;
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
;
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
;
54 * <p>Abstract AbstractFilteredCdmResourceSelectionDialog class.</p>
60 public abstract class AbstractFilteredCdmResourceSelectionDialog
<T
extends ICdmBase
> extends
61 FilteredItemsSelectionDialog
implements IConversationEnabled
{
63 private ConversationHolder conversation
;
65 protected List
<UuidAndTitleCache
<T
>> model
;
66 private Set
<T
> transientCdmObjects
= new HashSet
<T
>();
67 private String settings
;
70 * <p>Constructor for AbstractFilteredCdmResourceSelectionDialog.</p>
72 * @param shell a {@link org.eclipse.swt.widgets.Shell} object.
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.
80 protected AbstractFilteredCdmResourceSelectionDialog(Shell shell
, ConversationHolder conversation
, String title
, boolean multi
, String settings
, T cdmObject
) {
83 setMessage("Use * for wildcard, or ? to see all entries");
84 this.settings
= settings
;
86 this.conversation
= conversation
;
92 if (cdmObject
!= null) {
93 setInitialPattern(getTitle(cdmObject
));
96 ILabelProvider labelProvider
= new FilteredCdmResourceLabelProvider();
97 setListLabelProvider(labelProvider
);
98 setDetailsLabelProvider(labelProvider
);
100 // setSelectionHistory(new ResourceSelectionHistory());
104 * Override in suibclasses.
105 * Will run before initModel()
107 protected void init() {
112 * <p>getSelectionFromDialog</p>
114 * @param dialog a {@link eu.etaxonomy.taxeditor.ui.dialogs.filteredSelection.AbstractFilteredCdmResourceSelectionDialog} object.
115 * @param <TYPE> a TYPE object.
116 * @return a TYPE object.
118 protected static <TYPE
extends CdmBase
> TYPE
getSelectionFromDialog(AbstractFilteredCdmResourceSelectionDialog
<TYPE
> dialog
) {
119 if (dialog
.open() == Window
.CANCEL
) {
123 UUID uuid
= dialog
.getSelectedUuidAndTitleCache().getUuid();
127 return dialog
.getCdmObjectByUuid(uuid
);
131 * Check if object was created during the life of this dialog. If not,
132 * retrieve it from the CdmStore.
134 * @param cdmUuid a {@link java.util.UUID} object.
135 * @return a T object.
137 protected T
getCdmObjectByUuid(UUID cdmUuid
) {
138 for (T cdmObject
: transientCdmObjects
) {
139 if (cdmObject
.getUuid().equals(cdmUuid
)) {
143 return getPersistentObject(cdmUuid
);
147 * <p>getPersistentObject</p>
149 * @param uuid a {@link java.util.UUID} object.
150 * @return a T object.
152 abstract protected T
getPersistentObject(UUID uuid
);
157 // protected void addObjectToModel(T cdmObject) {
158 // model.add(new UuidAndTitleCache(cdmObject.getClass(), cdmObject.getUuid(), getTitle(cdmObject)));
159 // transientCdmObjects.add(cdmObject);
163 * <p>isObjectTransient</p>
165 * @param cdmObject a T object.
168 protected boolean isObjectTransient(T cdmObject
) {
169 return (getPersistentObject(cdmObject
.getUuid()) == null);
175 * @param cdmObject a T object.
176 * @return a {@link java.lang.String} object.
178 protected String
getTitle(T cdmObject
) {
179 if (cdmObject
instanceof IIdentifiableEntity
) {
180 return ((IIdentifiableEntity
) cdmObject
).getTitleCache();
187 public void refresh() {
195 abstract protected void initModel();
198 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createFilter()
202 protected ItemsFilter
createFilter() {
203 return new ItemsFilter() {
206 public boolean isConsistentItem(Object item
) {
211 public boolean matchItem(Object item
) {
213 if(item
instanceof UuidAndTitleCache
){
214 text
= ((UuidAndTitleCache
) item
).getTitleCache();
215 }else if(item
instanceof String
){
216 text
= (String
) item
;
218 return text
!= null ?
matches(text
) : false;
226 * Set the filter input to the Agent's title cache
228 * @param cdmObject a T object.
230 protected void setPattern(T cdmObject
) {
231 ((Text
) getPatternControl()).setText(getTitle(cdmObject
));
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)
239 protected void fillContentProvider(AbstractContentProvider contentProvider
,
240 ItemsFilter itemsFilter
, IProgressMonitor progressMonitor
)
241 throws CoreException
{
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();
250 progressMonitor
.worked(1);
253 StoreUtil
.warn(getClass(), "Model for Filtered Selection is null:" + this.getClass().getSimpleName());
257 progressMonitor
.done();
262 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getDialogSettings()
266 protected IDialogSettings
getDialogSettings() {
267 IDialogSettings settings
= TaxeditorStorePlugin
.getDefault().getDialogSettings().getSection(getSettings());
269 if (settings
== null) {
270 settings
= TaxeditorStorePlugin
.getDefault().getDialogSettings().addNewSection(getSettings());
276 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getElementName(java.lang.Object)
280 public String
getElementName(Object item
) {
281 return ((UuidAndTitleCache
) item
).getTitleCache();
285 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getItemsComparator()
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());
300 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#validateItem(java.lang.Object)
304 protected IStatus
validateItem(Object item
) {
305 return Status
.OK_STATUS
;
309 * <p>getSelectedUuidAndTitleCache</p>
311 * @return a {@link eu.etaxonomy.cdm.model.common.UuidAndTitleCache} object.
313 protected UuidAndTitleCache
getSelectedUuidAndTitleCache() {
314 Object
[] result
= getResult();
315 return result
[0] == null ?
null : (UuidAndTitleCache
) result
[0];
319 * <p>Getter for the field <code>settings</code>.</p>
321 * @return a {@link java.lang.String} object.
323 public String
getSettings() {
324 if(settings
== null){
325 throw new IllegalStateException("No SETTINGS set.");
333 * @created Oct 19, 2009
336 private class ResourceSelectionHistory
extends SelectionHistory
{
338 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.SelectionHistory#restoreItemFromMemento(org.eclipse.ui.IMemento)
340 protected Object
restoreItemFromMemento(IMemento element
) {
341 return element
.getString("resource"); //$NON-NLS-1$
344 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.SelectionHistory#storeItemToMemento(java.lang.Object,
345 * org.eclipse.ui.IMemento)
347 protected void storeItemToMemento(Object item
, IMemento element
) {
348 element
.putString("resource", item
.toString()); //$NON-NLS-1$
353 * <p>getNewWizardLinkText</p>
355 * @return a {@link java.lang.String} object.
357 protected abstract String
getNewWizardLinkText();
360 * <p>getNewEntityWizard</p>
362 * @return a {@link eu.etaxonomy.taxeditor.newWizard.AbstractNewEntityWizard} object.
364 protected abstract AbstractNewEntityWizard
getNewEntityWizard(String parameter
);
366 public class FilteredCdmResourceLabelProvider
extends LabelProvider
{
367 public String
getText(Object element
) {
368 if (element
== null) {
371 return ((UuidAndTitleCache
) element
).getTitleCache();
376 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createExtendedContentArea(org.eclipse.swt.widgets.Composite)
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());
390 protected SelectionListener
getNewWizardLinkSelectionListener(){
391 return new SelectionAdapter() {
394 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
397 public void widgetSelected(SelectionEvent e
) {
399 AbstractNewEntityWizard wizard
= getNewEntityWizard(e
.text
);
400 wizard
.init(null, null);
401 WizardDialog dialog
= new WizardDialog(getShell(), wizard
);
402 int status
= dialog
.open();
404 if (status
== IStatus
.OK
) {
406 T entity
= (T
) wizard
.getEntity();
408 // addObjectToModel(teamOrPerson);
418 * <p>getConversationHolder</p>
420 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
422 public ConversationHolder
getConversationHolder() {
427 public void update(CdmDataChangeMap changeEvents
) {}