/*
* RapidMiner
*
* Copyright (C) 2001-2008 by Rapid-I and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapid-i.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.gui.look.painters;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;
/**
* A cache for the cached painter.
*
* @author Ingo Mierswa
* @version $Id: Cache.java,v 1.3 2008/05/09 20:57:26 ingomierswa Exp $
*/
public class Cache {
private int maxCount;
private List<SoftReference<Cache.Entry>> entries;
Cache(int maxCount) {
this.maxCount = maxCount;
this.entries = new ArrayList<SoftReference<Cache.Entry>>(maxCount);
}
void setMaxCount(int maxCount) {
this.maxCount = maxCount;
}
private Cache.Entry getEntry(Object key, GraphicsConfiguration config, int w, int h, Object[] args) {
synchronized (this) {
Cache.Entry entry;
for (int counter = this.entries.size() - 1; counter >= 0; counter--) {
entry = (Cache.Entry) ((SoftReference) this.entries.get(counter)).get();
if (entry == null) {
this.entries.remove(counter);
} else if (entry.equals(config, w, h, args)) {
return entry;
}
}
entry = new Entry(config, w, h, args);
if (this.entries.size() == this.maxCount) {
this.entries.remove(0);
}
this.entries.add(new SoftReference<Cache.Entry>(entry));
return entry;
}
}
public Image getImage(Object key, GraphicsConfiguration config, int w, int h, Object[] args) {
Cache.Entry entry = getEntry(key, config, w, h, args);
return entry.getImage();
}
public void setImage(Object key, GraphicsConfiguration config, int w, int h, Object[] args, Image image) {
Cache.Entry entry = getEntry(key, config, w, h, args);
entry.setImage(image);
}
private static class Entry {
private GraphicsConfiguration config;
private Object[] args;
private Image image;
private int w;
private int h;
Entry(GraphicsConfiguration config, int w, int h, Object[] args) {
this.config = config;
this.args = args;
this.w = w;
this.h = h;
}
public void setImage(Image image) {
this.image = image;
}
public Image getImage() {
return this.image;
}
@Override
public String toString() {
StringBuffer value = new StringBuffer(super.toString() + "[ graphicsConfig=" + this.config + ", image=" + this.image + ", w=" + this.w + ", h=" + this.h);
if (this.args != null) {
for (Object element : this.args) {
value.append(", " + element);
}
}
value.append("]");
return value.toString();
}
public boolean equals(GraphicsConfiguration config, int w, int h, Object[] args) {
if ((this.w == w) && (this.h == h) && (((this.config != null) && this.config.equals(config)) || ((this.config == null) && (config == null)))) {
if ((this.args == null) && (args == null)) {
return true;
}
if ((this.args != null) && (args != null) && (this.args.length == args.length)) {
for (int counter = args.length - 1; counter >= 0; counter--) {
if (!this.args[counter].equals(args[counter])) {
return false;
}
}
return true;
}
}
return false;
}
}
}