package org.iplantc.phyloviewer.shared.scene; import java.util.HashMap; import java.util.Map; import org.iplantc.phyloviewer.shared.layout.ILayoutData; import org.iplantc.phyloviewer.shared.model.IDocument; import org.iplantc.phyloviewer.shared.model.INode; public class DrawableContainer { private Map<Integer,Drawable[]> nodeCache = new HashMap<Integer,Drawable[]>(); private Map<Integer,Drawable[]> branchCache = new HashMap<Integer,Drawable[]>(); private Map<Integer,Drawable> textCache = new HashMap<Integer,Drawable>(); private Map<Integer,Drawable[]> glyphCache = new HashMap<Integer,Drawable[]>(); IDrawableBuilder builder; public DrawableContainer() { } public IDrawableBuilder getBuilder() { return builder; } public void setBuilder(IDrawableBuilder builder) { this.builder = builder; clear(); } public void clear() { nodeCache.clear(); branchCache.clear(); textCache.clear(); glyphCache.clear(); } /** * Get the drawables for a node. * * @param node * @return array of drawables, null if the drawables haven't been created yet. */ public Drawable[] getNodeDrawables(INode node) { int id = node.getId(); if(nodeCache.containsKey(id)) { return nodeCache.get(id); } return null; } /** * Get drawables for a node. * * @param node * @param document * @param layout * @return */ public Drawable[] getNodeDrawables(INode node, IDocument document, ILayoutData layout) { Drawable[] drawables = getNodeDrawables(node); if(drawables == null) { drawables = builder.buildNode(node, document, layout); nodeCache.put(node.getId(), drawables); } return drawables; } /** * Get drawables to draw branches to the child. * * @param child * @return */ public Drawable[] getBranchDrawables(INode child) { int id = child.getId(); if(branchCache.containsKey(id)) { return branchCache.get(id); } return null; } /** * Get drawables for a branch from parent to child. * * @param parent * @param child * @param layout * @return */ public Drawable[] getBranchDrawables(INode parent, INode child, IDocument document, ILayoutData layout) { Drawable[] drawables = getBranchDrawables(child); if(drawables == null) { int id = child.getId(); drawables = builder.buildBranch(parent, child, document, layout); branchCache.put(id, drawables); } return drawables; } /** * Get a drawable for the text. * * @param node * @return */ public Drawable getTextDrawable(INode node) { int id = node.getId(); if(textCache.containsKey(id)) { return textCache.get(id); } return null; } /** * Get a drawable for the text. * @param node * @param document * @param layout * @return */ public Drawable getTextDrawable(INode node, IDocument document, ILayoutData layout) { Drawable drawable = getTextDrawable(node); if(drawable == null) { int id = node.getId(); drawable = builder.buildText(node, document, layout); textCache.put(id, drawable); } return drawable; } /** * * @param node * @param document * @param layout * @return */ public Drawable[] getGlyphDrawables(INode node, IDocument document, ILayoutData layout) { int id = node.getId(); if(glyphCache.containsKey(id)) { return glyphCache.get(id); } Drawable[] drawables = builder.buildNodeAbstraction(node, document, layout); glyphCache.put(id, drawables); return drawables; } }