2011-06-01 8 views
9

मुझे किसी ग्रहण प्लगइन प्रोजेक्ट में TreeViewer के लिए संदर्भ मेनू बनाने की आवश्यकता है। लेकिन, मेनू में निरंतर आइटम नहीं होना चाहिए, उन्हें चयनित नोड के प्रकार के आधार पर अलग-अलग होना चाहिए। उदाहरण के लिए, मेरी treeViewer निम्न पदानुक्रम है:चयनित नोड के आधार पर TreeViewer के लिए संदर्भ मेनू - SWT

Node A 
| 
--Node B 
    | 
    --Node C 

नोड एक के लिए - मैं एक कार्रवाई के साथ एक मेनू दिखाने के लिए चाहते हैं, लेकिन नोड्स बी और सी के लिए मैं कुछ भी (कोई मेनू) को दिखाने के लिए नहीं करना चाहती। मैं नोड ए के लिए मेनू बनाने में कामयाब रहा, लेकिन फिर जब मैं किसी अन्य प्रकार के नोड का चयन करता हूं तो मैं इससे छुटकारा नहीं पा सकता हूं। मेरे कोड लगता है:

treeViewer.addSelectionChangedListener(
      new ISelectionChangedListener(){ 
       public void selectionChanged(SelectionChangedEvent event) { 
        if(event.getSelection() instanceof IStructuredSelection) { 
         IStructuredSelection selection = (IStructuredSelection)event.getSelection();    
         Object o = selection.getFirstElement();  

         MenuManager menuMgr = new MenuManager(); 

         if (o instanceof NodeA){ 

          Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); 
          treeViewer.getControl().setMenu(menu); 
          getSite().registerContextMenu(menuMgr, treeViewer); 

          menuMgr.add(new SomeAction()); 

         }else { 
          //what ? 
         } 
        } 

       } 
      } 
    ); 

किसी और शाखा पर मैं MenuManager पर dispose(), removeAll() कॉल करने की कोशिश ... कुछ भी नहीं काम करता है!

किसी भी मदद की सराहना की है, धन्यवाद।

उत्तर

7

बस एकल मेनू प्रबंधक का उपयोग करें। मेनू प्रबंधक को गतिशील रूप से न बनाएं।

सिद्धांत में, यह संभव है कि आपने कोशिश की, लेकिन यह अक्षम है और यह सामान्य तरीका नहीं है।

बस एक मेनू प्रबंधक बनाएं और आपको आवश्यक सभी क्रियाएं जोड़ें।

जब चयन बदल दिया गया है, तो मेनू आइटम छुपाने या दिखाने के लिए कार्रवाई # सेट दृश्य (सत्य | झूठी) पर कॉल करें। आप मेनू आइटम को सक्षम/अक्षम करने के लिए एक्शन # सेट सक्षम भी उपयोग कर सकते हैं।

ps। मेनू प्रबंधक मेनू GUI नहीं है (पसंद है TreeViewer पेड़ नहीं है)

यह मेनू (एसडब्ल्यूटी) में क्रियाएं (व्यावसायिक तर्क) योगदान देता है। और यह दृश्यता और सक्षमता का भी प्रबंधन करता है। हम इस योगदान प्रबंधक को बुलाते हैं। हम इसके साथ एक SWT मेनू बहुत आसान बना सकते हैं। (यहां तक ​​कि हम एसडब्ल्यूटी के बारे में भी नहीं जानते हैं, हमें केवल हमारे व्यापार तर्क को ही जानना है: एक्शन) यह जेएफएएस में मौलिक विचार है।

जब आप मनु प्रबंधक में कोई कार्रवाई जोड़ते हैं, तो कार्रवाई को ActionContributionItem के साथ लपेटा जाएगा। यह यूआई अपडेट करने के लिए एक्शन की स्थिति को हुक करता है (दृश्यता, मेनू, बटन, टूलबार और अन्य के लिए सक्षमता)। यह दबाए जाने पर कार्रवाई को लॉन्च करने के लिए यूआई को भी हुक करता है।

यदि आप ग्रहण करने के लिए नए हैं, तो SWT और JFace की भूमिका को भ्रमित करना आसान है।

+0

युक्तियों के लिए धन्यवाद, अब मैं एक बार मेनू बना रहा हूं और फिर चयन के मामले में, मैं action.setEnabled (false) को कॉल करता हूं। यह ठीक काम करता है, लेकिन मुझे कार्रवाई के लिए एक सेट दृश्य विधि नहीं मिली। मैं इसे छिपाना चाहूंगा जब कुछ अन्य नोड को ग्रेइंग करने के बजाय चुना जाता है। धन्यवाद – AndaP

+1

यदि आप 'एक्शन कंट्रोल्यूशनइटम' जोड़ते हैं जिसमें आपके कार्य होते हैं, तो उनके पास 'सेट विज़िबल (बूलियन)' विधि होती है। लेकिन आपको 'setRemoveAllWhenShown (*) 'या' ActionContributionItems' की दृश्यता को अपडेट करना चाहिए क्योंकि वे अलग-अलग दृष्टिकोण हैं। –

11

जैसा कि @jeeeyul ने उल्लेख किया है, आपको केवल अपने दृश्य में उपयोग करने के लिए एक मेनू प्रबंधक बनाना चाहिए।

आप व्यूअर का उपयोग करके संदर्भ मेनू का एक उदाहरण प्राप्त करने के लिए नई> प्लग-इन प्रोजेक्ट और दृश्य टेम्पलेट का उपयोग कर सकते हैं, लेकिन मूल रूप से आपके createPartControl(Composite) विधि में आप अपने संदर्भ प्रबंधक को हुक अप करेंगे।

MenuManager menuMgr = new MenuManager(); 
    menuMgr.setRemoveAllWhenShown(true); 
    menuMgr.addMenuListener(new IMenuListener() { 
     public void menuAboutToShow(IMenuManager manager) { 
      SampleView.this.fillContextMenu(manager); 
     } 
    }); 
    Menu menu = menuMgr.createContextMenu(viewer.getControl()); 
    viewer.getControl().setMenu(menu); 
    getSite().registerContextMenu(menuMgr, viewer); 

आपका fillContextMenu(MenuManager) विधि अपने दर्शक के लिए उपयोग होगा, ताकि आप उस से वर्तमान चयन कर सकते हैं। आप जो भी कार्य चाहते हैं उसे जोड़ सकते हैं, वर्तमान चयन के साथ उन्हें अपडेट करने के बाद भी क्रियाओं को दोबारा जोड़ सकते हैं।

registerContextMenu(*) कॉल आपके संदर्भ मेनू में वस्तुओं का योगदान करने के लिए org.eclipse.ui.popupMenus और org.eclipse.ui.menus जैसे एक्सटेंशन बिंदुओं की अनुमति देता है।

+0

हां, मैं अब इस दृष्टिकोण का उपयोग कर रहा हूं। मेरे अन्य विचारों में मैंने इसे केवल एक बार बनाया है। लेकिन मेरी असली चिंता यह थी कि मेनू की सामग्री कैसे बदलें। – AndaP

+0

fillContextMenu (*) प्रत्येक मेनू SWT पर दिखाया जाता है। शो दिखाएं। आप उस विधि में हर बार मेनू की सामग्री बदल सकते हैं। –

6

तरीका यही मैं यह कर:

MenuManager menuMgr = new MenuManager(); 

     Menu menu = menuMgr.createContextMenu(viewer.getControl()); 
     menuMgr.addMenuListener(new IMenuListener() { 
      @Override 
      public void menuAboutToShow(IMenuManager manager) { 
       // IWorkbench wb = PlatformUI.getWorkbench(); 
       // IWorkbenchWindow win = wb.getActiveWorkbenchWindow(); 
       if (viewer.getSelection().isEmpty()) { 
        return; 
       } 

       if (viewer.getSelection() instanceof IStructuredSelection) { 
        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); 
        Node object = (Node)selection.getFirstElement(); 

        if (object.getModel() instanceof NodeA) { 
         manager.add(new Action(); 
        } else if (object.getModel() instanceof NodeB) { 

         manager.add(new OtherAction()); 

        } 
       } 
      } 
     }); 
     menuMgr.setRemoveAllWhenShown(true); 
     viewer.getControl().setMenu(menu); 

मुझे आशा है कि इस मदद करता है;)

यह गलत पर removeAllWhenShown स्थापित करने के लिए मेनू प्रबंधक की संपत्ति आदेश अन्य सभी को छिपाने के लिए महत्वपूर्ण है नोड्स क्रियाएं;)

0

मान लीजिए कि आप जानते हैं कि कार्य कैसे बनाएं और आप केवल संदर्भ मेनू में रूचि रखते हैं उदाहरण के लिए मेरे लिए काम किया है उम्मीद है कि कोड का यह समूह आपको

की मदद करेगा
private void hookContextMenu() { 
    MenuManager contextMenu = new MenuManager(); 
    contextMenu.setRemoveAllWhenShown(true); 
    contextMenu.addMenuListener(new IMenuListener() { 

     @Override 
     public void menuAboutToShow(IMenuManager manager) { 



      IStructuredSelection sSelection = (IStructuredSelection) treeViewer.getSelection(); 

      } 
      if(selectedObject instanceof A){ 
      manager.add(action); 
      } 

     } 
    }); 
संबंधित मुद्दे