Merge branch 'release/4.6.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / dialog / selection / AbstractFilteredCdmResourceSelectionDialog.java
index 171df7231870c61ab6e7b7822587245deb579f2c..a6ec94c170de6d86d423beb86ca5a7e69a7f1988 100644 (file)
@@ -1,4 +1,3 @@
-// $Id$
 /**
 * Copyright (C) 2007 EDIT
 * European Distributed Institute of Taxonomy
 
 package eu.etaxonomy.taxeditor.ui.dialog.selection;
 
-import java.lang.reflect.Field;
 import java.text.Collator;
 import java.util.Comparator;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.UUID;
@@ -32,23 +31,25 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Cursor;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Link;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.IMemento;
-import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.ICdmBase;
 import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;
-import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;
+import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.newWizard.AbstractNewEntityWizard;
+import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
 
 /**
@@ -59,16 +60,18 @@ import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
  * @version 1.0
  */
 public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmBase> extends
-               FilteredItemsSelectionDialog implements IConversationEnabled {
+               CdmFilteredItemsSelectionDialog implements IConversationEnabled {
 
        private final ConversationHolder conversation;
 
        protected List<UuidAndTitleCache<T>> model;
        private final Set<T> transientCdmObjects = new HashSet<T>();
        private final String settings;
+       protected final int limitOfInitialElements = 100;
 
        protected T cdmBaseToBeFiltered;
 
+
        /**
         * <p>Constructor for AbstractFilteredCdmResourceSelectionDialog.</p>
         *
@@ -87,15 +90,16 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
                this.settings = settings;
 
                this.conversation = conversation;
-
+               this.cdmBaseToBeFiltered = cdmObject;
+               Cursor cursor = shell.getCursor();
+               shell.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT));
                init();
-
                initModel();
-
+               shell.setCursor(cursor);
                String objectTitle = getTitle(cdmObject);
-               if (objectTitle != null) {
-                       setInitialPattern(objectTitle);
-               }
+//             if (objectTitle != null) {
+//                     setInitialPattern(objectTitle);
+//             }
 
                setListLabelProvider(createListLabelProvider());
                setDetailsLabelProvider(createDetailsLabelProvider());
@@ -218,15 +222,10 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
        /** {@inheritDoc} */
        @Override
        public void refresh() {
-               initModel();
-               filterExcludedObjects();
                super.refresh();
        }
 
-       /**
-        * <p>initModel</p>
-        */
-       abstract protected void initModel();
+
 
        /* (non-Javadoc)
         * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createFilter()
@@ -276,19 +275,19 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
                // and all the clever caching prevents the content provider from knowing that the model has changed
                // I am aware, that this is a hack, but the FilteredSelectionDialog API does not offer a convenient
                // way to solve the problem.
-               try {
-                       Field lastCompletedFilter = this.getClass().getSuperclass().getSuperclass().getDeclaredField("lastCompletedFilter");
-                       lastCompletedFilter.setAccessible(true);
-                       lastCompletedFilter.set(this, null);
-               } catch (SecurityException e) {
-                       AbstractUtility.error(getClass(), e);
-               } catch (NoSuchFieldException e) {
-                       AbstractUtility.error(getClass(), e);
-               } catch (IllegalArgumentException e) {
-                       AbstractUtility.error(getClass(), e);
-               } catch (IllegalAccessException e) {
-                       AbstractUtility.error(getClass(), e);
-               }
+//             try {
+//                     Field lastCompletedFilter = this.getClass().getSuperclass().getSuperclass().getDeclaredField("lastCompletedFilter");
+//                     lastCompletedFilter.setAccessible(true);
+//                     lastCompletedFilter.set(this, null);
+//             } catch (SecurityException e) {
+//                     MessagingUtils.error(getClass(), e);
+//             } catch (NoSuchFieldException e) {
+//                     MessagingUtils.error(getClass(), e);
+//             } catch (IllegalArgumentException e) {
+//                     MessagingUtils.error(getClass(), e);
+//             } catch (IllegalAccessException e) {
+//                     MessagingUtils.error(getClass(), e);
+//             }
 
                // this also is not the nicest way to do it.
                // I am still amazed, that FilteredSelectionDialog does not offer any methods to change its data
@@ -297,6 +296,8 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
                ((Text) getPatternControl()).setText(pattern);
        }
 
+
+
        /* (non-Javadoc)
        * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#fillContentProvider(org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.AbstractContentProvider, org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter, org.eclipse.core.runtime.IProgressMonitor)
        */
@@ -308,15 +309,21 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
                try {
                        if(model != null){
                                progressMonitor.beginTask("Looking for entities", model.size());
-                               for(UuidAndTitleCache<T> element : model){
-                                       contentProvider.add(element, itemsFilter);
+                               filterExcludedObjects();
+                               Iterator<UuidAndTitleCache<T>> iterator = model.iterator();
+                               UuidAndTitleCache<T> element;
+                               while(iterator.hasNext()){
+                                   element = iterator.next();
+                                   if (!element.equals(cdmBaseToBeFiltered)){
+                                       contentProvider.add(element, itemsFilter);
+                                   }
                                        if (progressMonitor.isCanceled()) {
                                                throw new OperationCanceledException();
                                        }
                                        progressMonitor.worked(1);
                                }
                        }else{
-                               AbstractUtility.warn(getClass(), "Model for Filtered Selection is null:" + this.getClass().getSimpleName());
+                               MessagingUtils.warn(getClass(), "Model for Filtered Selection is null:" + this.getClass().getSimpleName());
                        }
                }
                finally {
@@ -355,10 +362,17 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
        protected Comparator getItemsComparator() {
                return new Comparator<UuidAndTitleCache>() {
                        @Override
-            public int compare(UuidAndTitleCache entity1,
+                       public int compare(UuidAndTitleCache entity1,
                                        UuidAndTitleCache entity2) {
                                Collator collator = Collator.getInstance();
-                               return collator.compare(entity1.getTitleCache(), entity2.getTitleCache());
+                               if (entity1.getUuid().equals(entity2.getUuid())){
+                                   return 0;
+                               }
+                               int result = collator.compare(entity1.getTitleCache(), entity2.getTitleCache());
+                               if (result == 0){
+                                   result = entity1.getUuid().compareTo(entity2.getUuid());
+                               }
+                               return result;
                        }
                };
        }
@@ -405,7 +419,7 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
            * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.SelectionHistory#restoreItemFromMemento(org.eclipse.ui.IMemento)
                */
                @Override
-        protected Object restoreItemFromMemento(IMemento element) {
+               protected Object restoreItemFromMemento(IMemento element) {
                        return element.getString("resource"); //$NON-NLS-1$
                }
                /*
@@ -413,7 +427,7 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
                 *      org.eclipse.ui.IMemento)
                 */
                @Override
-        protected void storeItemToMemento(Object item, IMemento element) {
+               protected void storeItemToMemento(Object item, IMemento element) {
                        element.putString("resource", item.toString()); //$NON-NLS-1$
                }
        }
@@ -434,11 +448,16 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
 
        public class FilteredCdmResourceLabelProvider extends LabelProvider {
                @Override
-        public String getText(Object element) {
+               public String getText(Object element) {
                        if (element == null) {
                                return null;
                        }
-                       return ((UuidAndTitleCache) element).getTitleCache();
+                       UuidAndTitleCache uuidAndTitleCache = (UuidAndTitleCache) element;
+                       String titleCache = uuidAndTitleCache.getTitleCache();
+                       if(PreferencesUtil.getPreferenceStore().getBoolean(IPreferenceKeys.SHOW_ID_IN_ENTITY_SELECTION_DIAOLOG)){
+                           titleCache += " ["+uuidAndTitleCache.getId()+"]";
+                       }
+            return titleCache;
                }
        };
 
@@ -467,23 +486,29 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
                        @Override
                        public void widgetSelected(SelectionEvent e) {
 
-                               AbstractNewEntityWizard wizard = getNewEntityWizard(e.text);
-
-                               wizard.init(null, null);
-                               WizardDialog dialog = new WizardDialog(getShell(), wizard);
-                               int status = dialog.open();
-
-                               if (status == IStatus.OK) {
-
-                                       T entity = (T) wizard.getEntity();
-
-//                                     addObjectToModel(teamOrPerson);
-                                       refresh();
-                                       setPattern(entity);
-                                       getConversationHolder().bind();
-                                       //FIXME : Need to make sure this is a stable fix (ticket 3822)
-                                       getConversationHolder().commit();
-                               }
+                           AbstractNewEntityWizard wizard = getNewEntityWizard(e.text);
+                           if(wizard!=null){
+                               wizard.init(null, null);
+                               if(wizard.getEntity() != null) {
+                                   WizardDialog dialog = new WizardDialog(getShell(), wizard);
+                                   int status = dialog.open();
+
+                                   if (status == IStatus.OK) {
+
+                                       T entity = (T) wizard.getEntity();
+                                      // model.add(new UuidAndTitleCache<T>(entity.getUuid(), entity.getId(), getTitle(entity)));
+                                       refresh();
+                                       setPattern(entity);
+                                       if (getConversationHolder() != null){
+                                           getConversationHolder().bind();
+                                       }
+                                   }
+                                   //FIXME : Need to make sure this is a stable fix (ticket 3822)
+                                   if (getConversationHolder() != null){
+                                       getConversationHolder().commit();
+                                   }
+                               }
+                           }
                        }
                };
        }
@@ -494,13 +519,13 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
         * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
         */
        @Override
-    public ConversationHolder getConversationHolder() {
+       public ConversationHolder getConversationHolder() {
                return conversation;
        }
 
        /** {@inheritDoc} */
        @Override
-    public void update(CdmDataChangeMap changeEvents) {}
+       public void update(CdmDataChangeMap changeEvents) {}
 
        /**
         * Don't want to add for example a taxon or synonym to itself