/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.gwt.client.gfx;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* Visitor pattern implementation for painter.
* </p>
*
* @author Jan De Moerloose
*/
public class PainterVisitor {
/**
* The context on which all painter registered here should be applied.
*/
private MapContext context;
/**
* Dictionary of registered painter. It is possible that more then one painter is registered for a certain type of
* object.
*/
private Map<String, List<Painter>> painters;
/**
* This class should always be initialized with a <code>GraphicsContext</code> object, since all painter registered
* here will apply their painting skills on it.
*
* @param context
* Implementation of the MapContext interface.
*/
public PainterVisitor(MapContext context) {
this.context = context;
this.painters = new HashMap<String, List<Painter>>();
}
/**
* Register a new painter to this visitor.
*
* @param painter
* The painter itself.
*/
public void registerPainter(Painter painter) {
if (painters.containsKey(painter.getPaintableClassName())) {
List<Painter> list = painters.remove(painter.getPaintableClassName());
list.add(painter);
this.painters.put(painter.getPaintableClassName(), list);
} else {
List<Painter> list = new ArrayList<Painter>();
list.add(painter);
this.painters.put(painter.getPaintableClassName(), list);
}
}
/**
* Unregister an existing painter from this visitor.
*
* @param painter
* The painter itself.
*/
public void unregisterPainter(Painter painter) {
String className = painter.getPaintableClassName();
if (painters.containsKey(className)) {
List<Painter> list = painters.remove(className);
if (list.size() > 1) {
list.remove(painter);
painters.put(className, list);
}
}
}
/**
* The visitors visit function.
*
* @param paintable object to draw
* @param group group to draw
*/
public void visit(Paintable paintable, Object group) {
if (context.isReady()) {
String className = paintable.getClass().getName();
if (painters.containsKey(className)) {
List<Painter> list = painters.get(className);
for (Painter painter : list) {
painter.paint(paintable, group, context);
}
}
}
}
/**
* Remove a paintable object from the graphics.
*
* @param paintable paintable object
* @param group group to draw
*/
public void remove(Paintable paintable, Object group) {
String className = paintable.getClass().getName();
if (painters.containsKey(className)) {
List<Painter> list = painters.get(className);
for (Painter painter : list) {
painter.deleteShape(paintable, group, context);
}
}
}
/**
* Retrieve the full list of painter for a specific type of paintable object.
*
* @param paintable
* The type of object to retrieve painter for.
* @return Return a list of painter, or null.
*/
public List<Painter> getPaintersForObject(Paintable paintable) {
String className = paintable.getClass().getName();
if (painters.containsKey(className)) {
return painters.get(className);
}
return null;
}
}