/*******************************************************************************
* Copyright (c) 2013, 2015 Dirk Fauth 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:
* Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.nattable.filterrow.combobox;
import java.util.Collection;
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.edit.EditConstants;
import org.eclipse.nebula.widgets.nattable.edit.editor.ComboBoxCellEditor;
import org.eclipse.nebula.widgets.nattable.edit.editor.IComboBoxDataProvider;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.painter.cell.ImagePainter;
import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
import org.eclipse.swt.graphics.Image;
/**
* {@link ImagePainter} that is responsible for painting the icon into the
* filter row cells that are configured to show Excel like filter comboboxes. It
* will handle 2 different icons:
* <ul>
* <li>removeFilterImage - Image that is rendered if a filter is applied for
* that cell.</li>
* <li>comboImage - Image that is rendered if no filter is applied for that cell
* </li>
* </ul>
*/
public class ComboBoxFilterIconPainter extends ImagePainter {
/**
* The IComboBoxDataProvider that is used to fill the filter comboboxes.
* Needed here to determine whether a filter is applied or not. This is
* because if all items in the combo are selected, this means there is no
* filter applied.
*/
private final IComboBoxDataProvider comboBoxDataProvider;
/**
* Icon that will be rendered if a filter is applied for a cell in a filter
* row. This overrides any other icon configuration.
*/
private Image removeFilterImage;
/**
* Icon that is rendered if no filter is applied for a cell in a filter row,
* and the configured cell editor for that cell is a
* {@link ComboBoxCellEditor}. This image will be overriden in case a
* filterImage is applied.
*/
private Image comboImage;
/**
* @param comboBoxDataProvider
* The IComboBoxDataProvider that is used to fill the filter
* comboboxes.
*/
public ComboBoxFilterIconPainter(IComboBoxDataProvider comboBoxDataProvider) {
this(comboBoxDataProvider, null, null);
}
/**
* @param comboBoxDataProvider
* The IComboBoxDataProvider that is used to fill the filter
* comboboxes.
* @param removeFilterImage
* Icon that will be rendered if a filter is applied for a cell
* in a filter row.
* @param comboImage
* Icon that is rendered if no filter is applied for a cell in a
* filter row, and the configured cell editor for that cell is a
* {@link ComboBoxCellEditor}.
*/
public ComboBoxFilterIconPainter(
IComboBoxDataProvider comboBoxDataProvider,
Image removeFilterImage,
Image comboImage) {
this.comboBoxDataProvider = comboBoxDataProvider;
this.removeFilterImage = removeFilterImage != null
? removeFilterImage
: GUIHelper.getImage("remove_filter"); //$NON-NLS-1$
this.comboImage = comboImage != null
? comboImage
: GUIHelper.getImage("down_2"); //$NON-NLS-1$
}
@SuppressWarnings("rawtypes")
@Override
protected Image getImage(ILayerCell cell, IConfigRegistry configRegistry) {
Object cellData = cell.getDataValue();
Image result = null;
if (EditConstants.SELECT_ALL_ITEMS_VALUE.equals(cellData)
|| (cellData instanceof Collection
&& ((Collection) cellData).size() == this.comboBoxDataProvider.getValues(cell.getColumnIndex(), 0).size())) {
result = this.comboImage;
} else {
result = this.removeFilterImage;
}
return result;
}
}