package com.himamis.retex.editor.share.controller; import com.himamis.retex.editor.share.model.MathArray; import com.himamis.retex.editor.share.model.MathCharacter; import com.himamis.retex.editor.share.model.MathContainer; import com.himamis.retex.editor.share.model.MathFunction; import com.himamis.retex.editor.share.model.MathSequence; public class ArgumentHelper { public static void passArgument(EditorState editorState, MathContainer container) { MathSequence currentField = editorState.getCurrentField(); int currentOffset = editorState.getCurrentOffset(); // get pass to argument MathSequence field = (MathSequence) container.getArgument(container.getInsertIndex()); if (currentField.getArgument(currentOffset - 1) instanceof MathCharacter && "\u200b".equals(currentField.getArgument(currentOffset - 1) .toString())) { currentField.delArgument(currentOffset - 1); currentOffset--; } // pass scripts first while (currentOffset > 0 && currentField.isScript(currentOffset - 1)) { MathFunction character = (MathFunction) currentField.getArgument(currentOffset - 1); currentField.delArgument(currentOffset - 1); currentOffset--; field.addArgument(0, character); } editorState.setCurrentOffset(currentOffset); if (currentOffset > 0) { // if previous sequence argument are braces pass their content if (currentField.getArgument(currentOffset - 1) instanceof MathArray) { MathArray array = (MathArray) currentField.getArgument(currentOffset - 1); currentField.delArgument(currentOffset - 1); currentOffset--; if (field.size() == 0) { // here we already have sequence, just set it if (array.size() > 1) { MathSequence wrap = new MathSequence(); wrap.addArgument(array); container.setArgument(container.getInsertIndex(), wrap); } else { container.setArgument(container.getInsertIndex(), array.getArgument(0)); } } else { field.addArgument(0, array); } // if previous sequence argument is, function pass it } else if (currentField.getArgument(currentOffset - 1) instanceof MathFunction) { MathFunction function = (MathFunction) currentField.getArgument(currentOffset - 1); currentField.delArgument(currentOffset - 1); currentOffset--; field.addArgument(0, function); // otherwise pass character sequence } else { passCharacters(editorState, container); currentOffset = editorState.getCurrentOffset(); } } editorState.setCurrentOffset(currentOffset); } private static void passCharacters(EditorState editorState, MathContainer container) { int currentOffset = editorState.getCurrentOffset(); MathSequence currentField = editorState.getCurrentField(); // get pass to argument MathSequence field = (MathSequence) container.getArgument(container.getInsertIndex()); while (currentOffset > 0 && currentField.getArgument(currentOffset - 1) instanceof MathCharacter) { MathCharacter character = (MathCharacter) currentField.getArgument(currentOffset - 1); if (character.isOperator() || character.isSeparator()) { break; } currentField.delArgument(currentOffset - 1); currentOffset--; field.addArgument(0, character); } editorState.setCurrentOffset(currentOffset); } public static String readCharacters(EditorState editorState) { StringBuilder stringBuilder = new StringBuilder(); int offset = editorState.getCurrentOffset(); MathSequence currentField = editorState.getCurrentField(); if (currentField.getArgument(offset) instanceof MathCharacter && ((MathCharacter) currentField.getArgument(offset)) .isOperator()) { return ""; } while (offset > 0 && currentField.getArgument(offset - 1) instanceof MathCharacter) { MathCharacter character = (MathCharacter) currentField .getArgument(offset - 1); if (character.isOperator() || character.isSymbol()) { break; } offset--; stringBuilder.insert(0, character.getName()); } return stringBuilder.toString(); } }