IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SWT/JFace Java Discussion :

[RCP/Swt]Générer dynamiquement IHM sur une vue en fonction de données d'une autre vue


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut [RCP/Swt]Générer dynamiquement IHM sur une vue en fonction de données d'une autre vue
    hello tout le monde, c'est encore moi!

    J'ai ouvert il y'a quelques mois un post dont le sujet était la génération dynamique d'IHM en SWT. Je suis au jour d'aujourd'hui capable de générer une IHM à partir de données provennant de ma base de données.

    Pour rappel, le but est de pouvoir, lorsque je dispose d'informtions renvoyées par ma BD, effectuer un filtre sur ces données. Je dois donc disposer d'un interface me permettant d'effectuer ce filtre. Cependant, je n'ai aucune idée de ce que l'éxecution de la requête va me renvoyer(nom et nombre de colonnes notemment).

    L'application que je développe étant la même, je voudrais donc, lors d'un click sur un noeud de l'arbre de ma vue de navigation, pouvoir générer l'ihm en fonction des données qui me seront fournies par ce noeud. L'ihm sera généré sur une vue qui est dédiée à cet effet.

    La question que je me pose est celle de savoir comment m'y prendre pour transmettre les infos dont la vue a besoin pour génerer l'ihm. Pour l'instant, j'essai (sans succes) de le faire avec le principe du "selectionService".

    Je poste le source de ma vue(de filtre) en espérant que cela pourrait aider à m'aider. Sachant que dans ma vue de navigation, quite au click sur un noeud j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
    FilterView filterView = new FilterView();										
    try {
    	filterView = (FilterView) getViewSite().getWorkbenchWindow().getActivePage().showView(FilterView.ID);
     
    } catch (PartInitException e) {
    	e.printStackTrace();
    }
    filterView.setQuery(myQuery);
    filterView.setDataSource(myDataSource);
    filterView.setModelProvider(new ModelProvider(myQuery, myDataSource));
    ...

    Je reste attentif à toute remarque.

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Bonjour à tous,

    Je vais essayer de reformuler mon problème de plus simplement. Je suis à mesure de pouvoir générer un IHM grâce à certaines données. Ces données sont des lignes renvoyées par l'éxécution d'une requête.

    Dans mon cas, je recupère cette lignes suite à un click sur un noeud d'un treeViewer présent dans une vue. Je voudrais donc utiliser cette données pour créer une IHM dans une autre vue.

    Parvenant déjà à faire ce genre de lien (une selection d'un noeud sur une vue permettant de peupler un tableViewer sur une autre vue), j'ai essayé dans ce cas de faire cela de la même manière, mais j'y arrive pas. Le problème vient surrement du fait que dans ce cas, je n'ai pas de viewer dans ma vue, mais des vues.

    Voilà donc synthétisé mon problème.

    Merci infiniment de votre aide

  3. #3
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Bonjour à tous, toujours a la recherche d'une solution à mon problème, je crois avoir cerné où se situe ma principale difficulté. Dans ma NavigationView(celle dans la quelle gere le click sur un noeud de l'arbre, récupère et traite la selection), je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    try {
    	filterView = (FilterView)getViewSite().getWorkbenchWindow().getActivePage().showView(FilterView.ID);			
    } catch (PartInitException e) {
    	Activator.getLogger().error(e.toString());
    }		
    // mise à jour du modelProvider
    filterView.setModelProvider(modelProvider);
    ...
    Quand je lance l'application et que je clique sur un noeud, j'ai un "Java.lang.NullPointerException". Cela me semble normal, car, lorsque je fais un "showView" il se sert de la méthode "createPartControl" pour afficher la vue. Hors dans cette méthode, je fais appel à une méthode "createWidgets()" qui constuit les widgets en fonction des données du modelProvider. Le modelProvider est ici un objet me permettant de gérer mes données metiers, il est déclaré comme attribut privé de ma classe "FilterView", et n'est jamais initialisé avant sa première utilisation(lors de l'affichage de la vue), d'ou l'exception.

    Je suis donc en train de reflechir sur la maniere avec laquelle je vais initialiser ce "modelProvider"(qui je le rapelle est construit avec les données provenant de la selection) dans ma "FilterView".

    Merci de votre aide

    Je me rends donc compte que, lorsque je fais un "showView" dans un premier temps, c'est normal que la vue qui est affichée ne contienne pas de widgets

  4. #4
    Membre chevronné Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Par défaut
    Salut,
    En reprenant le code que tu as posté, il te suffit de passer ton provider en paramètres et de recréer tes composants en fonction de celui-ci. (Comme pour le ResultView que j'avais posté il y a quelques temps)
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try {
        ModelProvider modelProvider = new ModelProvider(...);
        IWorkbenchPage page = getViewSite().getWorkbenchWindow().getActivePage();
        FilterView filterView = (FilterView) page.findView(FilterView.ID);
        filterView.createWidgets(modelProvider);
        ...
    } catch (PartInitException e) {
        Activator.getLogger().error(e.toString());
    }
    et dans ta classe FilterView :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private Composite parent;
     
    public void createPartControl(Composite parent) {
        this.parent = parent;
    }
     
    public void createWidgets(ModelProvider modelProvider) {
       //Recréation des composants...
    }
    Maintenant, sans aller plus loin, cela risque d'être coton pour faire communiquer ta vue "Filtres" avec la bonne instance de ta vue "Résultats" et vice versa.
    Personnellement, ce que j'aurais fait, c'est créer une classe qui regroupe ta vue Filtres, ta vue Résultats, ton provider qui alimentent les deux vues et le noeud sélectionné de la vue "Navigation". Cela faciliterait sans doute les communications entre les vues et les données, un peu à la manière du controller dans l'architecture MVC.

  5. #5
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Bonjour à tous et merci Desert pour ta réponse,

    J'ai réadapté mon code de la manière que tu m'as conseillé, mais à l'exécution, lorque je clique sur un noeud de l'érbre, j'obtiens un "Java.Lang.NullException".

    J'ai éssayé de débogguer, et jme rends compte que, suite à l'appel du "filterView.createWidgets(modelProvider);", jne rentre même pas dans la méthode "createWidgets(modelProvider);"; encore moins dans le "createPartControl".

    Sachant également que le composants d'une vue doivent être construits dans le "createPartControl", est ce qu'on s'y prends bien?

    Pour information, ma classe filterView est déclarée dans ma perspective de la même manière que celle de la resultView(vue avec plusieurs instances):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IFolderLayout folderFilter = layout.createFolder("Filter", IPageLayout.TOP, 0.3f, editorArea);		
    folderFilter.addPlaceholder(FilterView.ID);
    Avez vous une idée de solution?

  6. #6
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    J'ai un tout petit peu évolué depuis ce matin, mais je bloque face à un problème de rafraichissement de ma vue.

    Tout d'abord, les changements que j'ai apportés sont les suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FilterView filterView;
    IWorkbenchPage activePage = getViewSite().getWorkbenchWindow().getActivePage();
    filterView = (FilterView) activePage.findView(FilterView.ID);
    // si la vue ne dispose pas de query
    if(filterView.getQuery() == null){
    	filterView.createWidgets(modelProvider);
    }else // si la query de la vue est différente de la query selectionée
    	if(filterView.getQuery() != myQuery){
    		filterView.disposeWidgets();
    		filterView.createWidgets(modelProvider);
    }
    Dans la FilterView, j'ai ajouté un champ query, ainsi qu'un getter pour ce champ. Je "set" ce champ quand je rentre dans le "createWidgets()".
    Ma méthode disposeWidgets etant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void disposeWidgets(){	
    		if (myWidgets.size() > 0){
    			for (int i=0; i<myWidgets.size(); i++)		
    				myWidgets.get(i).dispose();
    		}	
    	}
    De cette manière tout marche à merveille, avec pour seuls bémols :
    - Lors d'un click sur un noeud de l'arbre, les composants sont bien crées dans le FilterView, mais ne sont visibles que lorsque j'agrandit ma vue; en quelque sorte lorsque je la recharge.
    - Tous les composants générés sont disposés en dehors du composant DateTime.

    D'autres parts, je suis obligé de déclarer désormais ma FilterView dans la perspective de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    layout.addStandaloneView(FilterView.ID, true, IPageLayout.TOP, 0.3f, editorArea);
    Car en la déclarant de la manière suivante,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IFolderLayout folderFilter = layout.createFolder("Filter", IPageLayout.TOP, 0.3f, editorArea);
    folderFilter.addPlaceholder(FilterView.ID);
    , cela me génère une java.lang.nullexception.

    Sachant que je voudrais, à un moment donné de l'utilisation de l'application, pouvoir fermer la FilterView, de telle sorte que si je resselectionne un noeud, cette vue puisse se réouvrir. J'ai ce comportement avec ma ResultView, mais en l'état actuel des choses, jne l'ai pas avec le FilterView.

    Est ce que cela est lié à la manière dont je déclare ma vue dans la perpective?

    Auriez vous des idées de solution?

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/05/2012, 07h50
  2. [XL-2007] Exécution code d'une worksheet en fonction de données d'une autre worksheet
    Par assiec dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 08/12/2011, 14h58
  3. Réponses: 3
    Dernier message: 18/12/2009, 12h33
  4. Réponses: 2
    Dernier message: 17/12/2009, 15h40
  5. Réponses: 2
    Dernier message: 28/04/2009, 19h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo