/******************************************************************************* * Copyright (c) 2012, 2013, 2015 Original authors 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: * Original authors and others - initial API and implementation ******************************************************************************/ package org.eclipse.nebula.widgets.nattable.layer.cell; import java.io.Serializable; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.edit.editor.ICellEditor; import org.eclipse.nebula.widgets.nattable.layer.ILayer; import org.eclipse.nebula.widgets.nattable.layer.LabelStack; import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter; import org.eclipse.nebula.widgets.nattable.persistence.IPersistable; import org.eclipse.nebula.widgets.nattable.style.IStyle; import org.eclipse.nebula.widgets.nattable.util.ArrayUtil; /** * Registers/Adds configuration labels for a given column (by index). Custom * {@link ICellEditor}, {@link ICellPainter}, {@link IStyle} can then be * registered in the {@link IConfigRegistry} against these labels. * * Also @see {@link RowOverrideLabelAccumulator} */ public class ColumnOverrideLabelAccumulator extends AbstractOverrider implements IPersistable { public static final String PERSISTENCE_KEY = ".columnOverrideLabelAccumulator"; //$NON-NLS-1$ private final ILayer layer; /** * This key is used to register overrides for all columns. */ public static final String ALL_COLUMN_KEY = "ALL_COLUMNS"; //$NON-NLS-1$ public ColumnOverrideLabelAccumulator(ILayer layer) { this.layer = layer; } /** * {@inheritDoc} */ @Override public void accumulateConfigLabels(LabelStack configLabels, int columnPosition, int rowPosition) { int columnIndex = this.layer.getColumnIndexByPosition(columnPosition); addOverrides(configLabels, Integer.valueOf(columnIndex)); // first add the labels that should be applied for all columns addOverrides(configLabels, ALL_COLUMN_KEY); } private void addOverrides(LabelStack configLabels, Serializable key) { List<String> overrides = getOverrides(key); if (overrides != null) { for (String configLabel : overrides) { configLabels.addLabel(configLabel); } } } /** * Register labels to be contributed a column. This label will be applied to * all cells in the column. * * @param columnIndex * The column index of the column to which the config label * should be contributed. * @param configLabels * The config labels to add. */ public void registerColumnOverrides(int columnIndex, String... configLabels) { super.registerOverrides(columnIndex, configLabels); } /** * Register labels to be contributed a column. This label will be applied to * all cells in the column. * * @param columnIndex * The column index of the column to which the config label * should be contributed. * @param configLabels * The config labels to add. */ public void registerColumnOverrides(int columnIndex, List<String> configLabels) { super.registerOverrides(columnIndex, configLabels); } /** * Register labels to be contributed a column. This label will be applied to * all cells in the column. Using this method will add the labels on top of * the label stack. * * @param columnIndex * The column index of the column to which the config label * should be contributed. * @param configLabels * The config labels to add. */ public void registerColumnOverridesOnTop(int columnIndex, String... configLabels) { super.registerOverridesOnTop(columnIndex, configLabels); } /** * Register labels to be contributed a column. This label will be applied to * all cells in the column. Using this method will add the labels on top of * the label stack. * * @param columnIndex * The column index of the column to which the config label * should be contributed. * @param configLabels * The config labels to add. */ public void registerColumnOverridesOnTop(int columnIndex, List<String> configLabels) { super.registerOverridesOnTop(columnIndex, configLabels); } /** * Unregister a label that was contributed for a column. * * @param columnIndex * The column index of the column to which a config label was * contributed. * @param configLabel * The config label to remove. */ public void unregisterOverrides(int columnIndex, String configLabel) { List<String> overrides = getOverrides(columnIndex); if (overrides != null) { overrides.remove(configLabel); } } /** * Unregister labels that were contributed for a column. * * @param columnIndex * The column index of the column to which a config label was * contributed. * @param configLabels * The config labels to remove. */ public void unregisterOverrides(int columnIndex, String... configLabels) { List<String> overrides = getOverrides(columnIndex); if (overrides != null) { overrides.removeAll(ArrayUtil.asList(configLabels)); } } /** * Register a label to be contributed to all columns. This label will be * applied to all cells. * * @param configLabel * The config label that should be added to all cells. */ public void registerOverrides(String configLabel) { super.registerOverrides(ALL_COLUMN_KEY, configLabel); } /** * Register labels to be contributed to all columns. These labels will be * applied to all cells. * * @param configLabels * The config labels that should be added to all cells. */ public void registerOverrides(List<String> configLabels) { super.registerOverrides(ALL_COLUMN_KEY, configLabels); } /** * Register a label to be contributed to all columns. This label will be * applied to all cells. * * @param configLabel * The config label that should be added to all cells. */ public void registerOverridesOnTop(String configLabel) { super.registerOverridesOnTop(ALL_COLUMN_KEY, configLabel); } /** * Register labels to be contributed to all columns. These labels will be * applied to all cells. * * @param configLabels * The config labels that should be added to all cells. */ public void registerOverridesOnTop(List<String> configLabels) { super.registerOverridesOnTop(ALL_COLUMN_KEY, configLabels); } /** * Unregister a label that was contributed for all columns. * * @param configLabel * The config label to remove. */ public void unregisterOverrides(String configLabel) { List<String> overrides = getOverrides(ALL_COLUMN_KEY); if (overrides != null) { overrides.remove(configLabel); if (overrides.isEmpty()) { removeOverride(ALL_COLUMN_KEY); } } } /** * Unregister labels that were contributed for all columns. * * @param configLabels * The config labels to remove. */ public void unregisterOverrides(List<String> configLabels) { List<String> overrides = getOverrides(ALL_COLUMN_KEY); if (overrides != null) { overrides.removeAll(configLabels); if (overrides.isEmpty()) { removeOverride(ALL_COLUMN_KEY); } } } /** * Save the overrides to a properties file. A line is stored for every * column. * * Example for column 0: prefix.columnOverrideLabelAccumulator.0 = * LABEL1,LABEL2 */ @Override public void saveState(String prefix, Properties properties) { Map<Serializable, List<String>> overrides = getOverrides(); for (Map.Entry<Serializable, List<String>> entry : overrides.entrySet()) { StringBuilder strBuilder = new StringBuilder(); for (String columnLabel : entry.getValue()) { strBuilder.append(columnLabel); strBuilder.append(VALUE_SEPARATOR); } // Strip the last comma String propertyValue = strBuilder.toString(); if (propertyValue.endsWith(VALUE_SEPARATOR)) { propertyValue = propertyValue.substring(0, propertyValue.length() - 1); } String propertyKey = prefix + PERSISTENCE_KEY + DOT + entry.getKey(); properties.setProperty(propertyKey, propertyValue); } } /** * Load the overrides state from the given properties file. * * @see #saveState(String, Properties) */ @Override public void loadState(String prefix, Properties properties) { Set<Object> keySet = properties.keySet(); for (Object key : keySet) { String keyString = (String) key; if (keyString.contains(PERSISTENCE_KEY)) { String labelsFromPropertyValue = properties.getProperty(keyString).trim(); String overrideKey = keyString.substring(keyString.lastIndexOf(DOT) + 1); try { registerColumnOverrides( Integer.parseInt(overrideKey), labelsFromPropertyValue.split(VALUE_SEPARATOR)); } catch (NumberFormatException e) { // if the last part of the key can not be parsed to an // Integer, we use the key as is registerOverrides(overrideKey, labelsFromPropertyValue.split(VALUE_SEPARATOR)); } } } } }