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 :

[Débutant] Undo/Redo sur appli RCP


Sujet :

Eclipse Platform

  1. #1
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut [Débutant] Undo/Redo sur appli RCP
    Bonjour,
    Je suis en train de développer une appli RCP et je souhaiterai avoir une fonction de Undo/Redo.
    J'ai fait pas mal de recherche sur le net mais la documentation est très rare (je ne vous apprends rien )

    Pouvez-vous orienter mes recherches ?
    Avez-vous un tutoriel ? des explications ?

    Merci pour votre aide, vos éclaircissements

  2. #2
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Bonjour,
    Je commence à avoir les idées plus claires mais la documentation est très rare et mon anglais plus que moyen
    J'ai utiliér ce tutoriel :

    http://help.eclipse.org/help32/index...rkAdv_undo.htm

    Pour mon application, j'ai deux actions :
    ajouter un équipement
    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
     
    /**
     * Commande permetant d'ajouter un équipement 
     * à la fiche de manoeuvre
     */
    public class AddEquipmentHandler extends AbstractHandler implements IHandler {
     
    	@Override
    	public Object execute(ExecutionEvent event) throws ExecutionException {
    		//Récupération de la vue contenant l'arbre de la librairie d'équipement
    		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
    		IWorkbenchPage page = window.getActivePage();	
    		//Création d'une opération annulable d'ajout
    		IUndoableOperation operation = new AddDeleteEquipmentOperations("Ajouter un équipement",page,true);
    		//Récupéreation de l'historique des opérations du workbench
    		IWorkbench workbench = window.getWorkbench();
    		IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
    		operationHistory = OperationHistoryFactory.getOperationHistory();
    		//Récupération du contexte d'annulation
    		IUndoContext undoContext = workbench.getOperationSupport().getUndoContext();
    		//ajout du contexte d'annulation
    		operation.addContext(undoContext);
    		//On lance l'opération d'ajout d'équipement à la fiche de manoeuvre
    		operationHistory.execute(operation,null,null);
     
    		return null;
    	}
    }
    supprimer un équipement
    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
     
    /**
     * Commande permetant de supprimer un équipement 
     * à la fiche de manoeuvre
     */
    public class DeleteEquipmentHandler extends AbstractHandler implements IHandler {
     
    	@Override
    	public Object execute(ExecutionEvent event) throws ExecutionException {
    		//Récupération de la vue contenant l'arbre de la librairie d'équipement
    		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
    		IWorkbenchPage page = window.getActivePage();	
    		//Création d'une opération annulable de suppression
    		IUndoableOperation operation = new AddDeleteEquipmentOperations("Supprimer un équipement",page,false);
    		//Récupéreation de l'historique des opérations du workbench
    		IWorkbench workbench = window.getWorkbench();
    		IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
    		operationHistory = OperationHistoryFactory.getOperationHistory();
    		//Récupération du contexte d'annulation
    		IUndoContext undoContext = workbench.getOperationSupport().getUndoContext();
    		//ajout du contexte d'annulation
    		operation.addContext(undoContext);
    		//On lance l'opération d'ajout d'équipement à la fiche de manoeuvre
    		operationHistory.execute(operation,null,null);
     
    		return null;
    	}
    }
    C'est ces 2 opérations qui seront annulable.

    J'ai créé une classe qui extends AbstractOperation pour gérer ces deux opérations annulable:

    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
     
    /**
     * Opération annulable  d'ajout et de suppression d' 'équipement 
     * à la fiche de manoeuvre
     */
    public class AddDeleteEquipmentOperations extends AbstractOperation{
     
    	private IWorkbenchPage page;
    	private SheetOfManoeuvre sheetOfManoeuvre;
    	private boolean isAddOperation;
     
    	public AddDeleteEquipmentOperations(String label,IWorkbenchPage page,boolean isAddOperation) {
    		super(label);
    		this.page = page;
    		this.isAddOperation = isAddOperation;
    		//On récupére la fiche de manoeuvre
    		this.sheetOfManoeuvre = Activator.getDefault().getSheetOfManoeuvre();
    	}
     
    	/**
             * Execution de l'opération
             * Ajout de l'équipement à la fiche de manoeuvre
             */
    	@Override
    	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
     
    		//Si l'opération est l'ajout d'un équipement
    		if (isAddOperation){
    			//Récupération  de l'arbre de la librairie d'équipements
    			LibrarieExplorerTreeView view = (LibrarieExplorerTreeView)page.findView(LibrarieExplorerTreeView.ID);
    			TreeViewer treeViewer = view.getViewer();
    			//Récupération de la sélection
    			ISelection selection = treeViewer.getSelection();
    			if (selection instanceof IStructuredSelection) {			
    				Object obj = (IStructuredSelection) selection;
    				// si nous avons au moins une selection
    				if (obj != null) {		
    					for(Object item : ((IStructuredSelection) selection).toList()){
    						if (item instanceof LibrarieEquipment) {
    							  //Chaque item est un equipement de la librairie
    							  LibrarieEquipment equipment = (LibrarieEquipment) item;
    							   //On ajoute l'équipement à la fiche de manoeuvre
    							  doAddEquipment(equipment);
    				            }
    					}
    				}
    			}
    		}
    		//Si l'opération est la suppression d'un équipement
    		else if(!isAddOperation){
    			DrawingEquipmentTableView view = (DrawingEquipmentTableView)page.findView(DrawingEquipmentTableView.ID);
    			TableViewer tableViewer = view.getViewer();
    			//Récupération de la sélection
    			ISelection selection = tableViewer.getSelection();
    			if (selection instanceof IStructuredSelection) {
    				Object obj = (IStructuredSelection) selection;
    				// si nous avons au moins une selection
    				if (obj != null) {					
    					for(Object item : ((IStructuredSelection) selection).toList()){
    						if (item instanceof DrawingEquipment) {
    							  	//Chaque item est un equipement de la librairie
    								DrawingEquipment equipment = (DrawingEquipment) item;
    								//On supprime l'équipement de la fiche de manoeuvre
    								doDeleteEquipment(equipment);
    				            }
    					}
    				}
    			}
    		}
    		return Status.OK_STATUS;
    	}
     
    	@Override
    	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		// TODO Auto-generated method stub
    		return Status.OK_STATUS;
    	}
     
    	@Override
    	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		// TODO Auto-generated method stub
    		return Status.OK_STATUS;
    	}
     
    	private void doAddEquipment(LibrarieEquipment equipment){
    		//On ajoute l'équipement à la fiche de manoeuvre
    		this.sheetOfManoeuvre.getDrawing().addDrawingEquipment(new DrawingEquipment(equipment));		
    	}
     
    	private void doDeleteEquipment(DrawingEquipment equipment){
    		//On supprime l'équipement à la fiche de manoeuvre
    		this.sheetOfManoeuvre.getDrawing().deleteDrawingEquipment(equipment);
    	}
     
    }
    Je ne vois pas ce que je dois insérer dans les méthode undo() et redo() de cette dernière classe et comment est appeler ces méthodes

    Merci de vos éclaircissements / conseils

    Vince

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Points : 7
    Points
    7
    Par défaut voir le chapitre 3 de ce cours
    ce tutoriel propose des solutions pour des actions bien déterminées y compris undo/redo
    voici le lien
    http://www.psykokwak.com/blog/index....amework-part-4

  4. #4
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Bonjour,
    Merci pour le lien

    En fait mon problème est un problème de compréhension.
    Je n'arrive pas à comprendre comment fonctionne UndoContext et OperationHistory

    Surtout que pour le moment mon appli ajoute et supprime des équipements mais ensuite mon appli aura d'autres fonctions qui seront aussi annulable.


    Si vous avez une explication ou un lien de type "undo/redo pour les nuls" je suis partant

  5. #5
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Points : 159
    Points
    159
    Par défaut
    Voici, le lien qui explique la procédure de Undo/Redo.


    http://www.psykokwak.com/blog/index....amework-part-4

  6. #6
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    merci pour ce lien. Je ne trouve pas beaucoup d'information sur l'undo/redo dans ce tuto. Juste comment insérer la fonction dans un coolBar


    Si quelq'un à plus d'information que ce tuto, je suis vraiment demandeur

    Ca fait plusieurs jours que je cherche mais je ne trouve pas d'explication pour un débutant

    D'avance merci pour votre aide

  7. #7
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Hello,
    Suite à des discussion sur le chat j'ai réussi à avancé sur mon appli

    Désormais, il me reste un problème
    Mes fonctions undo/redo dans les menu (ou toolBar) sont disabled
    Malgré mes ajouts/suppressions d'équipements (action annulable)

    Ma classe qui génère une action annulable :
    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
     
    /**
     * Commande permetant d'ajouter un équipement 
     * à la fiche de manoeuvre
     * Cette commande peut être appellé depuis plusieurs
     * endroit de l'application (MenuBar, ToolBar,
     * Menu contextuel,drag and drop)
     */
    public class AddEquipmentHandler extends AbstractHandler implements IHandler {
    	@Override
    	public Object execute(ExecutionEvent event) throws ExecutionException {
    		//Récupération de la vue contenant l'arbre de la librairie d'équipement
    		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
    		IWorkbenchPage page = window.getActivePage();	
    		//Création d'une opération annulable d'ajout
    		IUndoableOperation operation = new AddEquipmentOperations("Ajouter un équipement",page);
    		//Récupéreation de l'historique des opérations du workbench
    		IWorkbench workbench = window.getWorkbench();
    		IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
    		operationHistory = OperationHistoryFactory.getOperationHistory();
    		//Récupération du contexte d'annulation du workbench
    		IUndoContext undoContext = workbench.getOperationSupport().getUndoContext();
    		//ajout du contexte d'annulation
    		operation.addContext(undoContext);
    		//On lance l'opération d'ajout d'équipement à la fiche de manoeuvre
    		operationHistory.execute(operation,null,null);
     
    		return null;
    	}
    }
    Une action annulable

    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
     
    /**
     * Opération annulable  d'ajout d'équipement 
     * à la fiche de manoeuvre
     * @author Vincent DAMIENS
     */
    public class AddEquipmentOperations extends AbstractOperation {
     
    	private IWorkbenchPage page;
    	private SheetOfManoeuvre sheetOfManoeuvre;
    	private List<Object> oldSelection;
    	private DrawingEquipment[] newEquipments;
    	private int[] equipmentIndex;
    	private ISelection treeViewerSelection;
    	private ISelection tableViewerSelection;
     
    	public AddEquipmentOperations(String label, IWorkbenchPage page) {
    		super(label);
    		this.page = page;
    		// On récupére la fiche de manoeuvre
    		this.sheetOfManoeuvre = Activator.getDefault().getSheetOfManoeuvre();
    		// Récupération de l'arbre de la librairie d'équipements
    		LibrarieExplorerTreeView librarieView = (LibrarieExplorerTreeView) page
    				.findView(LibrarieExplorerTreeView.ID);
    		// Récupération de la sélection courante de l'arbre d'équipement
    		treeViewerSelection = librarieView.getViewer().getSelection();
    		// Récupération du tableau d'équipements
    		DrawingEquipmentTableView tableView = (DrawingEquipmentTableView) page
    				.findView(DrawingEquipmentTableView.ID);
    		// Récupération de la sélection courante du tableau d'équipement
    		tableViewerSelection = tableView.getViewer().getSelection();
    		//Création d'un copie de l'ancienne selection
    		if (tableViewerSelection instanceof IStructuredSelection) {
    			oldSelection = ((IStructuredSelection) tableViewerSelection)
    					.toList();
    		}
    	}
     
    	/**
             * Execution de l'opération Ajout de l'équipement à la fiche de manoeuvre
             */
    	@Override
    	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		if (treeViewerSelection instanceof IStructuredSelection) {
    			// Récupération des equipments sélectionnées dans la librairie
    			List<LibrarieEquipment> selectedEquipment = ((IStructuredSelection) treeViewerSelection)
    					.toList();
    			// Si la sélection n'est pas vide,
    			if (!selectedEquipment.isEmpty()) {
    				// Création de l'ensemble des nouvelles instances d'équipement
    				List<DrawingEquipment> drawingEquipmentList = new ArrayList<DrawingEquipment>();
    				for (LibrarieEquipment equipment : selectedEquipment) {
    					drawingEquipmentList.add(new DrawingEquipment(equipment));
    				}
    				// création d'une liste d'équipement
    				newEquipments = drawingEquipmentList
    						.toArray(new DrawingEquipment[drawingEquipmentList
    								.size()]);
    				// Création du tableau des indices auxquels seront
    				// ajoutés les équipements dans le schéma
    				equipmentIndex  = new int[drawingEquipmentList
    						.size()];
    				int endIndex = sheetOfManoeuvre.getDrawing()
    						.getDrawingEquipment().size();
    				for (int i = 0; i < equipmentIndex.length; i++) {
    					equipmentIndex[i] = endIndex++;
    				}
    				// Ajout des équipments
    				AddDeleteEquipmentHelper.doAddEquipment(this.sheetOfManoeuvre,newEquipments, equipmentIndex);
    			}
    		}
    		return Status.OK_STATUS;
    	}
     
    	@Override
    	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		//Ajout des équipement supprimés
    		AddDeleteEquipmentHelper.doAddEquipment(this.sheetOfManoeuvre,newEquipments, equipmentIndex);
    		return Status.OK_STATUS;
    	}
     
    	@Override
    	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		//Suppresion des équipements et sélection des équipements
            //qui étaient sélectionnées avant l'ajout
    		AddDeleteEquipmentHelper.doDeleteEquipment(this.sheetOfManoeuvre,newEquipments); 
            sheetOfManoeuvre.getDrawing().setSelectedItems(oldSelection);
    		return Status.OK_STATUS;
    	}
    }
    Pour ajouter mes commandes undo/redo, j'ai récupérer les commandes org.eclipse.ui.edit.undo et org.eclipse.ui.edit.redo dans les extensions
    J'ai rien fais d'autre pour insérer mes fonctions dans mon appli
    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
     
             <menu
                   id="ltmanager.editmenu"
                   label="Edition">
                <command
                      commandId="org.eclipse.ui.edit.undo"
                      icon="icons/undo.gif"
                      label="Annuler"
                      style="push"
                      tooltip="Annuler la dernière action">
                </command>
                <command
                      commandId="org.eclipse.ui.edit.redo"
                      icon="icons/redo.gif"
                      label="Refaire"
                      style="push"
                      tooltip="Refaire la dernière action">
                </command>
                <separator
                      name="LTManager-0.1.separator1">
                </separator>
             </menu>
    merci pour votre aide

  8. #8
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Yep !
    J'ai codé directement la fonction undo et redo dans un Handler et ça marche


    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
     
    public class UndoHandler extends AbstractHandler implements IHandler {
     
    	@Override
    	public Object execute(ExecutionEvent event) throws ExecutionException {
    		//Récupération de la fénêtre
    		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);	
    		//Récupéreation de l'historique des opérations du workbench
    		IWorkbench workbench = window.getWorkbench();
    		IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
    		//Récupération du contexte d'annulation du workbench
    		IUndoContext undoContext = workbench.getOperationSupport().getUndoContext();
    		try {
    			IStatus status = operationHistory.undo(undoContext, null, null);
    		} catch (ExecutionException e) {
    			e.printStackTrace();
    		}
     
    		return null;
    	}
     
    }

  9. #9
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    Je reviens vers vous car je souhaites vraiment comprendre pourquoi, je n'arrive pas à faire fonctionner les fonctions undo/redo de ce tuto:

    http://help.eclipse.org/help32/index...rkAdv_undo.htm

    Pour essayer de comprendre, j'ai réalisé le test avec un exemple simple comme dans le tuto et cela ne fonctionne toujours pas.

    J'ai une action qui implemente IWorkbenchWindowActionDelegate
    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
     
    public class MonAction implements IWorkbenchWindowActionDelegate {
     
    	private IWorkbenchWindow window;
     
    	@Override
    	public void dispose() {
    		// TODO Auto-generated method stub
    	}
     
    	@Override
    	public void init(IWorkbenchWindow window) {
    		this.window = window;
    	}
     
    	@Override
    	public void run(IAction action) {
    		//Création d'une opération annulable
    		IUndoableOperation operation = new ActionOperation(window.getShell());
    		//Récupéreation de l'historique des opérations du workbench
    		IWorkbench workbench = window.getWorkbench();
    		IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
    		operationHistory = OperationHistoryFactory.getOperationHistory();
    		//Récupération du contexte d'annulation du workbench
    		IUndoContext undoContext = workbench.getOperationSupport().getUndoContext();
    		//ajout du contexte d'annulation
    		operation.addContext(undoContext);
    		//On lance l'opération d'ajout d'équipement à la fiche de manoeuvre
    		try {
    			operationHistory.execute(operation,null,null);
    		} catch (ExecutionException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
    	@Override
    	public void selectionChanged(IAction action, ISelection selection) {
    		// TODO Auto-generated method stub
     
    	}
    }
    Et une opération qui hérite AbstractOperation
    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
     
    public class ActionOperation extends AbstractOperation{
     
    	private Shell shell;
     
     
    	public ActionOperation(Shell shell) {
    		super("Test operation");
    		this.shell = shell;
    	}
     
    	@Override
    	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		MessageDialog.openInformation(shell, "Test", "Action executée");
    		return Status.OK_STATUS;
    	}
     
    	@Override
    	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		MessageDialog.openInformation(shell, "Test", "action Undo executée");
    		return Status.OK_STATUS;
    	}
     
    	@Override
    	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
    			throws ExecutionException {
    		MessageDialog.openInformation(shell, "Test", "action Redo executée");
    		return Status.OK_STATUS;
    	}
    }
    Mon ApplicationActionBarAdvisor qui configure les menu
    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
     
    public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
     
        public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
            super(configurer);
        }
     
        protected void makeActions(IWorkbenchWindow window) {
     
        }
     
        protected void fillMenuBar(IMenuManager menuBar) {
        	IWorkbenchWindow window = getActionBarConfigurer().getWindowConfigurer().getWindow();
        	menuBar.add(createFileMenu(window));
        	menuBar.add(createEditMenu(window));
        }
     
     
     
    	private MenuManager createFileMenu(IWorkbenchWindow window) {
    		MenuManager menuMgr = new MenuManager("Fichier",IWorkbenchActionConstants.M_FILE);
    		menuMgr.add(new GroupMarker(IWorkbenchActionConstants.FILE_START));
    		menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
    		IWorkbenchAction action = ActionFactory.QUIT.create(window);
    		menuMgr.add(action);
    		action.setText("Quitter");
    		menuMgr.add(new GroupMarker(IWorkbenchActionConstants.FILE_END));
    		return menuMgr;
    	}
     
    	private MenuManager createEditMenu(IWorkbenchWindow window) {
    		MenuManager menuEdit = new MenuManager("Edition",IWorkbenchActionConstants.M_EDIT);
    		IWorkbenchAction undo = ActionFactory.UNDO.create(window);
    		IWorkbenchAction redo = ActionFactory.REDO.create(window);
    		menuEdit.add(undo);
    		menuEdit.add(redo);
    		return menuEdit;
    	}
     
    }
    Mon actionSet pour l'action à executer
    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
     
       <extension
             point="org.eclipse.ui.actionSets">
          <actionSet
                id="MonApplication.actionSet2"
                label="label"
                visible="true">
             <action
                   class="fr.MonApplication.Actions.MonAction"
                   id="MonApplication.action2"
                   label="mon action"
                   menubarPath="file/groupe1"
                   style="push">
             </action>
          </actionSet>
       </extension>
    Lorsque j'exécute mon action le menu undo reste grisé
    Je ne comprend vraiment comment faire fonctionner convenablement ces fonctions (undo/redo) comme dans le tuto.
    Le code ci-dessus est pourtant simple


    D'avance merci pour votre aide

  10. #10
    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 : 39
    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
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut pingoui,

    Je sais pas si ton problème est toujours d'actualité... Tu as peut-être trouvé une solution entre temps.
    En tout cas, de ce que je vois, il pourrait s'agir d'un problème de rafraichissement des Menus Undo/Redo. Dans mon cas, j'utilise la même chose que toi, (mais en plus j'avais une autre IUndoableOperation déclarée dans un Editor) donc, je faisais :
    - opération de l'éditeur (les Menus se mettent à jour).
    - autre opération (pas de mise à jour et Menu grisé).
    - opération de l'éditeur (Menus mis à jour).

    Ensuite, quand j'ai fais un undo, le Menu Undo c'est mis à jour pour prendre en compte l'autre opération.

    Je sais pas si tout est clair... Mais dans mon cas, j'ai pu régler ça en ajoutant les lignes suivantes à ma View ou à mon Editor :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    IWorkbench workbench = PlatformUI.getWorkbench();
    IUndoContext undoContext =
            workbench.getOperationSupport().getUndoContext();
    UndoRedoActionGroup undoRedoActions =
            new UndoRedoActionGroup(getSite(), undoContext, false);
    // getViewSite() est remplacé par getEditorSite() pour un Editor.
    undoRedoActions.fillActionBars(getViewSite().getActionBars());

    Voilà, ++
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

Discussions similaires

  1. Undo/Redo sur Text n'utilise pas ceux de l'application
    Par jojodu31 dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 01/09/2011, 15h47
  2. [e4] Erreurs sur une simple appli RCP
    Par pingoui dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 26/07/2011, 22h48
  3. [RCP] LabelRetargetAction & opération undo/redo
    Par pingoui dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 19/08/2010, 21h15
  4. question sur undo/redo
    Par thibal_kamehouse dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 11/03/2008, 09h52
  5. [EJB] Débutant en EJB sur Weblogic
    Par viny dans le forum JBuilder
    Réponses: 8
    Dernier message: 24/04/2003, 15h34

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