3 package eu
.etaxonomy
.taxeditor
.ui
.dialog
.selection
;
5 import java
.lang
.reflect
.Field
;
6 import java
.text
.Collator
;
7 import java
.util
.Comparator
;
8 import java
.util
.HashSet
;
11 import java
.util
.UUID
;
13 import org
.eclipse
.core
.runtime
.CoreException
;
14 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
15 import org
.eclipse
.core
.runtime
.IStatus
;
16 import org
.eclipse
.core
.runtime
.OperationCanceledException
;
17 import org
.eclipse
.core
.runtime
.Status
;
18 import org
.eclipse
.jface
.dialogs
.IDialogSettings
;
19 import org
.eclipse
.jface
.viewers
.ILabelProvider
;
20 import org
.eclipse
.jface
.viewers
.LabelProvider
;
21 import org
.eclipse
.jface
.window
.Window
;
22 import org
.eclipse
.jface
.wizard
.WizardDialog
;
23 import org
.eclipse
.swt
.SWT
;
24 import org
.eclipse
.swt
.events
.SelectionAdapter
;
25 import org
.eclipse
.swt
.events
.SelectionEvent
;
26 import org
.eclipse
.swt
.events
.SelectionListener
;
27 import org
.eclipse
.swt
.widgets
.Composite
;
28 import org
.eclipse
.swt
.widgets
.Control
;
29 import org
.eclipse
.swt
.widgets
.Link
;
30 import org
.eclipse
.swt
.widgets
.Shell
;
31 import org
.eclipse
.swt
.widgets
.Text
;
32 import org
.eclipse
.ui
.IMemento
;
33 import org
.eclipse
.ui
.dialogs
.FilteredItemsSelectionDialog
;
35 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
36 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
37 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
38 import eu
.etaxonomy
.cdm
.model
.common
.ICdmBase
;
39 import eu
.etaxonomy
.cdm
.model
.common
.IEnumTerm
;
40 import eu
.etaxonomy
.cdm
.model
.common
.IIdentifiableEntity
;
41 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
42 import eu
.etaxonomy
.taxeditor
.newWizard
.AbstractNewEntityWizard
;
43 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
44 import eu
.etaxonomy
.taxeditor
.store
.internal
.TaxeditorStorePlugin
;
47 * <p>Abstract AbstractFilteredCdmEnumSelectionDialog class.</p>
53 public abstract class AbstractFilteredCdmEnumSelectionDialog
<T
extends IEnumTerm
> extends
54 FilteredItemsSelectionDialog
implements IConversationEnabled
{
56 private ConversationHolder conversation
;
58 protected List
<T
> model
;
59 private String settings
;
64 * <p>Constructor for AbstractFilteredCdmResourceSelectionDialog.</p>
66 * @param shell a {@link org.eclipse.swt.widgets.Shell} object.
68 * @param title a {@link java.lang.String} object.
69 * @param multi a boolean.
70 * @param settings a {@link java.lang.String} object.
71 * @param cdmEnum a T object.
72 * @param <T> a T object.
74 protected AbstractFilteredCdmEnumSelectionDialog(Shell shell
,
75 ConversationHolder conversation
,
82 setMessage("Use * for wildcard, or ? to see all entries");
83 this.settings
= settings
;
85 this.conversation
= conversation
;
91 String objectTitle
= getTitle(cdmEnum
);
92 if (objectTitle
!= null) {
93 setInitialPattern(objectTitle
);
96 setListLabelProvider(createListLabelProvider());
97 setDetailsLabelProvider(createDetailsLabelProvider());
99 setSelectionHistory(new ResourceSelectionHistory());
103 * By default, we are returning the standard list label provider
105 * Override in subclasses if you want different behavior
109 protected ILabelProvider
createDetailsLabelProvider() {
110 return createListLabelProvider();
117 protected ILabelProvider
createListLabelProvider() {
118 return new FilteredCdmResourceLabelProvider();
122 * Override in subclasses.
123 * Will run before initModel()
125 protected void init() {
130 * <p>getSelectionFromDialog</p>
132 * @param dialog a {@link eu.etaxonomy.taxeditor.ui.dialog.selection.AbstractFilteredCdmResourceSelectionDialog} object.
133 * @param <TYPE> a TYPE object.
134 * @return a TYPE object.
136 protected static <TYPE
extends IEnumTerm
> TYPE
getSelectionFromDialog(AbstractFilteredCdmEnumSelectionDialog
<TYPE
> dialog
) {
138 int result
= dialog
.open();
140 if (result
== Window
.CANCEL
) {
144 return dialog
.getSelectedEnumTerm();
151 * @param cdmObject a T object.
152 * @return a {@link java.lang.String} object.
154 protected String
getTitle(T cdmEnum
) {
155 return cdmEnum
.getMessage();
161 public void refresh() {
169 abstract protected void initModel();
172 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createFilter()
176 protected ItemsFilter
createFilter() {
177 return new ItemsFilter() {
180 * Always returns false to enforce refiltering even if the pattern is equal
183 public boolean equalsFilter(ItemsFilter filter
) {
188 public boolean isConsistentItem(Object item
) {
193 public boolean matchItem(Object item
) {
195 if(item
instanceof IEnumTerm
){
196 text
= ((IEnumTerm
) item
).getMessage();
197 }else if(item
instanceof String
){
198 text
= (String
) item
;
200 return text
!= null ?
matches(text
) : false;
208 * Set the filter input to the Agent's title cache
210 * @param cdmObject a T object.
212 protected void setPattern(T cdmObject
) {
213 // FilteredSelection does some very tricky caching to make sure it
214 // runs with high performance.
215 // This works for most use cases, but we want to change the model while the dialog is open
216 // and all the clever caching prevents the content provider from knowing that the model has changed
217 // I am aware, that this is a hack, but the FilteredSelectionDialog API does not offer a convenient
218 // way to solve the problem.
220 Field lastCompletedFilter
= this.getClass().getSuperclass().getSuperclass().getDeclaredField("lastCompletedFilter");
221 lastCompletedFilter
.setAccessible(true);
222 lastCompletedFilter
.set(this, null);
223 } catch (SecurityException e
) {
224 StoreUtil
.error(getClass(), e
);
225 } catch (NoSuchFieldException e
) {
226 StoreUtil
.error(getClass(), e
);
227 } catch (IllegalArgumentException e
) {
228 StoreUtil
.error(getClass(), e
);
229 } catch (IllegalAccessException e
) {
230 StoreUtil
.error(getClass(), e
);
233 // this also is not the nicest way to do it.
234 // I am still amazed, that FilteredSelectionDialog does not offer any methods to change its data
235 // once it was opened. Am I doing it wrong?
236 String pattern
= getTitle(cdmObject
);
237 ((Text
) getPatternControl()).setText(pattern
);
241 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#fillContentProvider(org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.AbstractContentProvider, org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter, org.eclipse.core.runtime.IProgressMonitor)
245 protected void fillContentProvider(AbstractContentProvider contentProvider
,
246 ItemsFilter itemsFilter
, IProgressMonitor progressMonitor
)
247 throws CoreException
{
250 progressMonitor
.beginTask("Looking for entities", model
.size());
251 for(T element
: model
){
252 contentProvider
.add(element
, itemsFilter
);
253 if (progressMonitor
.isCanceled()) {
254 throw new OperationCanceledException();
256 progressMonitor
.worked(1);
259 StoreUtil
.warn(getClass(), "Model for Filtered Selection is null:" + this.getClass().getSimpleName());
263 progressMonitor
.done();
268 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getDialogSettings()
272 protected IDialogSettings
getDialogSettings() {
273 IDialogSettings settings
= TaxeditorStorePlugin
.getDefault().getDialogSettings().getSection(getSettings());
275 if (settings
== null) {
276 settings
= TaxeditorStorePlugin
.getDefault().getDialogSettings().addNewSection(getSettings());
282 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getElementName(java.lang.Object)
286 public String
getElementName(Object item
) {
287 return ((IEnumTerm
) item
).getMessage();
291 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getItemsComparator()
295 protected Comparator
getItemsComparator() {
296 return new Comparator
<IEnumTerm
>() {
297 public int compare(IEnumTerm entity1
,
299 Collator collator
= Collator
.getInstance();
300 return collator
.compare(entity1
.getMessage(), entity2
.getMessage());
306 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#validateItem(java.lang.Object)
310 protected IStatus
validateItem(Object item
) {
311 return Status
.OK_STATUS
;
315 * <p>getSelectedUuidAndTitleCache</p>
317 * @return a {@link eu.etaxonomy.cdm.model.common.UuidAndTitleCache} object.
319 protected T
getSelectedEnumTerm() {
320 Object
[] result
= getResult();
321 return result
[0] == null ?
null : (T
) result
[0];
325 * <p>Getter for the field <code>settings</code>.</p>
327 * @return a {@link java.lang.String} object.
329 public String
getSettings() {
330 if(settings
== null){
331 throw new IllegalStateException("No SETTINGS set.");
339 * @created Oct 19, 2009
342 private class ResourceSelectionHistory
extends SelectionHistory
{
344 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.SelectionHistory#restoreItemFromMemento(org.eclipse.ui.IMemento)
346 protected Object
restoreItemFromMemento(IMemento element
) {
347 return element
.getString("resource"); //$NON-NLS-1$
350 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.SelectionHistory#storeItemToMemento(java.lang.Object,
351 * org.eclipse.ui.IMemento)
353 protected void storeItemToMemento(Object item
, IMemento element
) {
354 element
.putString("resource", item
.toString()); //$NON-NLS-1$
359 * <p>getNewWizardLinkText</p>
361 * @return a {@link java.lang.String} object.
363 protected abstract String
getNewWizardLinkText();
366 * <p>getNewEntityWizard</p>
368 * @return a {@link eu.etaxonomy.taxeditor.newWizard.AbstractNewEntityWizard} object.
370 protected abstract AbstractNewEntityWizard
getNewEntityWizard(String parameter
);
372 public class FilteredCdmResourceLabelProvider
extends LabelProvider
{
373 public String
getText(Object element
) {
374 if (element
== null) {
377 return ((IEnumTerm
) element
).getMessage();
382 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createExtendedContentArea(org.eclipse.swt.widgets.Composite)
386 protected Control
createExtendedContentArea(Composite parent
) {
387 if(getNewWizardLinkText() != null){
388 Link link
= new Link(parent
, SWT
.NONE
);
389 link
.setText(getNewWizardLinkText());
390 link
.addSelectionListener(getNewWizardLinkSelectionListener());
396 protected SelectionListener
getNewWizardLinkSelectionListener(){
397 return new SelectionAdapter() {
400 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
403 public void widgetSelected(SelectionEvent e
) {
405 AbstractNewEntityWizard wizard
= getNewEntityWizard(e
.text
);
406 wizard
.init(null, null);
407 WizardDialog dialog
= new WizardDialog(getShell(), wizard
);
408 int status
= dialog
.open();
410 if (status
== IStatus
.OK
) {
412 T entity
= (T
) wizard
.getEntity();
416 getConversationHolder().bind();
423 * <p>getConversationHolder</p>
425 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
427 public ConversationHolder
getConversationHolder() {
432 public void update(CdmDataChangeMap changeEvents
) {}