/* PredefMacroInfo.java
 * =========================================================================
 * This file is part of the JLaTeXMath Library - http://forge.scilab.org/jlatexmath
 *
 * Copyright (C) 2011 DENIZET Calixte
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 *
 * 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
 * General Public License for more details.
 *
 * A copy of the GNU General Public License can be found in the file
 * LICENSE.txt provided with the source distribution of this program (see
 * the META-INF directory in the source jar). This license can also be
 * found on the GNU website at http://www.gnu.org/licenses/gpl.html.
 *
 * If you did not receive a copy of the GNU General Public License along
 * with this program, contact the lead developer, or write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 *
 */

package org.scilab.forge.jlatexmath;

import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;

/**
 * Class to load the predefined commands. Mainly wrote to avoid the use of the Java reflection.
 */
class PredefMacroInfo extends MacroInfo {

    private int id;

    public PredefMacroInfo(int id, int nbArgs, int posOpts) {
        super(nbArgs, posOpts);
        this.id = id;
    }

    public PredefMacroInfo(int id, int nbArgs) {
        super(nbArgs);
        this.id = id;
    }

    public Object invoke(final TeXParser tp, final String[] args) throws ParseException {
        return invokeID(id, tp, args);
    }

    private static final Object invokeID(final int id, final TeXParser tp, final String[] args) throws ParseException {
        try {
            switch (id) {
            case 0:
                return PredefMacros.newcommand_macro(tp, args);
            case 1:
                return PredefMacros.renewcommand_macro(tp, args);
            case 2:
                return PredefMacros.rule_macro(tp, args);
            case 3:
            case 4:
                return PredefMacros.hvspace_macro(tp, args);
            case 5:
            case 6:
            case 7:
                return PredefMacros.clrlap_macro(tp, args);
            case 8:
            case 9:
            case 10:
                return PredefMacros.mathclrlap_macro(tp, args);
            case 11:
                return PredefMacros.includegraphics_macro(tp, args);
            case 12:
                return PredefMacros.cfrac_macro(tp, args);
            case 13:
                return PredefMacros.frac_macro(tp, args);
            case 14:
                return PredefMacros.sfrac_macro(tp, args);
            case 15:
                return PredefMacros.genfrac_macro(tp, args);
            case 16:
                return PredefMacros.over_macro(tp, args);
            case 17:
                return PredefMacros.overwithdelims_macro(tp, args);
            case 18:
                return PredefMacros.atop_macro(tp, args);
            case 19:
                return PredefMacros.atopwithdelims_macro(tp, args);
            case 20:
                return PredefMacros.choose_macro(tp, args);
            case 21:
                return PredefMacros.underscore_macro(tp, args);
            case 22:
                return PredefMacros.mbox_macro(tp, args);
            case 23:
                return PredefMacros.text_macro(tp, args);
            case 24:
                return PredefMacros.intertext_macro(tp, args);
            case 25:
                return PredefMacros.binom_macro(tp, args);
            case 26:
                return PredefMacros.mathbf_macro(tp, args);
            case 27:
                return PredefMacros.bf_macro(tp, args);
            case 28:
                return PredefMacros.textstyle_macros(tp, args);
            case 29:
                return PredefMacros.textstyle_macros(tp, args);
            case 30:
                return PredefMacros.textstyle_macros(tp, args);
            case 31:
                return PredefMacros.mathit_macro(tp, args);
            case 32:
                return PredefMacros.it_macro(tp, args);
            case 33:
                return PredefMacros.mathrm_macro(tp, args);
            case 34:
                return PredefMacros.rm_macro(tp, args);
            case 35:
                return PredefMacros.textstyle_macros(tp, args);
            case 36:
                return PredefMacros.mathsf_macro(tp, args);
            case 37:
                return PredefMacros.sf_macro(tp, args);
            case 38:
                return PredefMacros.mathtt_macro(tp, args);
            case 39:
                return PredefMacros.tt_macro(tp, args);
            case 40:
            case 41:
            case 42:
            case 43:
            case 44:
            case 45:
                return PredefMacros.textstyle_macros(tp, args);
            case 46:
            case 47:
            case 48:
            case 49:
            case 50:
            case 51:
            case 52:
            case 53:
            case 54:
            case 55:
            case 56:
            case 57:
                return PredefMacros.accentbis_macros(tp, args);
            case 58:
                return PredefMacros.T_macro(tp, args);
            case 59:
                return PredefMacros.accentbis_macros(tp, args);
            case 60:
                return PredefMacros.accent_macro(tp, args);
            case 61:
                return PredefMacros.grkaccent_macro(tp, args);
            case 62:
            case 63:
            case 64:
            case 65:
            case 66:
            case 67:
            case 68:
            case 69:
            case 70:
            case 71:
            case 72:
            case 73:
            case 74:
            case 75:
                return PredefMacros.accent_macros(tp, args);
            case 76:
                return PredefMacros.nbsp_macro(tp, args);
            case 77:
                return PredefMacros.smallmatrixATATenv_macro(tp, args);
            case 78:
                return PredefMacros.matrixATATenv_macro(tp, args);
            case 79:
                return PredefMacros.overrightarrow_macro(tp, args);
            case 80:
                return PredefMacros.overleftarrow_macro(tp, args);
            case 81:
                return PredefMacros.overleftrightarrow_macro(tp, args);
            case 82:
                return PredefMacros.underrightarrow_macro(tp, args);
            case 83:
                return PredefMacros.underleftarrow_macro(tp, args);
            case 84:
                return PredefMacros.underleftrightarrow_macro(tp, args);
            case 85:
                return PredefMacros.xleftarrow_macro(tp, args);
            case 86:
                return PredefMacros.xrightarrow_macro(tp, args);
            case 87:
                return PredefMacros.underbrace_macro(tp, args);
            case 88:
                return PredefMacros.overbrace_macro(tp, args);
            case 89:
                return PredefMacros.underbrack_macro(tp, args);
            case 90:
                return PredefMacros.overbrack_macro(tp, args);
            case 91:
                return PredefMacros.underparen_macro(tp, args);
            case 92:
                return PredefMacros.overparen_macro(tp, args);
            case 93:
            case 94:
                return PredefMacros.sqrt_macro(tp, args);
            case 95:
                return PredefMacros.overline_macro(tp, args);
            case 96:
                return PredefMacros.underline_macro(tp, args);
            case 97:
                return PredefMacros.mathop_macro(tp, args);
            case 98:
                return PredefMacros.mathpunct_macro(tp, args);
            case 99:
                return PredefMacros.mathord_macro(tp, args);
            case 100:
                return PredefMacros.mathrel_macro(tp, args);
            case 101:
                return PredefMacros.mathinner_macro(tp, args);
            case 102:
                return PredefMacros.mathbin_macro(tp, args);
            case 103:
                return PredefMacros.mathopen_macro(tp, args);
            case 104:
                return PredefMacros.mathclose_macro(tp, args);
            case 105:
                return PredefMacros.joinrel_macro(tp, args);
            case 106:
                return PredefMacros.smash_macro(tp, args);
            case 107:
                return PredefMacros.vdots_macro(tp, args);
            case 108:
                return PredefMacros.ddots_macro(tp, args);
            case 109:
                return PredefMacros.iddots_macro(tp, args);
            case 110:
                return PredefMacros.nolimits_macro(tp, args);
            case 111:
                return PredefMacros.limits_macro(tp, args);
            case 112:
                return PredefMacros.normal_macro(tp, args);
            case 113:
                return PredefMacros.leftparenthesis_macro(tp, args);
            case 114:
                return PredefMacros.leftbracket_macro(tp, args);
            case 115:
                return PredefMacros.left_macro(tp, args);
            case 116:
                return PredefMacros.middle_macro(tp, args);
            case 117:
                return PredefMacros.cr_macro(tp, args);
            case 118:
                return PredefMacros.multicolumn_macro(tp, args);
            case 119:
                return PredefMacros.hdotsfor_macro(tp, args);
            case 120:
                return PredefMacros.arrayATATenv_macro(tp, args);
            case 121:
                return PredefMacros.alignATATenv_macro(tp, args);
            case 122:
                return PredefMacros.alignedATATenv_macro(tp, args);
            case 123:
                return PredefMacros.flalignATATenv_macro(tp, args);
            case 124:
                return PredefMacros.alignatATATenv_macro(tp, args);
            case 125:
                return PredefMacros.alignedatATATenv_macro(tp, args);
            case 126:
                return PredefMacros.multlineATATenv_macro(tp, args);
            case 127:
                return PredefMacros.gatherATATenv_macro(tp, args);
            case 128:
                return PredefMacros.gatheredATATenv_macro(tp, args);
            case 129:
                return PredefMacros.shoveright_macro(tp, args);
            case 130:
                return PredefMacros.shoveleft_macro(tp, args);
            case 131:
                return PredefMacros.backslashcr_macro(tp, args);
            case 132:
                return PredefMacros.newenvironment_macro(tp, args);
            case 133:
                return PredefMacros.renewenvironment_macro(tp, args);
            case 134:
                return PredefMacros.makeatletter_macro(tp, args);
            case 135:
                return PredefMacros.makeatother_macro(tp, args);
            case 136:
            case 137:
                return PredefMacros.fbox_macro(tp, args);
            case 138:
                return PredefMacros.stackrel_macro(tp, args);
            case 139:
                return PredefMacros.stackbin_macro(tp, args);
            case 140:
                return PredefMacros.accentset_macro(tp, args);
            case 141:
                return PredefMacros.underaccent_macro(tp, args);
            case 142:
                return PredefMacros.undertilde_macro(tp, args);
            case 143:
                return PredefMacros.overset_macro(tp, args);
            case 144:
                return PredefMacros.Braket_macro(tp, args);
            case 145:
                return PredefMacros.Set_macro(tp, args);
            case 146:
                return PredefMacros.underset_macro(tp, args);
            case 147:
                return PredefMacros.boldsymbol_macro(tp, args);
            case 148:
                return PredefMacros.LaTeX_macro(tp, args);
            case 149:
                return PredefMacros.GeoGebra_macro(tp, args);
            case 150:
                return PredefMacros.big_macro(tp, args);
            case 151:
                return PredefMacros.Big_macro(tp, args);
            case 152:
                return PredefMacros.bigg_macro(tp, args);
            case 153:
                return PredefMacros.Bigg_macro(tp, args);
            case 154:
                return PredefMacros.bigl_macro(tp, args);
            case 155:
                return PredefMacros.Bigl_macro(tp, args);
            case 156:
                return PredefMacros.biggl_macro(tp, args);
            case 157:
                return PredefMacros.Biggl_macro(tp, args);
            case 158:
                return PredefMacros.bigr_macro(tp, args);
            case 159:
                return PredefMacros.Bigr_macro(tp, args);
            case 160:
                return PredefMacros.biggr_macro(tp, args);
            case 161:
                return PredefMacros.Biggr_macro(tp, args);
            case 162:
                return PredefMacros.displaystyle_macro(tp, args);
            case 163:
                return PredefMacros.textstyle_macro(tp, args);
            case 164:
                return PredefMacros.scriptstyle_macro(tp, args);
            case 165:
                return PredefMacros.scriptscriptstyle_macro(tp, args);
            case 166:
                return PredefMacros.sideset_macro(tp, args);
            case 167:
                return PredefMacros.prescript_macro(tp, args);
            case 168:
                return PredefMacros.rotatebox_macro(tp, args);
            case 169:
                return PredefMacros.reflectbox_macro(tp, args);
            case 170:
                return PredefMacros.scalebox_macro(tp, args);
            case 171:
                return PredefMacros.resizebox_macro(tp, args);
            case 172:
                return PredefMacros.raisebox_macro(tp, args);
            case 173:
                return PredefMacros.shadowbox_macro(tp, args);
            case 174:
                return PredefMacros.ovalbox_macro(tp, args);
            case 175:
                return PredefMacros.doublebox_macro(tp, args);
            case 176:
                return PredefMacros.phantom_macro(tp, args);
            case 177:
                return PredefMacros.hphantom_macro(tp, args);
            case 178:
                return PredefMacros.vphantom_macro(tp, args);
            case 179:
                return PredefMacros.spATbreve_macro(tp, args);
            case 180:
                return PredefMacros.spAThat_macro(tp, args);
            case 181:
                return PredefMacros.definecolor_macro(tp, args);
            case 182:
                return PredefMacros.textcolor_macro(tp, args);
            case 183:
                return PredefMacros.fgcolor_macro(tp, args);
            case 184:
                return PredefMacros.bgcolor_macro(tp, args);
            case 185:
                return PredefMacros.colorbox_macro(tp, args);
            case 186:
                return PredefMacros.fcolorbox_macro(tp, args);
            case 187:
                return PredefMacros.cedilla_macro(tp, args);
            case 188:
                return PredefMacros.IJ_macro(tp, args);
            case 189:
                return PredefMacros.IJ_macro(tp, args);
            case 190:
                return PredefMacros.TStroke_macro(tp, args);
            case 191:
                return PredefMacros.TStroke_macro(tp, args);
            case 192:
                return PredefMacros.LCaron_macro(tp, args);
            case 193:
                return PredefMacros.tcaron_macro(tp, args);
            case 194:
                return PredefMacros.LCaron_macro(tp, args);
            case 195:
                return PredefMacros.ogonek_macro(tp, args);
            case 196:
                return PredefMacros.cong_macro(tp, args);
            case 197:
                return PredefMacros.doteq_macro(tp, args);
            case 198:
                return PredefMacros.jlmDynamic_macro(tp, args);
            case 199:
                return PredefMacros.jlmExternalFont_macro(tp, args);
            case 200:
                return PredefMacros.jlmText_macro(tp, args);
            case 201:
                return PredefMacros.jlmTextit_macro(tp, args);
            case 202:
                return PredefMacros.jlmTextbf_macro(tp, args);
            case 203:
                return PredefMacros.jlmTextitbf_macro(tp, args);
            case 204:
                return PredefMacros.DeclareMathSizes_macro(tp, args);
            case 205:
                return PredefMacros.magnification_macro(tp, args);
            case 206:
                return PredefMacros.hline_macro(tp, args);
            case 207:
            case 208:
            case 209:
            case 210:
            case 211:
            case 212:
            case 213:
            case 214:
            case 215:
            case 216:
                return PredefMacros.size_macros(tp, args);
            case 217:
                return PredefMacros.jlatexmathcumsup_macro(tp, args);
            case 218:
                return PredefMacros.jlatexmathcumsub_macro(tp, args);
            case 219:
                return PredefMacros.hstrok_macro(tp, args);
            case 220:
                return PredefMacros.Hstrok_macro(tp, args);
            case 221:
                return PredefMacros.dstrok_macro(tp, args);
            case 222:
                return PredefMacros.Dstrok_macro(tp, args);
            case 223:
                return PredefMacros.dotminus_macro(tp, args);
            case 224:
                return PredefMacros.ratio_macro(tp, args);
            case 225:
                return PredefMacros.smallfrowneq_macro(tp, args);
            case 226:
                return PredefMacros.geoprop_macro(tp, args);
            case 227:
                return PredefMacros.minuscolon_macro(tp, args);
            case 228:
                return PredefMacros.minuscoloncolon_macro(tp, args);
            case 229:
                return PredefMacros.simcolon_macro(tp, args);
            case 230:
                return PredefMacros.simcoloncolon_macro(tp, args);
            case 231:
                return PredefMacros.approxcolon_macro(tp, args);
            case 232:
                return PredefMacros.approxcoloncolon_macro(tp, args);
            case 233:
                return PredefMacros.coloncolon_macro(tp, args);
            case 234:
                return PredefMacros.equalscolon_macro(tp, args);
            case 235:
                return PredefMacros.equalscoloncolon_macro(tp, args);
            case 236:
                return PredefMacros.colonminus_macro(tp, args);
            case 237:
                return PredefMacros.coloncolonminus_macro(tp, args);
            case 238:
                return PredefMacros.colonequals_macro(tp, args);
            case 239:
                return PredefMacros.coloncolonequals_macro(tp, args);
            case 240:
                return PredefMacros.colonsim_macro(tp, args);
            case 241:
                return PredefMacros.coloncolonsim_macro(tp, args);
            case 242:
                return PredefMacros.colonapprox_macro(tp, args);
            case 243:
                return PredefMacros.coloncolonapprox_macro(tp, args);
            case 244:
                return PredefMacros.kern_macro(tp, args);
            case 245:
                return PredefMacros.char_macro(tp, args);
            case 246:
            case 247:
                return PredefMacros.romannumeral_macro(tp, args);
            case 248:
                return PredefMacros.textcircled_macro(tp, args);
            case 249:
                return PredefMacros.textsc_macro(tp, args);
            case 250:
                return PredefMacros.sc_macro(tp, args);
            case 251:
            case 252:
            case 253:
            case 254:
            case 255:
            case 256:
            case 257:
            case 258:
            case 259:
            case 260:
                return PredefMacros.muskip_macros(tp, args);
            case 261:
                return PredefMacros.quad_macro(tp, args);
            case 262:
                return PredefMacros.surd_macro(tp, args);
            case 263:
                return PredefMacros.iint_macro(tp, args);
            case 264:
                return PredefMacros.iiint_macro(tp, args);
            case 265:
                return PredefMacros.iiiint_macro(tp, args);
            case 266:
                return PredefMacros.idotsint_macro(tp, args);
            case 267:
                return PredefMacros.int_macro(tp, args);
            case 268:
                return PredefMacros.oint_macro(tp, args);
            case 269:
                return PredefMacros.lmoustache_macro(tp, args);
            case 270:
                return PredefMacros.rmoustache_macro(tp, args);
            case 271:
                return PredefMacros.insertBreakMark_macro(tp, args);
            case 272:
                return PredefMacros.jlmXML_macro(tp, args);
            case 273:
                return PredefMacros.above_macro(tp, args);
            case 274:
                return PredefMacros.abovewithdelims_macro(tp, args);
            case 275:
                return PredefMacros.st_macro(tp, args);
            case 276:
                return PredefMacros.fcscore_macro(tp, args);
            default:
                return null;
            }
        } catch (Exception e) {
            throw new ParseException("Problem with command " + args[0] + " at position " + tp.getLine() + ":" + tp.getCol() + "\n" + e.getMessage());
        }
    }
}
