Skip to content

Package: MasterDetailSelectionProvider

MasterDetailSelectionProvider

nameinstructionbranchcomplexitylinemethod
MasterDetailSelectionProvider(ISelectionProvider)
M: 0 C: 27
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 8
100%
M: 0 C: 1
100%
addPostSelectionChangedListener(ISelectionChangedListener)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
addSelectionChangedListener(ISelectionChangedListener)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
forward(ListenerList, ISelection)
M: 0 C: 14
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
getActiveSelectionProvider()
M: 0 C: 9
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getSelection()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
hookListeners(ISelectionProvider)
M: 0 C: 13
100%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 0 C: 4
100%
M: 0 C: 1
100%
lambda$0(SelectionChangedEvent)
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
lambda$1(SelectionChangedEvent)
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
lambda$2(SelectionChangedEvent, ISelectionChangedListener)
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
pumpSelection()
M: 0 C: 14
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
removePostSelectionChangedListener(ISelectionChangedListener)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
removeSelectionChangedListener(ISelectionChangedListener)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
setDetailSelectionProvider(ISelectionProvider)
M: 0 C: 18
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
setSelection(ISelection)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
unhookListeners(ISelectionProvider)
M: 0 C: 13
100%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 0 C: 4
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2019 Christian W. Damus and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Christian W. Damus - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emf.ecp.view.spi.swt.selection;
15:
16: import org.eclipse.core.runtime.ListenerList;
17: import org.eclipse.jface.viewers.IPostSelectionProvider;
18: import org.eclipse.jface.viewers.ISelection;
19: import org.eclipse.jface.viewers.ISelectionChangedListener;
20: import org.eclipse.jface.viewers.ISelectionProvider;
21: import org.eclipse.jface.viewers.SelectionChangedEvent;
22:
23: /**
24: * Default implementation of a master-detail selection provider.
25: *
26: * @since 1.21
27: */
28: public class MasterDetailSelectionProvider implements IMasterDetailSelectionProvider, IPostSelectionProvider {
29:         private final ListenerList<ISelectionChangedListener> listeners = new ListenerList<>();
30:         private final ListenerList<ISelectionChangedListener> postListeners = new ListenerList<>();
31:
32:         private final ISelectionChangedListener forwarder = event -> forward(listeners, event.getSelection());
33:         private final ISelectionChangedListener postForwarder = event -> forward(postListeners, event.getSelection());
34:
35:         private final ISelectionProvider master;
36:         private ISelectionProvider detail;
37:
38:         /**
39:          * Initializes me with the {@code master} selection provider to which I delegate.
40:          *
41:          * @param master my master selection provider
42:          */
43:         public MasterDetailSelectionProvider(ISelectionProvider master) {
44:                 super();
45:
46:                 this.master = master;
47:
48:                 hookListeners(master);
49:         }
50:
51:         /**
52:          * Get the currently active selection provider.
53:          *
54:          * @return the active selection provider
55:          */
56:         protected final ISelectionProvider getActiveSelectionProvider() {
57:•                return detail != null ? detail : master;
58:         }
59:
60:         @Override
61:         public ISelection getSelection() {
62:                 return getActiveSelectionProvider().getSelection();
63:         }
64:
65:         @Override
66:         public void setSelection(ISelection selection) {
67:                 getActiveSelectionProvider().setSelection(selection);
68:         }
69:
70:         @Override
71:         public void addSelectionChangedListener(ISelectionChangedListener listener) {
72:                 listeners.add(listener);
73:         }
74:
75:         @Override
76:         public void removeSelectionChangedListener(ISelectionChangedListener listener) {
77:                 listeners.remove(listener);
78:         }
79:
80:         @Override
81:         public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
82:                 postListeners.add(listener);
83:         }
84:
85:         @Override
86:         public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
87:                 postListeners.remove(listener);
88:         }
89:
90:         @Override
91:         public void setDetailSelectionProvider(ISelectionProvider selectionProvider) {
92:•                if (selectionProvider != detail) {
93:                         unhookListeners(getActiveSelectionProvider());
94:
95:                         detail = selectionProvider;
96:
97:                         hookListeners(getActiveSelectionProvider());
98:
99:                         pumpSelection();
100:                 } // else nothing changed
101:         }
102:
103:         private void hookListeners(ISelectionProvider delegate) {
104:                 delegate.addSelectionChangedListener(forwarder);
105:•                if (delegate instanceof IPostSelectionProvider) {
106:                         ((IPostSelectionProvider) delegate).addPostSelectionChangedListener(postForwarder);
107:                 }
108:         }
109:
110:         private void unhookListeners(ISelectionProvider delegate) {
111:•                if (delegate instanceof IPostSelectionProvider) {
112:                         ((IPostSelectionProvider) delegate).removePostSelectionChangedListener(postForwarder);
113:                 }
114:                 delegate.removeSelectionChangedListener(forwarder);
115:         }
116:
117:         /**
118:          * Distribute my current selection to listeners.
119:          */
120:         protected final void pumpSelection() {
121:                 final ISelection selection = getSelection();
122:                 forward(listeners, selection);
123:                 forward(postListeners, selection);
124:         }
125:
126:         private void forward(ListenerList<? extends ISelectionChangedListener> listeners, ISelection selection) {
127:•                if (!listeners.isEmpty()) {
128:                         final SelectionChangedEvent forward = new SelectionChangedEvent(this, selection);
129:                         listeners.forEach(l -> l.selectionChanged(forward));
130:                 }
131:         }
132:
133: }