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 :

[plug-in][RCP]Implémenter le "Switch Workspace"...


Sujet :

Eclipse Platform

  1. #1
    Nouveau membre du Club
    [plug-in][RCP]Implémenter le "Switch Workspace"...
    Bonjour à tous!
    Je travaille sur une application RCP pour laquelle je dois avoir une action «Switch Workspace ».
    J’ai cherché sur les newsgroups d’Eclipse et grâce à cela j’ai réussi à trouver quelle action ajouter dans mon ActionBarAdvisor :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     menu.add(IDEActionFactory.OPEN_WORKSPACE.create(window));

    La difficulté, là, c’était que l’action ne se trouvait pas dans ActionFactory …Bref, l’action semble à priori marcher : je clique sur Switch workspace, mon application me propose de choisir un nouveau workspace, elle redémarre, et…le workspace est TOUJOURS LE MEME !!!!
    Apparemment, plusieurs personnes ont le même problême et ont posté dans les newsgroups et autres forums dédiés à Eclipse, mais personne ne leur a répondu (en tous cas, je n’ai pas encore trouvé un forum où une personne ayant eu ce problême ait trouvé une réponse…) ...
    Quelqu’un saurait m’aider ???
    Merci d’avance !
    Les mots vrais traversent le temps mais pas les mauvais...

  2. #2
    Nouveau membre du Club
    Pour info, je travaille avec Eclipse 3.1.2 et le jdk 1.5.0_02...
    Les mots vrais traversent le temps mais pas les mauvais...

  3. #3
    Nouveau membre du Club
    Bon...alors, j'ai regardé les sources d'Eclipse, et plus particulièrement [FONT=Arial]org.eclipse.ui.internal.ide. IDEApplication. J'ai alors modifié ma classe qui implémente IPlatformRunnable pour lui permettre de connaitre la constante EXIT_RELAUNCH:

    [/FONT] [FONT=Arial]
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [/FONT]
      [FONT=Arial]    if (returnCode != PlatformUI.RETURN_RESTART)[/FONT]
      [FONT=Arial]                return EXIT_OK;[/FONT]
      [FONT=Arial] [/FONT]
      [FONT=Arial]            // if the exit code property has been set to the relaunch code, then[/FONT]
      [FONT=Arial]            // return that code now, otherwise this is a normal restart[/FONT]
      [FONT=Arial]            [/FONT]
      [FONT=Arial]            return EXIT_RELAUNCH.equals(Integer.getInteger(PROP_EXIT_CODE)) ? EXIT_RELAUNCH[/FONT]
      [FONT=Arial]                    : EXIT_RESTART;[/FONT]
      [FONT=Arial]


    Mais après cela, l'action Switch Workspace semblait uniquement arrêter le worbench...
    J'ai alors essayé de ébugger pour savoir ce qui se passait et je suis arrivé jusqu'à la classe [/FONT][FONT=Arial]org.eclipse.core.launcher.Main class
    J'ai alors pu voir que la méthode setExitData() utilisait un argument de commande "-exitdata" et que si cet argument n'existait pas, elle s'arrêtait pûrement et simpleent:

    [/FONT] [FONT=Arial]
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [/FONT]
      [FONT=Arial]   private void setExitData() {[/FONT]
      [FONT=Arial]        String data = System.getProperty(PROP_EXITDATA);[/FONT]
      [FONT=Arial]        if (exitData == null || data == null)[/FONT]
      [FONT=Arial]            return;[/FONT]
      [FONT=Arial]        // sync call to the launcher[/FONT]
      [FONT=Arial]        runCommand(true, new String[] {EXITDATA, exitData, data}); //$NON-NLS-1$[/FONT]
      [FONT=Arial]    }[/FONT]
      [FONT=Arial]
    [/FONT]
    [FONT=Arial]
    D'où 2 nouvelles questions:
    D'après vous, est-ce que je suis sur la bonne voie?
    Est-ce que quelqu'un sait à quoi sert se exitdata et ce que l'on doit lui donner comme valeur???

    Merci d'avance!
    [/FONT]
    Les mots vrais traversent le temps mais pas les mauvais...

  4. #4
    Nouveau membre du Club
    Bon, bin j'ai résolu le problême...En fait je l'avais résolu quand j'ai ajouté les références à EXIT_RELAUNCH mais je ne pouvais pas le voir...En effet, j'ai tenté un truc: j'ai essayé de lancer un Eclipse depuis Eclipse et ça ne marchait pas....Ca avait exactement le même comportement que mon appli après avoir ajouté le EXIT_RELAUNCH: arrêt de l'appli sans relancer de nouveau process...J'ai alors ré-exporté mon produit RCP, et là, mon switch workspace marche!!!
    Je sais pas trop pourquoi ça ne marche pas depuis Eclipse, mais en tous cas, pour le produit final, ça roule!!
    Les mots vrais traversent le temps mais pas les mauvais...

  5. #5
    Membre du Club
    Bonjour,

    je cherche également a déclarer la gestion de workspace pour mon appli RCP. J'ai réussi a utiliser le switch comme expliquer ci dessus mais je ne parvient pas à déclarer la gestion du workspace au démarrage de l'application, j'ai réussi de le faire manuellement en appelant la dialogue IDE ChooseWorkspaceDialog, puis de sauver le workspace dans le Platform.getInstanceLocation()

    Mais voila j'aimerai savoir si il y a un moyen plus propre de déclarer cela pour une gestion plus complète et automatique, car ici lorsque de tente un switch de workspace, mon application redémarre normalement, mais cela n'empêche pas de faire réapparaitre la sélection manuelle que j'ai implémenté, alors que eclipse le fait lui.

  6. #6
    Membre du Club
    bon en fin de compte j'ai téléchargé les sources d'éclipse et me suis inspiré de l'IDEApplication, marche nickel

  7. #7
    Futur Membre du Club
    9 ans après mais bon...
    Citation Envoyé par jerome86600 Voir le message
    bon en fin de compte j'ai téléchargé les sources d'éclipse et me suis inspiré de l'IDEApplication, marche nickel
    merci pour l'info... très utile et introuvable ailleurs

    Bon, alors voilà. Après le temps passé dessus de mon côté, j'en suis à quelque chose qui marche pas mal.

    Pour le menu switch Workspace, c'est relativement direct (voir plus haut)

    Pour choisir le WS au démarrage :

    - D'abord : ne PAS définir de workspace par défaut sur le produit sinon le WS est déjà défini quand l'Application est créée (c'est pour ça entre autre que ça ne peut pas marcher en environnement de dev)

    C'est à dire dans le config.ini ou alors monProduit.product, onglet Configuration, Section Properties :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    osgi.instance.area=@noDefault


    - Ensuite l'Application doit choisir le WS avant de créer le workbench.

    - On doit aussi traiter les erreurs, forcer à remontrer le dialog au démarrage si le WS par défaut est locked,
    traité dans ma petite méthode chooseWorkspaceUrl()

    - Enfin, le répertoire d'installation doit pouvoir être accédé en écriture par l'utilisateur, sinon la config persistante ne peut être écrite par la class ChooseWorkspaceData
    ... ou alors configurer l'emplacement de eclipse\configuration chez le user (mais je ne sais pas encore comment...)


    Il me reste juste p-être à ajouter la MRU liste dans le menu :-(

    voici mon Application (pour equinox 3.5), si ça peut aider :
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
     
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
     
    import org.eclipse.core.runtime.Platform;
    import org.eclipse.equinox.app.IApplication;
    import org.eclipse.equinox.app.IApplicationContext;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.MessageBox;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.ui.IWorkbench;
    import org.eclipse.ui.PlatformUI;
    import org.eclipse.ui.internal.ide.ChooseWorkspaceData;
    import org.eclipse.ui.internal.ide.ChooseWorkspaceDialog;
     
    @SuppressWarnings("restriction")
    public class Application implements IApplication {
     
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.
    	 * IApplicationContext)
    	 */
     
    	// to be able to switch workspace (but "old fashion"...)
    	//private static final String PROP_EXIT_CODE = "eclipse.exitcode"; //$NON-NLS-1$
    	//private static final String PROP_EXIT_DATA = "eclipse.exitdata"; //$NON-NLS-1$
     
    	public Object start(IApplicationContext context) {
     
    		// Select platform workspace
    		// -------------------------
     
    		if (Platform.inDevelopmentMode() || Platform.inDebugMode()) {
    			// this can not work in development environment
    			// as it need to have a default workspace set to none
    			// see product configuration :
    			// osgi.instance.area=@noDefault
    			// ignored in development
    			// -------------------------------------
     
    		} else {
    			// in Release mode only : platform workspace selection on startup
    			// then restart if needed (on workspace error...)
    			if (chooseWorkspaceUrl(new Shell()))
    				return IApplication.EXIT_RESTART;
    		}
     
    		// Die if platform WS not set (user cancel)
    		// ---------------------------
     
    		if (Platform.getInstanceLocation().getURL() == null)
    			return IApplication.EXIT_OK;
     
     
    		// Run application Workbench on selected workspace
    		// -------------------------------------
     
    		Display display = PlatformUI.createDisplay();
    		try {
    			int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
     
    			// RESTART / RELAUNCH (with cmd line) / OK
    			// ---------------------------------------
     
    			if (returnCode == PlatformUI.RETURN_RESTART) {
    				// ** Relaunch with command : ie to switch Workspace
    				//if (PROP_EXIT_CODE.equals("24")) {
    				//	return IApplication.EXIT_RELAUNCH;
    				//}
     
    				// ** Restart with default command line (ie menu File/Restart)
    				return IApplication.EXIT_RESTART;
    			}
     
    			// ** Normal ending
    			return IApplication.EXIT_OK;
     
    		} finally {
    			display.dispose();
    		}
    	}
     
    	/**
             * Open choose workspace dialog and validate the user's choice. Returns true
             * if restart needed.
             */
    	private boolean chooseWorkspaceUrl(Shell shell) {
    		ChooseWorkspaceData launchData = new ChooseWorkspaceData("");
    		ChooseWorkspaceDialog dialog =
    				new ChooseWorkspaceDialog(shell, launchData, false, true);
     
    		// don't force prompt : setShowDialogValue is set on error
    		dialog.prompt(false);
     
    		// check choosen path
    		String selWS = launchData.getSelection();
    		if (selWS == null)
    			return false;// user cancelled (no restart)
     
    		// Switch workspace :
    		URL url = null;
    		try {
    			url = new URL("file", "", selWS);
    		} catch (MalformedURLException e1) {
    			showWorkspaceError("Workspace path could not be found.");
    			return true;// restart needed
    		}
     
    		try {
    			if (!Platform.getInstanceLocation().set(url, true)) {
    				showWorkspaceError("Workspace is already reserved by another instance. Choose another Workspace.");
    				ChooseWorkspaceData.setShowDialogValue(true);
    				return true;// restart needed - lock failed
    			}
     
    		} catch (IllegalStateException e) {
    			showWorkspaceError("Workspace is in an illegal state.");
    			ChooseWorkspaceData.setShowDialogValue(true);
    			return true;// restart needed
     
    		} catch (IOException e) {
    			showWorkspaceError("Workspace could not be found on disk.");
    			ChooseWorkspaceData.setShowDialogValue(true);
    			return true;// restart needed
    		}
     
    		// validate Current as default Workspace, save configuration & history
    		launchData.writePersistedData();
    		return false;// success (no restart)
    	}
     
    	private void showWorkspaceError(String message) {
    		MessageBox messageBox = new MessageBox(new Shell(), SWT.DIALOG_TRIM | SWT.ERROR);
    		messageBox.setText("RDS Error");
    		messageBox.setMessage(message);
    		messageBox.open();
    	}
     
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see org.eclipse.equinox.app.IApplication#stop()
    	 */
    	public void stop() {
    		if (!PlatformUI.isWorkbenchRunning())
    			return;
     
    		final IWorkbench workbench = PlatformUI.getWorkbench();
    		final Display display = workbench.getDisplay();
     
    		display.syncExec(new Runnable() {
    			public void run() {
    				if (!display.isDisposed())
    					workbench.close();
    			}
    		});
    	}
    }