1 /*******************************************************************************
2 * Copyright (C) 2017, Thomas Wolf <thomas.wolf@paranor.ch>
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *******************************************************************************/
9 package org
.eclipse
.egit
.ui
.internal
.selection
;
11 import java
.util
.ArrayList
;
12 import java
.util
.List
;
14 import org
.eclipse
.core
.runtime
.Assert
;
15 import org
.eclipse
.jface
.viewers
.IPostSelectionProvider
;
16 import org
.eclipse
.jface
.viewers
.ISelection
;
17 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
18 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
19 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
20 import org
.eclipse
.jface
.viewers
.Viewer
;
21 import org
.eclipse
.swt
.SWT
;
22 import org
.eclipse
.swt
.widgets
.Control
;
23 import org
.eclipse
.swt
.widgets
.Listener
;
26 * A {@link IPostSelectionProvider} for views with several viewers, tracking
27 * focus changes among the viewers to supply the correct selection.
29 public class MultiViewerSelectionProvider
extends AbstractSelectionProvider
{
31 private final List
<Viewer
> viewers
= new ArrayList
<>();
33 private final Listener focusHook
= event
-> {
34 if (event
.type
== SWT
.FocusIn
&& event
.widget
instanceof Control
) {
35 focusChanged((Control
) event
.widget
);
39 private final ISelectionChangedListener selectionHook
= event
-> selectionChanged(
42 private final ISelectionChangedListener postSelectionHook
= event
-> postSelectionChanged(
45 private Viewer currentViewer
;
48 * Creates a new {@link MultiViewerSelectionProvider} for the given viewers.
49 * The first viewer given is assumed to be the one that's focused initially.
52 * that contribute to this selection provider
54 public MultiViewerSelectionProvider(Viewer
... providers
) {
55 Assert
.isLegal(providers
!= null && providers
.length
> 0);
56 for (Viewer viewer
: providers
) {
57 Assert
.isLegal(viewer
!= null);
59 viewer
.getControl().addListener(SWT
.FocusIn
, focusHook
);
60 viewer
.addSelectionChangedListener(selectionHook
);
61 if (viewer
instanceof IPostSelectionProvider
) {
62 ((IPostSelectionProvider
) viewer
)
63 .addPostSelectionChangedListener(postSelectionHook
);
65 if (currentViewer
== null) {
66 currentViewer
= viewer
;
71 private void focusChanged(Control control
) {
72 for (Viewer viewer
: viewers
) {
73 if (control
== viewer
.getControl()) {
74 if (viewer
!= currentViewer
) {
75 currentViewer
= viewer
;
76 fireSelectionChanged(getSelectionListeners());
77 fireSelectionChanged(getPostSelectionListeners());
84 private void selectionChanged(SelectionChangedEvent event
) {
85 if (event
.getSelectionProvider() == currentViewer
) {
86 fireSelectionChanged(getSelectionListeners());
90 private void postSelectionChanged(SelectionChangedEvent event
) {
91 if (event
.getSelectionProvider() == currentViewer
) {
92 fireSelectionChanged(getPostSelectionListeners());
97 public ISelection
getSelection() {
98 if (currentViewer
!= null) {
99 return currentViewer
.getSelection();
101 return StructuredSelection
.EMPTY
;
105 public void setSelection(ISelection selection
) {
106 if (currentViewer
!= null) {
107 currentViewer
.setSelection(selection
);