78
|
1 /*******************************************************************************
|
|
2 * Copyright (c) 2007 Peter Centgraf and others.
|
|
3 * All rights reserved. This program and the accompanying materials
|
|
4 * are made available under the terms of the Eclipse Public License v1.0
|
|
5 * which accompanies this distribution, and is available at
|
|
6 * http://www.eclipse.org/legal/epl-v10.html
|
|
7 *
|
|
8 * Contributors:
|
|
9 * Peter Centgraf - initial API and implementation, bug 124683
|
|
10 * Boris Bokowski, IBM Corporation - initial API and implementation
|
|
11 *******************************************************************************/
|
|
12 module org.eclipse.jface.internal.databinding.viewers.SelectionProviderMultipleSelectionObservableList;
|
|
13
|
|
14 import java.lang.all;
|
|
15
|
|
16 import java.util.ArrayList;
|
|
17 import java.util.Collections;
|
|
18 import java.util.List;
|
|
19
|
|
20 import org.eclipse.core.databinding.observable.Diffs;
|
|
21 import org.eclipse.core.databinding.observable.Realm;
|
|
22 import org.eclipse.core.databinding.observable.list.ListDiff;
|
|
23 import org.eclipse.core.databinding.observable.list.WritableList;
|
|
24 import org.eclipse.jface.viewers.ISelection;
|
|
25 import org.eclipse.jface.viewers.ISelectionChangedListener;
|
|
26 import org.eclipse.jface.viewers.ISelectionProvider;
|
|
27 import org.eclipse.jface.viewers.IStructuredSelection;
|
|
28 import org.eclipse.jface.viewers.SelectionChangedEvent;
|
|
29 import org.eclipse.jface.viewers.StructuredSelection;
|
|
30
|
|
31 /**
|
|
32 * Observes multiple-selection of an {@link ISelectionProvider}.
|
|
33 *
|
|
34 * @since 1.2
|
|
35 */
|
|
36 public class SelectionProviderMultipleSelectionObservableList :
|
|
37 WritableList {
|
|
38
|
|
39 protected ISelectionProvider selectionProvider;
|
|
40 protected bool handlingSelection;
|
|
41 protected bool updating;
|
|
42 protected SelectionListener selectionListener = new SelectionListener();
|
|
43
|
|
44 class SelectionListener : ISelectionChangedListener {
|
|
45 public void selectionChanged(SelectionChangedEvent event) {
|
|
46 if (updating) {
|
|
47 return;
|
|
48 }
|
|
49 handlingSelection = true;
|
|
50 try {
|
|
51 updateWrappedList(new ArrayList(getSelectionList(event.getSelection())));
|
|
52 } finally {
|
|
53 handlingSelection = false;
|
|
54 }
|
|
55 }
|
|
56 }
|
|
57
|
|
58 /**
|
|
59 * Create a new observable list based on the current selection of the given
|
|
60 * selection provider. Assumes that the selection provider provides
|
|
61 * structured selections.
|
|
62 *
|
|
63 * @param realm
|
|
64 * @param selectionProvider
|
|
65 * @param elementType
|
|
66 */
|
|
67 public this(Realm realm,
|
|
68 ISelectionProvider selectionProvider, Object elementType) {
|
|
69 super(realm, new ArrayList(getSelectionList(selectionProvider)), elementType);
|
|
70 this.selectionProvider = selectionProvider;
|
|
71 selectionProvider.addSelectionChangedListener(selectionListener);
|
|
72 }
|
|
73
|
|
74 protected void fireListChange(ListDiff diff) {
|
|
75 if (handlingSelection) {
|
|
76 super.fireListChange(diff);
|
|
77 } else {
|
|
78 // this is a bit of a hack - we are changing the diff to match the order
|
|
79 // of elements returned by the selection provider after we've set the
|
|
80 // selection.
|
|
81 updating = true;
|
|
82 try {
|
|
83 List oldList = getSelectionList(selectionProvider);
|
|
84 selectionProvider
|
|
85 .setSelection(new StructuredSelection(wrappedList));
|
|
86 wrappedList = new ArrayList(getSelectionList(selectionProvider));
|
|
87 super.fireListChange(Diffs.computeListDiff(oldList, wrappedList));
|
|
88 } finally {
|
|
89 updating = false;
|
|
90 }
|
|
91 }
|
|
92 }
|
|
93
|
|
94 protected static List getSelectionList(ISelectionProvider selectionProvider) {
|
|
95 if (selectionProvider is null) {
|
|
96 throw new IllegalArgumentException();
|
|
97 }
|
|
98 return getSelectionList(selectionProvider.getSelection());
|
|
99 }
|
|
100
|
|
101 protected static List getSelectionList(ISelection sel) {
|
|
102 if (null !is cast(IStructuredSelection)sel) {
|
|
103 return (cast(IStructuredSelection) sel).toList();
|
|
104 }
|
|
105 return Collections.EMPTY_LIST;
|
|
106 }
|
|
107
|
|
108 public synchronized void dispose() {
|
|
109 selectionProvider.removeSelectionChangedListener(selectionListener);
|
|
110 selectionProvider = null;
|
|
111 super.dispose();
|
|
112 }
|
|
113 }
|