package org.geogebra.common.main.settings; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Set; import org.geogebra.common.awt.GDimension; import org.geogebra.common.factories.AwtFactory; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.plugin.SensorLogger.Types; /** * Settings for the data collection view. */ public class DataCollectionSettings extends AbstractSettings { // public class Defaults { // // timeout in ms // public static final int TIMEOUT = 100; // } // // private int timeout = Defaults.TIMEOUT; private GDimension preferredSize; public DataCollectionSettings(LinkedList<SettingListener> listeners) { super(listeners); preferredSize = AwtFactory.getPrototype().newDimension(0, 0); } public DataCollectionSettings() { super(); preferredSize = AwtFactory.getPrototype().newDimension(0, 0); } // Object can be String or GeoElement // Strings needed in case before construction loaded // GeoElements needed later in case geo is renamed private HashMap<Types, Object> mapper = new HashMap<Types, Object>(); /** * called from loading a saved material * * @param type * eg Types.ACCELEROMETER_X * @param label * GeoElement's label */ public void mapSensorToGeo(Types type, String label) { mapper.put(type, label); settingChanged(); } public void mapSensorToGeo(Types type, GeoElement geo) { mapper.put(type, geo); } /** * @param type * eg Types.ACCELEROMETER_X * @param cons * cons * @return GeoElement (can be null) */ public GeoElement getGeoMappedToSensor(Types type, Construction cons) { Object geoObj = mapper.get(type); GeoElement geo = null; if (geoObj instanceof String) { geo = cons.lookupLabel((String) geoObj); // faster lookup next time if (geo != null) { mapper.put(type, geo); } } else if (geoObj instanceof GeoElement) { geo = (GeoElement) geoObj; } return geo; } // ============================================ // PreferredSize Settings // ============================================ /** * @return the preferredSize */ public GDimension preferredSize() { return preferredSize; } /** * @param preferredSize * the preferredSize to set */ public void setPreferredSize(GDimension preferredSize) { if (this.preferredSize == null || !this.preferredSize.equals(preferredSize)) { this.preferredSize = preferredSize; settingChanged(); } } // ============================================ // XML // ============================================ /** * returns settings in XML format */ public void getXML(StringBuilder sb, boolean asPreference, Construction cons) { sb.append("<dataCollectionView>\n"); // GDimension size = preferredSize(); // int width = size.getWidth(); // int height = size.getHeight(); // sb.append("\t<size "); // if (width != 0) { // sb.append(" width=\""); // sb.append(width); // sb.append("\""); // } // // if (height != 0) { // sb.append(" height=\""); // sb.append(height); // sb.append("\""); // } // sb.append("/>\n"); // if (timeout != Defaults.TIMEOUT) { // sb.append("\t<timeout "); // sb.append(" value=\""); // sb.append(timeout); // sb.append("\""); // sb.append("/>\n"); // } // for testing only, REMOVE // mapper.put(Types.ACCELEROMETER_X, "testGeoLabel"); Set<Types> types = mapper.keySet(); Iterator<Types> it = types.iterator(); while (it.hasNext()) { Types type = it.next(); if (type.storeInXML()) { GeoElement geo = getGeoMappedToSensor(type, cons); if (geo != null) { sb.append("\t<"); sb.append(type.toXMLString()); sb.append(" geo=\""); sb.append(geo.getLabelSimple()); sb.append("\""); sb.append("/>\n"); } } } sb.append("</dataCollectionView>\n"); } public void removeMappedGeo(Types type) { this.mapper.remove(type); } }