Skip to main content
summaryrefslogtreecommitdiffstats
blob: 95a56b6b718d31ce1cdf72dba8ac42331ccabfe3 (plain) (blame)
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
/**
 * Copyright (c) 2010 Sierra Wireless and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Jacques Lescot, Sierra Wireless - initial API and implementation (bug 300462)
 *
 * $Id: RemoveAction.java,v 1.1 2010/01/22 16:42:08 bcabe Exp $
 */
package org.eclipse.pde.emfforms.editor.actions;

import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.pde.emfforms.editor.EmfActionBarContributor;
import org.eclipse.pde.emfforms.editor.EmfMasterDetailBlock;
import org.eclipse.pde.emfforms.internal.Activator;
import org.eclipse.pde.emfforms.internal.editor.IEmfFormsImages;

public class RemoveAction extends Action {

	public void addPropertyChangeListener(IPropertyChangeListener listener) {
		getDeleteAction().addPropertyChangeListener(listener);
	}

	public int getAccelerator() {
		return getDeleteAction().getAccelerator();
	}

	public String getActionDefinitionId() {
		return getDeleteAction().getActionDefinitionId();
	}

	public String getDescription() {
		return getDeleteAction().getDescription();
	}

	public String getToolTipText() {
		return getDeleteAction().getToolTipText();
	}

	@Override
	public void setEnabled(boolean enabled) {
		getDeleteAction().setEnabled(enabled);
	}

	public boolean isEnabled() {
		return getDeleteAction().isEnabled();
	}

	@Override
	public String getText() {
		return getDeleteAction().getText();
	}

	@Override
	public void run() {
		TreeViewer treeViewer = masterDetail.getTreeViewer();

		EObject nearestEltToSelect = computeElementToSelectAfterDeletion(treeViewer);

		getDeleteAction().run();

		treeViewer.refresh();
		if (nearestEltToSelect != null) {
			treeViewer.setSelection(new StructuredSelection(nearestEltToSelect));
			treeViewer.getTree().setFocus();
		}
	}

	/**
	 * Find the next element to be selected in the tree once the delete operation has been performed
	 * 
	 * @param treeViewer The {@link TreeViewer}
	 * @return the next {@link EObject} to be selected in the tree or <code>null</code> if none found. A possible reason to that last case is because there is no remaining element to select in the tree.
	 */
	protected EObject computeElementToSelectAfterDeletion(TreeViewer treeViewer) {
		EObject nextObjToSelect = null;

		// Iterate over all the selected element to be removed to define the new element to select in the tree after the delete operation is performed. 
		List<EObject> selectedElements = (List<EObject>) ((StructuredSelection) treeViewer.getSelection()).toList();
		for (EObject eltToRemove : selectedElements) {
			EObject containerElt = eltToRemove.eContainer();
			EStructuralFeature eContainingFeature = eltToRemove.eContainingFeature();
			// Retrieve all the siblings elements and try to select the nearest one
			Object featureValue = containerElt.eGet(eContainingFeature);
			if (featureValue instanceof List<?>) {
				List<EObject> siblingElts = (List<EObject>) featureValue;
				EObject candidateElt = getSelectableElement(selectedElements, siblingElts, eltToRemove);
				if (candidateElt != null) {
					return candidateElt;
				}
			}
		}
		return nextObjToSelect;
	}

	private EObject getSelectableElement(List<EObject> eltsToRemoveList, List<EObject> siblingElts, EObject eltToRemove) {
		int indexEltToRemove = siblingElts.indexOf(eltToRemove);
		// Try to search the next element in the list
		for (int i = indexEltToRemove + 1; i < siblingElts.size(); i++) {
			if (!eltsToRemoveList.contains(siblingElts.get(i))) {
				return siblingElts.get(i);
			}
		}
		// Or search among the previous elements in the list
		for (int i = indexEltToRemove - 1; i >= 0; i--) {
			if (!eltsToRemoveList.contains(siblingElts.get(i))) {
				return siblingElts.get(i);
			}
		}
		// Or return the parent element
		if (!eltsToRemoveList.contains(eltToRemove.eContainer())) {
			return eltToRemove.eContainer();
		}
		return null;
	}

	private EmfMasterDetailBlock masterDetail;

	public RemoveAction(EmfMasterDetailBlock masterDetail) {
		super();
		this.masterDetail = masterDetail;
		getDeleteAction();

	}

	private IAction getDeleteAction() {
		EditingDomainActionBarContributor actionBarContributor = masterDetail.getEditor().getActionBarContributor();
		if (actionBarContributor != null && actionBarContributor instanceof EmfActionBarContributor)
			return ((EmfActionBarContributor) actionBarContributor).getDeleteAction();
		return null;
	}

	@Override
	public ImageDescriptor getImageDescriptor() {
		return ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource(IEmfFormsImages.REMOVE_TOOLBAR_BUTTON));
	}
}

Back to the top