/*******************************************************************************
* Copyright (c) 2011, 2012 RĂ¼diger Herrmann 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:
* RĂ¼digier Herrmann - initial API and implementation
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.rap.demo.controls;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ICellEditorListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.TableColumn;
public class CheckboxTableViewerColumn {
private final TableViewer tableViewer;
private final TableViewerColumn tableViewerColumn;
private final int columnIndex;
private final ColumnViewerEditorActivationListener editorActivationListener;
private final CheckboxColumnLabelProvider checkboxLabelProvider;
private final CheckboxColumnEditingSupport checkboxEditingSupport;
private ILabelProvider labelProviderDelegate;
private CheckboxEditingSupport editingSupportDelegate;
private ColumnViewerEditor editor;
private boolean editing;
public CheckboxTableViewerColumn( TableViewer tableViewer, int columnStyle ) {
this.tableViewer = tableViewer;
checkboxLabelProvider = new CheckboxColumnLabelProvider();
checkboxEditingSupport = new CheckboxColumnEditingSupport();
editorActivationListener = new CheckboxEditorActivationListener();
tableViewerColumn = createViewerColumn( columnStyle );
columnIndex = computeColumnIndex();
registerDisposeListener();
}
public TableColumn getColumn() {
return tableViewerColumn.getColumn();
}
public void setLabelProvider( ILabelProvider labelProvider ) {
labelProviderDelegate = labelProvider;
}
public ILabelProvider getLabelProvider() {
return labelProviderDelegate;
}
public void setEditingSupport( CheckboxEditingSupport editingSupport ) {
editingSupportDelegate = editingSupport;
}
public CheckboxEditingSupport getEditingSupport() {
return editingSupportDelegate;
}
public void attachToEditor() {
editor = tableViewer.getColumnViewerEditor();
editor.addEditorActivationListener( editorActivationListener );
}
private TableViewerColumn createViewerColumn( int columnStyle ) {
TableViewerColumn result = new TableViewerColumn( tableViewer, columnStyle );
result.setLabelProvider( checkboxLabelProvider );
result.setEditingSupport( checkboxEditingSupport );
return result;
}
private int computeColumnIndex() {
return getColumn().getParent().indexOf( getColumn() );
}
private void registerDisposeListener() {
getColumn().addDisposeListener( new DisposeListener() {
public void widgetDisposed( DisposeEvent event ) {
dispose();
}
} );
}
private void dispose() {
if( editor != null ) {
editor.removeEditorActivationListener( editorActivationListener );
}
checkboxLabelProvider.dispose();
if( labelProviderDelegate != null ) {
labelProviderDelegate.dispose();
}
}
private class CheckboxColumnEditingSupport extends EditingSupport {
CheckboxColumnEditingSupport() {
super( tableViewer );
}
@Override
protected void setValue( Object element, Object value ) {
editingSupportDelegate.setValue( element, ( Boolean )value );
tableViewer.refresh( element );
}
@Override
protected Object getValue( Object element ) {
return editingSupportDelegate.getValue( element );
}
@Override
protected CellEditor getCellEditor( final Object element ) {
CellEditor cellEditor = new CheckWidgetCellEditor( getColumn().getParent() );
cellEditor.addListener( new CellEditorAdapter() {
@Override
public void cancelEditor() {
tableViewer.refresh( element );
}
} );
return cellEditor;
}
@Override
protected boolean canEdit( Object element ) {
return editingSupportDelegate != null && editingSupportDelegate.canEdit( element );
}
@Override
protected void initializeCellEditorValue( CellEditor cellEditor, ViewerCell cell ) {
cell.setImage( null );
super.initializeCellEditorValue( cellEditor, cell );
}
}
private static class CellEditorAdapter implements ICellEditorListener {
public void applyEditorValue() {
}
public void cancelEditor() {
}
public void editorValueChanged( boolean oldValidState, boolean newValidState ) {
}
}
private class CheckboxColumnLabelProvider extends ColumnLabelProvider {
@Override
public String getText( Object element ) {
String result = "";
if( !editing ) {
result = labelProviderDelegate.getText( element );
}
return result;
}
@Override
public Image getImage( Object element ) {
Image result = null;
if( !editing ) {
result = labelProviderDelegate.getImage( element );
}
return result;
}
}
private class CheckboxEditorActivationListener extends ColumnViewerEditorActivationListener {
@Override
public void beforeEditorActivated( ColumnViewerEditorActivationEvent event ) {
ViewerCell cell = ( ViewerCell )event.getSource();
if( cell.getColumnIndex() == columnIndex ) {
editing = true;
}
}
@Override
public void afterEditorActivated( ColumnViewerEditorActivationEvent event ) {
}
@Override
public void beforeEditorDeactivated( ColumnViewerEditorDeactivationEvent event ) {
ViewerCell cell = ( ViewerCell )event.getSource();
if( cell.getColumnIndex() == columnIndex ) {
editing = false;
}
}
@Override
public void afterEditorDeactivated( ColumnViewerEditorDeactivationEvent event ) {
}
}
}