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 :

Switch entre 2 composites dans un éditeur


Sujet :

Eclipse Platform

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2008
    Messages : 38
    Points : 26
    Points
    26
    Par défaut Switch entre 2 composites dans un éditeur
    bonjour,

    j'ai 2 composites dans un éditeur et je voudrais switcher de l'un à l'autre en fonction d'un événement.

    En gros je voudrais que le composite visible prenne toute la place dans l'éditeur et que l'autre ne prenne aucune place (et bien sur ne soit pas visible).

    Dans un thread non UI, je veux commander l'inversion (ie: le composite visible devient invisible et ne prend plus de place, inversement pour l'autre).

    Je ne sais pas trop comment m'y prendre, pour le moment ça ne marche pas. Je ne sais même pas si j'utilise le bon layout:
    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
    public void createPartControl(Composite parent) {
        rootComposite = new Composite(parent, SWT.BORDER);
        parent.setLayout(new GridLayout(1, false));
        try {
            svgStaticComp = new SVGComposite(parent, SWT.NONE, false);
            GridData dataStatic = new GridData();
            dataStatic.exclude = false;
            dataStatic.horizontalAlignment = SWT.FILL;
            svgStaticComp.setLayoutData(dataStatic);
     
            svgDynamicComp = new SVGComposite(parent, SWT.NONE, false);
            GridData dataDyn = new GridData();
            dataDyn.exclude = true;
            dataDyn.horizontalAlignment = SWT.FILL;
            svgDynamicComp.setLayoutData(dataDyn);
                       ....
    NB: dans le thread externe, j'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    rootComposite.getDisplay().asyncExec(new Runnable() {
     
            public void run() {
                GridData dataDyn = (GridData) svgDynamicComp.getLayoutData();
                GridData dataStatic = (GridData) svgStaticComp.getLayoutData();
                dataDyn.exclude = !isRemote;
                svgDynamicComp.setVisible(isRemote);
                dataStatic.exclude = isRemote;
                svgStaticComp.setVisible(!isRemote);
                rootComposite.layout(false);
            }
        });

  2. #2
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Citation Envoyé par hodac Voir le message
    Je ne sais pas trop comment m'y prendre, pour le moment ça ne marche pas
    Bonjour,
    peux tu expliquer un peu plus ce qui ne marche pas ? rien ne s'affiche ? ça ne s'affiche pas comme tu le souhaite ?... précise un peu le pb

    Sinon déjà tu crée ton rootComposite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rootComposite = new Composite(parent, SWT.BORDER);
    mais tu ajoute les autres composites au parent au lieu de les ajouter à ton rooComposite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    svgStaticComp = new SVGComposite(parent, SWT.NONE, false);
    a+,
    jojodu31

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2008
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Effectivement, mais ca ne change rien (j'ai modifié, hum...).

    Je me retrouve dans l'editeur avec 2 zones, une a gauche et une a droite. A gauche, le fond est blanc et j'ai mon composite qui s'affiche. A droite, c'est gris.

    quand je switche, ca fait l'inverse


    Citation Envoyé par jojodu31 Voir le message
    Bonjour,
    peux tu expliquer un peu plus ce qui ne marche pas ? rien ne s'affiche ? ça ne s'affiche pas comme tu le souhaite ?... précise un peu le pb

    Sinon déjà tu crée ton rootComposite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rootComposite = new Composite(parent, SWT.BORDER);
    mais tu ajoute les autres composites au parent au lieu de les ajouter à ton rooComposite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    svgStaticComp = new SVGComposite(parent, SWT.NONE, false);
    a+,
    jojodu31

  4. #4
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    alors, plusieurs choses :
    1. ton rootComposite doit avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rootComposite.setLayout(new GridLayout(2, false));
    sans quoi tes sous composites ne seront pas à leur tailles respectives. Ensuite tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rootComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    si tu souhaite que ce rootComposite s'étende au maximum...

    2. au lieu d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GridData dataDyn = new GridData();
    // et 
            dataDyn.horizontalAlignment = SWT.FILL;
    utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GridData dataStatic = new GridData(SWT.FILL, SWT.NONE, true, false);
    		dataStatic.exclude = false;
    		svgStaticComp.setLayoutData(dataStatic);
    le true permet au composite de prendre toute la place disponnible, le SWT.FILL ne suffit pas.

    3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    isRemote = !isRemote;
    à ajouter dans ton run() si ce n est pas fait ailleurs bien sur...

    j'ai fait un petit Shell qui illustre tout ceci, et qui devrait répondre à ton besoin, voici le code (ultra vitef hein... ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    public class TestHideComposite {
     
    	private static Composite	rootComposite;
    	private static Composite	svgStaticComp;
    	private static Composite	svgDynamicComp;
    	private static boolean	 isRemote	= false;
     
    	/**
             * TODO : Description de la méthode <code>main</code>.
             * @param args
             */
    	public static void main(final String[] args) {
    		Display display = new Display();
    		Shell shell = new Shell(display);
    		shell.setSize(600, 600);
    		shell.setLayout(new GridLayout());
     
    		Composite boutonComposite = new Composite(shell, SWT.BORDER);
    		boutonComposite.setLayout(new GridLayout());
    		boutonComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
    		Button switchBtn = new Button(boutonComposite, SWT.PUSH);
    		switchBtn.setText("SWITCH");
    		switchBtn.addSelectionListener(new SelectionListener() {
    			@Override
    			public void widgetDefaultSelected(final SelectionEvent e) {
    			}
     
    			@Override
    			public void widgetSelected(final SelectionEvent e) {
    				switchComposite();
    			}
    		});
     
    		rootComposite = new Composite(shell, SWT.BORDER);
    		// composite BLEU , le principal
    		rootComposite.setBackground(new Color(null, 0, 0, 255));
    		rootComposite.setLayout(new GridLayout(2, false));
    		rootComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
     
    		svgStaticComp = new Composite(rootComposite, SWT.NONE);
    		GridData dataStatic = new GridData(SWT.FILL, SWT.NONE, true, false);
    		dataStatic.exclude = false;
    		svgStaticComp.setLayoutData(dataStatic);
    		// composite VERT
    		svgStaticComp.setBackground(new Color(null, 0, 255, 0));
     
    		svgDynamicComp = new Composite(rootComposite, SWT.NONE);
    		GridData dataDyn = new GridData(SWT.FILL, SWT.NONE, true, false);
    		dataDyn.exclude = true;
    		svgDynamicComp.setLayoutData(dataDyn);
    		// composite ROUGE
    		svgDynamicComp.setBackground(new Color(null, 255, 0, 0));
     
    		shell.open();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch()) {
    				display.sleep();
    			}
    		}
    		display.dispose();
    	}
     
    	private static void switchComposite() {
    		isRemote = !isRemote;
    		GridData dataDyn = (GridData) svgDynamicComp.getLayoutData();
    		GridData dataStatic = (GridData) svgStaticComp.getLayoutData();
    		dataDyn.exclude = !isRemote;
    		svgDynamicComp.setVisible(isRemote);
    		dataStatic.exclude = isRemote;
    		svgStaticComp.setVisible(!isRemote);
    		rootComposite.layout(false);
     
    	}
    }
    Je pense que c'est exemple fait ce que tu souhaites

    a+,
    jojodu31

  5. #5
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Tu as aussi la solution du StackLayout() que je viens de découvrir et qui permet de switcher d'un Composite à un autre en lui affectant TopControl.
    Il faut ensuite appeler la méthode Layout() du Composite qui implémente le StackLayout() et ton composite est affiché. Les autres composites affectés à ce Composite parent sont automatiquement cachés.

    En fait c'est fait exactement pour ce que tu veux faire...

    Petit exemple tiré du cours SWT de Mickael Baron :
    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
     
    final Shell shell = new Shell (display);
    final StackLayout stackLayout = new StackLayout();
    shell.setLayout(stackLayout);
    Button button1 = new Button(shell, SWT.PUSH);
    button1.setText("Button 1");
    final Button button2 = new Button(shell, SWT.PUSH);
    button2.setText("Button 2");
    button1.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent arg0) {
    stackLayout.topControl = button2;
    shell.redraw();
    }
    });
    stackLayout.topControl = button1;

Discussions similaires

  1. [PDE] Récupérer texte mis en surbrillance dans un éditeur
    Par simsky dans le forum Eclipse Platform
    Réponses: 20
    Dernier message: 10/07/2007, 13h03
  2. Choix entre deux champs dans une requete
    Par Pico10 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/07/2005, 16h36
  3. [PDE] Récupérer position du curseur dans un éditeur
    Par simsky dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 05/07/2005, 16h50
  4. Agir sur le texte entré dans un éditeur
    Par FatalError dans le forum C++
    Réponses: 1
    Dernier message: 24/10/2004, 15h54
  5. Réponses: 11
    Dernier message: 13/10/2004, 01h58

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