package org.geogebra.common.euclidian.draw; import java.util.ArrayList; import org.geogebra.common.euclidian.DrawableND; import org.geogebra.common.euclidian.EuclidianViewInterfaceSlim; import org.geogebra.common.kernel.geos.GeoElement; /** * Class for storing drawables includes in a DrawList * * @author Mathieu * */ public class DrawListArray extends ArrayList<DrawableND> { private static final long serialVersionUID = 1L; /** view */ protected transient EuclidianViewInterfaceSlim view; /** * common constructor * * @param view * view */ public DrawListArray(EuclidianViewInterfaceSlim view) { this.view = view; // drawables = new ArrayList<DrawableND>(); } /** * Add the listElement's drawable * * @param listElement * element to insert * @param drawablePos * position to insert * @param oldDrawableSize * old size of drawable list * @param drawList * list in which we might find drawable for given geo * @return false if the drawable == null */ public boolean addToDrawableList(GeoElement listElement, int drawablePos, int oldDrawableSize, DrawableND drawList) { DrawableND d = null; boolean inOldDrawableRange = drawablePos < oldDrawableSize; if (inOldDrawableRange) { // try to reuse old drawable DrawableND oldDrawable = get(drawablePos); if (oldDrawable.getGeoElement() == listElement) { d = oldDrawable; update(d); } else { d = getDrawable(oldDrawable, listElement, drawList); } } else { d = getDrawable(listElement, drawList); } if (d != null) { if (inOldDrawableRange) { set(drawablePos, d); } else { add(drawablePos, d); } return true; } return false; } /** * For 3D: remove old drawable * * @param oldDrawable * old drawable at same position * @param listElement * list element * @param drawList * list that wants to add this geo * @return new drawable */ protected DrawableND getDrawable(DrawableND oldDrawable, GeoElement listElement, DrawableND drawList) { return getDrawable(listElement, drawList); } /** * update the drawable * * @param d * drawable to be updated */ protected void update(DrawableND d) { d.update(); } /** * Returns UPDATED drawable for the geo * * @param listElement * geo * @param drawList * list that wants to add this geo * @return drawable for the geo */ private DrawableND getDrawable(GeoElement listElement, DrawableND drawList) { DrawableND d = view.getDrawableND(listElement); if (d == null) { // create a new drawable for geo d = createDrawableND(listElement);// view.createDrawableND(listElement); if (d != null) { d.setCreatedByDrawList(drawList); } } else { update(d); } return d; } /** * @param listElement * geo * @return the drawable create by the view for this geo */ protected DrawableND createDrawableND(GeoElement listElement) { return view.newDrawable(listElement); } }