2010-07-08 1 views
0

Je crée une application RCP. J'ai besoin d'ouvrir plusieurs instances de la même vue mais avec des données différentes. Je l'ai fait en définissant id secondaire pour différentes instances de la même vue. Plus précisément, mon problème est le suivant: S'il vous plaît jeter un oeilIdentifiez quelle instance de la vue est actuellement active dans RCP?

J'ai une vue graphique appelée Views.GraphView. J'ai ouvert différentes instances à partir d'une commande appelée openGraphView pour afficher différents graphiques. La commande est la suivante:

page.showView("Views.GraphView", Integer.toString(instanceNum++), IWorkbenchPage.VIEW_ACTIVATE); 

Maintenant, je possède une commande TreeLayout sur cette barre d'outils Views.GraphView, ce qui suppose de changer la mise en page du graphique et il fonctionnera sur chaque instance de la vue. Mais pour cela, je pense, j'ai besoin d'identifier quelle instance de la vue est active. La commande TreeLayout ressemble à ceci:

IViewPart findView = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage(). findView("Views.GraphView"); //I think in the findView I need to give the id of the view [but how can I put the secondary id?] 

GraphView view = (GraphView) findView; 
view.changeLayout(); //I wrote this method in the graph view to change the layout 

//I just tried to print the secondary id, but it did not print anyting 
System.out.println("From treelayout command:- " + view.getViewSite().getSecondaryId()); 

Alors, comment puis-je identifier quelle instance de la vue est actuellement actif et d'opérer sur elle?

+0

Ceci est un double de http://stackoverflow.com/questions/3201341/how-can-i-identify-whcih-instance-of-the-view-is-currently-active-in-rcp –

+0

Comment faire vous savez que l'une des vues de ce type sera active lorsque l'action se produit? L'application ne dispose-t-elle pas d'autres types de vues ou d'éditeurs? –

Répondre

1

Vous pouvez utiliser IWorkBenchPage.findViewReference(String viewId, String viewId), si elle renvoie null, la vue avec viewId et viewId n'est pas présente dans la perspective actuelle.

Si vous avez un ViewReference vous pouvez utiliser ViewReference.getView(boolean restore) pour obtenir la vue

donc dans votre gestionnaire vous obtenez quelque chose comme:

final IWorkbenchPage page = HandlerUtil.getActiveWorkbenchWindow(
        event).getActivePage(); 
final int instanceNum = 8;//the number of instances that are created 
for (int index = 0; index < instanceNum; index++) { 
    final IViewReference viewReference = page.findViewReference(
         "Views.GraphView", Integer.toString(index)); 
    if (viewReference != null) { 
     final IViewPart view = viewReference.getView(true); 
     if (view instanceof GraphView) { 
      final GraphView graphView = (GraphView) view; 
      graphView.changeLayout(); 
     } 
    } 
} 
+0

Salut, Un grand merci pour votre réponse. J'ai essayé votre code, mais malheureusement cela n'a pas fonctionné. Si j'ouvre 2 instances ou plus de la vue graphique, la commande fonctionne uniquement pour la dernière instance et non pour les précédentes. Pouvez-vous fournir plus d'informations. merci, Syeed – syeed

+0

Ma première idée est cette page.findViewReference renvoie uniquement le point de vue de la vue active. Pouvez-vous s'il vous plaît déboguer pour confirmer cela? –

+0

Bonjour, je débogue le code. page.findViewReference renvoie la référence à toutes les instances de vue actuellement ouvertes (quel que soit le type actuellement sélectionné). Mais la référence ne fonctionne que pour la dernière instance de la vue (dans mon cas, changeLayout() a fonctionné pour la dernière instance). En outre, si je ferme la dernière instance de la vue, cela ne fonctionne toujours pas pour les instances de vue précédentes. Veuillez fournir une solution. -Syeed – syeed

1

La méthode view.getViewSite().getSecondaryId() est la bonne pour identifier une vue secondaire. Cette méthode renvoie uniquement la chaîne Null pour la vue "primaire": celle qui est ouverte lorsque l'utilisateur clique sur Fenêtre -> Afficher la vue - Votre vue.

Je ne comprends pas pourquoi le bouton de la barre d'outils de vue doit fonctionner sur toutes les instances de vue. À mes yeux, vous devriez avoir un bouton dans chaque barre d'outils d'instance de vue fonctionnant uniquement dans sa propre vue. Si vous avez vraiment besoin d'opérer d'un bouton à TOUTES les vues, je pense que vous devrez conserver les références des vues ouvertes vous-même, car je pense que le workbench ne fournit pas une méthode findViews retournant un tableau d'affichage. En utilisant le code ci-dessous, vous devriez être en mesure d'obtenir la vue active actuelle.

1

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart() 
0

vue active et affichage du nom Editor sur MessageDialogbox

public class Active_Workbench extends AbstractHandler{ 

    @Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 

     // A part service tracks the creation and activation of parts within a workbench page. 
     IPartService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService(); 

     MessageDialog.openInformation(HandlerUtil.getActiveWorkbenchWindow(
       event).getShell(), "Current Workbench Window", service.getActivePart().getTitle().toString()); 

     return null; 
    } 
} 

J'espère que cette réponse est utile.

Questions connexes