ref #8450 Expand matrix rows only to taxon level
authorPatrick Plitzner <p.plitzner@bgbm.org>
Wed, 9 Oct 2019 12:49:44 +0000 (14:49 +0200)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Wed, 9 Oct 2019 12:49:44 +0000 (14:49 +0200)
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/CharacterMatrix.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/DescriptionTreeFormat.java

index 2b98597c20cc15edf8e042cfaa67373efcc375b9..b8ec197e1e8ea2ad04a8846c3474a85c3c9c7c9b 100644 (file)
@@ -84,6 +84,7 @@ import org.eclipse.nebula.widgets.nattable.summaryrow.FixedSummaryRowLayer;
 import org.eclipse.nebula.widgets.nattable.summaryrow.SummaryRowLayer;
 import org.eclipse.nebula.widgets.nattable.tree.ITreeRowModel;
 import org.eclipse.nebula.widgets.nattable.tree.TreeLayer;
+import org.eclipse.nebula.widgets.nattable.tree.command.TreeExpandToLevelCommand;
 import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry;
 import org.eclipse.nebula.widgets.nattable.ui.matcher.MouseEventMatcher;
 import org.eclipse.nebula.widgets.nattable.ui.menu.PopupMenuAction;
@@ -192,6 +193,8 @@ public class CharacterMatrix extends Composite {
 
     private boolean isShowTooltips = true;
 
+    private DescriptionTreeFormat treeFormat;
+
     public CharacterMatrix(Composite parent, CharacterMatrixPart part) {
         super(parent, SWT.NONE);
         this.part = part;
@@ -275,6 +278,12 @@ public class CharacterMatrix extends Composite {
         this.layout();
         natTable.doCommand(new ClientAreaResizeCommand(natTable));
 
+        // expand all taxa
+        Integer deepestTaxonLevel = treeFormat.getDeepestTaxonLevel();
+        if(deepestTaxonLevel!=null){
+            natTable.doCommand(new TreeExpandToLevelCommand(deepestTaxonLevel-2));
+        }
+
         // clean up table state
         getNatTableState().remove(NatTable.INITIAL_PAINT_COMPLETE_FLAG);
         getNatTableState().remove(PersistenceDialog.ACTIVE_VIEW_CONFIGURATION_KEY);
@@ -310,7 +319,8 @@ public class CharacterMatrix extends Composite {
     private void createLayers(boolean treeView) {
         SortedList<Object> sortedList = new SortedList<>(descriptions, new MatrixRowComparator());
         // wrap the SortedList with the TreeList
-        TreeList<Object> treeList = new TreeList(sortedList, new DescriptionTreeFormat(getDescriptiveDataSet()), TreeList.NODES_START_EXPANDED);
+        treeFormat = new DescriptionTreeFormat(getDescriptiveDataSet());
+        TreeList<Object> treeList = new TreeList(sortedList, treeFormat, TreeList.NODES_START_COLLAPSED);
         /**
          * data provider
          */
index dd5172a3be494f6c74f4101aa300b5c4accab7eb..f9d0cb7c9bdefccd020cd20f2d85bff27fd74287 100644 (file)
@@ -18,6 +18,7 @@ import java.util.UUID;
 import ca.odell.glazedlists.TreeList;
 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
 import eu.etaxonomy.cdm.api.service.dto.RowWrapperDTO;
+import eu.etaxonomy.cdm.api.service.dto.SpecimenRowWrapperDTO;
 import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
 import eu.etaxonomy.cdm.model.name.Rank;
 import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
@@ -35,6 +36,8 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
 
      private Rank maxRank;
 
+     private Integer deepestTaxonLevel = null;
+
      private Map<UUID, TaxonNodeDto> uuidToTaxonNodeDtoMap = new HashMap<>();
 
      public DescriptionTreeFormat(DescriptiveDataSet descriptiveDataSet) {
@@ -43,9 +46,10 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
 
      @Override
      public void getPath(List path, Object element) {
+         Integer level = 0;
          if(element instanceof RowWrapperDTO){
              //TODO: check for multiple taxon nodes in multiple classifications
-             TaxonNodeDto taxonNode = ((RowWrapperDTO) element).getTaxonNode();
+             TaxonNodeDto taxonNode = ((RowWrapperDTO)element).getTaxonNode();
              //use dto from map cache because the elements have to be
              //exactly the same for the tree format to work
              if(uuidToTaxonNodeDtoMap.get(taxonNode.getUuid())!=null){
@@ -54,16 +58,26 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
              else{
                  uuidToTaxonNodeDtoMap.put(taxonNode.getUuid(), taxonNode);
              }
-             addPathRecursive(path, taxonNode);
+             level = addPathRecursive(path, taxonNode, level);
+         }
+         if(element instanceof SpecimenRowWrapperDTO){
+             if(deepestTaxonLevel==null){
+                 deepestTaxonLevel = level;
+             }
+             else{
+                 deepestTaxonLevel = Math.min(level, deepestTaxonLevel);
+             }
          }
          path.add(element);
      }
 
-     private void addPathRecursive(List path, TaxonNodeDto node){
+     private Integer addPathRecursive(List path, TaxonNodeDto node, Integer level){
+         level++;
+
          if(node!=null){
              if(maxRank!=null && node.getRankOrderIndex()==maxRank.getOrderIndex()){
                  path.add(node);
-                 return;
+                 return level;
              }
              TaxonNodeDto parentNodeDto = uuidToTaxonNodeDtoMap.get(node.getParentUUID());
              if(parentNodeDto==null){
@@ -73,12 +87,17 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
                  }
              }
              if(parentNodeDto!=null){
-                 addPathRecursive(path, parentNodeDto);
+                 level = addPathRecursive(path, parentNodeDto, level);
                  path.add(node);
              }
          }
+         return level;
      }
 
+    public Integer getDeepestTaxonLevel() {
+        return deepestTaxonLevel;
+    }
+
      @Override
      public boolean allowsChildren(Object element) {
          return true;