package org.geogebra.common.geogebra3D.main;
import java.util.ArrayList;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.geogebra3D.euclidianForPlane.EuclidianViewForPlaneCompanion;
import org.geogebra.common.geogebra3D.kernel3D.GeoFactory3D;
import org.geogebra.common.geogebra3D.kernel3D.Kernel3D;
import org.geogebra.common.geogebra3D.main.settings.EuclidianSettingsForPlane;
import org.geogebra.common.gui.layout.DockPanel;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.commands.CommandsConstants;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.kernelND.ViewCreator;
import org.geogebra.common.main.App;
import org.geogebra.common.main.AppCompanion;
import org.geogebra.common.main.settings.EuclidianSettings;
import org.geogebra.common.main.settings.Settings;
/**
*
* @author mathieu
*
* Companion for 3D application
*/
public abstract class App3DCompanion extends AppCompanion {
// id of the first view
private int viewId = App.VIEW_EUCLIDIAN_FOR_PLANE_START;
/**
* Constructor
*
* @param app
* application
*/
public App3DCompanion(App app) {
super(app);
}
@Override
public Kernel newKernel() {
return new Kernel3D(app, new GeoFactory3D());
}
@Override
protected boolean tableVisible(int table) {
return !(table == CommandsConstants.TABLE_CAS
|| table == CommandsConstants.TABLE_ENGLISH);
}
// ///////////////////////////////
// EUCLIDIAN VIEW FOR PLANE
// ///////////////////////////////
protected ArrayList<EuclidianViewForPlaneCompanion> euclidianViewForPlaneCompanionList;
private EuclidianViewForPlaneCompanion euclidianViewForPlaneCompanion;
/**
* add euclidian views for plane settings
*
* @param sb
* string builder
* @param asPreference
* save as preference flag
*/
public void addCompleteUserInterfaceXMLForPlane(StringBuilder sb,
boolean asPreference) {
if (euclidianViewForPlaneCompanionList != null) {
for (EuclidianViewForPlaneCompanion vfpc : euclidianViewForPlaneCompanionList) {
vfpc.getView().getXML(sb, asPreference);
}
}
}
@Override
public void getEuclidianViewXML(StringBuilder sb, boolean asPreference) {
super.getEuclidianViewXML(sb, asPreference);
if (app.isEuclidianView3Dinited()) {
// TODO it would be cleaner to use EuclidianSettings here instead
app.getEuclidianView3D().getXML(sb, asPreference);
}
if (euclidianViewForPlaneCompanionList != null) {
for (EuclidianViewForPlaneCompanion vfpc : euclidianViewForPlaneCompanionList) {
vfpc.getView().getXML(sb, asPreference);
}
}
}
/**
* create new euclidian view for plane
*
* @param plane
* plane
* @param evSettings
* settings
* @return view companion
*/
protected abstract EuclidianViewForPlaneCompanion createEuclidianViewForPlane(
ViewCreator plane, EuclidianSettings evSettings,
boolean panelSettings);
@Override
public EuclidianViewForPlaneCompanion createEuclidianViewForPlane(
ViewCreator plane, boolean panelSettings) {
// create new view for plane and controller
Settings settings = app.getSettings();
String name = ((GeoElement) plane).getLabelSimple();
EuclidianSettings evSettings = settings.getEuclidianForPlane(name);
if (evSettings == null) {
evSettings = new EuclidianSettingsForPlane(app);
evSettings.setShowGridSetting(false);
evSettings.setShowAxes(false, false);
settings.setEuclidianSettingsForPlane(name, evSettings);
}
euclidianViewForPlaneCompanion = createEuclidianViewForPlane(plane,
evSettings, panelSettings);
evSettings.addListener(euclidianViewForPlaneCompanion.getView());
euclidianViewForPlaneCompanion.getView().updateFonts();
euclidianViewForPlaneCompanion.addExistingGeos();
// add it to list
if (euclidianViewForPlaneCompanionList == null) {
euclidianViewForPlaneCompanionList = new ArrayList<EuclidianViewForPlaneCompanion>();
}
euclidianViewForPlaneCompanionList.add(euclidianViewForPlaneCompanion);
return euclidianViewForPlaneCompanion;
}
@Override
public void resetFonts() {
super.resetFonts();
if (app.getGuiManager() != null && app.showView(App.VIEW_EUCLIDIAN3D)) {
((EuclidianView) app.getEuclidianView3D()).updateFonts();
}
if (euclidianViewForPlaneCompanion != null) {
euclidianViewForPlaneCompanion.getView().updateFonts();
}
}
/**
* remove the view from the list
*
* @param vfpc
* view for plane companion
*/
public void removeEuclidianViewForPlaneFromList(
EuclidianViewForPlaneCompanion vfpc) {
euclidianViewForPlaneCompanionList.remove(vfpc);
app.getSettings().removeEuclidianSettingsForPlane(
((GeoElement) vfpc.getPlane()).getLabelSimple());
}
/**
* remove all euclidian views for plane
*/
public void removeAllEuclidianViewForPlane() {
if (euclidianViewForPlaneCompanionList == null) {
return;
}
for (EuclidianViewForPlaneCompanion vfpc : euclidianViewForPlaneCompanionList) {
vfpc.removeFromGuiAndKernel();
}
euclidianViewForPlaneCompanionList.clear();
app.getSettings().clearEuclidianSettingsForPlane();
}
@Override
public DockPanel createEuclidianDockPanelForPlane(int id, String plane) {
GeoElement geo = app.getKernel().lookupLabel(plane);
if (geo == null) {
return null;
}
if (!(geo instanceof ViewCreator)) {
return null;
}
ViewCreator vc = (ViewCreator) geo;// getViewCreator(id);
vc.setEuclidianViewForPlane(createEuclidianViewForPlane(vc, false));
return getPanelForPlane();
}
/**
*
* @return current dockpanel for plane
*/
abstract public DockPanel getPanelForPlane();
@Override
public Settings newSettings() {
return new Settings(app, 3);
}
@Override
public boolean hasEuclidianViewForPlane() {
return euclidianViewForPlaneCompanionList != null
&& euclidianViewForPlaneCompanionList.size() > 0;
}
@Override
public boolean hasEuclidianViewForPlaneVisible() {
if (!hasEuclidianViewForPlane()) {
return false;
}
for (EuclidianViewForPlaneCompanion c : euclidianViewForPlaneCompanionList) {
if (c.isPanelVisible()) {
return true;
}
}
return false;
}
@Override
public EuclidianView getViewForPlaneVisible() {
if (!hasEuclidianViewForPlane()) {
return null;
}
for (EuclidianViewForPlaneCompanion c : euclidianViewForPlaneCompanionList) {
if (c.getView().isShowing()) {
return c.getView();
}
}
return null;
}
@Override
public void addToViewsForPlane(GeoElement geo) {
if (euclidianViewForPlaneCompanionList == null) {
return;
}
for (EuclidianViewForPlaneCompanion c : euclidianViewForPlaneCompanionList) {
c.getView().add(geo);
}
}
@Override
public void removeFromViewsForPlane(GeoElement geo) {
if (euclidianViewForPlaneCompanionList == null) {
return;
}
for (EuclidianViewForPlaneCompanion c : euclidianViewForPlaneCompanionList) {
c.getView().remove(geo);
}
}
@Override
public final void resetEuclidianViewForPlaneIds() {
viewId = App.VIEW_EUCLIDIAN_FOR_PLANE_START;
}
public int incViewID() {
return viewId++;
}
}