IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

Création ou utilisation de ToolTip personnalisé


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Par défaut Création ou utilisation de ToolTip personnalisé
    Bonjour,

    Suite à un projet de visualisation, je dois afficher des tooltips dans une vue qui contient des formes 3D.

    Suivant certaines condition de cette forme, je dois afficher ce tooltip ou non en passant ma souris sur cette forme 3D. Hors cette forme 3D est construite à l'aide d'une librairie OpenGL, il n'est donc pas un Component. Donc je dois insérer un ToolTip pour l'élément créer ce que je fais, mais lequel choisir entre ces 2 là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.eclipse.swt.widgets ou le org.eclipse.jface.window
    ?

    Tout en sachant que le thème de ce tooltip doit ressembler à celui d'Eclipse lorsqu'on veut par exemple afficher la javadoc lorsqu'on passe sa souris sur du code. De plus, lors de l'affichage de ce tooltip, ce dernier doit charger une Treetable (qui est déjà construite) qu'on doit pouvoir consulter, à la manière d'Eclipse.

    D'avance merci

    Dasson

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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Salut,

    Je te conseille de plutôt utiliser le ToolTip de JFace. D'ailleurs, d'ordre général, il vaut mieux utilisé JFace au lieu de SWT (plus orienté objet).
    Après, je vois pas trop ce que tu veux dire par:
    ce tooltip doit ressembler à celui d'Eclipse lorsqu'on veut par exemple afficher la javadoc
    L'astuce c'est qu'il ne s'agit pas d'un tooltip pour afficher la Javadoc
    Donc, si tu veux quelque chose d'approchant, à moins d'avoir un ISourceViewer ça risque d'être compliqué (un ISourceViewer hérite de ITextViewer ce qui ne s'applique pas à ton cas je pense).
    Après, rien ne t'empêche de donner ce look à ton ToolTip puisqu'avec la classe de JFace, tu dois surcharger la méthode createToolTipContentArea().

    Voilà, à+
    Gueritarish

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Par défaut
    Salut et merci pour la réponse.

    Je vais regarder au niveau du ToolTip de JFace et je reviendrai pour te dire si ça m'aide ou pas.

    Après, je vois pas trop ce que tu veux dire par:
    ce tooltip doit ressembler à celui d'Eclipse lorsqu'on veut par exemple afficher la javadoc
    En fait dans Eclipse, lorsqu'on passe sa souris sur une méthode de son code, un genre de popup montre la javadoc, ou autre si on appuie sur une touche de son clavier, de cette méthode où la souris se positionne.

    Ce que je voudrais au final, c'est quand je passe sur la vue Eclipse contenant mes formes 3D et que je passe ma souris sur l'une des formes, ce même genre de popup apparait mais le contenu sera une TreeTable que j'ai déjà construit auparavant.

    Enfin je regarde avec ce que tu as fourmis et je mettrai mon avancement sur ce topic.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Par défaut
    Après plusieurs tentative et le temps de comprendre comment SWT fonctionnait, je suis arrivé à ceci avec le JPanel contenant ma JTreeTable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    public class PopupFrame extends ToolTip {
     
    	private JPanel panel;
    	private Shell shell;
     
    	public PopupFrame(Control control, JPanel panel) {
    		super(control);
    		shell = control.getShell();
    		this.panel = panel;
    		shell.open();
    		while (!shell.isDisposed()) {
    			if (!shell.getDisplay().readAndDispatch())
    				shell.getDisplay().sleep();
    		}
    		//shell.getDisplay().dispose();
    	}
     
    	@Override
    	protected Composite createToolTipContentArea(Event event, final Composite parent) {
    		Composite comp = new Composite(parent, SWT.EMBEDDED);
    		comp.setLayout(new FillLayout());
    		java.awt.Frame frame = SWT_AWT.new_Frame(comp);
    		frame.add(panel);
    		frame.addWindowListener(new WindowListener() {
     
    			@Override
    			public void windowOpened(WindowEvent e) {
    			}
     
    			@Override
    			public void windowIconified(WindowEvent e) {
    			}
     
    			@Override
    			public void windowDeiconified(WindowEvent e) {
    			}
     
    			@Override
    			public void windowDeactivated(WindowEvent e) {
    			}
     
    			@Override
    			public void windowClosing(WindowEvent e) {
    				parent.setVisible(false);
    				EventQueue.invokeLater(new Runnable () {
    					public void run () {
    						panel.setVisible(false);
    					}
    				});
    			}
     
    			@Override
    			public void windowClosed(WindowEvent e) {
    			}
     
    			@Override
    			public void windowActivated(WindowEvent e) {
    			}
    		});
    		panel.setVisible(true);
    		return comp;
    	}	
    }
    Le problème c'est que lorsque que je veux afficher ce ToolTip, j'ai bien une frame qui se charge, mais elle est vide. De plus quand je la ferme et je la réaffiche, j'obtiens l'exception suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access
    	at org.eclipse.swt.SWT.error(SWT.java:4282)
    	at org.eclipse.swt.SWT.error(SWT.java:4197)
    	at org.eclipse.swt.SWT.error(SWT.java:4168)
    	at org.eclipse.swt.widgets.Display.checkDisplay(Display.java:775)
    	at org.eclipse.swt.widgets.Display.create(Display.java:837)
    	at org.eclipse.swt.graphics.Device.<init>(Device.java:137)
    	at org.eclipse.swt.widgets.Display.<init>(Display.java:489)
    	at org.eclipse.swt.widgets.Display.<init>(Display.java:480)
    	at verso.representation.cubeLandscape.SceneLandscape.createStackTable(SceneLandscape.java:238)
    	at verso.representation.cubeLandscape.SceneLandscape.mouseMoved(SceneLandscape.java:206)
    	at java.awt.Component.processMouseMotionEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseMotionEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    	at java.awt.EventQueue.access$000(Unknown Source)
    	at java.awt.EventQueue$1.run(Unknown Source)
    	at java.awt.EventQueue$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue$2.run(Unknown Source)
    	at java.awt.EventQueue$2.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    La ligne 238 de ma classe SceneLandScape étant l'appel au constructeur comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new PopupFrame(new Shell(new Display()), panel);
    Je me rend compte que le problème se situe au niveau de l'intégration des composants Swing dans des composants SWT mais j'ai un peu du mal à m'en sortir.

    Pour info, je donne la construction de ma JTable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    JPanel panel = new JPanel();
    				EntityStackFrame en = DebugEventListener.getEntity(th, entity);
    				try {
    					IJavaVariable varList [] = new IJavaVariable [en.getStackFrame().getLocalVariables().length];
    					int i=0;
    					for (IVariable var : en.getStackFrame().getLocalVariables()) {
    						varList[i] = (IJavaVariable) var;
    						i++;
    					}
    					JTreeTable treeTable = new JTreeTable(
    							new VariableModel(varList));
    					panel.add(new JScrollPane(treeTable));
    					panel.setName(en.getStackFrame().getName() + " variables");
    				}
    				catch (DebugException e) {
    					e.printStackTrace();
    				}
    				new PopupFrame(new Shell(new Display()), panel);
    Merci d'avance

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Par défaut
    Voilà, j'ai réussi a faire ce dont je voulais.

    J'ai laissé tomber les composants Swing pour m’orienter uniquement en SWT ce qui m'a grandement facilité les choses. Ensuite je devais rechercher le Shell de ma vue Eclipse sur lequel je voulais afficher mes tooltips.

    Je laisse le code pour les autres qui voudraient faire ce genre de construction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class PopupFrame extends ToolTip {
     
    	private IVariable[] listVar;
     
    	public PopupFrame(Control control, IVariable[] listVar) {
    		super(control);
    		this.listVar = listVar;
    	}
     
    	@Override
    	protected Composite createToolTipContentArea(Event event, Composite parent) {
    		Composite comp = new Composite(parent,SWT.NONE);
    		parent.setLayout(new FillLayout());
                    //Construction de l'arbre des variables
    		new TreeTableVariable(comp, listVar); 
    		comp.setLayout(new FillLayout());
    		return comp;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public class TreeTableVariable {
     
    	private IVariable[] listVar;
    	private Tree tree;
    	private Composite parent;
     
    	public TreeTableVariable(Composite parent, IVariable[] listVar) {
    		this.parent = parent;
    		this.listVar = listVar;
    		this.tree = new Tree(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
    		initTree();
    	}
     
    	private void initTree() {
     
    		tree.setHeaderVisible(true);
    		TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
    		column1.setText("Variables");
    		column1.setWidth(200);
    		TreeColumn column2 = new TreeColumn(tree, SWT.RIGHT_TO_LEFT);
    		column2.setText("Valeur");
    		column2.setWidth(200);
    		for (IVariable var : listVar) {
    			IJavaVariable jVar = (IJavaVariable) var;
    			TreeItem item = new TreeItem(tree, SWT.NONE);
    			try {
    				item.setText(new String[] { jVar.getName(),
    						jVar.getValue().getValueString() });
    				constructTree(item, jVar.getValue().getVariables());
    			}
    			catch (DebugException e) {
    				e.printStackTrace();
    			}
    		}
    		parent.pack();
    	}
     
    	private void constructTree(TreeItem treeItem, IVariable[] listVar) {
    		if (listVar != null) {
    			for (IVariable var : listVar) {
    				IJavaVariable jVar = (IJavaVariable) var;
    				TreeItem item = new TreeItem(treeItem, SWT.NONE);
    				try {
    					item.setText(new String[] { jVar.getName(),
    							jVar.getValue().getValueString() });
    					constructTree(item, jVar.getValue().getVariables());
    				}
    				catch (DebugException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    final Display display = Display.getDefault();
    display.asyncExec(new Runnable() {
     
    	@Override
    	public void run() {
    		Shell shell = PluginScene.sce.getShell();
    		PopupFrame popup = new PopupFrame(shell, listVar);
    		popup.setHideOnMouseDown(false);
    		//popup.setShift(new Point(-5, -5));
    		popup.show(new Point(me.getXOnScreen(), me.getYOnScreen()));
     
    	}
    });
    Sur ce bonne journée

    Dasson

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

Discussions similaires

  1. Création et utilisation de librairies statiques avec Code::Blocks
    Par somberlord dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 22/07/2007, 08h58
  2. Réponses: 6
    Dernier message: 07/06/2007, 22h03
  3. Réponses: 1
    Dernier message: 18/01/2007, 11h45
  4. Création d'une infobulle / tooltip
    Par Poutchou dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 05/04/2006, 17h46
  5. Création et utilisation de variables
    Par Furius dans le forum VBScript
    Réponses: 6
    Dernier message: 11/12/2005, 21h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo