major
minor
defect
major
minor
minor
#29390
Teilbaum-Auswahl endet zu früh, wenn die unterste Ebene vom Ebenen-Filter nicht mitgezählt wird
Das Kontextmenü-Kommando zum Auswählen bzw. Abwählen eines Teilbaums in Baumtabellen kann auf eine bestimmte Anzahl von Ebenen (levels) begrenzt werden. Zusätzlich kann ein optionaler Ebenen-Filter (level-filter) konfiguriert werden, der bestimmt, welche Knoten als eigene Ebene zählen: Unterhalb von Knoten, die der Filter nicht akzeptiert, soll die Auswahl eine Ebene weiter absteigen, ohne den Ebenen-Zähler zu verringern.
Der Ebenen-Filter wird jedoch ignoriert, sobald der Ebenen-Zähler 0 erreicht hat: Ist die zuletzt erreichte Ebene (levels == 0) eine, die laut Ebenen-Filter nicht zählt, wird trotzdem nicht weiter abgestiegen. Dadurch werden weniger Knoten ausgewählt bzw. abgewählt als konfiguriert.
Die Bedingung levels > 0 in com.top_logic.layout.table.tree.SelectSubtree.selectLevel(LayoutComponent, TreeSelectionModel<Object>, Object, int) muss erweitert werden um eine Prüfung, ob der aktuelle Level überhaupt mitgezählt wird.
Lösungsvorschlag:
private void selectLevel(LayoutComponent component, TreeSelectionModel<Object> treeSelection, Object directTarget,
int levels) {
if (_filter == null
|| _filter.apply(((TLTreeNode<?>) directTarget).getBusinessObject(), component.getModel())) {
treeSelection.setSelected(directTarget, select());
}
boolean countLevel = _levelFilter == null
|| _levelFilter.apply(((TLTreeNode<?>) directTarget).getBusinessObject(), component.getModel());
if (levels > 0 || !countLevel) {
int childLevels = countLevel ? levels - 1 : levels;
for (Object child : treeSelection.getTreeModel().getChildren(directTarget)) {
selectLevel(component, treeSelection, child, childLevels);
}
}
}