Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Eclipse > Eclipse Platform
Eclipse Platform Développement de plugins Eclipse et d'applications Eclipse RCP (Rich Client Platform). Avant de poster -> Tutoriels sur le développement de plugins Eclipse
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/11/2012, 20h54   #1
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 09h26   #2
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 589
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 589
Points : 3 552
Points : 3 552
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.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/11/2012, 09h42   #3
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 10h43   #4
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 18h20   #5
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 13h54   #6
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 589
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 589
Points : 3 552
Points : 3 552
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.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2012, 15h39   #7
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 19h48   #8
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2012, 19h29   #9
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2012, 11h15   #10
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 589
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 589
Points : 3 552
Points : 3 552
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.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/11/2012, 16h48   #11
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 07h45   #12
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 589
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 589
Points : 3 552
Points : 3 552
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.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/12/2012, 13h56   #13
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 20h17   #14
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 16h35   #15
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 589
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 589
Points : 3 552
Points : 3 552
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.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/12/2012, 07h31   #16
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2012, 10h59   #17
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 589
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 589
Points : 3 552
Points : 3 552
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.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/12/2012, 16h05   #18
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2012, 16h27   #19
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 589
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 589
Points : 3 552
Points : 3 552
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.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/12/2012, 21h29   #20
thierrybenji
Membre Expert
 
Avatar de thierrybenji
 
Homme Benjamin
Étudiant
Inscription : décembre 2008
Messages : 1 186
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Âge : 25
Localisation : France, Doubs (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2008
Messages : 1 186
Points : 2 028
Points : 2 028
Envoyer un message via MSN à thierrybenji
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/
thierrybenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h44.


 
 
 
 
Partenaires

Hébergement Web