Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 26
  1. #1
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    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 :
    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 :
    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 :
    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 :
    1
    2
    3
    4
    public void setTreeParent(TreeParent treeParent){
        setPartName(treeParent.getName());
        this.treeParent = treeParent;
    }
    Et ensuite j'appelle la méthode setInput :
    Code :
    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.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  2. #2
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    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
    Points : 3 510
    Points
    3 510

    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 :
    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
    Pas de questions technique par MP, les forums sont là pour ça.

  3. #3
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    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 :
    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 :
    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.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  4. #4
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    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.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  5. #5
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    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 :
    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 :
    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 :
    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 :
    window.getActivePage().showView(viewId, viewId+instanceNum++, IWorkbenchPage.VIEW_ACTIVATE);
    Et les onglets apparaissaient à l'endroit prévu.
    Maintenant je fais :
    Code :
    window.getActivePage().openEditor(input, TestEditorPart.ID);
    Et les onglets sont au mauvais endroit.

    Dans Perspective :
    Code :
    1
    2
    folder.addPlaceholder(DetailEditorPart.ID + ":*");
    folder.addPlaceholder(TestEditorPart.ID + ":*");
    J'ai également fais des views :
    Code :
    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.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  6. #6
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    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
    Points : 3 510
    Points
    3 510

    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
    Pas de questions technique par MP, les forums sont là pour ça.

  7. #7
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    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 :
    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 :
    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 :
    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.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  8. #8
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    Par défaut

    J'ai fini par trouver la source du problème.
    Dans Eclipse j'ai supprimé le dossier runtime de mon projet et maintenant l'affichage fonctionne comme je le souhaitais.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  9. #9
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    Par défaut

    Mon problème n'est pas encore totalement résolu, j'ai pu avancer et corriger des erreurs que j'avais réalisé, mais il me reste encore des questions au sujet du passage de paramètres.

    Je me base sur un nouveau Plugin Project avec la template "RCP mail template" d'Eclipse.

    Code :
    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
    public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
        private OpenViewAction openViewAction;
     
        public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
            super(configurer);
        }
     
        protected void makeActions(final IWorkbenchWindow window) {
            openViewAction = new OpenViewAction(window, "Open Another Message View", View.ID);
            register(openViewAction);
        }
     
        protected void fillMenuBar(IMenuManager menuBar) {
            MenuManager fileMenu = new MenuManager("&File", IWorkbenchActionConstants.M_FILE);
     
            menuBar.add(fileMenu);
     
            fileMenu.add(openViewAction);
        }
     
        protected void fillCoolBar(ICoolBarManager coolBar) {
            IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
            coolBar.add(new ToolBarContributionItem(toolbar, "main"));   
            toolbar.add(openViewAction);
        }
    }
     
    public interface ICommandIds {
        public static final String CMD_OPEN_MESSAGE = "package.openMessage";
    }
     
    // plugin.xml
    <command
        name="Open Message Dialog"
        description="Open a message dialog"
        categoryId="package.category"
        id="package.openMessage">
    </command>
    Depuis le menu File et depuis la barre d'outils je peux ouvrir un onglet.

    Pour l'instant j'utilise :
    Code :
    1
    2
    3
    FileInput input = new FileInput(objet);
    IWorkbenchPage page = window.getActivePage();
    page.openEditor(input, viewId);
    Dans la méthode run de OpenViewAction.

    Ma technique actuel est d'avoir une instance de la classe OpenViewAction, avant d’appeler run j'envoie un objet via une méthode setObjet(Objet obj).

    Mais j'aimerais savoir comment devrais-je m'y prendre pour, par exemple, créer un onglet selon la sélection qu'a fait l'utilisateur dans un treeViewer.

    Je dois probablement mal utilisé IEditorInput.
    Je vais rechercher de ce côté là.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  10. #10
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    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
    Points : 3 510
    Points
    3 510

    Par défaut

    Salut,

    Attention quand même aux amalgames (dangereux) que tu fais. Quand tu parles d'onglet il serait plus pertinent de parler de vue ou d'éditeur spécifiquement.

    Sinon, pour ce qui est du passage de sélection depuis une vue vers une action, tu peux utiliser le service de sélection.
    Pour ce faire, dans ta vue, il te faut enregistrer ton Viewer comme fournisseur de sélection: getViewSite().setSelectionProvider(myViewer); dans ta méthode createPartControl().
    Ensuite, tu peux récupérer la sélection courante, dans ton action, en faisant:
    Code :
    1
    2
    3
    4
    5
    ISelectionService service = (ISelectionService) PlatformUI.getWorkbench().getService(ISelectionService.class);
    ISelection selection = service.getSelection("my.view.id");
    if (selection instanceof IStructuredSelection) {
        ((IStructuredSelection) selection).getFirstElement();
    }
    Par contre, je te conseille fortement de t'intéresser aux Commands et Handler plutôt qu'aux Action (qui sont historique et gardées pour des raisons de rétrocompatibilité). Tu as une très bonne série d'articles sur le sujet.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  11. #11
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    Par défaut

    Merci beaucoup.
    Je vais tacher de mettre en place des Commands et des Handlers.
    En réalité j'ai beaucoup de mal à trouver des exemples de Java RCP, il y a peu d'exemple dans Eclipse et aucun utilise de command et de handler apparemment.

    On dirait qu'il n'existe que http://www.vogella.com/.

    Edit :
    Je viens de recevoir un gigantesque coup de pouce de la part d'un collègue.
    Code :
    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
    <extension
             point="org.eclipse.ui.commands">
          <command
                id="projetrcp.commandOpenView"
                name="name">
          </command>
       </extension>
       <extension
             point="org.eclipse.ui.handlers">
          <handler
                class="projetrcp.OpenViewHandler"
                commandId="projetrcp.commandOpenView">
          </handler>
       </extension>
       <extension
             point="org.eclipse.ui.menus">
          <menuContribution
                allPopups="false"
                locationURI="toolbar:org.eclipse.ui.main.toolbar">
             <toolbar
                   id="projetrcp.toolbar1">
                <command
                      commandId="projetrcp.commandOpenView"
                      style="push">
                </command>
             </toolbar>
          </menuContribution>
       </extension>
       <extension
             point="org.eclipse.ui.commandImages">
          <image
                commandId="projetrcp.commandOpenView"
                icon="icons/check.png">
          </image>
       </extension>
    J'ai un bouton avec une icône dans la toolbar et quand j'appuie dessus, la methode public Object execute(ExecutionEvent event) de mon Handler s’exécute.
    J'ai fais getSite().setSelectionProvider(viewer); dans ma NavigationView et getSite().setSelectionProvider(tableViewer); dans ma DetailEditorPart.

    Je peux récupérer la sélection dans la méthode execute :
    Code :
    HandlerUtil.getCurrentSelection(event);
    Donc là je devrais sans doute être capable d'ouvrir un onglet selon la sélection.
    Bon pour l'instant c'est depuis la toolbar, mais ensuite je ferais la popup du clique droit.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  12. #12
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    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
    Points : 3 510
    Points
    3 510

    Par défaut

    Citation Envoyé par thierrybenji Voir le message
    Merci beaucoup.
    Je vais tacher de mettre en place des Commands et des Handlers.
    En réalité j'ai beaucoup de mal à trouver des exemples de Java RCP, il y a peu d'exemple dans Eclipse et aucun utilise de command et de handler apparemment.
    Laisse moi corriger ça.
    Tu utilises en ce moment même le meilleur exemple de RCP qui puisse exister... Tu développes dessus. Il te suffit de te procurer la version SDK d'Eclipse et tu auras accès à toutes les sources Eclipse.
    En programmation RCP, selon moi, il faut mettre les mains dans le cambouis et aller voir comment font ceux qui en ont déjà fait
    Citation Envoyé par thierrybenji Voir le message
    Je peux récupérer la sélection dans la méthode execute :
    Code :
    HandlerUtil.getCurrentSelection(event);
    En effet, je ne t'ai pas proposé cette solution comme tu n'utilisais pas encore de Commande + Handlers

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  13. #13
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    Par défaut

    Oui je recherche dans le code source d'application RPC déjà fait.
    Et en ce moment je recherche un exemple pour que lorsque je fais un clique droit une popup s'affiche.

    J'ai peut être trouvé ici :
    http://wiki.bioclipse.net/index.php?...es_the_Command

    J'ai l'impression que :
    Code :
    locationURI="popup:org.eclipse.ui.examples.contributions.view?after=additions"
    Revient souvent.

    Pour l'instant je n'arrive pas à exécuté un handler ou afficher une popup lors d'un clique droit.

    Voyez-vous une erreur là dedans :
    Code :
    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
       <extension
             point="org.eclipse.ui.commands">
          <command
                id="projetrcp.showSelected"
                name="Show">
          </command>
       </extension>
     
       <extension
             point="org.eclipse.ui.handlers">
          <handler
                class="projetrcp.ShowSelected"
                commandId="projetrcp.showSelected">
          </handler>
       </extension>
     
       <extension
             point="org.eclipse.ui.menus">
     
          <menuContribution
                locationURI="popup:org.eclipse.ui.popup.any?after=additions">
             <command
                   commandId="projetrcp.showSelected"
                   label="action"
                   style="push">
             </command>
          </menuContribution>
       </extension>
    J'ai une classe projetrcp.ShowSelected mais la méthode execute n'a encore jamais été appelé.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  14. #14
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    Par défaut

    Le problème doit venir de
    Code :
    locationURI="popup:org.eclipse.ui.popup.any?after=additions"
    .

    Je fais des clique droits partout et rien ne se passe.
    Je veux pouvoir faire un clique droit dans ma SelectionView et dans mes Editor.
    Mais la popup ne s'est jamais affiché.

    Edit :
    J'ai créé des commandes que j'ai ajouté à une toolbar, tout fonctionne, je n'ai plus qu'a affiché ses commandes lors d'un clique droit, normalement c'est simple, mais ça ne fonctionne pas chez moi...
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  15. #15
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    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
    Points : 3 510
    Points
    3 510

    Par défaut

    Salut,

    Quelques point de recherches:
    • est-ce que les méthodes isEnabled() et isHandled() de ta classe projetrcp.ShowSelected renvoie bien true?
    • est-ce que tu as fait un clean de ton répertoire de runtime? (ça peut aider). Pour cela, tu vas dans Run > Run Configurations... Là, tu sélectionnes ta configuration de lancement, puis, dans l'onglet Configuration tu as une case à cocher "Clear the configuration area before launching" (ça fera le ménage à chaque lancement de la commande).
    • Si tu n'as qu'un seul handler pour cette commande, tu peux passer par l'argument defaultHandler de ta commande plutôt que par un handler spécifique. Ex:
      Code :
      1
      2
      3
      4
      5
      6
      7
      8
      <extension
           point="org.eclipse.ui.commands">
        <command
              defaultHandler="org.eclipse.my.handlers.MyCommandHandler"
              id="my.command.id1"
              name="My Command">
        </command>
      </extension>
    • As-tu définit une popup pour ta vue?
    Attention aux locationURI, j'ai l'impression que tu n'as pas tout à fait saisi à quoi ça correspond. Un locationURI, c'est:
    <scheme>:<id>?<placement>=<id_menu_item>
    Avec:
    - <scheme> qui est à choisir parmi: menu, popup ou toolbar.
    - <id> l'identifiant de ta vue / menu / toolbar (ou des identifiants spéciaux comme le popupAny).
    - <placement> qui est à choisir parmi: before, after ou endof.
    - <id_menu_item> correspond à l'identifiant d'un menu item (une commande, un menu, ...).

    Voilà, +
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  16. #16
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    Par défaut

    Bonjour, merci pour cette réponse.

    Citation Envoyé par Gueritarish Voir le message
    est-ce que les méthodes isEnabled() et isHandled() de ta classe projetrcp.ShowSelected renvoie bien true?
    Je viens d'ajouter :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
    public boolean isEnabled(){
    	return true;
    }
     
    @Override
    public boolean isHandled(){
    	return true;
    }
    Dans tout mes Handlers.

    Citation Envoyé par Gueritarish Voir le message
    est-ce que tu as fait un clean de ton répertoire de runtime? (ça peut aider). Pour cela, tu vas dans Run > Run Configurations... Là, tu sélectionnes ta configuration de lancement, puis, dans l'onglet Configuration tu as une case à cocher "Clear the configuration area before launching" (ça fera le ménage à chaque lancement de la commande).
    Je viens de cocher la case "Clear the configuration area before launching".

    Citation Envoyé par Gueritarish Voir le message
    Si tu n'as qu'un seul handler pour cette commande, tu peux passer par l'argument defaultHandler de ta commande plutôt que par un handler spécifique. Ex:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    <extension
         point="org.eclipse.ui.commands">
      <command
            defaultHandler="org.eclipse.my.handlers.MyCommandHandler"
            id="my.command.id1"
            name="My Command">
      </command>
    </extension>
    Là par contre je n'ai pas compris, apparemment org.eclipse.my.handlers.MyCommandHandler n'existe pas.

    Citation Envoyé par Gueritarish Voir le message
    As-tu définit une popup pour ta vue?
    Je ne crois pas.

    Citation Envoyé par Gueritarish Voir le message
    Attention aux locationURI, j'ai l'impression que tu n'as pas tout à fait saisi à quoi ça correspond. Un locationURI, c'est:
    <scheme>:<id>?<placement>=<id_menu_item>
    Avec:
    - <scheme> qui est à choisir parmi: menu, popup ou toolbar.
    - <id> l'identifiant de ta vue / menu / toolbar (ou des identifiants spéciaux comme le popupAny).
    - <placement> qui est à choisir parmi: before, after ou endof.
    - <id_menu_item> correspond à l'identifiant d'un menu item (une commande, un menu, ...).
    Donc scheme et id était correct déjà.
    Je dois bien utiliser popup:org.eclipse.ui.popup.any.

    J'aimerais avoir la popup dans le clique droit dans ma NavigationView et dans l'editor area.
    Mais je ne sais pas quel est le placement et le id_menu_item à donner.

    Edit : je n'ai pas définit de popup dans la vue ça doit être ça le problème.
    Est-ce quelque chose comme ça :
    http://www.vogella.com/articles/Ecli...commands_popup
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  17. #17
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    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
    Points : 3 510
    Points
    3 510

    Par défaut

    Citation Envoyé par thierrybenji Voir le message
    Là par contre je n'ai pas compris, apparemment org.eclipse.my.handlers.MyCommandHandler n'existe pas.
    Euh. C'est une classe exemple. Bien sûr qu'il faut mettre ton handler.
    Citation Envoyé par thierrybenji Voir le message
    Je ne crois pas.
    Dans ce cas, il te faut la créer... Ex dans une vue:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
        final MenuManager menuManager = new MenuManager("#popup");
        final Menu iContextMenu =
          menuManager.createContextMenu(myViewer.getControl());
        myViewer.getControl().setMenu(iContextMenu);
        menuManager
            .add(new ContributionItem(IWorkbenchActionConstants.MB_ADDITIONS) {
              @Override
              public boolean isSeparator() {
                return true;
              }
     
              @Override
              public boolean isVisible() {
                return false;
              }
            });
        menuManager.setRemoveAllWhenShown(true);
        getViewSite().registerContextMenu(menuManager, viewer);
    myViewer est un Viewer JFace.
    Citation Envoyé par thierrybenji Voir le message
    Donc scheme et id était correct déjà.
    Je dois bien utiliser popup:org.eclipse.ui.popup.any.

    J'aimerais avoir la popup dans le clique droit dans ma NavigationView et dans l'editor area.
    Mais je ne sais pas quel est le placement et le id_menu_item à donner
    C'est pas forcément les bons non... Étant donné que tu es dans une application RCP, et non juste dans un plug-in, tu maîtrises l'affichage de toutes les vues ou éditeurs. Donc, tu peux donner explicitement l'identifiant que tu souhaites.
    Après, le placement dépend de ton besoin. La variable <id_menu_item> que j'ai mis, correspond à l'identifiant d'un item de ta popup auprès duquel tu souhaites placé ta commande.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  18. #18
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    Par défaut

    Merci !

    J'ai enfin réussi à afficher une popup avec le clic droit !

    Par contre j'ai du mal placé le code parce que le clic droit ne fonctionne que dans ma NavigationView et pas dans les editors.
    Je n'aurai peut être pas du utiliser un TreeViewer de NavigationView.

    Je vais rechercher ça, en tout cas j'ai presque réussi a faire tout ce que je voulais.

    Edit :
    J'ai utilisé le même code à deux endroits différents, une fois avec un TreeViewer dans une ViewPart et une fois avec un TableViewer dans un EditorPart et maintenant ça fonctionne, c'est propre de faire comme ça ?
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

  19. #19
    Modérateur
    Avatar de Gueritarish
    Homme Profil pro Marc
    Développeur Java
    Inscrit en
    mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Marc
    Âge : 30
    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
    Points : 3 510
    Points
    3 510

    Par défaut

    Rien ne t'empêche de le rendre générique... Tu crées une méthode createContextualMenu():
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public void createContextualMenu(final Control aControl, final IWorkbenchPartSite aSite, final ISelectionProvider aSelectionProvider) {
        final MenuManager menuManager = new MenuManager("#popup");
        final Menu iContextMenu =
          menuManager.createContextMenu(aControl);
        aControl.setMenu(iContextMenu);
        menuManager
            .add(new ContributionItem(IWorkbenchActionConstants.MB_ADDITIONS) {
              @Override
              public boolean isSeparator() {
                return true;
              }
     
              @Override
              public boolean isVisible() {
                return false;
              }
            });
        menuManager.setRemoveAllWhenShown(true);
        aSite.registerContextMenu(menuManager, aSelectionProvider);
    }
    Et il ne te reste plus qu'à l'appeler en faisant:createContextualMenu(myTreeViewer.getControl(), getViewSite(), myTreeViewer); dans ta vue et createContextualMenu(myTableViewer.getControl(), getEditorSite(), myTableViewer); dans ton éditeur.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  20. #20
    Membre Expert Avatar de thierrybenji
    Homme Profil pro Benjamin
    Étudiant
    Inscrit en
    décembre 2008
    Messages
    1 209
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 209
    Points : 1 838
    Points
    1 838

    Par défaut

    D'accord, merci.

    Par contre j'ai un problème avec getCurrentSelection et setSelectionProvider.
    Comme je l'ai déjà dis, dans la méthode createPartControl de ma classe EditorPart j'appelle :
    Code :
    getSite().setSelectionProvider(tableViewer);
    Et dans la méthode createPartControl de ma classe ViewPart j'appelle :
    Code :
    getSite().setSelectionProvider(treeViewer);
    Dans les Handlers je récupère la Selection et la Part :
    Code :
    1
    2
    ISelection selection = HandlerUtil.getCurrentSelection(event);
    IWorkbenchPart part = HandlerUtil.getActivePart(event);
    Le problème est le suivant : après avoir créer un onglet EditorPart si je sélectionne a nouveau ma ViewPart la sélection ne change pas, quand j’exécute un handler depuis ma ViewPart la Selection reste sur l'EditorPart.

    Pour être plus précis, depuis le TreeViewer de ma ViewPart je fais un clic droit et appuie sur "ouvrir dans un nouvel onglet" là tout fonctionne.
    Mais la sélection va automatiquement sur le nouvel onglet (le TableViewer de l'EditorPart) et ne peux pas revenir sur la ViewPart tant que je ne sélectionne pas l'EditorPart puis la ViewPart à nouveau.
    Aidez la chaîne Nolife, abonnez-vous : http://www.nolife-tv.com/

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •