Wie man am besten ViewerFilter auf einem TreeViewer zu benutzen?
-
10-07-2019 - |
Frage
Ich bin ein ViewerFilter
an einen Baum von einigen Zweigen der Anwendung, aber vor allem Blätter. Der Filter passt dann wirklich auf die Blätter, mit Eigenschaften innerhalb des Blattes. Alle Zweige bleiben unberührt, so dass ihre Blätter erscheinen.
Allerdings würde Ich mag Zweige, um herauszufiltern, die keine ausgewählten Blätter enthalten, und ich kann keinen Mechanismus innerhalb ViewerFilter
sehen, die dies ermöglicht.
Ist das möglich?
Zum Beispiel angesichts der fiktiven Baum unten (wo b
ein Zweig, ein L
ist ein Blatt)
b0
b1
L2
L4
L8
b2
L1
L3
L5
würde Ich mag eine ViewerFilter
anzuwenden, die Blätter und Zweige wählt nur noch die sogar Blätter enthalten. Der resultierende Baum wäre ..
b0
b1
L2
L4
L8
.. wo Zweig b2
nicht angezeigt, da es keine ausgewählten Kinder enthält, sondern Zweige b0
und b1
tun.
Lösung
class MyFilter extends ViewerFilter{
private boolean isLeaf(Object element){
// implement this
}
private boolean isEvenLeaf(Object leaf){
// implement this
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element){
if (isLeaf(element))
return isEventLeaf(element);
else {
StructuredViewer sviewer = (StructuredViewer) viewer;
ITreeContentProvider provider = (ITreeContentProvider) sviewer.getContentProvider();
for (Object child: provider.getChildren(element)){
if (select(viewer, element, child))
return true;
}
return false;
}
}
}
Andere Tipps
Haben Sie auch einen Blick auf org.eclipse.ui.dialogs.FilteredTree
, die das Richtige in Bezug auf das Kind verlässt.
Ja, wenn Sie die Zweigknoten nicht herausfiltern, werden sie auch sind, wenn es gezeigt werden keine Blätter in ihr. Wenn Sie die Filter wollen dauerhaft zu sein, kann etwas, das Sie prüfen, ist die ITreeContentProvider als Filter verwenden.
Da der Content-Provider hat beide getChildren () und hasChildren () Methoden, haben Sie ein wenig mehr Kontrolle.
Ich bin mir nicht sicher, was Sie durch ausgewählte Blätter bedeuten. Wenn Sie in der Ansicht ausgewählt bedeuten, können Sie dies herausfinden, indem Viewer.getSelection () aufrufen. Die Auswahlmethode, die Sie in Ihrem Filter implementieren geht in dem Betrachter, Eltern und Blatt. Sie sollten diese Informationen zu verwenden, um zu entscheiden, ob das Blatt ausgewählt ist oder nicht und filtern sie aus. Wenn Sie mehr Informationen geben können, kann ich wahrscheinlich mit ausführlicher beantworten.