org.jdesktop.swingx.sort.StringValueRegistry Maven / Gradle / Ivy
/*
* $Id$
*
* Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
package org.jdesktop.swingx.sort;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import org.jdesktop.swingx.renderer.StringValue;
import org.jdesktop.swingx.renderer.StringValues;
/**
* A writable implemenation of StringValueProvider. Typically, this is created and
* maintained by a collection view and then passed over to interested parties. It is
* modeled/implemented after the default renderer maintenance in a JTable.
*
* PENDING JW: for safety - better not implement but return a provider. We probably don't want
* readers to frickle around here?.
*
* @author Jeanette Winzenburg
*/
public final class StringValueRegistry implements StringValueProvider {
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(StringValueRegistry.class.getName());
private Map, StringValue> perClass;
private HashMap perColumn;
private HashMap> classPerColumn;
/**
* {@inheritDoc}
*/
@Override
public StringValue getStringValue(int row, int column) {
StringValue sv = getPerColumnMap().get(column);
if (sv == null) {
sv = getStringValueByClass(getClass(row, column));
}
if (sv == null) {
sv = getStringValueByClass(Object.class);
}
return sv != null ? sv : StringValues.TO_STRING;
}
//-------------------- manage
/**
* Sets a StringValue to use for the given column. If the converter is null,
* the mapping is removed.
*
* @param sv the StringValue to use for the given column.
* @param column the column index in model coordinates.
*
*/
public void setStringValue(StringValue sv, int column) {
// PENDING really remove mapping if sv null
getPerColumnMap().put(column, sv);
}
/**
* Removes all per-column mappings of StringValues.
*
*/
public void clearColumnStringValues() {
getPerColumnMap().clear();
}
/**
* Sets the StringValue to use for the given class. If the converter is null,
* the mapping is removed.
*
* @param sv the StringValue to use for the given column.
* @param clazz the class
*/
public void setStringValue(StringValue sv, Class clazz) {
// PENDING really remove mapping if sv null
getPerClassMap().put(clazz, sv);
}
/**
* Returns the StringValue registered for the given class.
*
* This is temporarily exposed for testing only - do not use, it will
* be removed very soon!
*
* @param clazz the class to find the registered StringValue for
* @return the StringValue registered for the class, or null if not directly
* registered.
*/
public StringValue getStringValue(Class clazz) {
return getPerClassMap().get(clazz);
}
/**
* Sets the column class.
*
* @param clazz
* @param column index in model coordinates
*/
public void setColumnClass(Class clazz, int column) {
getColumnClassMap().put(column, clazz);
}
/**
* @param classPerColumn
*/
public void setColumnClasses(Map> classPerColumn) {
this.classPerColumn = classPerColumn != null ?
new HashMap>(classPerColumn) : null;
}
/**
*
* @param clazz
* @return
*/
private StringValue getStringValueByClass(Class clazz) {
if (clazz == null) return null;
StringValue sv = getPerClassMap().get(clazz);
if (sv != null) return sv;
return getStringValueByClass(clazz.getSuperclass());
}
/**
* Returns the Class of the column.
*
* @param row
* @param column
* @return
*/
private Class getClass(int row, int column) {
Class clazz = getColumnClassMap().get(column);
return clazz != null ? clazz : Object.class;
}
/**
* Returns the Map which stores the per-column Class, lazily
* creates one if null.
*
* @return the per-column storage map of Class
*/
private Map> getColumnClassMap() {
if (classPerColumn == null) {
classPerColumn = new HashMap>();
}
return classPerColumn;
}
/**
* Returns the Map which stores the per-class StringValues, lazily
* creates one if null.
*
* @return the per-class storage map of StringValues
*/
private Map, StringValue> getPerClassMap() {
if (perClass == null) {
perClass = new HashMap, StringValue>();
}
return perClass;
}
/**
* Returns the Map which stores the per-column StringValues, lazily
* creates one if null.
*
* @return the per-column storage map of StringValues
*/
private Map getPerColumnMap() {
if (perColumn == null) {
perColumn = new HashMap();
}
return perColumn;
}
}