2009-06-23 5 views
9

मैं कुछ शाखाओं के पेड़ पर ViewerFilter लागू कर रहा हूं, लेकिन अधिकतर पत्तियां छोड़ती हैं। फिल्टर वास्तव में पत्तियों के भीतर गुणों का उपयोग करके पत्तियों पर लागू होता है। सभी शाखाएं बिना छूटे रहती हैं ताकि उनकी पत्तियां दिखाई दे सकें।एक TreeViewer पर ViewerFilter का उपयोग करने के लिए सबसे अच्छा तरीका है?

हालांकि मैं उन शाखाओं को फ़िल्टर करना चाहता हूं जिनमें कोई चयनित पत्तियां नहीं हैं, और मैं ViewerFilter के भीतर कोई तंत्र नहीं देख सकता जो इसे अनुमति देता है।

क्या यह संभव है?

उदाहरण के लिए, नीचे काल्पनिक पेड़ दिया

b0 
    b1 
    L2 
    L4 
    L8 
    b2 
    L1 
    L3 
    L5 

मैं एक ViewerFilter है कि केवल भी पत्तियों और शाखाओं कि यहां तक ​​कि पत्ते होते हैं का चयन करता है आवेदन करना चाहते हैं (जहां b एक शाखा है, एक L एक पत्ता है) । जिसके परिणामस्वरूप पेड़ होगा ..

b0 
    b1 
    L2 
    L4 
    L8 

.. जहां शाखा b2 प्रदर्शित नहीं करता है के रूप में यह कोई चयनित बच्चों में शामिल है, लेकिन शाखाओं b0 और b1 है।

उत्तर

13
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; 
    } 
    } 
} 
+0

मुझे संदेह है कि तत्वों के बड़े संग्रह के लिए इस बहुत खराब समय का चल रहा समय। उदाहरण के लिए, सभी संसाधन एक कार्यक्षेत्र है। मुझे लगता है कि, प्रत्येक संसाधन के लिए, अपने सभी निहित संसाधनों पर जाएं। इसलिए यह है * ओ (एन^2) *। एक * ओ (एन) * समाधान होना चाहिए। – Lii

+0

दर्शक का अन्य फ़िल्टर होने पर यह समाधान वास्तव में खराब काम करता है। उदाहरण के लिए वर्कस्पेस संसाधनों के मामले में, जब किसी अन्य फ़िल्टर ने किसी फ़ोल्डर से सभी संसाधनों को फ़िल्टर किया है, तो यह फ़िल्टर अभी भी फ़ोल्डर को गैर-खाली के रूप में रिपोर्ट करेगा, क्योंकि यह फ़िल्टर अन्य फ़िल्टर से अवगत नहीं है। – Lii

0

मुझे यकीन नहीं है कि आप चयनित पत्तियों से क्या मतलब रखते हैं। यदि आपका विचार दृश्य में चुना गया है, तो आप इसे Viewer.getSelection() पर कॉल करके ढूंढ सकते हैं। आपके फ़िल्टर में लागू होने वाली चुनिंदा विधि दर्शक, अभिभावक और पत्ता में गुजरती है। आपको इस जानकारी का उपयोग यह तय करने में सक्षम होना चाहिए कि क्या पत्ता चुना गया है या नहीं और उन्हें फ़िल्टर करें। यदि आप कुछ और जानकारी दे सकते हैं, तो शायद मैं अधिक जानकारी के साथ उत्तर दे सकता हूं।

+0

पत्तियों और शाखाओं के बजाय, निर्देशिकाओं और फ़ाइलों की बात करते हैं। एक मनमानी निर्देशिका वृक्ष को देखते हुए मैं * .foo से मेल खाने वाली फ़ाइलों को प्रदर्शित करना चाहता हूं। इसके अलावा, मैं केवल उन निर्देशिकाओं को प्रदर्शित करना चाहता हूं जिनमें * .foo फ़ाइलें हों, या पुनरावर्ती निर्देशिकाएं हों जो करें। ऐसी कोई भी फाइल वाली निर्देशिकाएं प्रदर्शित नहीं की जानी चाहिए। क्या यह मदद करता है? एम –

+0

उस मामले में, चुनिंदा विधि में, आपको तत्व शुरू करने, अपने बच्चों को तब तक प्राप्त करने की आवश्यकता होगी जब तक कि आप एक पत्ते तक पहुंचें (सत्य वापस लौटें) या अंत (झूठी वापसी)। – AdamC

1

हां, यदि आप शाखा नोड्स को फ़िल्टर नहीं करते हैं, तो वे दिखाए जाएंगे कि इसमें कोई पत्तियां नहीं हैं। यदि आप फ़िल्टर को स्थायी रूप से चालू करना चाहते हैं, तो आप जो कुछ भी विचार कर सकते हैं वह फ़िल्टर के रूप में ITreeContentProvider का उपयोग कर रहा है।

चूंकि सामग्री प्रदाता दोनों कोChildren() और hasChildren() विधियों मिलते हैं, तो आपके पास थोड़ा अधिक नियंत्रण होता है।

2

org.eclipse.ui.dialogs.FilteredTree पर भी एक नज़र डालें जो बच्चे के पत्तों के संबंध में सही बात है।

संबंधित मुद्दे