package org.geogebra.keyboard.base.model.impl; import org.geogebra.keyboard.base.Accents; import org.geogebra.keyboard.base.Action; import org.geogebra.keyboard.base.ActionType; import org.geogebra.keyboard.base.Background; import org.geogebra.keyboard.base.ResourceType; import org.geogebra.keyboard.base.model.KeyModifier; public class AccentModifier implements KeyModifier { private static final byte GRAVE_ACCENT = 0b0001; private static final byte CIRCUMFLEX_ACCENT = 0b0010; private static final byte CARON_ACCENT = 0b0100; private static final byte ACUTE_ACCENT = 0b1000; private int currentAccent = 0; private Accents accents = new Accents(); public boolean toggleAccent(String accent) { boolean changed = true; if (accent != null) { switch (accent) { case Accents.ACCENT_ACUTE: currentAccent = ~currentAccent & ACUTE_ACCENT; break; case Accents.ACCENT_CARON: currentAccent = ~currentAccent & CARON_ACCENT; break; case Accents.ACCENT_CIRCUMFLEX: currentAccent = ~currentAccent & CIRCUMFLEX_ACCENT; break; case Accents.ACCENT_GRAVE: currentAccent = ~currentAccent & GRAVE_ACCENT; break; default: changed = false; } } else { changed = currentAccent != (currentAccent = 0); } return changed; } @Override public String modifyResourceName(String resourceName, ResourceType resourceType) { if (resourceType == ResourceType.TEXT && resourceName.length() == 1) { return getAccent(resourceName); } return resourceName; } @Override public String modifyActionName(String actionName, ActionType actionType) { if (actionType == ActionType.INPUT && actionName.length() == 1) { return getAccent(actionName); } return actionName; } @Override public Background modifyBackground(Background background, ActionType actionType, String actionName) { if (actionType == ActionType.CUSTOM && ( (actionName.equals(Action.TOGGLE_ACCENT_ACUTE.name()) && hasAccent(ACUTE_ACCENT)) || (actionName.equals(Action.TOGGLE_ACCENT_CARON.name()) && hasAccent(CARON_ACCENT)) || (actionName.equals(Action.TOGGLE_ACCENT_GRAVE.name()) && hasAccent(GRAVE_ACCENT)) || (actionName.equals(Action.TOGGLE_ACCENT_CIRCUMFLEX.name()) && hasAccent(CIRCUMFLEX_ACCENT)))) { return Background.STANDARD_PRESSED; } return background; } private String getAccent(String letter) { String returnValue = null; if (hasAccent(GRAVE_ACCENT)) { returnValue = accents.getGraveAccent(letter); } else if (hasAccent(ACUTE_ACCENT)) { returnValue = accents.getAcuteLetter(letter); } else if (hasAccent(CARON_ACCENT)) { returnValue = accents.getCaronLetter(letter); } else if (hasAccent(CIRCUMFLEX_ACCENT)) { returnValue = accents.getCircumflexLetter(letter); } return returnValue != null ? returnValue : letter; } private boolean hasAccent(byte accent) { return (currentAccent & accent) != 0; } }