package org.geogebra.common.gui.toolcategorization;
import org.geogebra.common.euclidian.EuclidianConstants;
import org.geogebra.common.gui.toolbar.ToolBar;
import org.geogebra.common.main.App;
import java.util.ArrayList;
import java.util.TreeSet;
/**
* Created by mathieu on 11/05/17.
*/
public class ToolCategorization {
public enum Type {GEOMETRY, GRAPHING_CALCULATOR, GRAPHER_3D}
public enum Category {
BASIC("Basic"), LINES("Lines"), CIRCLES("Circles"),
PLANES("Planes");
private final String header;
Category(String header) {
this.header = header;
}
public String getHeader() {
return header;
}
}
private Type type;
private ArrayList<Category> customizedCategories;
private ArrayList<ArrayList<Integer>> toolsLists;
private TreeSet<Integer> availableTools;
private App app;
/**
* Creates a tool categorization for the give type
*
* @param app App (for localization)
* @param type categorization type
*/
public ToolCategorization(App app, Type type) {
this.app = app;
toolsLists = new ArrayList<ArrayList<Integer>>();
customizedCategories = new ArrayList<Category>();
this.type = type;
}
/**
* @return categories used
*/
public ArrayList<Category> getCategories() {
return customizedCategories;
}
/**
* @param category tools category
* @return localized header for this category
*/
public String getLocalizedHeader(Category category) {
return app.getLocalization().getPlain(category.getHeader());
}
/**
* categoryId is the rank of the category over the categories list
*
* @param categoryId category id
* @return list of tools for that category
*/
public ArrayList<Integer> getTools(int categoryId) {
return toolsLists.get(categoryId);
}
/**
* reset tools & categories list
*/
public void resetTools() {
resetTools(null);
}
/**
* reset tools & categories list, keeping only tools present in toolbarDef
*
* @param toolbarDef toolbar definition
*/
public void resetTools(String toolbarDef) {
if (toolbarDef == null) {
this.availableTools = null;
} else {
this.availableTools = ToolBar.toSet(toolbarDef);
}
toolsLists.clear();
customizedCategories.clear();
buildTools();
}
private void buildTools() {
Category category;
ArrayList<Integer> tools;
switch (type) {
case GEOMETRY:
case GRAPHING_CALCULATOR:
default:
category = Category.BASIC;
tools = new ArrayList<Integer>();
addToList(tools, EuclidianConstants.MODE_MOVE);
addToList(tools, EuclidianConstants.MODE_POINT);
addToList(tools, EuclidianConstants.MODE_SEGMENT);
addToList(tools, EuclidianConstants.MODE_JOIN);
addToList(tools, EuclidianConstants.MODE_CIRCLE_TWO_POINTS);
addToList(tools, EuclidianConstants.MODE_POLYGON);
addToList(tools, EuclidianConstants.MODE_INTERSECT);
storeIfNotEmpty(category, tools);
category = Category.LINES;
tools = new ArrayList<Integer>();
addToList(tools, EuclidianConstants.MODE_ORTHOGONAL);
addToList(tools, EuclidianConstants.MODE_LINE_BISECTOR);
addToList(tools, EuclidianConstants.MODE_PARALLEL);
addToList(tools, EuclidianConstants.MODE_ANGULAR_BISECTOR);
addToList(tools, EuclidianConstants.MODE_SEGMENT_FIXED);
addToList(tools, EuclidianConstants.MODE_SEGMENT);
addToList(tools, EuclidianConstants.MODE_JOIN);
addToList(tools, EuclidianConstants.MODE_RAY);
addToList(tools, EuclidianConstants.MODE_VECTOR);
addToList(tools, EuclidianConstants.MODE_POLYLINE);
addToList(tools, EuclidianConstants.MODE_TANGENTS);
addToList(tools, EuclidianConstants.MODE_VECTOR_FROM_POINT);
addToList(tools, EuclidianConstants.MODE_FITLINE);
addToList(tools, EuclidianConstants.MODE_POLAR_DIAMETER);
storeIfNotEmpty(category, tools);
category = Category.CIRCLES;
tools = new ArrayList<Integer>();
addToList(tools, EuclidianConstants.MODE_CIRCLE_TWO_POINTS);
addToList(tools, EuclidianConstants.MODE_COMPASSES);
addToList(tools, EuclidianConstants.MODE_CIRCLE_POINT_RADIUS);
addToList(tools, EuclidianConstants.MODE_CIRCLE_THREE_POINTS);
addToList(tools, EuclidianConstants.MODE_SEMICIRCLE);
addToList(tools, EuclidianConstants.MODE_CIRCLE_ARC_THREE_POINTS);
addToList(tools, EuclidianConstants.MODE_CIRCLE_SECTOR_THREE_POINTS);
addToList(tools, EuclidianConstants.MODE_CIRCUMCIRCLE_ARC_THREE_POINTS);
addToList(tools, EuclidianConstants.MODE_CIRCUMCIRCLE_SECTOR_THREE_POINTS);
storeIfNotEmpty(category, tools);
break;
case GRAPHER_3D:
category = Category.BASIC;
tools = new ArrayList<Integer>();
addToList(tools, EuclidianConstants.MODE_MOVE);
addToList(tools, EuclidianConstants.MODE_POINT);
addToList(tools, EuclidianConstants.MODE_SEGMENT);
addToList(tools, EuclidianConstants.MODE_JOIN);
addToList(tools, EuclidianConstants.MODE_SPHERE_TWO_POINTS);
addToList(tools, EuclidianConstants.MODE_CUBE);
addToList(tools, EuclidianConstants.MODE_INTERSECT);
storeIfNotEmpty(category, tools);
category = Category.LINES;
tools = new ArrayList<Integer>();
addToList(tools, EuclidianConstants.MODE_ORTHOGONAL);
addToList(tools, EuclidianConstants.MODE_LINE_BISECTOR);
addToList(tools, EuclidianConstants.MODE_PARALLEL);
addToList(tools, EuclidianConstants.MODE_ANGULAR_BISECTOR);
addToList(tools, EuclidianConstants.MODE_SEGMENT_FIXED);
addToList(tools, EuclidianConstants.MODE_SEGMENT);
addToList(tools, EuclidianConstants.MODE_JOIN);
addToList(tools, EuclidianConstants.MODE_RAY);
addToList(tools, EuclidianConstants.MODE_VECTOR);
addToList(tools, EuclidianConstants.MODE_POLYLINE);
addToList(tools, EuclidianConstants.MODE_TANGENTS);
addToList(tools, EuclidianConstants.MODE_VECTOR_FROM_POINT);
addToList(tools, EuclidianConstants.MODE_INTERSECTION_CURVE);
storeIfNotEmpty(category, tools);
category = Category.PLANES;
tools = new ArrayList<Integer>();
addToList(tools, EuclidianConstants.MODE_PLANE_THREE_POINTS);
addToList(tools, EuclidianConstants.MODE_PLANE);
addToList(tools, EuclidianConstants.MODE_ORTHOGONAL_PLANE);
addToList(tools, EuclidianConstants.MODE_PARALLEL_PLANE);
storeIfNotEmpty(category, tools);
break;
}
}
private void storeIfNotEmpty(Category category, ArrayList<Integer> tools) {
if (!tools.isEmpty()) {
customizedCategories.add(category);
toolsLists.add(tools);
}
}
final private void addToList(ArrayList<Integer> toolList, int mode) {
if (availableTools == null || availableTools.contains(mode)) {
toolList.add(mode);
}
}
}