Toolbar button to switch repositories in git views
[egit/eclipse.git] / org.eclipse.egit.ui / src / org / eclipse / egit / ui / internal / selection / MultiViewerSelectionProvider.java
blobe4efe789ab13616ed8a9f907fd9edb6c6e537e26
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;
25 /**
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(
40 event);
42 private final ISelectionChangedListener postSelectionHook = event -> postSelectionChanged(
43 event);
45 private Viewer currentViewer;
47 /**
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.
51 * @param providers
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);
58 viewers.add(viewer);
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());
79 return;
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());
96 @Override
97 public ISelection getSelection() {
98 if (currentViewer != null) {
99 return currentViewer.getSelection();
101 return StructuredSelection.EMPTY;
104 @Override
105 public void setSelection(ISelection selection) {
106 if (currentViewer != null) {
107 currentViewer.setSelection(selection);