/* GeoGebra - Dynamic Mathematics for Everyone http://www.geogebra.org This file is part of GeoGebra. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. */ package org.geogebra.common.kernel; import java.util.LinkedHashMap; import org.geogebra.common.io.MyXMLHandler; import org.geogebra.common.kernel.algos.AlgoDispatcher; import org.geogebra.common.kernel.arithmetic.ExpressionNodeEvaluator; import org.geogebra.common.kernel.commands.AlgebraProcessor; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.kernelND.GeoDirectionND; import org.geogebra.common.kernel.kernelND.GeoPlaneND; import org.geogebra.common.main.MyError; import org.geogebra.common.util.MaxSizeHashMap; /** * Kernel with its own construction for macros. */ public class MacroKernel extends Kernel { private Kernel parentKernel; private MacroConstruction macroCons; /** * Creates new kernel for macro * * @param parentKernel * kernel of construction in which we want to use this macro */ public MacroKernel(Kernel parentKernel) { super(parentKernel.getGeoFactory()); this.parentKernel = parentKernel; app = parentKernel.getApplication(); setUndoActive(false); setAllowVisibilitySideEffects(false); macroCons = new MacroConstruction(this); cons = macroCons; // does 3D as parentKernel setManager3D(getParentKernel().newManager3D(this)); } @Override public final boolean isMacroKernel() { return true; } /** * @return kernel for construction using this macro */ public Kernel getParentKernel() { return parentKernel; } // public boolean isUseTempVariablePrefix() { // return super.isUseTempVariablePrefix(); // } // // public void setUseTempVariablePrefix(boolean flag) { // useTempVariablePrefix = flag; // super.setUseTempVariablePrefix(flag); // } /** * @param label * reserved label */ public void addReservedLabel(String label) { macroCons.addReservedLabel(label); } /** * @param flag * when true, variables are looked up in parent construction as * well */ public void setGlobalVariableLookup(boolean flag) { macroCons.setGlobalVariableLookup(flag); } /** * Sets macro construction of this kernel via XML string. * * @param xmlString * XML representation of the construction * @throws Exception * if reading XML fails */ public void loadXML(String xmlString) throws Exception { macroCons.loadXML(xmlString); } @Override public final double getXmax() { return parentKernel.getXmax(); } @Override public final double getXmin() { return parentKernel.getXmin(); } @Override public final double getXscale() { return parentKernel.getXscale(); } @Override public final double getYmax() { return parentKernel.getYmax(); } @Override public final double getYmin() { return parentKernel.getYmin(); } @Override public final double getYscale() { return parentKernel.getYscale(); } /** * Adds a new macro to the parent kernel. */ @Override public void addMacro(Macro macro) { parentKernel.addMacro(macro); } /** * Returns the macro object for the given macro name. Note: null may be * returned. */ @Override public Macro getMacro(String name) { return parentKernel.getMacro(name); } // ////////////////////////////////////// // METHODS USING KERNEL3D // ////////////////////////////////////// @Override public MyXMLHandler newMyXMLHandler(Construction cons1) { return parentKernel.newMyXMLHandler(this, cons1); } @Override public AlgebraProcessor newAlgebraProcessor(Kernel kernel) { return parentKernel.newAlgebraProcessor(kernel); } @Override public ExpressionNodeEvaluator newExpressionNodeEvaluator(Kernel kernel) { return parentKernel.newExpressionNodeEvaluator(kernel); } @Override public GeoElement createGeoElement(Construction cons1, String type) throws MyError { return parentKernel.createGeoElement(cons1, type); } @Override public boolean handleCoords(GeoElement geo, LinkedHashMap<String, String> attrs) { return parentKernel.handleCoords(geo, attrs); } /** * Returns the parent kernel's GeoGebraCAS object. */ @Override public synchronized GeoGebraCasInterface getGeoGebraCAS() { return parentKernel.getGeoGebraCAS(); } /** * @return Whether the GeoGebraCAS of the parent kernel has been initialized * before */ @Override public synchronized boolean isGeoGebraCASready() { return parentKernel.isGeoGebraCASready(); } /** * @return Hash map for caching CAS results from parent kernel. */ @Override public MaxSizeHashMap<String, String> getCasCache() { return parentKernel.getCasCache(); } /** * @return Whether parent kernel is already using CAS caching. */ @Override public boolean hasCasCache() { return parentKernel.hasCasCache(); } @Override protected AlgoDispatcher newAlgoDispatcher(Construction cons1) { return this.parentKernel.newAlgoDispatcher(cons1); } @Override public boolean isZvarAllowed() { return parentKernel.isZvarAllowed(); } @Override public GeoPlaneND getDefaultPlane() { return parentKernel.getDefaultPlane(); } @Override public GeoDirectionND getSpace() { return parentKernel.getSpace(); } @Override public ConstructionCompanion createConstructionCompanion( Construction cons1) { return parentKernel.createConstructionCompanion(cons1); } }