Bonjour,
y a t-il un moyen pour intercepter la fermeture d'une vue ? (dans un tab folder)
Ou bien de redefinir le comportement du tab folder lors de la fermeture d'une vue?
Merci
Version imprimable
Bonjour,
y a t-il un moyen pour intercepter la fermeture d'une vue ? (dans un tab folder)
Ou bien de redefinir le comportement du tab folder lors de la fermeture d'une vue?
Merci
Salut,
Il me semble la méthode dispose()...Citation:
y a t-il un moyen pour intercepter la fermeture d'une vue ? (dans un tab folder)
En utilisant l'interface IPartListener2
J'avais deja essayer avec l'interface IPartListener2 mais je n'ai aucune résutlat sur aucune des methodes, que ce soit a l'ouverte/focus/fermeture de ma vue.
Alors peut-etre que je m'y prend mal ?
J'ai juste implementé IPartListener2 dans les vues concernées, j'ai essayé d'affiché un emssage dans chaque methode pour identifié les methodes appelé, mais rien.
:(
Montre nous ton code pour qu'on puisse se faire une idée...
Bah plutot simple :
ma vue :
public class LotView extends ViewPart implements IPartListener2{
....
les methodes de IpartListener2 (bon la elles sont vide mais j'avais un message de trace dans chacune d'entre elle):
public void partActivated(IWorkbenchPartReference partRef) {
// TODO Auto-generated method stub
}
public void partBroughtToTop(IWorkbenchPartReference partRef) {
// TODO Auto-generated method stub
}
public void partClosed(IWorkbenchPartReference partRef) {
// TODO Auto-generated method stub
}
public void partDeactivated(IWorkbenchPartReference partRef) {
// TODO Auto-generated method stub
}
public void partHidden(IWorkbenchPartReference partRef) {
// TODO Auto-generated method stub
}
public void partInputChanged(IWorkbenchPartReference partRef) {
// TODO Auto-generated method stub
}
public void partOpened(IWorkbenchPartReference partRef) {
// TODO Auto-generated method stub
}
public void partVisible(IWorkbenchPartReference partRef) {
// TODO Auto-generated method stub
}
Et c'est tout...
Ma vue est affiché dans un tab folder avec d'autre.
Ben moi j'ai pas trop cherche mais je dirai que tu devras a un moment quand meme associer ton listner a ta view.
Moi j'aurai pas implementer l'interface mais plutot fait une methode que j'applerai initPartListner() que j'appelle dans le constructeur bien sur. et cette methode sera dans ce style:
Voila j'espere que ca t'aidera, tiens nous au courant ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 private void initPartListener() { getSite().getPage().addPartListener( new IPartListener2() { /* Cette methode sera appelee quand le view sera fermee -> t'y mets le comportement approprie */ public void partClosed( IWorkbenchPartReference partRef ) { // Ici ton implementation... } /* Cette methode sera appelee quand le view sera desactivee => t'y mets le comportement approprie */ public void partDeactivated( IWorkbenchPartReference partRef ) { // Ici ton implementation... } /*Cette methode sera appelee quand le view sera activee => t'y mets le comportement approprie */ public void partActivated( IWorkbenchPartReference partRef ) { // Ici ton implementation... } // Et ainsi de suite avec les autres methodes // Bien sur il faut les laisser vides si tu fais rien
AC
J'ai oublie de fermer mon code :s donc voila le morceau de code syntaxiquement correcte:
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 private void initPartListener() { getSite().getPage().addPartListener( new IPartListener2() { /* Cette methode sera appelee quand le view sera fermee -> t'y mets le comportement approprie */ public void partClosed( IWorkbenchPartReference partRef ) { // Ici ton implementation... } /* Cette methode sera appelee quand le view sera desactivee => t'y mets le comportement approprie */ public void partDeactivated( IWorkbenchPartReference partRef ) { // Ici ton implementation... } /*Cette methode sera appelee quand le view sera activee => t'y mets le comportement approprie */ public void partActivated( IWorkbenchPartReference partRef ) { // Ici ton implementation... } // Et ainsi de suite avec les autres methodes // Bien sur il faut les laisser vides si tu fais rien }); } Have fun AC
Merci AirCraft,
ça marche ffectivement mieux.
je ne sais pas trop ou j'avais la tete.
Par contre j'ai plusieurs type de vue dans ce tabFolder et du coup ça le fait pour tous donc il va falloir que je trouve le moyen de faire la différence lors du declenchement de l'event.
Merci
dans ce cas utilise une classe interne (implementant l'interface bien sur) dans ta classe qui utilise ces vues, et dans chaque methode tu fais des "if" pour faire un traitement a chaque vue (tu peux surement recuperer la vue ecoutee a partir du "IWorkbenchPartReference partRef" ca doit pas etre dur a trouver ;) ). et quand tu instancies tes vues tu appelles:
comme al a Swing :)Code:
1
2
3 view1.getSite().getPage().addPartListener(new MyPartListener()); view2.getSite().getPage().addPartListener(new MyPartListener());
Have fun
AC
Salut,
j'ai effectivement trouvé le moyen de savoir de quel type de vue il s'agit grace au partRef.
Par contre j'ai un phénomène étrange et pas top!
Explication :
j'ai 3 types de vue : A,B,C.
Ce sont les vues C qui m'interesse ici. Je fait donc un filtre pour avoir que les evenements des vues C.
La pas de probleme.
Sauf que si j'ai plusieurs vue C ouverte dans mon tabFolder, et bien j'ai autant d'appel sur chaque evenement!
Par example : si je passe d'une vue C a une autre vue C via mes onglets.
je vais avoir 2x l'appel a "partActivated", 2x a "partDeactivated", 2x"partHidden", 2x"partVisible".
Si j'ouvre encore une autre vue C, et bien ça sera 3x de chaque...
Je ne comprend pas pourquoi chaque evenement est repété?!
Il devrait y en avoir une qui declenche les evenement "desactivé" et "caché" et 1 l'inverse mais pas 2x tout?!?
Le comportement des vues semble bien sur tout a fait ok.
Merci
poste ton code je peux pas te dire comme ca! t'es sur que t'ajoute pas 2 instance du listener a chque vue (tu fais 2 fois addPartListener sur la vue C par exemple)? Ca sera un truc tout bete de ce genre! le truc qui est devant nos yeux mais on le vois pas! Sinon si tu veux etre un peu autodidacte met un breakpoint sur les methodes du listener et lance l'appli en debug et la tu verras les appels et pk ca se lance plusieurs fois et d'ou!
Voila
Have fun
AC
Citation:
Envoyé par Aircraft
haha bien vu l'aveugle :)
L'informatique ne fait que ce qu'on lui dit apres tout...!
Heureusement que je suis en vacances bientot car la j'ai la concentration qui baisse ;)
Merci beaucoup pour ton aide :)
Des vacances?? Ah comment ca me manque :(
Allez tu peux mettre un "resolu" pour les autres ;) !
Have fun,
AC
Avant le "resolu"
j'aurai une derniere question, certe plus en rapport avec le titre du topic.
Je voulais intercepté ce type d'evenement car je veux que certaine vue ne soit visible que lorsque d'autre soit selectionnée.
j'ai dont mis le code pour afficher/cacher ces vu dans le listener sur l'activation/desactivation des vues qui vont bien.
Sauf que j'ai un warning ennervant qui se produit, quand je veux afficher mes vues.
J'ai ça :
J'avais deja ce probleme avant que j'utilisais les methodes setFocus() pour faire ça mais j'avais observé que setFocus() etait appelé plusieurs fois.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 !ENTRY org.eclipse.ui.workbench 4 0 2007-07-31 15:17:18.468 !MESSAGE WARNING: Prevented recursive attempt to activate part winmaj2.TreeCategoryView while still in the middle of activating part winmaj2.LotView !STACK 0 java.lang.RuntimeException: WARNING: Prevented recursive attempt to activate part winmaj2.TreeCategoryView while still in the middle of activating part winmaj2.LotView at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3157) at org.eclipse.ui.internal.WorkbenchPage.activate(WorkbenchPage.java:588) at org.eclipse.ui.internal.WorkbenchPage.busyShowView(WorkbenchPage.java:1008) at org.eclipse.ui.internal.WorkbenchPage.busyShowView(WorkbenchPage.java:989) at org.eclipse.ui.internal.WorkbenchPage.access$13(WorkbenchPage.java:968) at org.eclipse.ui.internal.WorkbenchPage$13.run(WorkbenchPage.java:3514) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67) at org.eclipse.ui.internal.WorkbenchPage.showView(WorkbenchPage.java:3511) at org.eclipse.ui.internal.WorkbenchPage.showView(WorkbenchPage.java:3487) at classeVue.ListeDesVentesView$1.partActivated(ListeDesVentesView.java:80) at org.eclipse.ui.internal.PartListenerList2$1.run(PartListenerList2.java:68) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) at org.eclipse.core.runtime.Platform.run(Platform.java:843) at org.eclipse.ui.internal.PartListenerList2.fireEvent(PartListenerList2.java:53) at org.eclipse.ui.internal.PartListenerList2.firePartActivated(PartListenerList2.java:66) at org.eclipse.ui.internal.PartService.firePartActivated(PartService.java:77) at org.eclipse.ui.internal.PartService.setActivePart(PartService.java:171) at org.eclipse.ui.internal.WorkbenchPagePartList.fireActivePartChanged(WorkbenchPagePartList.java:56) at org.eclipse.ui.internal.PartList.setActivePart(PartList.java:126) at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3207) at org.eclipse.ui.internal.WorkbenchPage.requestActivation(WorkbenchPage.java:2750) at org.eclipse.ui.internal.PartPane.requestActivation(PartPane.java:256) at org.eclipse.ui.internal.PartPane.setFocus(PartPane.java:302) at org.eclipse.ui.internal.PartStack.presentationSelectionChanged(PartStack.java:798) at org.eclipse.ui.internal.PartStack.access$1(PartStack.java:781) at org.eclipse.ui.internal.PartStack$1.selectPart(PartStack.java:123) at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(TabbedStackPresentation.java:126) at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:267) at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:276) at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(DefaultTabFolder.java:1) at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$2.handleEvent(DefaultTabFolder.java:84) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:952) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:937) at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:709) at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:3171) at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1953) at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:288) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1930) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1894) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:422) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at winmaj2.Application.run(Application.java:18) at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336) at org.eclipse.core.launcher.Main.basicRun(Main.java:280) at org.eclipse.core.launcher.Main.run(Main.java:977) at org.eclipse.core.launcher.Main.main(Main.java:952)
La avec ce listener je n'appel qu'une seule fois mon code qui ouvre mes vues...donc je ne comprend pas pourquoi j'ai encore ce type de message d'erreur :(
Surtout que ça ne me le fait que pour l'affichage, quand je les cachent il n'y a pas de probleme apparament.
Code de mon listener :
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 public void partActivated(IWorkbenchPartReference partRef) { if(partRef.getId().compareTo("winmaj2.LotView")==0) { System.out.println("activation de la vue d'un lot"); IViewReference ref = getViewSite().getPage().findViewReference(TreeCategoryView.ID); if(ref==null) { try { getViewSite().getPage().showView(TreeCategoryView.ID); } catch (PartInitException e) { // TODO Auto-generated catch block e.printStackTrace(); } } IViewReference refImg = getViewSite().getPage().findViewReference(ImageLotView.ID); if(refImg==null) { try { getViewSite().getPage().showView(ImageLotView.ID); } catch (PartInitException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public void partDeactivated(IWorkbenchPartReference partRef) { if(partRef.getId().compareTo("winmaj2.LotView")==0) { System.out.println("Desactivation de la vue d'un lot"); IViewReference ref = getViewSite().getPage().findViewReference(TreeCategoryView.ID); if(ref!=null) getViewSite().getPage().hideView(ref); IViewReference refImg = getViewSite().getPage().findViewReference(ImageLotView.ID); if(refImg!=null) getViewSite().getPage().hideView(refImg); } }
Le warning dit que tu fais une activation recursive des vues, En effet si tu vois ton code, la premiere vue va activer la deuxieme vue qui va elle meme essayer d'activer la premiere vue et ainsi de suite ( un debuggage est tres utile pour trouver ce genre de prob, penses y ;) )... une solution simple (qui peut marcher) serait d'ajouter un test avant chauqe appel de ce genre:
pour verifier si la vue n'est pas deja activee. si elle est deja activee tu fais rien.Code:
1
2 getViewSite().getPage().showView(TreeCategoryView.ID);
Voila si ca ne resoud pas le pb il faut plus d'elements alors, envoie le code ou tu ajoutes les instances du listener a tes vues par exemple!
AC
Désolé mais je ne vois vraiment pas ou il y a la moindre recursivité dans mon code!
Et je fais un test avant de faire un show justement.
Quand une vue qu'on va dire de type A (l'activation d'autre vue est filtré et ne fait rien) est activé, j'intercepte l'evenement qui n'a lieu qu'une fois et je fais :
Si "ref" n'est pas a null c'est que la vue existe deja, je ne fait donc rien.Code:
1
2
3
4
5
6
7
8
9
10
11
12 IViewReference ref = getViewSite().getPage().findViewReference(TreeCategoryView.ID); if(ref==null) { try { getViewSite().getPage().showView(TreeCategoryView.ID); } catch (PartInitException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Dans le cas contraire je l'affiche.
Et c'est fini...
Quand ma vue de type A pert le focus meme chose mais avec un hide.
Je ne vois vraiment rien de recursif la dedans?
:roll: je dois etre fatigue aussi alors :)
Je verrai ca qd je rentre chez moi tout a l'heure! je te reponds ce soir si j'ai une solution!
AC
poste qd meme comment tu fais les addPartListener ca peut aider!
AC
Voici :
le tout est au debut de le methode createPartControl d'une de mes vues qui est affiché une seul fois et qui ne peux pas etre fermé.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
73
74
75
76
77
78
79
80
81 IPartListener2 viewListener = new IPartListener2() { public void partActivated(IWorkbenchPartReference partRef) { if(partRef.getId().compareTo("winmaj2.LotView")==0) { System.out.println("activation de la vue d'un lot"); IViewReference ref = getViewSite().getPage().findViewReference(TreeCategoryView.ID); if(ref==null) { try { getViewSite().getPage().showView(TreeCategoryView.ID); } catch (PartInitException e) { // TODO Auto-generated catch block e.printStackTrace(); } } IViewReference refImg = getViewSite().getPage().findViewReference(ImageLotView.ID); if(refImg==null) { try { getViewSite().getPage().showView(ImageLotView.ID); } catch (PartInitException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } else //c'est une autre vue qui s'active { //si c'est la liste des vente ou une vente > cache les vues if(partRef.getId().compareTo("winmaj2.ListeDesVentesView")==0 ||partRef.getId().compareTo("winmaj2.VenteEtLotView")==0) { System.out.println("activation de la liste des vente ou d'une vente"); IViewReference ref = getViewSite().getPage().findViewReference(TreeCategoryView.ID); if(ref!=null) getViewSite().getPage().hideView(ref); IViewReference refImg = getViewSite().getPage().findViewReference(ImageLotView.ID); if(refImg!=null) getViewSite().getPage().hideView(refImg); } } } public void partBroughtToTop(IWorkbenchPartReference partRef) { } public void partClosed(IWorkbenchPartReference partRef) { // TODO Auto-generated method stub } public void partDeactivated(IWorkbenchPartReference partRef) { } public void partHidden(IWorkbenchPartReference partRef) { } public void partInputChanged(IWorkbenchPartReference partRef) { } public void partOpened(IWorkbenchPartReference partRef) { } public void partVisible(IWorkbenchPartReference partRef) { } }; getSite().getPage().addPartListener(viewListener);
J'ai legerement changé le code car sinon j'avais un probleme de show/hide +/- simultanné si je passais d'une vue de type A a une autre vue de type A.
ça me regle au passage certain probleme de positionnement de fenetre meme si je ne sais pas pourquoi...
Donc au stade actuelle j'ai just emon log qui se rempli a vitesse grand V de ce Warning.
ps : je part du boulot là donc je ne pourrai repondre que demain matin si on me propose des solutions.
Merci