# eclipse-Kontextmenü erweitern über PlugIn



## Szdnez (2. Oktober 2010)

Hallo,

ich habe folgenden Plan. Ich möchte verschiedene PlugIns für eclipse schreiben, die meinen Arbeitsalltag erleichtern sollen (und weil ich mal mit PlugIns "spielen" möchte). Diese PlugIns sollen über Kontextmenüs aufgerufen werden (werden alle zusammengefasst unter einem Hauptmenüpunkt mit entsprechenden Untermenüs). Das ganze funktioniert soweit auch wunderbar. Nun möchte ich die Auswahl meiner "Tools" variabel halten, so dass man sich als Nutzer aussuchen kann, was man gerne nutzen möchte und was nicht.
Dazu habe ich mir gedacht, dass ich ein PlugIn schreibe, dass einen Hauptmenüpunkt für die jeweils unterschiedlichen Anwendungsfälle bereitstellt (File, CompilationUnit, etc.) (dieses PlugIn sei mal Hauptplugin genannt). Meine Tools werden jeweils eigene PlugIns, die sich dann in diesen Menüpunkt als Untermenü "einhängen" können. Wie kann ich das am geschicktesten realisieren?
Ich habe mir das vielleicht so gedacht, dass mein Hauptplugin Extension Points zur Verfügung stellt, über die sich die anderen PlugIns "registrieren" und im Hauptplugin über die registrierten PlugIns das Kontextmenü dynamisch zusammengebaut wird. Allerdings weiß ich nicht, wie ich dynamisch/programmatisch das Kontextmenü bearbeiten kann. Vielleicht hat ja von euch jemand einen Tipp?
Oder habe ich vielzu kompliziert gedacht und das ganze kann man auch viel einfacher realisieren?

Dankeschön


----------



## Szdnez (2. Oktober 2010)

Mittlerweile habe ich einiges dazu im Netz gefundenm aber mit keinem Beispiel hatte ich bisher Erfolg. Die Beispiele sehen in etwa immer so aus:

```
public void addPopUpContribution()
     {
         final ICommandService commandService =
             (ICommandService) PlatformUI.getWorkbench().getService( ICommandService.class );
         final Command command = commandService.getCommand( "my.new.undefined.command" );
         command.define( "New Command", "This is created Programatically!", commandService
                 .getCategory( "com.hmb.plugin.sample.view.command.category" ) );

         final IHandlerService handlerService = 
             (IHandlerService) PlatformUI.getWorkbench().getService( IHandlerService.class );
         handlerService.activateHandler( command.getId(), new AbstractHandler()
         {
             @Override
             public Object execute( final ExecutionEvent event ) throws ExecutionException
             {
                 System.out.println( "Command executed !" );
                 return null;
             }
         } );

         final AbstractContributionFactory contribFactory =
             new AbstractContributionFactory( "popup:org.eclipse.ui.popup.any?after=additions", null )
             {
                 @Override
                 public void createContributionItems( 
                         final IServiceLocator serviceLocator, final IContributionRoot additions )
                 {
                     final CommandContributionItemParameter p =
                         new CommandContributionItemParameter( serviceLocator, "", command.getId(),
                                 CommandContributionItem.STYLE_PUSH );
                     p.label = "Exit the application";
                     p.icon = PlugIn.getImageDescriptor( "icons/sample.gif" );
    
                     final CommandContributionItem item = new CommandContributionItem( p );
                     item.setVisible( true );
                     
                     additions.addContributionItem( item, null );
                 }
             };

         // create a dynamic toolbar
         final IMenuService menuService = (IMenuService) PlatformUI.getWorkbench().getService( IMenuService.class );
         menuService.addContributionFactory( contribFactory );
     }
```
Aufgerufen wird die Methode _addPopUpContribution()_ in meiner PlugIn-Klasse in der Überlagerung der Methode _public void start( final BundleContext pContext )_. Starte ich dann das "PlugIn", so kann ich aber in keinem Kontextmenü einen Eintrag_ Exit the application_ finden. Hat vielleicht jemand eine Ahnung warum?Ist bestimmt nur eine Kleinigkeit, aber wenn man diese nicht weiß...


----------

