/* * Catroid: An on-device visual programming system for Android devices * Copyright (C) 2010-2016 The Catrobat Team * (<http://developer.catrobat.org/credits>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * An additional term exception under section 7 of the GNU Affero * General Public License, version 3, is available at * http://developer.catrobat.org/license_additional_term * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.catrobat.catroid.formulaeditor; import org.catrobat.catroid.R; import java.util.LinkedList; import java.util.List; public class InternFormulaKeyboardAdapter { public static final int FORMULA_EDITOR_COLLIDE_RESOURCE_ID = 2; public static final int FORMULA_EDITOR_USER_LIST_RESOURCE_ID = 1; public static final int FORMULA_EDITOR_USER_VARIABLE_RESOURCE_ID = 0; public List<InternToken> createInternTokenListByResourceId(int resource, String name) { //USER VARIABLES if ((resource == FORMULA_EDITOR_USER_VARIABLE_RESOURCE_ID) && !name.isEmpty()) { return buildUserVariable(name); } //COLLISION FORMULA if ((resource == FORMULA_EDITOR_COLLIDE_RESOURCE_ID) && !name.isEmpty()) { return buildCollideWithFormula(name); } //USER LISTS if ((resource == FORMULA_EDITOR_USER_LIST_RESOURCE_ID) && !name.isEmpty()) { return buildUserList(name); } //STRING if ((resource == R.id.formula_editor_keyboard_string)) { return buildString(name); } switch (resource) { // NUMBER: case R.id.formula_editor_keyboard_0: return buildNumber("0"); case R.id.formula_editor_keyboard_1: return buildNumber("1"); case R.id.formula_editor_keyboard_2: return buildNumber("2"); case R.id.formula_editor_keyboard_3: return buildNumber("3"); case R.id.formula_editor_keyboard_4: return buildNumber("4"); case R.id.formula_editor_keyboard_5: return buildNumber("5"); case R.id.formula_editor_keyboard_6: return buildNumber("6"); case R.id.formula_editor_keyboard_7: return buildNumber("7"); case R.id.formula_editor_keyboard_8: return buildNumber("8"); case R.id.formula_editor_keyboard_9: return buildNumber("9"); //FUNCTIONS: case R.string.formula_editor_function_sin: return buildSingleParameterFunction(Functions.SIN, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_cos: return buildSingleParameterFunction(Functions.COS, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_tan: return buildSingleParameterFunction(Functions.TAN, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_ln: return buildSingleParameterFunction(Functions.LN, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_log: return buildSingleParameterFunction(Functions.LOG, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_pi: return buildFunctionWithoutParametersAndBrackets(Functions.PI); case R.string.formula_editor_function_sqrt: return buildSingleParameterFunction(Functions.SQRT, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_rand: return buildDoubleParameterFunction(Functions.RAND, InternTokenType.NUMBER, "0", InternTokenType.NUMBER, "1"); case R.string.formula_editor_function_abs: return buildSingleParameterFunction(Functions.ABS, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_round: return buildSingleParameterFunction(Functions.ROUND, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_mod: return buildDoubleParameterFunction(Functions.MOD, InternTokenType.NUMBER, "1", InternTokenType.NUMBER, "1"); case R.string.formula_editor_function_arcsin: return buildSingleParameterFunction(Functions.ARCSIN, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_arccos: return buildSingleParameterFunction(Functions.ARCCOS, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_arctan: return buildSingleParameterFunction(Functions.ARCTAN, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_exp: return buildSingleParameterFunction(Functions.EXP, InternTokenType.NUMBER, "1"); case R.string.formula_editor_function_power: return buildDoubleParameterFunction(Functions.POWER, InternTokenType.NUMBER, "2", InternTokenType.NUMBER, "3"); case R.string.formula_editor_function_floor: return buildSingleParameterFunction(Functions.FLOOR, InternTokenType.NUMBER, "0.7"); case R.string.formula_editor_function_ceil: return buildSingleParameterFunction(Functions.CEIL, InternTokenType.NUMBER, "0.3"); case R.string.formula_editor_function_max: return buildDoubleParameterFunction(Functions.MAX, InternTokenType.NUMBER, "0", InternTokenType.NUMBER, "1"); case R.string.formula_editor_function_min: return buildDoubleParameterFunction(Functions.MIN, InternTokenType.NUMBER, "0", InternTokenType.NUMBER, "1"); case R.string.formula_editor_function_true: return buildFunctionWithoutParametersAndBrackets(Functions.TRUE); case R.string.formula_editor_function_false: return buildFunctionWithoutParametersAndBrackets(Functions.FALSE); case R.string.formula_editor_function_letter: return buildDoubleParameterFunction(Functions.LETTER, InternTokenType.NUMBER, "1", InternTokenType.STRING, "hello world"); case R.string.formula_editor_function_length: return buildSingleParameterFunction(Functions.LENGTH, InternTokenType.STRING, "hello world"); case R.string.formula_editor_function_number_of_items: return buildSingleParameterFunction(Functions.NUMBER_OF_ITEMS, InternTokenType.USER_LIST, "list name"); case R.string.formula_editor_function_join: return buildDoubleParameterFunction(Functions.JOIN, InternTokenType.STRING, "hello", InternTokenType.STRING, " world"); case R.string.formula_editor_function_list_item: return buildDoubleParameterFunction(Functions.LIST_ITEM, InternTokenType.NUMBER, "1", InternTokenType.USER_LIST, "list name"); case R.string.formula_editor_function_contains: return buildDoubleParameterFunction(Functions.CONTAINS, InternTokenType.USER_LIST, "list name", InternTokenType.NUMBER, "1"); //Arduino case R.string.formula_editor_function_arduino_read_pin_value_digital: return buildSingleParameterFunction(Functions.ARDUINODIGITAL, InternTokenType.NUMBER, "0"); case R.string.formula_editor_function_arduino_read_pin_value_analog: return buildSingleParameterFunction(Functions.ARDUINOANALOG, InternTokenType.NUMBER, "0"); //RaspberryPi case R.string.formula_editor_function_raspi_read_pin_value_digital: return buildSingleParameterFunction(Functions.RASPIDIGITAL, InternTokenType.NUMBER, "0"); //Finger touching case R.string.formula_editor_function_finger_x: return buildSensor(Sensors.FINGER_X); case R.string.formula_editor_function_finger_y: return buildSensor(Sensors.FINGER_Y); case R.string.formula_editor_function_is_finger_touching: return buildSensor(Sensors.FINGER_TOUCHED); case R.string.formula_editor_function_multi_finger_x: return buildSingleParameterFunction(Functions.MULTI_FINGER_X, InternTokenType.NUMBER, "1"); case R.string.formula_editor_function_multi_finger_y: return buildSingleParameterFunction(Functions.MULTI_FINGER_Y, InternTokenType.NUMBER, "1"); case R.string.formula_editor_function_is_multi_finger_touching: return buildSingleParameterFunction(Functions.MULTI_FINGER_TOUCHED, InternTokenType.NUMBER, "1"); case R.string.formula_editor_function_index_of_last_finger: return buildSensor(Sensors.LAST_FINGER_INDEX); //SENSOR case R.string.formula_editor_sensor_x_acceleration: return buildSensor(Sensors.X_ACCELERATION); case R.string.formula_editor_sensor_y_acceleration: return buildSensor(Sensors.Y_ACCELERATION); case R.string.formula_editor_sensor_z_acceleration: return buildSensor(Sensors.Z_ACCELERATION); case R.string.formula_editor_sensor_compass_direction: return buildSensor(Sensors.COMPASS_DIRECTION); case R.string.formula_editor_sensor_latitude: return buildSensor(Sensors.LATITUDE); case R.string.formula_editor_sensor_longitude: return buildSensor(Sensors.LONGITUDE); case R.string.formula_editor_sensor_location_accuracy: return buildSensor(Sensors.LOCATION_ACCURACY); case R.string.formula_editor_sensor_altitude: return buildSensor(Sensors.ALTITUDE); case R.string.formula_editor_sensor_x_inclination: return buildSensor(Sensors.X_INCLINATION); case R.string.formula_editor_sensor_y_inclination: return buildSensor(Sensors.Y_INCLINATION); case R.string.formula_editor_sensor_loudness: return buildSensor(Sensors.LOUDNESS); case R.string.formula_editor_sensor_face_detected: return buildSensor(Sensors.FACE_DETECTED); case R.string.formula_editor_sensor_face_size: return buildSensor(Sensors.FACE_SIZE); case R.string.formula_editor_sensor_face_x_position: return buildSensor(Sensors.FACE_X_POSITION); case R.string.formula_editor_sensor_face_y_position: return buildSensor(Sensors.FACE_Y_POSITION); case R.string.formula_editor_phiro_sensor_front_left: return buildSensor(Sensors.PHIRO_FRONT_LEFT); case R.string.formula_editor_phiro_sensor_front_right: return buildSensor(Sensors.PHIRO_FRONT_RIGHT); case R.string.formula_editor_phiro_sensor_side_left: return buildSensor(Sensors.PHIRO_SIDE_LEFT); case R.string.formula_editor_phiro_sensor_side_right: return buildSensor(Sensors.PHIRO_SIDE_RIGHT); case R.string.formula_editor_phiro_sensor_bottom_left: return buildSensor(Sensors.PHIRO_BOTTOM_LEFT); case R.string.formula_editor_phiro_sensor_bottom_right: return buildSensor(Sensors.PHIRO_BOTTOM_RIGHT); case R.string.formula_editor_sensor_date_year: return buildSensor(Sensors.DATE_YEAR); case R.string.formula_editor_sensor_date_month: return buildSensor(Sensors.DATE_MONTH); case R.string.formula_editor_sensor_date_day: return buildSensor(Sensors.DATE_DAY); case R.string.formula_editor_sensor_date_weekday: return buildSensor(Sensors.DATE_WEEKDAY); case R.string.formula_editor_sensor_time_hour: return buildSensor(Sensors.TIME_HOUR); case R.string.formula_editor_sensor_time_minute: return buildSensor(Sensors.TIME_MINUTE); case R.string.formula_editor_sensor_time_second: return buildSensor(Sensors.TIME_SECOND); case R.string.formula_editor_nfc_tag_id: return buildSensor(Sensors.NFC_TAG_ID); case R.string.formula_editor_nfc_tag_message: return buildSensor(Sensors.NFC_TAG_MESSAGE); //NXT SENSOR case R.string.formula_editor_sensor_lego_nxt_1: return buildSensor(Sensors.NXT_SENSOR_1); case R.string.formula_editor_sensor_lego_nxt_2: return buildSensor(Sensors.NXT_SENSOR_2); case R.string.formula_editor_sensor_lego_nxt_3: return buildSensor(Sensors.NXT_SENSOR_3); case R.string.formula_editor_sensor_lego_nxt_4: return buildSensor(Sensors.NXT_SENSOR_4); case R.string.formula_editor_sensor_lego_ev3_1: return buildSensor(Sensors.EV3_SENSOR_1); case R.string.formula_editor_sensor_lego_ev3_2: return buildSensor(Sensors.EV3_SENSOR_2); case R.string.formula_editor_sensor_lego_ev3_3: return buildSensor(Sensors.EV3_SENSOR_3); case R.string.formula_editor_sensor_lego_ev3_4: return buildSensor(Sensors.EV3_SENSOR_4); //DRONE SENSOR case R.string.formula_editor_sensor_drone_battery_status: return buildSensor(Sensors.DRONE_BATTERY_STATUS); case R.string.formula_editor_sensor_drone_emergency_state: return buildSensor(Sensors.DRONE_EMERGENCY_STATE); case R.string.formula_editor_sensor_drone_flying: return buildSensor(Sensors.DRONE_FLYING); case R.string.formula_editor_sensor_drone_initialized: return buildSensor(Sensors.DRONE_INITIALIZED); case R.string.formula_editor_sensor_drone_usb_active: return buildSensor(Sensors.DRONE_USB_ACTIVE); case R.string.formula_editor_sensor_drone_usb_remaining_time: return buildSensor(Sensors.DRONE_USB_REMAINING_TIME); case R.string.formula_editor_sensor_drone_camera_ready: return buildSensor(Sensors.DRONE_CAMERA_READY); case R.string.formula_editor_sensor_drone_record_ready: return buildSensor(Sensors.DRONE_RECORD_READY); case R.string.formula_editor_sensor_drone_recording: return buildSensor(Sensors.DRONE_RECORDING); case R.string.formula_editor_sensor_drone_num_frames: return buildSensor(Sensors.DRONE_NUM_FRAMES); //PERIOD case R.id.formula_editor_keyboard_decimal_mark: return buildPeriod(); //OPERATOR case R.id.formula_editor_keyboard_plus: return buildOperator(Operators.PLUS); case R.id.formula_editor_keyboard_minus: return buildOperator(Operators.MINUS); case R.id.formula_editor_keyboard_mult: return buildOperator(Operators.MULT); case R.id.formula_editor_keyboard_divide: return buildOperator(Operators.DIVIDE); case R.string.formula_editor_operator_power: return buildOperator(Operators.POW); case R.id.formula_editor_keyboard_equal: return buildOperator(Operators.EQUAL); case R.string.formula_editor_logic_equal: return buildOperator(Operators.EQUAL); case R.string.formula_editor_logic_notequal: return buildOperator(Operators.NOT_EQUAL); case R.string.formula_editor_logic_lesserthan: return buildOperator(Operators.SMALLER_THAN); case R.string.formula_editor_logic_leserequal: return buildOperator(Operators.SMALLER_OR_EQUAL); case R.string.formula_editor_logic_greaterthan: return buildOperator(Operators.GREATER_THAN); case R.string.formula_editor_logic_greaterequal: return buildOperator(Operators.GREATER_OR_EQUAL); case R.string.formula_editor_logic_and: return buildOperator(Operators.LOGICAL_AND); case R.string.formula_editor_logic_or: return buildOperator(Operators.LOGICAL_OR); case R.string.formula_editor_logic_not: return buildOperator(Operators.LOGICAL_NOT); //BRACKETS case R.id.formula_editor_keyboard_bracket_open: return buildBracketOpen(); case R.id.formula_editor_keyboard_bracket_close: return buildBracketClose(); //COSTUME case R.string.formula_editor_object_x: return buildObject(Sensors.OBJECT_X); case R.string.formula_editor_object_y: return buildObject(Sensors.OBJECT_Y); case R.string.formula_editor_object_transparency: return buildObject(Sensors.OBJECT_TRANSPARENCY); case R.string.formula_editor_object_brightness: return buildObject(Sensors.OBJECT_BRIGHTNESS); case R.string.formula_editor_object_color: return buildObject(Sensors.OBJECT_COLOR); case R.string.formula_editor_object_size: return buildObject(Sensors.OBJECT_SIZE); case R.string.formula_editor_object_rotation: return buildObject(Sensors.OBJECT_ROTATION); case R.string.formula_editor_object_layer: return buildObject(Sensors.OBJECT_LAYER); case R.string.formula_editor_object_x_velocity: return buildObject(Sensors.OBJECT_X_VELOCITY); case R.string.formula_editor_object_y_velocity: return buildObject(Sensors.OBJECT_Y_VELOCITY); case R.string.formula_editor_object_angular_velocity: return buildObject(Sensors.OBJECT_ANGULAR_VELOCITY); case R.string.formula_editor_object_look_number: return buildObject(Sensors.OBJECT_LOOK_NUMBER); case R.string.formula_editor_object_look_name: return buildObject(Sensors.OBJECT_LOOK_NAME); case R.string.formula_editor_object_background_number: return buildObject(Sensors.OBJECT_BACKGROUND_NUMBER); case R.string.formula_editor_object_background_name: return buildObject(Sensors.OBJECT_BACKGROUND_NAME); case R.string.formula_editor_object_distance_to: return buildObject(Sensors.OBJECT_DISTANCE_TO); case R.string.formula_editor_function_collides_with_edge: return buildObject(Sensors.COLLIDES_WITH_EDGE); case R.string.formula_editor_function_touched: return buildObject(Sensors.COLLIDES_WITH_FINGER); } return null; } private List<InternToken> buildBracketOpen() { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.BRACKET_OPEN)); return returnList; } private List<InternToken> buildBracketClose() { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.BRACKET_CLOSE)); return returnList; } private List<InternToken> buildUserList(String userListName) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.USER_LIST, userListName)); return returnList; } private List<InternToken> buildUserVariable(String userVariableName) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.USER_VARIABLE, userVariableName)); return returnList; } private List<InternToken> buildCollideWithFormula(String formula) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.COLLISION_FORMULA, formula)); return returnList; } private List<InternToken> buildPeriod() { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.PERIOD)); return returnList; } private List<InternToken> buildNumber(String numberValue) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.NUMBER, numberValue)); return returnList; } private List<InternToken> buildObject(Sensors sensors) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.SENSOR, sensors.name())); return returnList; } private List<InternToken> buildOperator(Operators operator) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.OPERATOR, operator.name())); return returnList; } private List<InternToken> buildSensor(Sensors sensor) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.SENSOR, sensor.name())); return returnList; } private List<InternToken> buildDoubleParameterFunction(Functions function, InternTokenType firstParameter, String firstParameterNumberValue, InternTokenType secondParameter, String secondParameterNumberValue) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.FUNCTION_NAME, function.name())); returnList.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); returnList.add(new InternToken(firstParameter, firstParameterNumberValue)); returnList.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); returnList.add(new InternToken(secondParameter, secondParameterNumberValue)); returnList.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); return returnList; } private List<InternToken> buildSingleParameterFunction(Functions function, InternTokenType firstParameter, String parameterNumberValue) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.FUNCTION_NAME, function.name())); returnList.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); returnList.add(new InternToken(firstParameter, parameterNumberValue)); returnList.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); return returnList; } private List<InternToken> buildFunctionWithoutParametersAndBrackets(Functions function) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.FUNCTION_NAME, function.name())); return returnList; } private List<InternToken> buildString(String myString) { List<InternToken> returnList = new LinkedList<InternToken>(); returnList.add(new InternToken(InternTokenType.STRING, myString)); return returnList; } }