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] Affecter des données différentes à plusieurs instances d'une même 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] Affecter des données différentes à plusieurs instances d'une même vue
    Bonjour à tous,

    Au risque de m'attirer la foudre des modérateurs , je me permet de poser cette question à la quelle je suis confronté.

    AJe dispose en ce moment de deux vues dans mon application RCP. Une vue de navigation et une vue de résultats. Suite à un click dans a vue de navigation, un nouvel onglet apparait dans ma vue de résultats avec les résultats correspondant au noeud selectionné. Malgré le fait que les onglets (instance de vue sont crées), je constate que les données viennent à chaque fois se "supperposer" sur celles qui étaient déjà existantes.

    Pour être plus clair, supposons que je dispose de 4 noeuds (ayant respectivement pour noms Noeud1, ..., Noeud4, et pour données les listes Data1, ..., Data4) dans mon arbre.

    Lorsque je clique sur le premier noeud, un onglet est crée avec pour nom "Data1". Ce n'est que quand j'aggrandit ma vue que mon tableViewer rempli des données "Data1" apparaît.

    Lorsque je clique sur le second noeud, un second onglet apparaît, avec cette fois ci pour nom "Data2" et un tableViewer rempli avec des "Data2". Dans le même temps, je constate que le nom de ma première colonne est changé est passe à "Data2". De même, quand j'"actualise" cet onglet, je constate qu'il y est présent deux tableViewers, celui rempli de "Data1" étant au dessus de celui rempli de "Data2".

    Ainsi, une fois que j'aurais cliqué successivement sur mes 4 noeuds, jme retrouve en fin de compte avec 4 onglets ayant pour nom "Data4"(le dernier noeud selectionné), et ayant pour données :
    - Onglets 1 : 4 tableViewers placés les uns sur les autres et ce dans l'ordre 1 -> 4 (ordre de clic)
    - Onglets 2 : les 3 tableViewers placés les uns sur les autres et ce dans l'ordre 2 -> 4 (ordre de clic)
    - Onglets 3 : les 2 tableViewers placés les uns sur les autres et ce dans l'ordre 3 -> 4 (ordre de clic)
    - Onglets 4 : le dernier tableViewer(4).

    Je solllicite donc votre précieuse aide afin de pouvoir m'en sortir.

    Deplus, au lancement de mon application, j'ai par defaut un onglet déjà présent (ce qui est normal vu qu'il correspond à ma vue de départ). Comment pourrais je faire pour partir d'une vue "vierge", un peu comme ce que l'on a sous eclipse(avant de doublecliquer sur une classe afin de pouvoir l'afficher, la vue devant les contenir ne contient aucun onglet).

    Merci infiniment

  2. #2
    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 papaetoo,
    Comment t'y prends-tu pour distinguer différemment les instances de ta vue de résultats ?
    Peut-être qu'en cliquant sur un nœud, tu rafraichies plusieurs instances de la vue et non une seule en particulier.
    Pour la vue vierge, il suffit de ne rien mettre dans la méthode createPartControl() de ta vue de résultats (il faudra donc faire des vérifications).

  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
    Merci desert pour ta réponse et pour toutes celles passées.
    omment t'y prends-tu pour distinguer différemment les instances de ta vue de résultats ?
    Dans mon fichier xml de configuration de vues, j'ai mis l'attribut allouMultiple à "true". Dans ma classe perspective, j''ai ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    layout.addStandaloneView(NavigationView.ID,  false, IPageLayout.LEFT, 0.25f, editorArea);
    		IFolderLayout folderResults = layout.createFolder("Results", IPageLayout.BOTTOM, 0.5f, editorArea);
    		folderResults.addPlaceholder(View.ID + ":*");
    		folderResults.addView(View.ID);
    "View" représente ici ma vue de résultats. C'est celle là même qui est instancié suite au click sur un noeud de l'arbre.

    Enfin, dans cette même classe "View", dans mon "selectionChanged", j'affiche l'instance de ma vue une fois que j'ai récupéré la selection(suite au click sur un noeud de l'arbre).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(View.ID, Integer.toString((instanceNum)), IWorkbenchPage.VIEW_CREATE);
    "instanceNum" est initialisé à 0.

    Pour la vue vierge, il suffit de ne rien mettre dans la méthode createPartControl() de ta vue de résultats (il faudra donc faire des vérifications)
    Ba, à le fait de ne rien mettre dans mon createPartControl signifie que je ne peux instancier ma vue par la suite (car aucune ligne de code me permettant de le faire). A moins que cela sois les vérifications dont tu parles?

    En cas de besoin, je pourrais te passer mon source.

    Merci une fois de plus

  4. #4
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Bonjour à tous,

    Bon, je me replonge dans ton problème... Je vais retracer ce que j'ai compris de ton problème pour tout mettre à plat (parce que sinon, il va encore y avoir des quiproquos). Alors dans ta première vue (que l'on va nommer Data) tu as des données que tu veux visualiser, à chaque fois que la sélection change dans la vue Data, dans une seconde vue (que l'on va appeler Result).
    Donc, je suppose que tu as une classe pour la vue Data qui doit être à peu près comme ça :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class DataView extends ViewPart implements ISelectionChangedListener {
        ...
        public void selectionChanged(SelectionChangedEvent event) {
            openResultView();
        }
    }
    et une classe pour la vue Result qui doit ressembler à ça :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class ResultView extends ViewPart {
     
        private Composite viewComposite;
        ...
        public void createPartControl(Composite parent) {
            viewComposite = new Composite(parent, SWT.NONE);
        }
     
        public void setViewerInput(Object anInput) {
            if (viewComposite != null && !viewComposite.isDisposed) {
                TableViewer viewer = new TableViewer(viewComposite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
                viewer.setContentProvider(...);
                viewer.setInput(anInput);
     
                // Ici, ajoute ce que tu veux au Composite...
            }
        }
    }
    Je comprends pas où sont tes problèmes...

    Au passage, je te déconseille de choisir un compteur pour les id secondaires de ta vue Result. A moins que tu ne saches parfaitement le retrouver.

    Voilà, a+
    Gueritarish

  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
    Bjr à tous et merci pour vos posts.

    Je dispose éffectivement de deux vues (NavigationView et ResultsView). La première contenant un treeViewer et la seconde un tableViewer.

    Dans ma première vue, j'ajoute le treeViewer au service de selection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getSite().setSelectionProvider(treeViewer);
    Dans ma seconde vue, je recupère et "traite" cette selection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    this.getSite().getWorkbenchWindow().getSelectionService().addSelectionListener("fast.navigationview", new ISelectionListener(){			
    	public void selectionChanged(IWorkbenchPart part, ISelection selection) {					
    		if (selection == null) {return;}
    		if (selection instanceof IStructuredSelection) {															
    			IStructuredSelection ss = (IStructuredSelection)selection;
    			if (ss.getFirstElement() != null){ //if the selection is != of null						
    				if (ss.getFirstElement().getClass() == SubModule.class) {
    					myQuery = new Query(((SubModule) ss.getFirstElement()).getQuery().getName());
    					myDataSource = ((SubModule)ss.getFirstElement()).getDataSource();														
    					modelProvider = new ModelProvider(myQuery, myDataSource);																													
    					viewer = createTableViewer(parent, modelProvider);														
    					try {								
    						Activator.getLogger().info("instanceNumBefore = "+ instanceNum);
    						PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(ResultView.ID, Integer.toString((instanceNum)), IWorkbenchPage.VIEW_CREATE);
    						instanceNum++;
    						setPartName( ((SubModule)ss.getFirstElement()).getName());						
    						//notify of changes to the name 
    						firePropertyChange(IWorkbenchPartConstants.PROP_PART_NAME);
    					} catch (PartInitException e) {
    						e.printStackTrace();
    					}																						
    				}
    				else{							
    					MessageDialog.openInformation(getSite().getShell(),"Ouverture","Veuillez ouvrir le fichier");
    				}
    			}				
    		}										
    	}
    }
    - createTableViewer(parent, modelProvider) : permet de créer un tableViewer, à partir d'un composite parent et d'un modelProvider.
    - modelProvider : classe me permettant de définir mes objets metiers(ceux qui sont affichés dans le tableViewer). Donc, le clic sur un noeud du NavigationView me fournit une selection(contenant une requête et une DataSource). Cette selection est donc passée au modelProvider, qui en fonction de la requête et du dataSource recupère et fournit les objets metiers.

    Comme je l'ai expliqué dans mes posts plus hauts, je recupère bien ma selection à chaque fois, mais c'est la gestion des multiples instances qui n'est pas correcte (voir premier message du post pour plus de compréhension). Au besoin, je posterais mes sources et des captures d'écran de ce que j'ai.

    Merci une fois de plus

  6. #6
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Poste le code de tes vues s'il te plait...

    Gueritarish

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

Discussions similaires

  1. Synchroniser des données entre plusieurs instances d'une même application
    Par wil4linux dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 12/02/2013, 13h58
  2. [XL-2007] Copier des données de plusieurs classeurs sur une feuille récap
    Par chipster008 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/08/2011, 11h12
  3. Insérer des données sur plusieurs lignes dans une seule en SQL
    Par nathantahiti dans le forum Développement
    Réponses: 1
    Dernier message: 03/08/2011, 10h47
  4. [XL-2003] Compilation des données de plusieurs feuilles en une seule?
    Par USnico dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/11/2009, 18h08
  5. Réponses: 7
    Dernier message: 03/12/2008, 15h18

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