blob: 3b6a535a983a232ef1181bc03fce3e675a2500e2 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2006, 2021 IBM Corporation and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0.
#
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
# IBM Corporation - org.eclipse.platform: initial API and implementation
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.ecommons.ui.components;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Tree;
/**
*
*/
public class TreeAndListGroup implements ISelectionChangedListener {
private Object fRoot;
private Object fCurrentTreeSelection;
private final ListenerList fSelectionChangedListeners = new ListenerList();
private final ListenerList fDoubleClickListeners = new ListenerList();
private final ITreeContentProvider fTreeContentProvider;
private final IStructuredContentProvider fListContentProvider;
private final ILabelProvider fTreeLabelProvider;
private final ILabelProvider fListLabelProvider;
private final ViewerComparator fComparator;
// widgets
private final Composite fControl;
private SashForm fSplitControl;
private TreeViewer fTreeViewer;
private TableViewer fListViewer;
private boolean fAllowMultiselection = false;
/**
* Create an instance of this class. Use this constructor if you wish to specify
* the width and/or height of the combined widget (to only hardcode one of the
* sizing dimensions, specify the other dimension's value as -1)
*
* @param parent org.eclipse.swt.widgets.Composite
* @param style int
* @param rootObject java.lang.Object
* @param width int
* @param height int
* @param allowMultiselection Whether to allow multi-selection in the list viewer.
*/
public TreeAndListGroup(final Composite parent, final Object rootObject,
final ITreeContentProvider treeContentProvider, final ILabelProvider treeLabelProvider,
final IStructuredContentProvider listContentProvider, final ILabelProvider listLabelProvider,
final ViewerComparator comparator, final boolean allowMultiselection) {
fRoot = rootObject;
fTreeContentProvider = treeContentProvider;
fListContentProvider = listContentProvider;
fTreeLabelProvider = treeLabelProvider;
fListLabelProvider = listLabelProvider;
fComparator = comparator;
fAllowMultiselection = allowMultiselection;
fControl = createControls(parent);
}
public Composite getControl() {
return fControl;
}
// /**
// * This method must be called just before this window becomes visible.
// */
// public void initDefaultSelection() {
//
// fCurrentTreeSelection = null;
//
// //select the first element in the list
// Object[] elements = fTreeContentProvider.getElements(fRoot);
// Object primary = elements.length > 0 ? elements[0] : null;
// if (primary != null) {
// fTreeViewer.setSelection(new StructuredSelection(primary));
// }
// }
/**
* Add the passed listener to collection of clients
* that listen for changes to list viewer selection state
*
* @param listener ISelectionChangedListener
*/
public void addSelectionChangedListener(final ISelectionChangedListener listener) {
fSelectionChangedListeners.add(listener);
}
/**
* Add the given listener to the collection of clients that listen to
* double-click events in the list viewer
*
* @param listener IDoubleClickListener
*/
public void addDoubleClickListener(final IDoubleClickListener listener) {
fDoubleClickListeners.add(listener);
}
/**
* Notify all selection listeners that a selection has occurred in the list
* viewer
*/
protected void notifySelectionListeners(final SelectionChangedEvent event) {
for (final Object o : fSelectionChangedListeners.getListeners()) {
((ISelectionChangedListener) o).selectionChanged(event);
}
}
/**
* Notify all double click listeners that a double click event has occurred
* in the list viewer
*/
protected void notifyDoubleClickListeners(final DoubleClickEvent event) {
for (final Object o : fDoubleClickListeners.getListeners()) {
((IDoubleClickListener) o).doubleClick(event);
}
}
/**
* Lay out and initialize self's visual components.
*
* @param parent org.eclipse.swt.widgets.Composite
* @param width int
* @param height int
*/
protected Composite createControls(final Composite parent) {
fSplitControl = new SashForm(parent, SWT.HORIZONTAL);
fSplitControl.setVisible(true);
fSplitControl.setFont(parent.getFont());
createTreeViewer(fSplitControl);
createListViewer(fSplitControl);
fSplitControl.setWeights(1, 1);
return fSplitControl;
}
/**
* Create this group's list viewer.
*/
protected void createListViewer(final Composite parent) {
int style;
if (fAllowMultiselection) {
style = SWT.MULTI;
} else {
style = SWT.SINGLE;
}
fListViewer = new TableViewer(parent, SWT.BORDER | style);
final GridData data = new GridData(GridData.FILL_BOTH);
fListViewer.getTable().setLayoutData(data);
fListViewer.getTable().setFont(parent.getFont());
fListViewer.setContentProvider(fListContentProvider);
fListViewer.setLabelProvider(fListLabelProvider);
fListViewer.setComparator(fComparator);
fListViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
notifySelectionListeners(event);
}
});
fListViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(final DoubleClickEvent event) {
if (!event.getSelection().isEmpty()) {
notifyDoubleClickListeners(event);
}
}
});
}
/**
* Create this group's tree viewer.
*/
protected void createTreeViewer(final Composite parent) {
final Tree tree = new Tree(parent, SWT.BORDER);
final GridData data = new GridData(GridData.FILL_BOTH);
tree.setLayoutData(data);
tree.setFont(parent.getFont());
fTreeViewer = new TreeViewer(tree);
fTreeViewer.setContentProvider(fTreeContentProvider);
fTreeViewer.setLabelProvider(fTreeLabelProvider);
fTreeViewer.setComparator(fComparator);
fTreeViewer.addSelectionChangedListener(this);
}
public Table getListTable() {
return fListViewer.getTable();
}
public IStructuredSelection getListSelection() {
final ISelection selection = fListViewer.getSelection();
if (selection instanceof IStructuredSelection) {
return (IStructuredSelection)selection;
}
return StructuredSelection.EMPTY;
}
public void selectListElement(final Object element) {
final Object parent = fTreeContentProvider.getParent(element);
fTreeViewer.setSelection(new StructuredSelection(parent), true);
fListViewer.setSelection(new StructuredSelection(element), true);
}
public void selectTreeElement(final Object element) {
fTreeViewer.setSelection(new StructuredSelection(element), true);
}
/**
* Initialize this group's viewers after they have been laid out.
*/
public void initFields() {
fTreeViewer.setInput(fRoot);
}
@Override
public void selectionChanged(final SelectionChangedEvent event) {
final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
final Object selectedElement = selection.getFirstElement();
if (selectedElement != fCurrentTreeSelection) {
fCurrentTreeSelection = selectedElement;
fListViewer.setInput(selectedElement);
notifySelectionListeners(event);
}
}
/**
* Set the list viewer's providers to those passed
*
* @param contentProvider ITreeContentProvider
* @param labelProvider ILabelProvider
*/
public void setListProviders(final IStructuredContentProvider contentProvider, final ILabelProvider labelProvider) {
fListViewer.setContentProvider(contentProvider);
fListViewer.setLabelProvider(labelProvider);
}
/**
* Set the sorter that is to be applied to self's list viewer
*/
public void setListSorter(final ViewerSorter sorter) {
fListViewer.setSorter(sorter);
}
/**
* Set the root of the widget to be new Root. Regenerate all of the tables and lists from this
* value.
* @param newRoot
*/
public void setRoot(final Object newRoot) {
fRoot = newRoot;
initFields();
}
/**
* Set the tree viewer's providers to those passed
*
* @param contentProvider ITreeContentProvider
* @param labelProvider ILabelProvider
*/
public void setTreeProviders(final ITreeContentProvider contentProvider, final ILabelProvider labelProvider) {
fTreeViewer.setContentProvider(contentProvider);
fTreeViewer.setLabelProvider(labelProvider);
}
/**
* Set the sorter that is to be applied to self's tree viewer
*/
public void setTreeSorter(final ViewerSorter sorter) {
fTreeViewer.setSorter(sorter);
}
/**
* Set the focus on to the list widget.
*/
public void setFocus() {
fTreeViewer.getTree().setFocus();
}
}