/*******************************************************************************
* Copyright (c) 2012 Original authors and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.selection;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.util.OpenStrategy;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.IPostSelectionProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.data.IRowDataProvider;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Control;
public class RowPostSelectionProvider<T> extends RowSelectionProvider<T>
implements IPostSelectionProvider {
private ListenerList postSelectionChangedListeners = new ListenerList();
private ISelection previousSelection;
public RowPostSelectionProvider(NatTable natTable,
SelectionLayer selectionLayer, IRowDataProvider<T> rowDataProvider) {
super(selectionLayer, rowDataProvider);
hookControl(natTable);
}
public RowPostSelectionProvider(NatTable natTable,
SelectionLayer selectionLayer, IRowDataProvider<T> rowDataProvider,
boolean fullySelectedRowsOnly) {
super(selectionLayer, rowDataProvider, fullySelectedRowsOnly);
hookControl(natTable);
}
protected void hookControl(Control control) {
OpenStrategy handler = new OpenStrategy(control);
handler.addPostSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handlePostSelect(e);
}
});
}
@Override
public void addPostSelectionChangedListener(
ISelectionChangedListener listener) {
this.postSelectionChangedListeners.add(listener);
}
@Override
public void removePostSelectionChangedListener(
ISelectionChangedListener listener) {
this.postSelectionChangedListeners.remove(listener);
}
protected void handlePostSelect(SelectionEvent e) {
ISelection selection = getSelection();
if (!selection.equals(this.previousSelection)) { // OpenStrategy doesn't
// throttle left/right
// cursor key presses, so
// only fire event when row
// changes
SelectionChangedEvent event = new SelectionChangedEvent(this,
selection);
firePostSelectionChanged(event);
this.previousSelection = selection;
}
}
protected void firePostSelectionChanged(final SelectionChangedEvent event) {
Object[] listeners = this.postSelectionChangedListeners.getListeners();
for (int i = 0; i < listeners.length; ++i) {
final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
SafeRunnable.run(new SafeRunnable() {
@Override
public void run() {
l.selectionChanged(event);
}
});
}
}
}