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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 584
    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 éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 584
    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
    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
    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 éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 584
    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 éclairé
    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
    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 éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 584
    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 éclairé Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 584
    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

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