/******************************************************************************* * Copyright (c) 2013 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; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes; import org.eclipse.nebula.widgets.nattable.edit.editor.ComboBoxCellEditor; import org.eclipse.nebula.widgets.nattable.edit.editor.ICellEditor; 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.nebula.widgets.nattable.util.ObjectUtils; import org.eclipse.swt.graphics.Image; /** * {@link ImagePainter} that is responsible for painting the icon into the * filter row cells. It will handle 3 different icons, where two of them are * mandatory: * <ul> * <li>removeFilterImage (mandatory) - Image that is rendered if a filter is * applied for that cell.</li> * <li>comboImage (mandatory) - Image that is rendered if no filter is applied * for that cell, but the filter cell editor is of type * {@link ComboBoxCellEditor}.</li> * <li>filterImage (optional) - Image that is rendered if no filter is applied * for that cell.</li> * </ul> */ public class FilterIconPainter extends ImagePainter { /** * Icon that will be rendered if no filter is applied for a cell in a filter * row. This can be <code>null</code> which will leave the cell blank. If * set it will indicate the filter purpose of the cell to a user and will * override the combo box icon, as both icons do not fit into the cell. */ private Image filterImage; /** * 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; /** * Creates a {@link FilterIconPainter} that uses the default images for * removeFilter and combo box icons. No image for indicating the filter row * will be applied. */ public FilterIconPainter() { this(null, null, null); } /** * Creates a {@link FilterIconPainter} that uses the default images for * removeFilter and combo box icons. Will apply the given image for * indicating the filter row to a user. * * @param filterImage * Icon that will be rendered if no filter is applied for a cell * in a filter row. */ public FilterIconPainter(Image filterImage) { this(filterImage, null, null); } /** * Creates a {@link FilterIconPainter} that uses the given images for the * icons in the filter row cells. * * @param filterImage * Icon that will be rendered if no filter is applied for a cell * in a filter row. * @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 FilterIconPainter(Image filterImage, Image removeFilterImage, Image comboImage) { if (filterImage != null) { this.filterImage = filterImage; } this.removeFilterImage = removeFilterImage != null ? removeFilterImage : GUIHelper.getImage("remove_filter"); //$NON-NLS-1$ this.comboImage = comboImage != null ? comboImage : GUIHelper .getImage("down_2"); //$NON-NLS-1$ } @Override protected Image getImage(ILayerCell cell, IConfigRegistry configRegistry) { // If a filter value is present draw the remove filter icon if (ObjectUtils.isNotNull(cell.getDataValue())) { return this.removeFilterImage; } // If no filter value is present and a filter icon is specified, // draw the filter icon to indicate the cell as a filter cell if (this.filterImage != null) { return this.filterImage; } ICellEditor cellEditor = configRegistry.getConfigAttribute( EditConfigAttributes.CELL_EDITOR, cell.getDisplayMode(), cell.getConfigLabels().getLabels()); // If a combo box is specified as the editor, draw the combo box arrow if (ObjectUtils.isNotNull(cellEditor) && cellEditor instanceof ComboBoxCellEditor) { return this.comboImage; } return null; } }