ref #7063 change labels for dialog help
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / wizard / AvailableDistributionPage.java
index cc25cb48152d8bf848c20c71d2f5031956e47784..1065b6c5413d4b55d8eca3607651475f209487a3 100755 (executable)
@@ -12,18 +12,20 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
+import org.apache.commons.lang.StringUtils;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.CheckboxTreeViewer;
 import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ITreeViewerListener;
 import org.eclipse.jface.viewers.StyledString.Styler;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jface.viewers.TreeExpansionEvent;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.TextStyle;
 import org.eclipse.swt.layout.GridData;
@@ -31,14 +33,12 @@ import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 
-import eu.etaxonomy.cdm.api.service.ITermService;
 import eu.etaxonomy.cdm.api.service.IVocabularyService;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
 import eu.etaxonomy.cdm.model.common.TermType;
 import eu.etaxonomy.cdm.model.common.TermVocabulary;
-import eu.etaxonomy.taxeditor.editor.definedterm.TermContentProvider;
-import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
+import eu.etaxonomy.cdm.model.metadata.PreferencePredicate;
 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
@@ -49,68 +49,54 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
  * @date 21.07.2014
  *
  */
-public class AvailableDistributionPage extends WizardPage implements ICdmEntitySessionEnabled {
-
-    private CheckboxTreeViewer viewer;
-
-    private Set<TermVocabulary<DefinedTermBase>> vocabularies;
+public class AvailableDistributionPage extends AbstractTermSelectionWizardPage implements ICdmEntitySessionEnabled {
 
     /**
      * @param pageName
      */
     protected AvailableDistributionPage(String pageName) {
-        super(pageName);
-        // TODO check if configuration exists
-        CdmStore.getCurrentSessionManager().bindNullSession();
+        super(pageName, TermType.NamedArea);
+        this.localPref = true;
+
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see
-     * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
-     * .Composite)
-     */
     /** {@inheritDoc} */
     @Override
     public void createControl(Composite parent) {
         IPreferenceStore preferenceStore = PreferencesUtil.getPreferenceStore();
+
         String checkedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS);
         String grayedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS_GRAYED);
         setTitle("Select areas for Distribution Editor");
-        setDescription("In order to be able to modify and see the distribution status of taxa,\n"
-                + "you have to select the areas which you like to see.");
+        setDescription("In order to see and modify distribution status of taxa\n"
+                + "you have to select the areas which you like to see/modify.");
         Composite composite = new Composite(parent, SWT.NULL);
         composite.setLayout(new GridLayout());
-        viewer = new CheckboxTreeViewer(composite, SWT.NULL);
-        viewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-        viewer.setContentProvider(new TermContentProvider());
+        setViewer(new CheckboxTreeViewer(composite, SWT.NULL));
+        ((CheckboxTreeViewer)getViewer()).getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        getViewer().setContentProvider(new DistributionContentProvider());
         Styler styler = new Styler() {
             @Override
             public void applyStyles(TextStyle textStyle) {
                 textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
             }
         };
-        viewer.setLabelProvider(new TermLabelProvider(styler));
-        viewer.addCheckStateListener(new ICheckStateListener() {
+        getViewer().setLabelProvider(new AreaLabelProvider(styler));
+        getViewer().setComparator(new AreaViewerComparator());
+        ((CheckboxTreeViewer)getViewer()).addCheckStateListener(new ICheckStateListener() {
 
             private boolean ignoreCheckEvent = false;
 
             @Override
             public void checkStateChanged(CheckStateChangedEvent event) {
-
-
                 if (ignoreCheckEvent ) {
                     return;
                 }
-
                 ignoreCheckEvent = true;
-
                 try {
-
                     checkChildren(event.getElement(), event.getChecked());
-
-                    grayParents(event.getElement());
+                    grayParents(event.getElement(), event.getChecked());
+                   // ((CheckboxTreeViewer)getViewer()).refresh();
                 }
                 finally {
                     ignoreCheckEvent = false;
@@ -118,71 +104,44 @@ public class AvailableDistributionPage extends WizardPage implements ICdmEntityS
                 checkNoneChecked();
             }
         });
+        ((CheckboxTreeViewer)getViewer()).addTreeListener(new ITreeViewerListener() {
+            @Override
+            public void treeCollapsed(TreeExpansionEvent event) {
+            }
+
+            @Override
+            public void treeExpanded(TreeExpansionEvent event) {
+                final Object element = event.getElement();
+                final Object[] children = ((DistributionContentProvider)getViewer().getContentProvider()).getChildren(element);
+                for (Object child : children) {
+                    if (child instanceof NamedAreaWrapper){
+                        if (getListCheckedTerms().contains(((NamedAreaWrapper) child).getNamedArea()) ){
+                            ((CheckboxTreeViewer)getViewer()).setChecked(child, true);
+                        }
+                        if (getListGrayedTerms().contains(((NamedAreaWrapper) child).getNamedArea())&& !((NamedAreaWrapper) child).isBaseElement){
+                            ((CheckboxTreeViewer)getViewer()).setGrayChecked(child, true);
+                        }
+                    }
+
+                }
+            }
+        });
+
         // TODO: write listener or toggle button to select all named areas
 
         rememberCheckedValues(checkedValues, grayedValues);
+       // ((CheckboxTreeViewer)getViewer()).expandToLevel(2);
         setControl(composite);
     }
 
 
-    protected List<TermVocabulary<DefinedTermBase>> initialiseVocabularies() {
-        if (vocabularies != null) {
-            vocabularies.clear();
-        }
-        List<TermVocabulary<DefinedTermBase>> vocs = CdmStore.getService(IVocabularyService.class).findByTermType(
-                TermType.NamedArea, null);
 
-        return vocs;
-    }
 
-    private void rememberCheckedValues(String checkedValues, String grayedValues) {
-        viewer.setInput(initialiseVocabularies());
-
-        if (grayedValues != null && grayedValues != "") {
-            String[] listGrayed = grayedValues.split(",");
-            ArrayList listGrayedTerms = new ArrayList();
-            getTermsFromStringValues(listGrayed, listGrayedTerms);
-            for(Object element : listGrayedTerms){
-                if(element != null){
-                    viewer.setGrayChecked(element, true);
-                }
-            }
-        }
-        if (checkedValues != null && checkedValues != "") {
-            String[] listChecked = checkedValues.split(",");
-            ArrayList<DefinedTermBase<?>> listCheckedTerms = new ArrayList<DefinedTermBase<?>>();
-            getTermsFromStringValues(listChecked, listCheckedTerms);
-            for(Object element : listCheckedTerms){
-                if(element != null){
-                    viewer.setChecked(element, true);
-                }
-            }
-        }
-    }
 
-    /**
-     * @param split
-     * @param termlist
-     */
-    private void getTermsFromStringValues(String[] split, ArrayList termlist) {
-        List<String> listValue = Arrays.asList(split);
-        for (String s : listValue) {
-            UUID uuid = UUID.fromString(s);
-            ITermService termService = CdmStore.getService(ITermService.class);
-            DefinedTermBase definedTermBase = termService.load(uuid);
-            if(definedTermBase != null){
-                termlist.add(definedTermBase);
-            }else{
-                IVocabularyService vocabularyService = CdmStore.getService(IVocabularyService.class);
-                TermVocabulary termVocabulary = vocabularyService.load(uuid);
-                termlist.add(termVocabulary);
-            }
-        }
-    }
 
     private boolean checkNoneChecked() {
 
-        if (viewer.getCheckedElements().length == 0) {
+        if (((CheckboxTreeViewer)getViewer()).getCheckedElements().length == 0) {
             setMessage("Please check at least one item", WARNING);
             return true;
         } else {
@@ -191,67 +150,6 @@ public class AvailableDistributionPage extends WizardPage implements ICdmEntityS
         }
     }
 
-    /**
-     * @return the viewer
-     */
-    public CheckboxTreeViewer getViewer() {
-        return viewer;
-    }
-
-    /**
-     *
-     * @param path
-     */
-    private void checkParents(final TreePath path) {
-        if (path == null) {
-            return;
-        }
-        TermContentProvider tcp = new TermContentProvider();
-        Object treeElement = path.getLastSegment();
-
-        if (treeElement != null) {
-            boolean allChecked = true;
-            boolean allUnchecked = true;
-            for (final Object fieldElement : tcp.getChildren(treeElement)) {
-                allChecked = allChecked && this.viewer.getChecked(fieldElement);
-                allUnchecked = allUnchecked && !this.viewer.getChecked(fieldElement);
-            }
-            if (allUnchecked) {
-                this.viewer.setChecked(treeElement, false);
-                this.viewer.setGrayed(treeElement, false);
-            } else if (allChecked) {
-                this.viewer.setChecked(treeElement, true);
-                this.viewer.setGrayed(treeElement, false);
-            } else if (!allUnchecked && !allChecked) {
-                this.viewer.setChecked(treeElement, true);
-                this.viewer.setGrayed(treeElement, true);
-            }
-        }
-        checkParents(path.getParentPath());
-    }
-
-//    /**
-//     *
-//     * @param path
-//     * @param checked
-//     */
-//    private void checkChildren(final TreePath path, final boolean checked) {
-//        TermContentProvider tcp = new TermContentProvider();
-//
-//        if (path == null) {
-//            return;
-//        }
-//        final Object element = path.getLastSegment();
-//        if (element != null) {
-//            this.viewer.setChecked(element, checked);
-//            this.viewer.setGrayed(element, false);
-//            int length = tcp.getChildren(element).length;
-//            if(length>1){
-//                this.viewer.expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
-//                this.viewer.setSubtreeChecked(element, checked);
-//            }
-//        }
-//    }
 
     /**
     *
@@ -259,29 +157,37 @@ public class AvailableDistributionPage extends WizardPage implements ICdmEntityS
     * @param checked
     */
    private void checkChildren(final Object element, final boolean checked) {
-       TermContentProvider tcp = new TermContentProvider();
-
        if (element == null) {
            return;
        }
-    //   final Object element = path.getLastSegment();
-       if (element != null) {
-           this.viewer.setChecked(element, checked);
-           this.viewer.setGrayed(element, false);
-           int length = tcp.getChildren(element).length;
-           if(length>1){
-               this.viewer.expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
-               this.viewer.setSubtreeChecked(element, checked);
+
+       if (((CheckboxTreeViewer)getViewer()).isExpandable(element)){
+           ((CheckboxTreeViewer)getViewer()).expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
+           ((CheckboxTreeViewer)getViewer()).setSubtreeChecked(element, checked);
+
+           ((CheckboxTreeViewer)getViewer()).setChecked(element, checked);
+           if (((CheckboxTreeViewer)getViewer()).getGrayed(element)){
+               ((CheckboxTreeViewer)getViewer()).setGrayChecked(element, !checked);
            }
+//           if (element instanceof NamedAreaWrapper){
+//               NamedAreaWrapper baseElement = new NamedAreaWrapper(((NamedAreaWrapper)element).getNamedArea(), true, ((NamedAreaWrapper)element).parent);
+//               ((CheckboxTreeViewer)getViewer()).setChecked(baseElement, !checked);
+//               ((CheckboxTreeViewer)getViewer()).setGrayed(element, checked);
+//           }
+
+       }else{
+           ((CheckboxTreeViewer)getViewer()).setChecked(element, checked);
+           ((CheckboxTreeViewer)getViewer()).setGrayed(element, false);
        }
+
    }
    /**
    *
    * @param path
    * @param checked
    */
-  private void grayParents(final Object element) {
-      TermContentProvider tcp = new TermContentProvider();
+  private void grayParents(final Object element, boolean checked) {
+      DistributionContentProvider tcp = new DistributionContentProvider();
 
       if (element == null) {
           return;
@@ -289,24 +195,41 @@ public class AvailableDistributionPage extends WizardPage implements ICdmEntityS
    //   final Object element = path.getLastSegment();
       Object parent = tcp.getParent(element);
       if (parent != null) {
-          boolean allChecked = true;
+
           boolean allUnchecked = true;
-          for (final Object fieldElement : tcp.getChildren(parent)) {
-              allChecked = allChecked && this.viewer.getChecked(fieldElement);
-              allUnchecked = allUnchecked && !this.viewer.getChecked(fieldElement);
-          }
-          if (allUnchecked) {
-              this.viewer.setChecked(parent, false);
-              this.viewer.setGrayed(parent, false);
-          } else if (allChecked) {
-              this.viewer.setChecked(parent, true);
-              this.viewer.setGrayed(parent, false);
-          } else if (!allUnchecked && !allChecked) {
-              this.viewer.setChecked(parent, true);
-              this.viewer.setGrayed(parent, true);
-          }
-
-        grayParents(tcp.getParent(parent));
+          boolean allChecked = true;
+          //if element is checked then the parent should be grayed if it is unchecked it have to be computed whether the parent should be checked
+//          if (checked){
+//              if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
+//                  ((CheckboxTreeViewer)getViewer()).setGrayChecked(parent, true);
+//              }
+//
+//          }else{
+              for (final Object fieldElement : tcp.getChildren(parent)) {
+                  allChecked = allChecked && ((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
+                  allUnchecked = allUnchecked && !((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
+                  allUnchecked = allUnchecked && !((CheckboxTreeViewer)getViewer()).getGrayed(fieldElement);
+              }
+              if (allUnchecked) {
+//                  if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
+                      ((CheckboxTreeViewer)getViewer()).setChecked(parent, false);
+                      ((CheckboxTreeViewer)getViewer()).setGrayed(parent, false);
+//                  }else{
+//                      checked = true;
+//                  }
+              } else if (allChecked){
+                  ((CheckboxTreeViewer)getViewer()).setChecked(parent, true);
+                  ((CheckboxTreeViewer)getViewer()).setGrayed(parent, false);
+              }else {
+//                if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
+                    ((CheckboxTreeViewer)getViewer()).setGrayChecked(parent, true);
+                    ((CheckboxTreeViewer)getViewer()).setChecked(parent, true);
+//                }
+                checked = true;
+
+              }
+//          }
+        grayParents(parent, checked);
       }
   }
 
@@ -345,4 +268,33 @@ public class AvailableDistributionPage extends WizardPage implements ICdmEntityS
         return propertyPathsMap;
     }
 
+    @Override
+    protected  List<TermVocabulary<DefinedTermBase>> getVocabulariesFromPreference(){
+        List<TermVocabulary<DefinedTermBase>> vocs = new ArrayList();
+
+        if (PreferencesUtil.getPreferenceFromDB(PreferencePredicate.AvailableDistributionAreaVocabularies) == null && PreferencesUtil.getPreferenceStore().getString(PreferencesUtil.DISTRIBUTION_VOCABULARIES) == null){
+            vocs = CdmStore.getService(IVocabularyService.class).findByTermType(
+                    type, null);
+        }else{
+            String vocString = PreferencesUtil.getPreferenceStore().getString(PreferencesUtil.DISTRIBUTION_VOCABULARIES);
+
+            String[] arrayVocs = vocString.split(";");
+
+            Set<UUID> uuidVocs = new HashSet();
+            for (String voc: arrayVocs){
+                if (!StringUtils.isBlank(voc)){
+                    uuidVocs.add(UUID.fromString(voc));
+                }
+            }
+            List<TermVocabulary> tempVocs = CdmStore.getService(IVocabularyService.class).find(uuidVocs);
+            for (TermVocabulary voc: tempVocs){
+                vocs.add(voc);
+            }
+
+        }
+        return vocs;
+    }
+
+
+
 }