/*******************************************************************************
* Copyright (c) 2007 IBM Corporation 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:
* rmcamara@us.ibm.com - initial API and implementation
* Tom Schindl <tom.schindl@bestsolution.at> - various significant contributions
* Mark-Oliver Reiser <mopr1@web.de> - support for differing row heights ; fix in bug 191216
*******************************************************************************/
package org.eclipse.nebula.jface.gridviewer;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ViewerColumn;
import org.eclipse.nebula.widgets.grid.Grid;
import org.eclipse.nebula.widgets.grid.GridColumn;
import org.eclipse.nebula.widgets.grid.GridItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
/**
* The concrete implementation of the ColumnViewer for the grid.
*/
public final class GridViewerColumn extends ViewerColumn
{
/** This is either a GridTableViewer or a GridTreeViewer. */
private ColumnViewer viewer;
/** The concrete grid column that is being represented by the {@code ViewerColumn}.*/
private GridColumn column;
/** Editor support for handling check events. */
private CheckEditingSupport checkEditingSupport;
/** Listener used to get informed when the colum resizes */
protected Listener columnResizeListener = null;
/**
* Create a new column in the {@link GridTableViewer}
*
* @param viewer
* the viewer the column belongs to
* @param style
* the style used to create the column for style bits see
* {@link GridColumn}
* @see GridColumn#GridColumn(Grid, int)
*/
public GridViewerColumn(GridTableViewer viewer, int style)
{
this(viewer, style, -1);
}
/**
* Create a new column in the {@link GridTreeViewer}
*
* @param viewer
* the viewer the column belongs to
* @param style
* the style used to create the column for style bits see
* {@link GridColumn}
* @see GridColumn#GridColumn(Grid, int)
*/
public GridViewerColumn(GridTreeViewer viewer, int style) {
this(viewer, style, -1);
}
/**
* Create a new column in the {@link GridTableViewer}
*
* @param viewer
* the viewer the column belongs to
* @param style
* the style used to create the column for style bits see
* {@link GridColumn}
* @param index
* the index of the newly created column
* @see GridColumn#GridColumn(Grid, int, int)
*/
public GridViewerColumn(GridTableViewer viewer, int style, int index)
{
this(viewer, createColumn((Grid) viewer.getControl(), style, index));
}
/**
* Create a new column in the {@link GridTreeViewer}
*
* @param viewer
* the viewer the column belongs to
* @param style
* the style used to create the column for style bits see
* {@link GridColumn}
* @param index
* the index of the newly created column
* @see GridColumn#GridColumn(Grid, int, int)
*/
public GridViewerColumn(GridTreeViewer viewer, int style, int index)
{
this(viewer, createColumn((Grid) viewer.getControl(), style, index));
}
/**
*
* @param viewer
* the viewer the column belongs to
* @param column
* the column the viewer is attached to
*/
public GridViewerColumn(GridTreeViewer viewer, GridColumn column)
{
this((ColumnViewer)viewer,column);
}
/**
*
* @param viewer
* the viewer the column belongs to
* @param column
* the column the viewer is attached to
*/
public GridViewerColumn(GridTableViewer viewer, GridColumn column)
{
this((ColumnViewer)viewer,column);
}
GridViewerColumn(ColumnViewer viewer, GridColumn column) {
super(viewer, column);
this.viewer = viewer;
this.column = column;
hookColumnResizeListener();
}
private static GridColumn createColumn(Grid table, int style, int index)
{
if (index >= 0)
{
return new GridColumn(table, style, index);
}
return new GridColumn(table, style);
}
/**
* Returns the underlying column.
*
* @return the underlying Nebula column
*/
public GridColumn getColumn()
{
return column;
}
/** {@inheritDoc} */
public void setEditingSupport(EditingSupport editingSupport)
{
if (editingSupport instanceof CheckEditingSupport)
{
if (checkEditingSupport == null)
{
final int colIndex = getColumn().getParent().indexOf(getColumn());
getColumn().getParent().addListener(SWT.Selection, new Listener()
{
public void handleEvent(Event event)
{
if (event.detail == SWT.CHECK && event.index == colIndex)
{
GridItem item = (GridItem)event.item;
Object element = item.getData();
checkEditingSupport.setValue(element, new Boolean(item.getChecked(colIndex)));
}
}
});
}
checkEditingSupport = (CheckEditingSupport)editingSupport;
}
else
{
super.setEditingSupport(editingSupport);
}
}
private void hookColumnResizeListener() {
if (columnResizeListener == null)
{
columnResizeListener = new Listener() {
public void handleEvent(Event event)
{
boolean autoPreferredSize=false;
if(viewer instanceof GridTableViewer)
autoPreferredSize = ((GridTableViewer)viewer).getAutoPreferredHeight();
if(viewer instanceof GridTreeViewer)
autoPreferredSize = ((GridTreeViewer)viewer).getAutoPreferredHeight();
if(autoPreferredSize && column.getWordWrap())
{
Grid grid = column.getParent();
for(int cnt=0;cnt<grid.getItemCount();cnt++)
grid.getItem(cnt).pack();
grid.redraw();
}
}
};
column.addListener(SWT.Resize, columnResizeListener);
column.addListener(SWT.Hide, columnResizeListener);
column.addListener(SWT.Show, columnResizeListener);
}
}
private void unhookColumnResizeListener() {
if (columnResizeListener != null)
{
column.removeListener(SWT.Resize, columnResizeListener);
columnResizeListener = null;
}
}
/**
* {@inheritDoc}
*/
protected void handleDispose() {
unhookColumnResizeListener();
super.handleDispose();
}
}