Bonjour,

J'essaye de résoudre un IndexOutOfBoundsException mais en vain
Les points 1 à 5 suivants fonctionnent correctement

1) Je lance ma commande (execute) pour ajouter un équipement (AddEquipmentOperation)
Cette commande ajoute l’équipement à l’index 1
Sortie console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Ajout Disjoncteur index 0
2) Je lance ma commande de suppression (execute) pour supprimer l’équipement ajouté précédemment (DeleteEquipmentOperation)
Sortie console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
drawingEquipmentList size 1
drawingEquipmentList get(0) Disjoncteur
selection size 1
equipement Disjoncteur indice 0
suppression Disjoncteur index 0

3) J’annule (Undo) mon opération de suppression
Sortie console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Undo Delete => add
Ajout Disjoncteur index 0

4) J’annule (Undo) mon opération d’ajout (retour à l’état initial sans équipement)
Sortie console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Undo Add => delete
suppresion Disjoncteur index 0
5) Je refais (Redo) mon opération d’ajout
Sortie console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Redo Add => add
Ajout Disjoncteur index 0
6) Je refais (Redo) mon opération de suppression
Sortie console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
Redo Delete => delete
drawingEquipment size 1
drawingEquipment get(0) Disjoncteur
selection size 1
equipement Disjoncteur indice -1
suppresion Disjoncteur index -1
On peut constater que l'index passe à -1
La suppression ne fonctionne pas


7) J’essaye de annuler (Undo) la suppression et j’ai cette erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
java.lang.IndexOutOfBoundsException: Index: -1, Size: 1
	at java.util.ArrayList.add(Unknown Source)
	at ltmanager.model.Drawing.addDrawingEquipment(Drawing.java:74)
	at ltmanager.operations.AddDeleteEquipmentHelper.doAddEquipment(AddDeleteEquipmentHelper.java:28)
	at ltmanager.operations.DeleteEquipmentOperation.undo(DeleteEquipmentOperation.java:104)
Pour moi l'erreur provient du point 6) mais je ne vois pas où
DeleteEquipmentOperation
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
 
public class DeleteEquipmentOperation extends EquipmentOperation {
 
	private SheetOfManoeuvre sheetOfManoeuvre;
	private DrawingEquipment [] equipment;
	private int [] equipmentIndex;
	private ISelection tableViewerSelection;
 
	public DeleteEquipmentOperation(String label,IUndoContext undoContext) {
		super(label,undoContext);
		//On récupére la fiche de manoeuvre
		//Récupération de la fenêtre
		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
		IWorkbenchPage page = window.getActivePage();
		this.sheetOfManoeuvre = Activator.getDefault().getSheetOfManoeuvre();
		// 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();
	}
 
	/**
         * Execution de l'opération
         * Suppresion de l'équipement de la fiche de manoeuvre
         */
	@Override
	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
			throws ExecutionException {
 
		if (tableViewerSelection instanceof IStructuredSelection) {
		    //Récupération de la liste des équipments du schéma
		    List<DrawingEquipment> drawingEquipmentList = this.sheetOfManoeuvre.getDrawing().getDrawingEquipment();
		    System.out.println("drawingEquipmentList size "+drawingEquipmentList.size());
		    System.out.println("drawingEquipmentList get(0) "+drawingEquipmentList.get(0).getName());
		    System.out.println("selection size "+((IStructuredSelection) tableViewerSelection).toList().size());
			// si nous avons au moins un équipement
			if (!drawingEquipmentList.isEmpty()) {				
			    //Création d'un dictionnaire qui classifie les équipements
			    //à supprimer dans l'ordre ascendant de
			    //leur indice dans le schéma
			    Map<Integer, DrawingEquipment> sortedMap = new TreeMap<Integer, DrawingEquipment>();
			    for(Object item : ((IStructuredSelection) tableViewerSelection).toList()){
					if (item instanceof DrawingEquipment) {
						  	//Chaque item est un equipement de la librairie
							DrawingEquipment equipment = (DrawingEquipment) item;
							System.out.println("equipement "+equipment.getName()+ " indice "+drawingEquipmentList.indexOf(equipment));
							sortedMap.put(drawingEquipmentList.indexOf(equipment), equipment);
			            }
				}
			    //Récupération des équipements à supprimer
			    //dans l'ordre de leur indice
			    equipment  = sortedMap.values().
			        toArray(new DrawingEquipment [sortedMap.size()]);
			    //Création du tableau des indices croissants
			    //des équipments à supprimer
			    equipmentIndex = new int [equipment.length];
			    int i = 0;
			    for (int index : sortedMap.keySet()) {
			    	equipmentIndex [i++] = index; 
			    }
			    //suppression des équipements
			    AddDeleteEquipmentHelper.doDeleteEquipment(this.sheetOfManoeuvre,equipment);
			}
		}
		return Status.OK_STATUS;
	}
 
	@Override
	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
			throws ExecutionException {
		//Ajout des équipements supprimés
 
		try {
			System.out.println("Undo Delete => add");
			AddDeleteEquipmentHelper.doAddEquipment(this.sheetOfManoeuvre,equipment, equipmentIndex);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
		return Status.OK_STATUS;
	}
 
	@Override
	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
			throws ExecutionException {
		System.out.println("Redo Delete => delete");
		//sélection des équipements qui étaient sélectionnées avant la suppression
        sheetOfManoeuvre.getDrawing().setSelectedItems(Arrays.asList(equipment));
		//re-suppression des équipements
		return execute(monitor, info);
	}
}
Ca fait un moment que je cherche à débugger mais je ne comprend pas d'où vient mon erreur.

D'avance merci pour votre aide