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

Eclipse Platform Discussion :

Comment créer une vue avec des paramètres (objets) ?


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 258
    Par défaut Comment créer une vue avec des paramètres (objets) ?
    Bonjour,

    Je débute dans le développement d'application RCP et j'ai une question sans doute simple, mais qui me pause beaucoup de problèmes.

    Pour faire simple :
    A gauche j'ai un TreeViewer, à droite j'ai des onglets (ViewPart).
    Depuis l’arbre, l'utilisateur peut créer un nouvel onglet, lequel a besoin d'informations qui lui seront données par la sélection de l'utilisateur.

    Le TreeViewer est créé avec des TreeObject qui représentent des fichiers et des TreeParent qui représentent des dossiers.
    L'utilisateur peur sélectionner un TreeParent dans le TreeViewer et créer un onglet grâce aux informations contenues dans ce TreeParent.

    J'ai une classe Dialog qui étend ViewPart, c'est la vue de l'onglet.

    J'ai une classe NouvelOngletAction qui étend Action et me permet de créer un onglet, là je crée une instance de NouvelOngletAction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    ongletAction = new NouvelOngletAction(window, label, Detail.ID);
    //
    // Quand je veux créer un nouvel onglet :
    //
    ongletAction.setTreeParent(treeParent);
    ongletAction.run();
    La méthode run de NouvelOngletAction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void run() {
        if(window != null) {    
            try {
                IViewPart part = window.getActivePage().showView(Detail.ID, Integer.toString(instanceNum++), IWorkbenchPage.VIEW_ACTIVATE);
                ((Detail)part).setTreeParent(treeParent);
                ((Detail)part).setInput();
            } catch (PartInitException e) {
                MessageDialog.openError(window.getShell(), "Error", "Error opening view:" + e.getMessage());
            }
        }
    }
    Donc j'envoie à mon action un objet TreeParent, quand j’exécute l'action une View est créé avec l'objet TreeParent.

    Dans ma classe qui étend ViewPart (la vue de l'onglet) dans createPartControl, je ne fais pas de treeViewer.setInput.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    treeViewer = new TreeViewer(composite, SWT.BORDER);
    treeViewer.setContentProvider(new ViewContentProvider());
    treeViewer.setLabelProvider(new ViewLabelProvider());
    Ensuite en récupérant le IViewPart que retourne le showView, j'appelle la méthode setTreeParent en envoyant le TreeParent nécessaire pour créer l'onglet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void setTreeParent(TreeParent treeParent){
        setPartName(treeParent.getName());
        this.treeParent = treeParent;
    }
    Et ensuite j'appelle la méthode setInput :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setInput(){
        treeViewer.setInput(treeParent);
    }
    Ça fonctionne bien.
    Le problème intervient quand je quitte puis redémarre l'application.

    Les onglets sont vides.
    Ils ont pourtant gardé le nom qui leur avait été donné dans setTreeParent.
    Bien que le nom change quand je clique sur un onglet.

    Quelqu'un saurait-il me dire si ma méthode est bonne pour créer une vue avec un Object ?
    Et comment puis-je faire pour que le TreeParent de chaque instance de la classe qui étend ViewPart soit sauvegardé et que les onglets puissent être recréés lors du démarrage ?

    Merci d'avance pour votre aide.

  2. #2
    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
    Salut,

    Citation Envoyé par thierrybenji Voir le message
    Le problème intervient quand je quitte puis redémarre l'application.

    Les onglets sont vides.
    Ils ont pourtant gardé le nom qui leur avait été donné dans setTreeParent.
    Bien que le nom change quand je clique sur un onglet.

    Quelqu'un saurait-il me dire si ma méthode est bonne pour créer une vue avec un Object ?
    Et comment puis-je faire pour que le TreeParent de chaque instance de la classe qui étend ViewPart soit sauvegardé et que les onglets puissent être recréés lors du démarrage ?

    Merci d'avance pour votre aide.
    Ce ne sont pas des vues qu'il te faut utiliser. Ce sont des IEditorPart. La différence majeure entre une vue et un éditeur, c'est qu'un éditeur va permettre de faire la sauvegarde et la récupération de tes objets (une vue peut le faire aussi, mais je trouve ça plus déplacé). Tu peux jeter un œil sur la FAQ Eclipse.
    Tu vas donc pouvoir ouvrir un éditeur avec ses objets d'entrées directement sans passer par une méthode que tu auras explicitement créer dans ta classe.
    En pratique, un éditeur se déclare comme une vue dans le plugin.xml (avec une extension du point d'extension org.eclipse.ui.editors). Dans la partie "class" tu vas renseigner ta classe qui étend IEditorPart (ou qui hérite de EditorPart). Puis tu vas définir une classe qui hérite de IEditorInput.
    Ils s'ouvrent à peu-prêt de la même façon que les vues:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PlaftormUI.getWorkbench().getActiveWorkbenchWindow()
        .getActivePage().openEditor(new MyEditorInput(), "my.editor.id");
    Dans la méthode createPartControl() de ton éditeur, tu auras accès à son IEditorInput grâce à la méthode getEditorInput().

    Voilà, à+
    Gueritarish

  3. #3
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 258
    Par défaut
    J'ai le même problème mais dans un cas plus simple.
    J'ai une classe qui étend également ViewPart.
    Avec à l'intérieur un Browser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import org.eclipse.ui.part.ViewPart;
    import org.eclipse.swt.browser.Browser;
    J'ai besoin d'une String contenant le chemin vers un fichier HTML.
    Mais je n'y arrive pas, dans le run de mon Action j'ai quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IViewPart part = window.getActivePage().showView(viewId, viewId+instanceNum++, IWorkbenchPage.VIEW_ACTIVATE);
    Ça créer bien un nouvel onglet, mais je ne lui ai pas passé le path du fichier.

    J'imagine que c'est vraiment un problème de débutant, je veux juste que la méthode createPartControl ait accès à des objets que je lui aurai transmis auparavant.

    Ici je ne peux pas utiliser mon bricolage en décalant les setInput.
    Comment dois-je procéder pour donner une String à une instance de ma classe qui étend ViewPart avant l’exécution de createPartControl ?

    Merci d'avoir lu ce post.

    ======================================================================
    Edit :
    Merci Gueritarish je vais voir ça tout de suite.

  4. #4
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 258
    Par défaut
    Ok alors j'essaie d'utiliser l'exemple de ce tutoriel : http://www.vogella.com/articles/Ecli...s/article.html

    Donc j'ai une classe qui étend EditorPart et une classe qui implémente IEditorInput.

    Pour l'instant je n'arrive encore à rien, mais je vais continuer d'essayer.
    J'ai du mal à démarrer en Java RCP.

  5. #5
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 258
    Par défaut Les onglets ne sont pas créé là où il faut
    Bonsoir.

    Maintenant j'arrive à créer un onglet (ViewPart avec un Brower à l'intérieur) avec un objet que je donne dans le constructeur de ma classe qui implémente IEditorInput.

    Par contre quand je redémarre l'application, les onglets ne sont plus là.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    public class TestInput implements IEditorInput {
     
    	private TreeObject treeObject;
     
    	public TestInput(TreeObject treeObject){
    		this.treeObject = treeObject;
    	}
     
    	public TreeObject getTreeObject(){
    		return treeObject;
    	}
     
    	@Override
    	public Object getAdapter(Class adapter) {
    		return null;
    	}
     
    	@Override
    	public boolean exists() {
    		return true;
    	}
     
    	@Override
    	public ImageDescriptor getImageDescriptor() {
    		return null;
    	}
     
    	@Override
    	public String getName() {
    		return null;
    	}
     
    	@Override
    	public IPersistableElement getPersistable() {
    		return null;
    	}
     
    	@Override
    	public String getToolTipText() {
    		return null;
    	}
     
    }
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    public class TestEditorPart extends EditorPart {
    	public static final String ID = "ProjetRCP.testEditorPart";
    	private String path;	
    	private TestInput input;
     
    	@Override
    	public void doSave(IProgressMonitor monitor) {
    	}
     
    	@Override
    	public void doSaveAs() {
    	}
     
    	@Override
    	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
    		this.input = (TestInput) input;
    		TreeObject obj = this.input.getTreeObject();
     
    	    setSite(site);
    	    setInput(input);
     
    	   path = obj.getPath();
    	   setPartName("Person ID: " + obj.getName() );
     
    	}
     
    	@Override
    	public boolean isDirty() {
    		return false;
    	}
     
    	@Override
    	public boolean isSaveAsAllowed() {
    		return false;
    	}
     
    	@Override
    	public void createPartControl(Composite parent) {
    		Browser browser = new Browser(parent, SWT.NONE);
    		File file = new File(path);
     
     
    	    String buffer = "";
    	    String html = "";
    	    System.out.println("filepath : "+path);
    		try {
    			FileInputStream nomLogique;
    			nomLogique = new FileInputStream (file);
    			InputStreamReader ligne = new InputStreamReader (nomLogique);
    		    BufferedReader bufferLigne = new BufferedReader (ligne);
     
    		    while ((buffer = bufferLigne.readLine()) != null)   {
    		    	  html += buffer;
    		    }
    		    buffer += bufferLigne.readLine();
     
    		    bufferLigne.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
     
    		browser.setText(html);
    	}
     
    	@Override
    	public void setFocus() {
    	}
     
    }
    J'image que je dois utiliser les méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void doSave(IProgressMonitor monitor) 
    public boolean isSaveAsAllowed()
    Ou quelque chose dans le genre, mais pour l'instant j'ai rien trouvé.
    En tout cas c'est chouette, la méthode init est appelé avant createPartControl.

    S'il vous plait, pourriez-vous me donner quelques indications ?
    Merci d'avance.
    Au revoir.

    ========== EDIT ==========
    Avant je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window.getActivePage().showView(viewId, viewId+instanceNum++, IWorkbenchPage.VIEW_ACTIVATE);
    Et les onglets apparaissaient à l'endroit prévu.
    Maintenant je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window.getActivePage().openEditor(input, TestEditorPart.ID);
    Et les onglets sont au mauvais endroit.

    Dans Perspective :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    folder.addPlaceholder(DetailEditorPart.ID + ":*");
    folder.addPlaceholder(TestEditorPart.ID + ":*");
    J'ai également fais des views :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <view
    	name=""
    	allowMultiple="true"
    	icon="icons/sample2.gif"
    	class="projetrcp.DetailEditorPart"
    	id="ProjetRCP.detailEditorPart">
    </view>
    <view
    	name="HTML"
    	allowMultiple="true"
    	icon="icons/html.png"
    	class="projetrcp.TestEditorPart"
    	id="ProjetRCP.testEditorPart">
    </view>
    Mais je sais pas showView et openEditor ne font pas la même chose.

  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
    Salut,

    Pour ton premier problème (la réouverture des éditeurs), c'est dû à ton implémentation de IEditorInput. En effet, pour pouvoir sauvegarder l'état de l'éditeur, la plateforme a besoin de:
    • une implémentation d'IEditorInput qui ne renvoie pas null dans sa méthode getPersistableElement(). C'est ce IPersistableElement qui va permettre la sauvegarde et la récupération du contenu de l'éditeur. Deux méthodes sont à noter dans ce IPersistableElement:
      • la première, getFactoryId(), sert à donner l'identifiant de la factory IElementFactory qui va être responsable de la récupération de ton IEditorInput (à la réouverture de l'éditeur). J'aborde l'IElementFactory dans la suite.
      • la seconde, saveState(final IMemento memento), va te permettre de sauvegarder ton input dans un IMemento. Il faut voir un memento comme un objet DOM dans lequel on ajoute les éléments nécessaire à la reconstruction de ton input.
    • créer une IElementFactory. Pour ce faire, il faut ajouter une extension factory au point d'extension org.eclipse.ui.elementFactories. Cette extension va demander un id (le fameux qu'il faut indiquer dans le IPersistableElement) et une classe à implémenter. Cette classe doit implémenter IElemetnFactory. Cette interface ne définit qu'une méthode qui créé un élément IAdaptable (donc, dans ton cas un IEditorInput) à partir d'un IMemento.

    Tout ça paraît un peu long, mais c'est relativement facile à mettre en place
    Pour ce qui est du partName, il te suffit de le mettre en place dans la méthode getName() de ton IEditorInput (plus pratique et appelé automatiquement).

    Pour ton second problème, les éditeurs ne peuvent s'ouvrir que dans la zone d'édition (sauf à partir d'Eclipse 4.X)
    Du coup, ta customisation de la perspective ne sert à rien (le ":*" ne servant que pour les vues multiples)

    Voilà, à+
    Gueritarish

  7. #7
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 258
    Par défaut
    Merci Gueritarish.

    Je vais essayer d'implémenter ça dans mon IEditorInput, cela dit, je crois que je n'ai pas besoin de sauvegarder les onglets finalement.

    Ok alors qu'il est impossible que les views et les editors soit affiché au même endroit.
    Mais je n'arrive pas à me débarrasser des vues.

    Dans ma classe Perspective :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void createInitialLayout(IPageLayout layout) {
    	String editorArea = layout.getEditorArea();
    	layout.setEditorAreaVisible(false);
     
     
    	layout.addStandaloneView(NavigationView.ID,  false, IPageLayout.LEFT, 0.25f, editorArea);
     
    	IFolderLayout folder = layout.createFolder("messages", IPageLayout.TOP, 0.5f, editorArea);
    	folder.addPlaceholder(View.ID + ":*");
    	folder.addPlaceholder(DetailEditorPart.ID + ":*");
    	folder.addPlaceholder(TestEditorPart.ID + ":*");
     
    	layout.getViewLayout(NavigationView.ID).setCloseable(false);
    }
    Donc là vous venez de me dire que ces 2 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    folder.addPlaceholder(DetailEditorPart.ID + ":*");
    folder.addPlaceholder(TestEditorPart.ID + ":*");
    ne servent à rien.
    J'ai essayé d'enlever le IFolderLayout, mais il s'affiche toujours lors de l’exécution.
    J'ai mal enlevé ça de plugin.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <view
    	name="Message"
    	allowMultiple="true"
    	icon="icons/sample2.gif"
    	class="projetrcp.View"
    	id="ProjetRCP.view">
    </view>
    Dois-je mettre :layout.setEditorAreaVisible(true);?

    Merci pour ces éclaircissements.
    Je comprend certaines choses grâce à vous et ça m'aide énormément.

    ========== EDIT ==========
    En image ça donne ça :




    Je n'arrive pas à virer la barre en haut, elle attend des onglets views, mais je ne sais pas où je lui ai dit de s'afficher.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/10/2008, 00h37
  2. comment créer une application avec des switchs
    Par abderrahim_05 dans le forum Débuter
    Réponses: 5
    Dernier message: 28/12/2007, 19h07
  3. Créer une vue avec des onglets
    Par Flackou dans le forum MFC
    Réponses: 2
    Dernier message: 14/06/2007, 11h43
  4. [PHP-JS] Comment créer une boucle avec des headers
    Par djinnwatcher dans le forum Langage
    Réponses: 10
    Dernier message: 17/07/2006, 15h48
  5. Créer une vue avec des requêtes UNION ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2005, 12h37

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