| /******************************************************************************* |
| * Copyright (c) 2004 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wst.html.core.internal.contentmodel.chtml; |
| |
| |
| |
| import java.lang.reflect.Field; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.Vector; |
| |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; |
| |
| /** |
| * Factory for element declarations. |
| */ |
| final class ElementCollection extends DeclCollection implements org.eclipse.wst.html.core.internal.provisional.HTML40Namespace.ElementName { |
| |
| |
| // Element IDs |
| private static class Ids { |
| public static final int ID_A = 0; |
| public static final int ID_ADDRESS = 1; |
| public static final int ID_BASE = 2; |
| public static final int ID_BLOCKQUOTE = 3; |
| public static final int ID_BODY = 4; |
| public static final int ID_BR = 5; |
| public static final int ID_CENTER = 6; |
| public static final int ID_DD = 7; |
| public static final int ID_DIR = 8; |
| public static final int ID_DIV = 9; |
| public static final int ID_DL = 10; |
| public static final int ID_DT = 11; |
| public static final int ID_FORM = 12; |
| public static final int ID_H1 = 13; |
| public static final int ID_H2 = 14; |
| public static final int ID_H3 = 15; |
| public static final int ID_H4 = 16; |
| public static final int ID_H5 = 17; |
| public static final int ID_H6 = 18; |
| public static final int ID_HEAD = 19; |
| public static final int ID_HR = 20; |
| public static final int ID_HTML = 21; |
| public static final int ID_IMG = 22; |
| public static final int ID_INPUT = 23; |
| public static final int ID_LI = 24; |
| public static final int ID_MENU = 25; |
| public static final int ID_META = 26; |
| public static final int ID_OL = 27; |
| public static final int ID_OPTION = 28; |
| public static final int ID_P = 29; |
| public static final int ID_PRE = 30; |
| public static final int ID_SELECT = 31; |
| public static final int ID_TEXTAREA = 32; |
| public static final int ID_TITLE = 33; |
| public static final int ID_UL = 34; |
| public static final int ID_SSI_CONFIG = 35; |
| public static final int ID_SSI_ECHO = 36; |
| public static final int ID_SSI_EXEC = 37; |
| public static final int ID_SSI_FSIZE = 38; |
| public static final int ID_SSI_FLASTMOD = 39; |
| public static final int ID_SSI_INCLUDE = 40; |
| public static final int ID_SSI_PRINTENV = 41; |
| public static final int ID_SSI_SET = 42; |
| |
| public static int getNumOfIds() { |
| if (numofids != -1) |
| return numofids; |
| |
| // NOTE: If the reflection is too slow, this method should |
| // just return the literal value, like 105. |
| // -- 5/25/2001 |
| Class clazz = Ids.class; |
| Field[] fields = clazz.getFields(); |
| numofids = 0; |
| for (int i = 0; i < fields.length; i++) { |
| String name = fields[i].getName(); |
| if (name.startsWith("ID_"))//$NON-NLS-1$ |
| numofids++; |
| } |
| return numofids; |
| } |
| |
| // chache the result of the reflection. |
| private static int numofids = -1; |
| } |
| |
| /** %formctl;. INPUT | SELECT | TEXTAREA */ |
| private static final String[] FORMCTL = {INPUT, SELECT, TEXTAREA}; |
| /** %phrase;. |
| * DFN |
| */ |
| private static final String[] PHRASE = {DFN}; |
| /** %special;. |
| * A | IMG | BR |
| */ |
| private static final String[] SPECIAL = {A, IMG, BR}; |
| /** %heading;. H[1-6] */ |
| private static final String[] HEADING = {H1, H2, H3, H4, H5, H6}; |
| /** %list;. UL | OL | DIR | MENU */ |
| private static final String[] LIST = {UL, OL, DIR, MENU}; |
| /** %preformatted;. PRE */ |
| private static final String[] PREFORMATTED = {PRE}; |
| private AttributeCollection attributeCollection = null; |
| private static String[] names = null; |
| |
| static { |
| names = new String[Ids.getNumOfIds()]; |
| names[Ids.ID_A] = A; |
| names[Ids.ID_ADDRESS] = ADDRESS; |
| names[Ids.ID_BASE] = BASE; |
| names[Ids.ID_BLOCKQUOTE] = BLOCKQUOTE; |
| names[Ids.ID_BODY] = BODY; |
| names[Ids.ID_BR] = BR; |
| names[Ids.ID_CENTER] = CENTER; |
| names[Ids.ID_DD] = DD; |
| names[Ids.ID_DIR] = DIR; |
| names[Ids.ID_DIV] = DIV; |
| names[Ids.ID_DL] = DL; |
| names[Ids.ID_DT] = DT; |
| names[Ids.ID_FORM] = FORM; |
| names[Ids.ID_H1] = H1; |
| names[Ids.ID_H2] = H2; |
| names[Ids.ID_H3] = H3; |
| names[Ids.ID_H4] = H4; |
| names[Ids.ID_H5] = H5; |
| names[Ids.ID_H6] = H6; |
| names[Ids.ID_HEAD] = HEAD; |
| names[Ids.ID_HR] = HR; |
| names[Ids.ID_HTML] = HTML; |
| names[Ids.ID_IMG] = IMG; |
| names[Ids.ID_INPUT] = INPUT; |
| names[Ids.ID_LI] = LI; |
| names[Ids.ID_MENU] = MENU; |
| names[Ids.ID_META] = META; |
| names[Ids.ID_OL] = OL; |
| names[Ids.ID_OPTION] = OPTION; |
| names[Ids.ID_P] = P; |
| names[Ids.ID_PRE] = PRE; |
| names[Ids.ID_SELECT] = SELECT; |
| names[Ids.ID_TEXTAREA] = TEXTAREA; |
| names[Ids.ID_TITLE] = TITLE; |
| names[Ids.ID_UL] = UL; |
| names[Ids.ID_SSI_CONFIG] = SSI_CONFIG; |
| names[Ids.ID_SSI_ECHO] = SSI_ECHO; |
| names[Ids.ID_SSI_EXEC] = SSI_EXEC; |
| names[Ids.ID_SSI_FSIZE] = SSI_FSIZE; |
| names[Ids.ID_SSI_FLASTMOD] = SSI_FLASTMOD; |
| names[Ids.ID_SSI_INCLUDE] = SSI_INCLUDE; |
| names[Ids.ID_SSI_PRINTENV] = SSI_PRINTENV; |
| names[Ids.ID_SSI_SET] = SSI_SET; |
| } |
| |
| /** |
| */ |
| public ElementCollection(AttributeCollection collection) { |
| super(names, TOLERANT_CASE); |
| attributeCollection = collection; |
| } |
| |
| /** |
| * Actually creates HTMLElementDeclaration instance. |
| * @return HTMLElementDeclaration |
| */ |
| protected CMNode create(String elementName) { |
| HTMLElemDeclImpl edec = null; |
| |
| if (elementName.equalsIgnoreCase(A)) { |
| edec = new HedA(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(ADDRESS)) { |
| edec = new HedADDRESS(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(BASE)) { |
| edec = new HedBASE(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(BLOCKQUOTE)) { |
| edec = new HedBLOCKQUOTE(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(BODY)) { |
| edec = new HedBODY(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(BR)) { |
| edec = new HedBR(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(CENTER)) { |
| edec = new HedCENTER(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(DD)) { |
| edec = new HedDD(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(DIR)) { |
| edec = new HedMENU(DIR, this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(DIV)) { |
| edec = new HedDIV(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(DL)) { |
| edec = new HedDL(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(DT)) { |
| edec = new HedDT(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(FORM)) { |
| edec = new HedFORM(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(H1)) { |
| edec = new HedHeading(H1, this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(H2)) { |
| edec = new HedHeading(H2, this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(H3)) { |
| edec = new HedHeading(H3, this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(H4)) { |
| edec = new HedHeading(H4, this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(H5)) { |
| edec = new HedHeading(H5, this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(H6)) { |
| edec = new HedHeading(H6, this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(HEAD)) { |
| edec = new HedHEAD(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(HR)) { |
| edec = new HedHR(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(HTML)) { |
| edec = new HedHTML(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(IMG)) { |
| edec = new HedIMG(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(INPUT)) { |
| edec = new HedINPUT(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(LI)) { |
| edec = new HedLI(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(MENU)) { |
| edec = new HedMENU(MENU, this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(META)) { |
| edec = new HedMETA(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(OL)) { |
| edec = new HedOL(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(OPTION)) { |
| edec = new HedOPTION(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(P)) { |
| edec = new HedP(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(PRE)) { |
| edec = new HedPRE(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(SELECT)) { |
| edec = new HedSELECT(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(TEXTAREA)) { |
| edec = new HedTEXTAREA(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(TITLE)) { |
| edec = new HedTITLE(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(UL)) { |
| edec = new HedUL(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(SSI_CONFIG)) { |
| edec = new HedSSIConfig(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(SSI_ECHO)) { |
| edec = new HedSSIEcho(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(SSI_EXEC)) { |
| edec = new HedSSIExec(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(SSI_FSIZE)) { |
| edec = new HedSSIFsize(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(SSI_FLASTMOD)) { |
| edec = new HedSSIFlastmod(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(SSI_INCLUDE)) { |
| edec = new HedSSIInclude(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(SSI_PRINTENV)) { |
| edec = new HedSSIPrintenv(this); |
| |
| } |
| else if (elementName.equalsIgnoreCase(SSI_SET)) { |
| edec = new HedSSISet(this); |
| |
| } // unknown |
| else { |
| // NOTE: We don't define the UNKNOWN element declaration. |
| // <code>null</code> for a declaration is a sign of |
| // the target element is unknown. |
| // -- 3/9/2001 |
| edec = null; |
| } |
| return edec; |
| } |
| |
| public AttributeCollection getAttributeCollection() { |
| return attributeCollection; |
| } |
| |
| /** |
| */ |
| public final Collection getNamesOfBlock() { |
| // P | %list | %preformatted | DL | DIV | CENTER | BLOCKQUOTE | FORM | HR |
| String[] blockMisc = {P, DL, DIV, CENTER, BLOCKQUOTE, FORM, HR,}; |
| Vector blockNames = new Vector(Arrays.asList(blockMisc)); |
| // %heading; |
| blockNames.addAll(Arrays.asList(HEADING)); |
| // %list; |
| blockNames.addAll(Arrays.asList(LIST)); |
| // %preformatted; |
| blockNames.addAll(Arrays.asList(PREFORMATTED)); |
| |
| return blockNames; |
| } |
| |
| /** |
| * %block;. |
| * %block; is: |
| * P | %heading; | %list; | %preformatted; | DL | DIV | CENTER | |
| * NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR | |
| * TABLE | FIELDSET | ADDRESS.<br> |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getBlock(CMGroupImpl group) { |
| if (group == null) |
| return; |
| getDeclarations(group, getNamesOfBlock().iterator()); |
| } |
| |
| /** |
| * Create element declarations and store them |
| * into a <code>CMGroupImpl</code> instance. |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getFlow(CMGroupImpl group) { |
| if (group == null) |
| return; |
| getBlock(group); |
| getInline(group); |
| } |
| |
| /** |
| * Create element declarations and store them into a <code>CMGroupImpl</code> |
| * instance.<br> |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getFontstyle(CMGroupImpl group) { |
| return; |
| } |
| |
| /** |
| * Create element declarations and store them into a <code>CMGroupImpl</code> |
| * instance.<br> |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getFormctrl(CMGroupImpl group) { |
| if (group == null) |
| return; |
| getDeclarations(group, Arrays.asList(FORMCTL).iterator()); |
| } |
| |
| /** |
| * %heading;. |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getHeading(CMGroupImpl group) { |
| if (group == null) |
| return; |
| |
| getDeclarations(group, Arrays.asList(HEADING).iterator()); |
| } |
| |
| /** |
| * Create element declarations and store them |
| * into a <code>CMGroupImpl</code> instance. |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getInline(CMGroupImpl group) { |
| if (group == null) |
| return; |
| getFontstyle(group); |
| getPhrase(group); |
| getSpecial(group); |
| getFormctrl(group); |
| } |
| |
| /** |
| * %list;. |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getList(CMGroupImpl group) { |
| if (group == null) |
| return; |
| |
| getDeclarations(group, Arrays.asList(LIST).iterator()); |
| } |
| |
| /** |
| * Create element declarations and store them into a <code>CMGroupImpl</code> |
| * instance.<br> |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getPhrase(CMGroupImpl group) { |
| if (group == null) |
| return; |
| getDeclarations(group, Arrays.asList(PHRASE).iterator()); |
| } |
| |
| /** |
| * %preformatted; |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getPreformatted(CMGroupImpl group) { |
| if (group == null) |
| return; |
| |
| getDeclarations(group, Arrays.asList(PREFORMATTED).iterator()); |
| } |
| |
| /** |
| * Create element declarations and store them into a <code>CMGroupImpl</code> |
| * instance.<br> |
| * @param group CMGroupImpl Return values. |
| */ |
| public final void getSpecial(CMGroupImpl group) { |
| if (group == null) |
| return; |
| getDeclarations(group, Arrays.asList(SPECIAL).iterator()); |
| } |
| } |