/*
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.algos;
import java.util.TreeSet;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.GTemplate;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.kernelND.GeoElementND;
import org.geogebra.common.main.Localization;
/**
* Element of the construction tree
*
* @author Markus
*/
public abstract class ConstructionElement
implements Comparable<ConstructionElement> {
/** parent construction of this element */
public transient Construction cons;
/** parent kernel of this element */
public transient Kernel kernel;
private int constIndex = -1; // index in construction list
private long ceID; // creation ID of this ConstructionElement, used for
// sorting
/**
* Creates new construction element
*
* @param c
* construction
*/
public ConstructionElement(final Construction c) {
ceID = c.getNextCeIDcounter();
setConstruction(c);
}
/**
* @param c
* new construction
*/
public void setConstruction(final Construction c) {
cons = c;
kernel = c.getKernel();
}
/**
* @return construction this element belongs to
*/
public Construction getConstruction() {
return cons;
}
/**
* @return kernel
*/
public final Kernel getKernel() {
return kernel;
}
/**
* Returns the smallest possible construction index for this object in its
* construction.
*
* @return the smallest possible construction index for this object
*/
public abstract int getMinConstructionIndex();
/**
* Returns the largest possible construction index for this object in its
* construction.
*
* @return the largest possible construction index for this object
*/
public abstract int getMaxConstructionIndex();
/**
* Returns construction index in current construction.
*
* @return construction index in current construction.
*/
public int getConstructionIndex() {
return constIndex;
}
/**
* Sets construction index in current construction. This method should only
* be called from Construction.
*
* @param index
* new construction index
*/
public void setConstructionIndex(int index) {
constIndex = index;
}
/**
* Returns whether this construction element is in the construction list of
* its construction.
*
* @return true for elements in construction list
*/
final public boolean isInConstructionList() {
return constIndex > -1;
}
/**
* Returns whether this element is a breakpoint in the construction protocol
*
* @return whether this element is a breakpoint in the construction protocol
*/
abstract public boolean isConsProtocolBreakpoint();
/**
* Returns whether this object is available at the given construction step
* (this depends on this object's construction index).
*
* @param step
* construction step
* @return whether this object is available at the given construction step
*/
public boolean isAvailableAtConstructionStep(int step) {
// Note: this method is overwritten by
// GeoAxis in order to make the axes available
// in empty constructions too (for step == -1)
int pos = getConstructionIndex();
return (pos >= 0 && pos <= step);
}
/**
* Returns true for an independent GeoElement and false otherwise.
*
* @return true for independent GeoElement
*/
public abstract boolean isIndependent();
/**
* Returns XML representation of this object. GeoGebra File Format.
*
* @param getListentersToo
* @param sb
* string builder
*/
public abstract void getXML(boolean getListentersToo, StringBuilder sb);
/**
* Returns XML representation of this object. OGP format.
*
* @param sb
* string builder
*/
public void getXML_OGP(StringBuilder sb) {
getXML(false, sb);
}
/**
* Removes this object from the current construction.
*/
public abstract void remove();
/**
* Updates this object.
*/
public abstract void update();
/**
* Notifies all views to remove this object.
*/
public abstract void notifyRemove();
/**
* Notifies all views to add this object.
*/
public abstract void notifyAdd();
/**
* Returns an array with all GeoElements of this construction element.
*
* @return an array with all GeoElements of this construction element.
*/
public abstract GeoElementND[] getGeoElements();
/**
* @return true for GeoElements
*/
public abstract boolean isGeoElement();
/**
* @return true for AlgoElements
*/
public abstract boolean isAlgoElement();
/**
* Returns type and name of this construction element (e.g. "Point A").
* Note: may return ""
*
* @return type and name of this construction element (e.g. "Point A").
*/
public abstract String getNameDescription();
/**
* Returns textual description of the definition of this construction
* element (e.g. "Line through A and B"). Note: may return ""
*
* @param tpl
* string template
* @return textual description of the definition
*/
public abstract String getDefinitionDescription(StringTemplate tpl);
/**
* Returns command that defines this construction element (e.g. "Line[A, B]"
* ). Note: may return ""
*/
/**
* Returns name of class. This is needed to allow code obfuscation.
*/
/**
* Returns the mode ID of a related tool.
*
* @return mode ID, returns -1 if there is no related tool.
*/
public int getRelatedModeID() {
return -1;
}
/* Comparable interface */
/**
* Compares using creation ID. Older construction elements are larger. Note:
* 0 is only returned for this == obj.
*/
@Override
public int compareTo(ConstructionElement obj) {
if (this == obj) {
return 0;
}
ConstructionElement ce = obj;
if (ceID < ce.ceID) {
return -1;
}
return 1;
}
@Override
public boolean equals(Object obj) {
return this == obj;
}
/**
* return the construction element ID
*
* @return the construction element ID
*/
public long getID() {
return ceID;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return super.hashCode();
}
/**
* @param tpl
* string template
* @return command description, e.g. "Midpoint[A,B]"
*/
public abstract String getDefinition(StringTemplate tpl);
/**
* Returns string representation of this element
*
* @param tpl
* string template
* @return e.g. "A=(1,2)"
*/
public abstract String toString(StringTemplate tpl);
public abstract String toString(GTemplate tpl);
protected Localization getLoc() {
return cons.getKernel().getLocalization();
}
abstract public void addPredecessorsToSet(final TreeSet<GeoElement> set,
final boolean onlyIndependent);
}