/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.ui.common.table;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Display;
import org.teiid.designer.ui.common.eventsupport.SelectionUtilities;
/**
* CtrlClickListener is a hack to allow single-selection TableViewers to clear their selection upon Ctrl-click. It currently has a
* bug: if you Ctrl-click on an un-selected row, it will clear the active selection and swallow the new selection. That needs to
* get fixed.
*
* @since 8.0
*/
public class CtrlClickListener extends MouseAdapter implements SelectionListener {
TableViewer tableViewer;
private boolean clearNextSelection = false;
/**
* Construct an instance of CtrlClickListener.
*
* @param the TableViewer that this instance is supposed to monitor.
*/
public CtrlClickListener( TableViewer tableViewer ) {
tableViewer.getTable().addMouseListener(this);
tableViewer.getTable().addSelectionListener(this);
this.tableViewer = tableViewer;
}
/**
* @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseUp( MouseEvent e ) {
if ((e.stateMask & SWT.CTRL) != 0) {
clearNextSelection = true;
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
if (SelectionUtilities.getSelectedObject(tableViewer.getSelection()) != null) {
tableViewer.setSelection(new StructuredSelection());
}
}
});
}
}
/**
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetDefaultSelected( SelectionEvent e ) {
}
/**
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected( SelectionEvent e ) {
if (clearNextSelection) {
clearNextSelection = false;
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
if (SelectionUtilities.getSelectedObject(tableViewer.getSelection()) != null) {
tableViewer.setSelection(new StructuredSelection());
}
}
});
}
}
/**
* Call this method to unhook this listener from the table.
*/
public void dispose() {
tableViewer.getTable().removeMouseListener(this);
tableViewer.getTable().removeSelectionListener(this);
}
}