ingo@1115: /*
ingo@1115: * Copyright (c) 2010 by Intevation GmbH
ingo@1115: *
ingo@1115: * This program is free software under the LGPL (>=v2.1)
ingo@1115: * Read the file LGPL.txt coming with the software for details
ingo@1115: * or visit http://www.gnu.org/licenses/ if it does not exist.
ingo@1115: */
ingo@1115:
sascha@438: package de.intevation.gnv.raster;
sascha@438:
sascha@779: import java.lang.ref.SoftReference;
sascha@779:
sascha@438: import java.util.HashMap;
sascha@438:
sascha@438: /**
sascha@801: * Manages palettes by their name. Provides different levels of
sascha@801: * subdivisions.
sascha@780: * @author Sascha L. Teichmann
sascha@438: */
sascha@438: public class PaletteManager
sascha@438: {
sascha@801: /**
sascha@801: * The base palette.
sascha@801: */
sascha@438: protected Palette base;
sascha@438:
sascha@801: /**
sascha@801: * The description of the palette.
sascha@801: */
sascha@438: protected String description;
sascha@801:
sascha@801: /**
sascha@801: * The name of the palette.
sascha@801: */
sascha@438: protected String name;
sascha@438:
sascha@801: /**
sascha@801: * Already created subdivisions of the palette.
sascha@801: */
sascha@438: protected HashMap> levels;
sascha@438:
sascha@801: /**
sascha@801: * Default constructor.
sascha@801: */
sascha@438: public PaletteManager() {
sascha@438: }
sascha@438:
sascha@801: /**
sascha@801: * Constructor to create a palette manager with a given name,
sascha@801: * description and base palette.
sascha@801: * @param name The name.
sascha@801: * @param description The description.
sascha@801: * @param base The base palette.
sascha@801: */
sascha@438: public PaletteManager(
sascha@438: String name,
sascha@438: String description,
sascha@438: Palette base
sascha@438: ) {
sascha@438: this.name = name;
sascha@438: this.description = description;
sascha@438: this.base = base;
sascha@438: levels = new HashMap>();
sascha@438: }
sascha@438:
sascha@801: /**
sascha@801: * Returns the description of the palette.
sascha@801: * @return The description.
sascha@801: */
sascha@438: public String getDescription() {
sascha@438: return description;
sascha@438: }
sascha@438:
sascha@801: /**
sascha@801: * The name of the palette.
sascha@801: * @return The name.
sascha@801: */
sascha@445: public String getName() {
sascha@445: return name;
sascha@445: }
sascha@445:
sascha@801: /**
sascha@801: * Returns the base palette.
sascha@801: * @return The base palette.
sascha@801: */
sascha@445: public Palette getBase() {
sascha@445: return base;
sascha@445: }
sascha@445:
sascha@801: /**
sascha@801: * Returns the subdivided palette of a given level.
sascha@801: * @param n The level of subdivision.
sascha@801: * @return The subdivided palette.
sascha@801: */
sascha@438: public Palette getLevel(int n) {
sascha@438: if (n < 2) {
sascha@438: return base;
sascha@438: }
sascha@438:
sascha@438: Integer N = Integer.valueOf(n);
sascha@438:
sascha@438: Palette palette;
sascha@438:
sascha@438: synchronized (levels) {
sascha@438: SoftReference ref = levels.get(N);
sascha@438:
sascha@438: if (ref != null && (palette = ref.get()) != null) {
sascha@438: return palette;
sascha@438: }
sascha@438:
sascha@438: palette = base.subdivide(n);
sascha@438:
sascha@438: ref = new SoftReference(palette);
sascha@438:
sascha@438: levels.put(N, ref);
sascha@438: }
sascha@438:
sascha@438: return palette;
sascha@438: }
sascha@438: }
sascha@798: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :