9 Stimmen

Kontextmenü für TreeViewer basierend auf dem ausgewählten Knoten - SWT

Ich muss ein Kontextmenü für einen TreeViewer in einem Eclipse-Plugin-Projekt erstellen. Das Menü soll aber keine konstanten Einträge enthalten, sondern je nach Typ des ausgewählten Knotens variieren. Zum Beispiel hat mein TreeViewer die folgende Hierarchie:

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

Für Knoten A möchte ich ein Menü mit einer Aktion anzeigen, aber für die Knoten B und C möchte ich nichts anzeigen (kein Menü). Es ist mir gelungen, das Menü für Knoten A zu erstellen, aber dann kann ich es nicht mehr loswerden, wenn ein anderer Knotentyp ausgewählt wird. Mein Code sieht so aus:

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 ?
                        }
                    }

                }
            }   
    );

Auf dem anderen Zweig habe ich versucht, Folgendes aufzurufen dispose() , removeAll() auf dem MenuManager...nichts funktioniert!

Für jede Hilfe sind wir dankbar, danke.

11voto

Paul Webster Punkte 10584

Wie @jeeeyul erwähnte, sollten Sie nur einen MenuManager erstellen, der in Ihrer Ansicht verwendet wird.

Sie können Neu>Plug-in Projekt und die Ansichtsvorlage verwenden, um ein Beispiel für ein Kontextmenü in einer Ansicht mit einem Viewer zu erhalten, aber im Grunde genommen in Ihrem createPartControl(Composite) Methode würden Sie Ihren Kontextmanager einbinden.

    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);

Su fillContextMenu(MenuManager) Methode hat Zugriff auf Ihren Viewer, so dass Sie die aktuelle Auswahl von diesem abrufen können. Sie können beliebige Aktionen hinzufügen und sogar Aktionen erneut hinzufügen, nachdem Sie sie mit der aktuellen Auswahl aktualisiert haben.

En registerContextMenu(*) Aufruf können Erweiterungspunkte wie org.eclipse.ui.popupMenus und org.eclipse.ui.menus Elemente zu Ihrem Kontextmenü beitragen.

8voto

jeeeyul Punkte 3707

Verwenden Sie einfach den Single Menu Manager. Machen Sie den Menü-Manager nicht dynamisch.

Theoretisch ist es möglich, dass Sie es versucht haben, aber es ist ineffizient und nicht allgemein üblich.

Erstellen Sie einfach einen Menü-Manager und fügen Sie alle Aktionen hinzu, die Sie benötigen.

wenn die Auswahl geändert wurde, rufen Sie Action#setVisible(true|false) auf, um Menüpunkte ein- oder auszublenden. Sie können auch Action#setEnable verwenden, um einen Menüpunkt zu aktivieren/deaktivieren.

ps. Menu Manager ist keine Menü-GUI (so wie TreeViewer kein Baum ist)

Es trägt Aktionen (Geschäftslogik) zum Menü (SWT) bei. Und er verwaltet auch die Sichtbarkeit und die Freigabe. Wir nennen dies Contribution Manager. Damit können wir sehr einfach ein SWT-Menü erstellen. (Auch wenn wir nichts über SWT wissen, müssen wir nur unsere Geschäftslogik kennen: Action) Das ist die grundlegende Idee in JFace.

Wenn Sie eine Aktion in den Manu-Manager hinzufügen, wird die Aktion mit ActionContributionItem umhüllt. Es hakt den Zustand der Aktion ein, um die Benutzeroberfläche zu aktualisieren (Sichtbarkeit, Aktivierung für Menü, Schaltfläche, Symbolleiste usw.). Es hakt auch UI zu starten Aktion, wenn es gedrückt.

Wenn Sie neu in Eclipse sind, ist es leicht, die Rolle von SWT und JFace zu verwechseln.

7voto

Kasas Punkte 71

So mache ich es auch:

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);

Ich hoffe, das hilft ;)

Es ist wichtig, Folgendes festzulegen removeAllWhenShown Eigenschaft des Menümanagers auf false setzen, um alle anderen Aktionen des Knotens auszublenden ;)

0voto

V Kash Singh Punkte 409

Angenommen, Sie wissen, wie man eine Aktion erstellt, und Sie sind nur an einem Kontextmenü interessiert. Das folgende Beispiel hat für mich funktioniert, und ich hoffe, dass dieser Code Ihnen helfen wird

 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);
            }

        }
    });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X