package com.jediterm.terminal.emulator.charset; import org.jetbrains.annotations.NotNull; public class GraphicSetState { private final GraphicSet[] myGraphicSets; //in-use table graphic left (GL) private GraphicSet myGL; //in-use table graphic right (GR) private GraphicSet myGR; //Override for next char (used by shift-in and shift-out) private GraphicSet myGlOverride; public GraphicSetState() { myGraphicSets = new GraphicSet[4]; for (int i = 0; i < myGraphicSets.length; i++) { myGraphicSets[i] = new GraphicSet(i); } resetState(); } /** * Designates the given graphic set to the character set designator. * * @param graphicSet the graphic set to designate; * @param designator the designator of the character set. */ public void designateGraphicSet(@NotNull GraphicSet graphicSet, char designator) { graphicSet.setDesignation(CharacterSet.valueOf(designator)); } public void designateGraphicSet(int num, CharacterSet characterSet) { getGraphicSet(num).setDesignation(characterSet); } /** * Returns the (possibly overridden) GL graphic set. */ @NotNull public GraphicSet getGL() { GraphicSet result = myGL; if (myGlOverride != null) { result = myGlOverride; myGlOverride = null; } return result; } /** * Returns the GR graphic set. */ @NotNull public GraphicSet getGR() { return myGR; } /** * Returns the current graphic set (one of four). * * @param index the index of the graphic set, 0..3. */ @NotNull public GraphicSet getGraphicSet(int index) { return myGraphicSets[index % 4]; } /** * Returns the mapping for the given character. * * @param ch the character to map. * @return the mapped character. */ public char map(char ch) { return CharacterSets.getChar(ch, getGL(), getGR()); } /** * Overrides the GL graphic set for the next written character. * * @param index the graphic set index, >= 0 && < 3. */ public void overrideGL(int index) { myGlOverride = getGraphicSet(index); } /** * Resets the state to its initial values. */ public void resetState() { for (int i = 0; i < myGraphicSets.length; i++) { myGraphicSets[i].setDesignation(CharacterSet.valueOf((i == 1) ? '0' : 'B')); } myGL = myGraphicSets[0]; myGR = myGraphicSets[1]; myGlOverride = null; } /** * Selects the graphic set for GL. * * @param index the graphic set index, >= 0 && <= 3. */ public void setGL(int index) { myGL = getGraphicSet(index); } /** * Selects the graphic set for GR. * * @param index the graphic set index, >= 0 && <= 3. */ public void setGR(int index) { myGR = getGraphicSet(index); } public int getGLOverrideIndex() { return myGlOverride != null ? myGlOverride.getIndex() : -1; } }