Skip to main content

This CGIT instance is deprecated, and repositories have been moved to Gitlab or Github. See the repository descriptions for specific locations.

summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal')
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java12
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java4
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java2
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/commentelement/handlers/CommentElementHandlerForSSI.java164
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java1295
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMContentImpl.java58
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMGroupImpl.java83
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamedNodeMapImpl.java99
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamespaceImpl.java59
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeImpl.java65
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeListImpl.java62
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinition.java76
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java185
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdAddress.java71
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdColumnGroup.java69
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDl.java69
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdEmbed.java65
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFieldset.java74
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFlowContainer.java55
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFrameset.java93
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHead.java176
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java80
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdInlineContainer.java56
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdLiContainer.java69
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMap.java72
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdNoframesContent.java65
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdOptionContainer.java70
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java71
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdSelect.java69
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTable.java128
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTableCellContainer.java74
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTrContainer.java69
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/DeclCollection.java238
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java886
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/EntityCollection.java837
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HCMDocImpl.java92
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java122
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java24
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java66
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataTypeImpl.java125
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocument.java37
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java60
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMNode.java32
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java377
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElementDeclaration.java81
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclImpl.java76
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclaration.java22
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLPropertyDeclaration.java105
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java100
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedADDRESS.java58
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAPPLET.java68
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java61
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASE.java50
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASEFONT.java57
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBDO.java61
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBGSOUND.java47
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBLOCKQUOTE.java63
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBODY.java96
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBR.java51
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java102
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCAPTION.java48
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCENTER.java56
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOL.java67
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOLGROUP.java77
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDD.java59
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDIV.java63
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDL.java64
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDT.java59
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEMBED.java94
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEmpty.java49
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java57
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFONT.java62
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFORM.java93
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAME.java62
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAMESET.java80
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFlowContainer.java26
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFontStyle.java65
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEAD.java78
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHR.java77
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java81
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHeading.java86
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java76
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java89
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java122
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedISINDEX.java65
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedInlineContainer.java29
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLABEL.java94
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLEGEND.java54
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java71
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java63
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedListItemContainer.java30
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMAP.java53
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMARQUEE.java81
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java90
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java59
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMarkChanges.java50
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOBR.java33
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOEMBED.java42
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOFRAMES.java80
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOSCRIPT.java56
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOBJECT.java86
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java70
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTGROUP.java55
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTION.java66
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedP.java106
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java57
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPRE.java92
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPcdata.java47
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPhrase.java42
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedQ.java49
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java81
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java79
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSPAN.java44
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIBase.java50
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIConfig.java48
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIEcho.java46
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIExec.java47
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFlastmod.java47
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFsize.java47
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIInclude.java47
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIPrintenv.java49
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSISet.java47
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java77
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedScripts.java56
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java91
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java77
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTITLE.java70
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTR.java74
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableBody.java73
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableCell.java80
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedUL.java73
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedWBR.java32
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCMDocImpl.java79
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP11Namespace.java112
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPCMDocument.java29
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPElementCollection.java897
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProvider.java23
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProviderFactory.java359
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/AttributeCollection.java324
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHCMDocImpl.java95
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHTMLNamespace.java152
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMContentImpl.java56
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMGroupImpl.java83
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNamedNodeMapImpl.java97
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeImpl.java64
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeListImpl.java61
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinition.java77
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinitionFactory.java146
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdAddress.java70
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdDl.java68
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdFlowContainer.java55
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHead.java175
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHtml.java79
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdInlineContainer.java56
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdLiContainer.java68
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdOptionContainer.java69
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdSelect.java64
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/DeclCollection.java238
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ElementCollection.java495
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/EntityCollection.java837
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLAttrDeclImpl.java118
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMDataTypeImpl.java126
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMNode.java32
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLElemDeclImpl.java380
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLEntityDeclImpl.java77
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedA.java99
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedADDRESS.java57
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBASE.java47
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBLOCKQUOTE.java57
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBODY.java68
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBR.java51
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedCENTER.java55
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDD.java56
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDIV.java62
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDL.java59
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDT.java56
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedEmpty.java49
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFORM.java92
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFlowContainer.java26
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHEAD.java71
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHR.java75
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHTML.java81
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHeading.java85
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedIMG.java88
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedINPUT.java108
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedInlineContainer.java29
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedLI.java58
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedListItemContainer.java30
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMENU.java87
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMETA.java67
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOL.java58
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOPTION.java63
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedP.java105
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPRE.java91
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPcdata.java47
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSELECT.java65
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIBase.java52
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIConfig.java45
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIEcho.java43
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIExec.java44
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFlastmod.java44
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFsize.java44
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIInclude.java44
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIPrintenv.java48
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSISet.java44
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTEXTAREA.java62
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTITLE.java69
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedUL.java57
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProvider.java26
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProviderFactory.java363
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ssi/SSICMDocumentFactory.java158
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DOMStyleModelImpl.java67
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java96
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java73
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLConverter.java302
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java303
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java136
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java19
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeEntry.java126
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java139
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistryReader.java107
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java354
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapterFactory.java70
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaData.java28
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaDataAdapter.java301
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/TagScanner.java166
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/UnknownTagAdapter.java82
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentCharsetDetector.java42
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentLoader.java161
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLModelLoader.java112
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/EmbeddedCSSFormatter.java90
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLElementFormatter.java356
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatContraintsImpl.java42
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatProcessorImpl.java60
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java650
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatterFactory.java108
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLTextFormatter.java298
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/SpaceConverter.java233
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java166
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/ModelHandlerForHTML.java55
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMAttributeDeclarationBuddySystem.java67
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMDocumentForBuddySystem.java119
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMElementDeclarationBuddySystem.java201
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java109
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNodeBuddySystem.java74
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/DocumentQuery.java200
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapter.java29
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapterFactory.java68
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HMQUtil.java121
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLElementDeclarationAdapter.java54
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryAssociationProvider.java54
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java100
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java140
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForEmbeddedHTML.java51
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForHTML.java175
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java80
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java18
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/AbstractErrorInfo.java40
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java200
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CompositeValidator.java74
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/DocumentPropagatingValidator.java58
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ElementPropagatingValidator.java50
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfo.java26
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java56
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java41
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java78
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java255
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLDocumentContentValidator.java194
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementAncestorValidator.java70
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java178
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleDocumentValidator.java39
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleValidator.java42
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java72
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java254
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java127
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NullValidator.java34
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/PrimeValidator.java25
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SMUtil.java36
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/Segment.java64
-rw-r--r--bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java345
280 files changed, 29886 insertions, 18 deletions
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java
index 84a8587d66..36e6d2a2f8 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/ElementNodeCleanupHandler.java
@@ -37,15 +37,15 @@ import org.eclipse.wst.sse.core.util.StringUtils;
import org.eclipse.wst.xml.core.document.IDOMAttr;
import org.eclipse.wst.xml.core.document.IDOMDocument;
import org.eclipse.wst.xml.core.document.IDOMElement;
-import org.eclipse.wst.xml.core.document.ISourceGenerator;
import org.eclipse.wst.xml.core.document.IDOMModel;
import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.document.ISourceGenerator;
import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.parser.XMLRegionContext;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -383,7 +383,7 @@ public class ElementNodeCleanupHandler extends AbstractNodeCleanupHandler {
IStructuredDocumentRegion endTagStructuredDocumentRegion = newNode.getEndStructuredDocumentRegion();
ITextRegionList regionList = startTagStructuredDocumentRegion.getRegions();
- if (startTagStructuredDocumentRegion != null && regionList != null && regionList.get(regionList.size() - 1).getType() == XMLRegionContext.XML_EMPTY_TAG_CLOSE) {
+ if (startTagStructuredDocumentRegion != null && regionList != null && regionList.get(regionList.size() - 1).getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
}
else {
@@ -428,7 +428,7 @@ public class ElementNodeCleanupHandler extends AbstractNodeCleanupHandler {
ITextRegion lastRegion = regionList.get(regionList.size() - 1);
if (lastRegion != null) {
String regionType = lastRegion.getType();
- if ((regionType != XMLRegionContext.XML_EMPTY_TAG_CLOSE) && (regionType != XMLRegionContext.XML_TAG_CLOSE)) {
+ if ((regionType != DOMRegionContext.XML_EMPTY_TAG_CLOSE) && (regionType != DOMRegionContext.XML_TAG_CLOSE)) {
IStructuredDocument structuredDocument = structuredModel.getStructuredDocument();
// insert ">" after lastRegion of flatNode
@@ -563,11 +563,11 @@ public class ElementNodeCleanupHandler extends AbstractNodeCleanupHandler {
IStructuredDocumentRegion startStructuredDocumentRegion = newNode.getStartStructuredDocumentRegion();
int index = startStructuredDocumentRegion.getEndOffset();
ITextRegion lastRegion = startStructuredDocumentRegion.getLastRegion();
- if (lastRegion.getType() == XMLRegionContext.XML_TAG_CLOSE) {
+ if (lastRegion.getType() == DOMRegionContext.XML_TAG_CLOSE) {
index--;
lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1);
}
- else if (lastRegion.getType() == XMLRegionContext.XML_EMPTY_TAG_CLOSE) {
+ else if (lastRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
index = index - 2;
lastRegion = startStructuredDocumentRegion.getRegionAtCharacterOffset(index - 1);
}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java
index 03356c9c78..dd87fe893f 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupHandlerFactory.java
@@ -16,7 +16,7 @@ import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupHandler;
import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupPreferences;
import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
import org.eclipse.wst.xml.core.document.IDOMNode;
-import org.eclipse.wst.xml.core.parser.XMLRegionContext;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
import org.w3c.dom.Node;
// nakamori_TODO: check and remove CSS formatting
@@ -127,7 +127,7 @@ class HTMLCleanupHandlerFactory {
IStructuredDocumentRegion flatNode = ((IDOMNode) node).getFirstStructuredDocumentRegion();
if (flatNode == null)
return false;
- if (flatNode.getType() != XMLRegionContext.BLOCK_TEXT)
+ if (flatNode.getType() != DOMRegionContext.BLOCK_TEXT)
return false;
// check if the parent is STYLE element
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java
index ea6a01d816..04502a97c9 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/cleanup/HTMLCleanupProcessorImpl.java
@@ -12,8 +12,8 @@ package org.eclipse.wst.html.core.internal.cleanup;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.wst.html.core.contenttype.ContentTypeIdForHTML;
-import org.eclipse.wst.html.core.format.HTMLFormatProcessorImpl;
import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupHandler;
import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
import org.eclipse.wst.xml.core.internal.cleanup.CleanupProcessorXML;
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/commentelement/handlers/CommentElementHandlerForSSI.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/commentelement/handlers/CommentElementHandlerForSSI.java
new file mode 100644
index 0000000000..321d0c46dc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/commentelement/handlers/CommentElementHandlerForSSI.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * 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.commentelement.handlers;
+
+
+
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.document.ISourceGenerator;
+import org.eclipse.wst.xml.core.internal.commentelement.CommentElementHandler;
+import org.eclipse.wst.xml.core.internal.commentelement.util.CommentElementFactory;
+import org.eclipse.wst.xml.core.internal.commentelement.util.TagScanner;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+
+/**
+ */
+public class CommentElementHandlerForSSI implements CommentElementHandler {
+
+ /**
+ * @see com.ibm.sed.model.commentelement.CommentElementHandler#createElement(Document, String, boolean)
+ */
+ public Element createElement(Document document, String data, boolean isJSPTag) {
+ ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document);
+ if (modelQuery == null) {
+ return null;
+ }
+ CMDocument cm = modelQuery.getCorrespondingCMDocument(document);
+ if (cm == null) {
+ return null;
+ }
+ CMNamedNodeMap map = cm.getElements();
+ if (map == null) {
+ return null;
+ }
+
+ TagScanner scanner = new TagScanner(data, 1);
+ String name = scanner.nextName();
+ if (name == null) {
+ return null;
+ }
+ StringBuffer buffer = new StringBuffer(name.length() + 4);
+ buffer.append(SSI_PREFIX);
+ buffer.append(':');
+ buffer.append(name);
+ String tagName = buffer.toString();
+ // check if valid (defined) SSI tag or not
+ if (map.getNamedItem(tagName) == null) {
+ return null;
+ }
+
+ CommentElementFactory factory = new CommentElementFactory(document, isJSPTag, this);
+ Element element = factory.create(tagName, CommentElementFactory.IS_START);
+
+ // set attributes
+ String attrName = scanner.nextName();
+ while (attrName != null) {
+ String attrValue = scanner.nextValue();
+ Attr attr = document.createAttribute(attrName);
+ if (attr != null) {
+ if (attrValue != null)
+ attr.setValue(attrValue);
+ element.setAttributeNode(attr);
+ }
+ attrName = scanner.nextName();
+ }
+ return element;
+ }
+
+ /**
+ * @see com.ibm.sed.model.commentelement.CommentElementHandler#generateStartTagContent(IDOMElement)
+ */
+ public String generateStartTagContent(IDOMElement element) {
+ ISourceGenerator generator = element.getModel().getGenerator();
+ StringBuffer buffer = new StringBuffer();
+
+ buffer.append('#');
+ buffer.append(element.getLocalName());
+
+ NamedNodeMap attributes = element.getAttributes();
+ int length = attributes.getLength();
+ for (int i = 0; i < length; i++) {
+ Attr attr = (Attr) attributes.item(i);
+ if (attr == null) {
+ continue;
+ }
+ buffer.append(' ');
+ String attrName = generator.generateAttrName(attr);
+ if (attrName != null) {
+ buffer.append(attrName);
+ }
+ String attrValue = generator.generateAttrValue(attr);
+ if (attrValue != null) {
+ // attr name only for HTML boolean and JSP
+ buffer.append('=');
+ buffer.append(attrValue);
+ }
+ }
+
+ return buffer.toString();
+ }
+
+ /**
+ * @see com.ibm.sed.model.commentelement.CommentElementHandler#generateEndTagContent(IDOMElement)
+ */
+ public String generateEndTagContent(IDOMElement element) {
+ return null; // always empty
+ }
+
+ public boolean isEmpty() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see com.ibm.sed.model.commentelement.CommentElementHandler#isCommentElement(com.ibm.sed.model.xml.XMLElement)
+ */
+ public boolean isCommentElement(IDOMElement element) {
+ if (element == null) {
+ return false;
+ }
+ Document document = element.getOwnerDocument();
+ ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document);
+ if (modelQuery == null) {
+ return false;
+ }
+ CMDocument cm = modelQuery.getCorrespondingCMDocument(document);
+ if (cm == null) {
+ return false;
+ }
+ CMNamedNodeMap map = cm.getElements();
+ if (map == null) {
+ return false;
+ }
+ String prefix = element.getPrefix();
+ if (prefix == null || !prefix.equals(SSI_PREFIX)) {
+ return false;
+ }
+ String tagName = element.getTagName();
+ if (tagName.length() <= 4) {
+ return false;
+ }
+ if (map.getNamedItem(tagName) == null) {
+ return false;
+ }
+ else {
+ return true;
+ }
+ }
+
+ private static final String SSI_PREFIX = "ssi";//$NON-NLS-1$
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java
new file mode 100644
index 0000000000..d1c5a06546
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/AttributeCollection.java
@@ -0,0 +1,1295 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Factory for attribute declarations.
+ */
+final class AttributeCollection extends CMNamedNodeMapImpl implements HTML40Namespace {
+
+ /** bodycolors. */
+ private static final String[] BODYCOLORS = {ATTR_NAME_BGCOLOR, ATTR_NAME_TEXT, ATTR_NAME_LINK, ATTR_NAME_VLINK, HTML40Namespace.ATTR_NAME_ALINK};
+ /** coreattrs. */
+ private static final String[] CORE = {ATTR_NAME_ID, ATTR_NAME_CLASS, ATTR_NAME_STYLE, ATTR_NAME_TITLE};
+ /** events. */
+ private static final String[] EVENTS = {ATTR_NAME_ONCLICK, ATTR_NAME_ONDBLCLICK, ATTR_NAME_ONMOUSEDOWN, ATTR_NAME_ONMOUSEUP, ATTR_NAME_ONMOUSEOVER, ATTR_NAME_ONMOUSEMOVE, ATTR_NAME_ONMOUSEOUT, ATTR_NAME_ONKEYPRESS, ATTR_NAME_ONKEYDOWN, ATTR_NAME_ONKEYUP, ATTR_NAME_ONHELP};
+ /** i18n. lang, dir */
+ private static final String[] I18N = {ATTR_NAME_LANG, ATTR_NAME_DIR};
+ /** cellhaligh. */
+ private static final String[] CELLHALIGN = {ATTR_NAME_CHAR, ATTR_NAME_CHAROFF};
+
+ /**
+ * constructor.
+ */
+ public AttributeCollection() {
+ super();
+ }
+
+ /**
+ * Create an attribute declaration.
+ * @return com.ibm.sed.contentmodel.html.HTMLAttrDeclImpl
+ * @param attrName java.lang.String
+ */
+ private HTMLAttrDeclImpl create(String attrName) {
+ HTMLAttrDeclImpl attr = null;
+ HTMLCMDataTypeImpl atype = null;
+
+ if (attrName.equalsIgnoreCase(ATTR_NAME_ABBR)) {
+ // (abbr %Text; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ABBR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ACCEPT)) {
+ // (accept %ContentTypes; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ACCEPT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ACCEPT_CHARSET)) {
+ // (accept-charset %Charsets;; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARSETS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ACCEPT_CHARSET, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ACTION)) {
+ // (action %URI #REQUIRED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ACTION, atype, CMAttributeDeclaration.REQUIRED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ARCHIVE)) {
+ // (archive CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ARCHIVE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ACCESSKEY)) {
+ // (accesskey %Character; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARACTER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ACCESSKEY, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ALINK)) {
+ // (alink %Color; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ALINK, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ALT)) {
+ // (alt %Text; #REQUIRED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ALT, atype, CMAttributeDeclaration.REQUIRED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_AUTOSTART)) {
+ // (autostart (true|false) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_AUTOSTART, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_AUTOPLAY)) {
+ // (autoplay (true|false) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_AUTOPLAY, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_AUTOSIZE)) {
+ // (autosize (true|false) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_AUTOSIZE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_AXIS)) {
+ // (axis CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_AXIS, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_BACKGROUND)) {
+ // (background %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_BACKGROUND, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_BEHAVIOR)) {
+ // (behavior (scroll|slide|alternate) scroll)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_SCROLL, ATTR_VALUE_SLIDE, ATTR_VALUE_ALTERNATE};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_SCROLL);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_BEHAVIOR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_BGCOLOR)) {
+ // (bgcolor %Color; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_BGCOLOR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_BORDER)) {
+ // (border %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_BORDER, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CELLSPACING)) {
+ // (cellspacing %Length; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CELLSPACING, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CELLPADDING)) {
+ // (cellpadding %Length; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CELLPADDING, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CGI)) {
+ // (cgi %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CGI, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CHAR)) {
+ // (char %Character; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARACTER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CHAR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CHAROFF)) {
+ // (charoff %Length; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CHAROFF, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CHARSET)) {
+ // (charset %Charset; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARSET);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CHARSET, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CITE)) {
+ // (cite %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CITE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CLASS)) {
+ // (class CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CLASS, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CLASSID)) {
+ // (classid %URI #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CLASSID, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CMD)) {
+ // (cmd CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CMD, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CHECKED)) {
+ // (checked (checked) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_CHECKED};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CHECKED, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CLEAR)) {
+ // (clear (left | all | right | none) none)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_ALL, ATTR_VALUE_RIGHT, ATTR_VALUE_NONE};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_NONE);
+
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CLEAR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CODE)) {
+ // (code CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CODE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CODEBASE)) {
+ // (codebase %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CODEBASE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CODETYPE)) {
+ // (codetype %CotentType; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CODETYPE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_COLOR)) {
+ // (color %Color; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_COLOR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_COMPACT)) {
+ // (compact (compact) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_COMPACT};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_COMPACT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_COLS)) {
+ // (cols NUMBER #REQUIRED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_COLS, atype, CMAttributeDeclaration.REQUIRED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_COLSPAN)) {
+ // (colspan NUMBER 1)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_1);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_COLSPAN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CONTENT)) {
+ // (content CDATA #REQUIRED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CONTENT, atype, CMAttributeDeclaration.REQUIRED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CONTROLLER)) {
+ // (controller (true|false) true)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_TRUE);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CONTROLLER, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_COORDS)) {
+ // (coords %Coords; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COORDS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_COORDS, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_DATA)) {
+ // (data %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_DATA, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_DATETIME)) {
+ // (datetime %Datetime; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.DATETIME);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_DATETIME, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_DATAPAGESIZE)) {
+ // (datapagesize CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_DATAPAGESIZE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_DECLARE)) {
+ // (declare (declare) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_DECLARE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_DECLARE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_DEFER)) {
+ // (defer (defer) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_DEFER};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_DEFER, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_DIR)) {
+ // (dir (ltr|rtl) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_LTR, ATTR_VALUE_RTL};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_DIR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_DIRECTION)) {
+ // (direction (left|right|up|down) left)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT, ATTR_VALUE_UP, ATTR_VALUE_DOWN};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_DIRECTION, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_DIRECTKEY)) {
+ // (directkey %Character; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CHARACTER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_DIRECTKEY, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_DISABLED)) {
+ // (disabled (disabled) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ // boolean attribute must have the same value as its name.
+ String[] values = {ATTR_NAME_DISABLED};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_DISABLED, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ENCTYPE)) {
+ // (enctype %ContentType; "application/x-www-form-urlencoded")
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_WWW_FORM_URLENCODED);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ENCTYPE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ERRMSG)) {
+ // (errmsg CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ERRMSG, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_EVENT)) {
+ // (event CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_EVENT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_FACE)) {
+ // (face CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_FACE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_FILE)) {
+ // (file %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_FILE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_FOR)) {
+ // (for %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_FOR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_FRAME)) {
+ // (frame %TFrame; #IMPLIED)
+ // %TFrame; is (void|above|below|hsides|lhs|rhs|vsides|box|border).
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_VOID, ATTR_VALUE_ABOVE, ATTR_VALUE_BELOW, ATTR_VALUE_HSIDES, ATTR_VALUE_LHS, ATTR_VALUE_RHS, ATTR_VALUE_VSIDES, ATTR_VALUE_BOX, ATTR_VALUE_BORDER};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_FRAME, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_FRAMEBORDER)) {
+ // (frameborder (1|0) 1)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_1, ATTR_VALUE_0};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_1);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_FRAMEBORDER, atype, CMAttributeDeclaration.OPTIONAL);
+
+ //<<D215684
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_FRAMESPACING)) {
+ // (framespacing CDATA; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_FRAMESPACING, atype, CMAttributeDeclaration.OPTIONAL);
+ //D215684
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HEADERS)) {
+ // (HEADERS IDREFS; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.IDREFS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HEADERS, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HEIGHT)) {
+ // (height %Length; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HEIGHT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HIDDEN)) {
+ // (hidden CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HIDDEN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HREF)) {
+ // (href %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HREF, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HREFLANG)) {
+ // (hreflang %LanguageCode; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LANGUAGE_CODE);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HREFLANG, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HSPACE)) {
+ // (hspace %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HSPACE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HTTP_EQUIV)) {
+ // (http-equiv NAME #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HTTP_EQUIV, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ID)) {
+ // (id ID #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ID);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ID, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ISMAP)) {
+ // (ismap (ismap) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_ISMAP};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ISMAP, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ISTYLE)) {
+ // (istyle CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ISTYLE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_LABEL)) {
+ // (label %Text; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_LABEL, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_LANG)) {
+ // (lang %LanguageCode; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LANGUAGE_CODE);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_LANG, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_LANGUAGE)) {
+ // (language %CDATA; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_LANGUAGE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_LINK)) {
+ // (link %Color; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_LINK, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_LONGDESC)) {
+ // (longdesc %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_LONGDESC, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_LOOP)) {
+ // (loop CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_LOOP, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MACRO)) {
+ // (macro CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MACRO, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MAPFILE)) {
+ // (mapfile %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MAPFILE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MARGINWIDTH)) {
+ // (marginwidth %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MARGINWIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MARGINHEIGHT)) {
+ // (marginheight %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MARGINHEIGHT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MAXLENGTH)) {
+ // (maxlength NUMBER #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MAXLENGTH, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MAYSCRIPT)) {
+ // (mayscript (mayscript) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_MAYSCRIPT};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MAYSCRIPT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MEDIA)) {
+ // (media %MediaDesc; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.MEDIA_DESC);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MEDIA, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_METHOD)) {
+ // (method (GET|POST) GET)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_GET, ATTR_VALUE_POST};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_GET);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_METHOD, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MULTIPLE)) {
+ // (multiple (multiple) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_MULTIPLE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MULTIPLE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_NAME)) {
+ // (name CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_NOHREF)) {
+ // (nohref (nohref) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_NOHREF};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_NOHREF, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_NORESIZE)) {
+ // (noresize (noresize) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_NORESIZE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_NORESIZE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_NOSHADE)) {
+ // (noshade (noshade) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_NOSHADE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_NOSHADE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_NOWRAP)) {
+ // (nowrap (nowrap) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_NOWRAP};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_NOWRAP, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_OBJECT)) {
+ // (object CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_OBJECT};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_OBJECT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONBLUR)) {
+ // (onblur %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONBLUR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONCLICK)) {
+ // (onclick %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONCLICK, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONCHANGE)) {
+ // (onchange %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONCHANGE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONDBLCLICK)) {
+ // (ondblclick %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONDBLCLICK, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONFOCUS)) {
+ // (onfocus %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONFOCUS, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONHELP)) {
+ // (onhelp %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONHELP, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONKEYPRESS)) {
+ // (onkeypress %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONKEYPRESS, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONKEYDOWN)) {
+ // (onkeydown %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONKEYDOWN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONKEYUP)) {
+ // (onkyeup %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONKEYUP, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONLOAD)) {
+ // (onload %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONLOAD, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEDOWN)) {
+ // (onmousedown %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEDOWN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEUP)) {
+ // (onmouseup %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEUP, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEOVER)) {
+ // (onmouseover %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEOVER, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEMOVE)) {
+ // (onmousemove %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEMOVE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONMOUSEOUT)) {
+ // (onmouseout %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONMOUSEOUT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONRESET)) {
+ // (onreset %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONRESET, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSELECT)) {
+ // (onselect %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSELECT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONSUBMIT)) {
+ // (onsubmit %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONSUBMIT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ONUNLOAD)) {
+ // (onunload %Script; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.SCRIPT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ONUNLOAD, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_PALETTE)) {
+ // (palette CDATA; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_PALETTE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_PANEL)) {
+ // (panel CDATA; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_PANEL, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_PLAYCOUNT)) {
+ // (playcount NUMBER; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_PLAYCOUNT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_PROFILE)) {
+ // (profile %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_PROFILE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_PROMPT)) {
+ // (prompt %Text; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_PROMPT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_READONLY)) {
+ // (readonly (readonly) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_READONLY};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_READONLY, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_REPEAT)) {
+ // (repeat CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_REPEAT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_REL)) {
+ // (rel %LinkTypes; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LINK_TYPES);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_REL, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_REV)) {
+ // (rev %LinkTypes; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LINK_TYPES);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_REV, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ROWS)) {
+ // (rows NUMBER #REQUIRED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ROWS, atype, CMAttributeDeclaration.REQUIRED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ROWSPAN)) {
+ // (rowspan NUMBER 1)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_1);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ROWSPAN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_RULES)) {
+ // (rules %TRules; #IMPLIED)
+ // %TRules; is (none | groups | rows | cols | all).
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_NONE, ATTR_VALUE_GROUPS, ATTR_VALUE_ROWS, ATTR_VALUE_COLS, ATTR_VALUE_ALL};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_RULES, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SCALE)) {
+ // (scale CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SCALE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SCHEME)) {
+ // (scheme CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SCHEME, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SELECTED)) {
+ // (selected (selected) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_SELECTED};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SELECTED, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SCOPE)) {
+ // (SCOPE %Scope; #IMPLIED)
+ // %Scope; is (row|col|rowgroup|colgroup)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_ROW, ATTR_VALUE_COL, ATTR_VALUE_ROWGROUP, ATTR_VALUE_COLGROUP};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SCOPE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SCROLLAMOUNT)) {
+ // (scrollamount NUMBER #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SCROLLAMOUNT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SCROLLDELAY)) {
+ // (scrolldelay NUMBER #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SCROLLDELAY, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SCROLLING)) {
+ // (scrolling (yes|no|auto) auto)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_YES, ATTR_VALUE_NO, ATTR_VALUE_AUTO};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_AUTO);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SCROLLING, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SHAPE)) {
+ // (shape %Shape; rect): %Shape; is (rect|circle|poly|default).
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_RECT, ATTR_VALUE_CIRCLE, ATTR_VALUE_POLY, ATTR_VALUE_DEFAULT};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_RECT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SHAPE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SHOWCONTROLS)) {
+ // (showcontrols (true|false) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SHOWCONTROLS, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SIZE)) {
+ // (size %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SIZEFMT)) {
+ // (sizefmt CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZEFMT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SPAN)) {
+ // (span NUMBER 1)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_1);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SPAN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SRC)) {
+ // (src %URI; #IMPLIED)
+ // NOTE: "src" attributes are defined in several elements.
+ // The definition of IMG is different from others.
+ // So, it should be locally defined.
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SRC, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_START)) {
+ // (start NUMBER #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_START, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_STANDBY)) {
+ // (standby %Text; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_STANDBY, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_STYLE)) {
+ // (style %StyleSheet; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.STYLE_SHEET);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_STYLE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SUMMARY)) {
+ // (summary %Text; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SUMMARY, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TABINDEX)) {
+ // (tabindex NUMBER #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TABINDEX, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TARGET)) {
+ // (target %FrameTarget; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.FRAME_TARGET);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TARGET, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TEXT)) {
+ // (text CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TEXT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TEXTFOCUS)) {
+ // (textfocus CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TEXTFOCUS, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TITLE)) {
+ // (title %Text; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TITLE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TIMEFMT)) {
+ // (timefmt CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TIMEFMT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TRUESPEED)) {
+ // (truespeed (truespeed) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_TRUESPEED};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TRUESPEED, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TYPE)) {
+ // (type %CotentType; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_USEMAP)) {
+ // (usemap %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_USEMAP, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VALIGN)) {
+ // (valign (top|middle|bottom|baseline) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_MIDDLE, ATTR_VALUE_BOTTOM, ATTR_VALUE_BASELINE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VALUE)) {
+ // (value CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VALUETYPE)) {
+ // (valuetype (DATA|REF|OBJECT) DATA)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_DATA, ATTR_VALUE_REF, ATTR_VALUE_OBJECT};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_DATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VALUETYPE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VAR)) {
+ // (var CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VAR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VERSION)) {
+ // (version CDATA #FIXED '%HTML.Version;)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_FIXED, ATTR_VALUE_VERSION_TRANSITIONAL);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VERSION, atype, CMAttributeDeclaration.FIXED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VIRTUAL)) {
+ // (virtual %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VIRTUAL, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VLINK)) {
+ // (vlink %Color; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VLINK, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VOLUME)) {
+ // (volume CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VOLUME, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_WIDTH)) {
+ // (width %Length; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VSPACE)) {
+ // (vspace %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VSPACE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ // <<D205514
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TOPMARGIN)) {
+ // (topmargin, CDATA, #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TOPMARGIN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_BOTTOMMARGIN)) {
+ // (bottommargin, CDATA, #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_BOTTOMMARGIN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_LEFTMARGIN)) {
+ // (leftmargin, CDATA, #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_LEFTMARGIN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_RIGHTMARGIN)) {
+ // (rightmargin, CDATA, #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_RIGHTMARGIN, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_BORDERCOLOR)) {
+ // (bordercolor, %Color; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.COLOR);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_BORDERCOLOR, atype, CMAttributeDeclaration.OPTIONAL);
+ // D205514
+
+ }
+ else {
+ // unknown attribute; maybe error.
+ // should warn.
+ attr = null;
+ }
+
+ return attr;
+ }
+
+ /**
+ * Get align attribute which has %CAlign; as values..
+ * At this time (4/19/2001), it is identical to %LAlign;.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public static final HTMLAttrDeclImpl createAlignForCaption() {
+ // align (local)
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ // set enum values
+ String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT};
+ atype.setEnumValues(values);
+
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ return attr;
+ }
+
+ /**
+ * Get align attribute which has %IAlign; as values..
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public static final HTMLAttrDeclImpl createAlignForImage() {
+ // align (local)
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ // set enum values
+ String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_MIDDLE, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT};
+ atype.setEnumValues(values);
+
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ return attr;
+ }
+
+ /**
+ * Get align attribute which has %LAlign; as values..
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public static final HTMLAttrDeclImpl createAlignForLegend() {
+ // align (local)
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ // set enum values
+ String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT};
+ atype.setEnumValues(values);
+
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ return attr;
+ }
+
+ /**
+ * Create an attribute declaration for <code>align</code>
+ * in several elements, like <code>P</code>, <code>DIV</code>.
+ * The values are different from attributes those have the same name
+ * in other elements (<code>IMG</code> and <code>TABLE</code>).
+ * So, it can't treat as global attributes.
+ * <strong>NOTE: These attribute declaration has
+ * no owner CMDocument instance.</strong>
+ * @return com.ibm.sed.contentmodel.html.HTMLAttrDeclImpl
+ */
+ public static final HTMLAttrDeclImpl createAlignForParagraph() {
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ // set enum values: left|center|right|justify
+ String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_CENTER, ATTR_VALUE_RIGHT, ATTR_VALUE_JUSTIFY};
+ atype.setEnumValues(values);
+
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ return attr;
+ }
+
+ /**
+ * Get %attrs; declarations.
+ * %attrs; consists of %coreattrs;, %i18n, and %events;.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getAttrs(CMNamedNodeMapImpl declarations) {
+ // %coreattrs;
+ Iterator names = Arrays.asList(CORE).iterator();
+ getDeclarations(declarations, names);
+ // %i18n;
+ names = Arrays.asList(I18N).iterator();
+ getDeclarations(declarations, names);
+ // %events;
+ names = Arrays.asList(EVENTS).iterator();
+ getDeclarations(declarations, names);
+ }
+
+ /**
+ * Get %bodycolors; declarations.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getBodycolors(CMNamedNodeMapImpl declarations) {
+ Iterator names = Arrays.asList(BODYCOLORS).iterator();
+ getDeclarations(declarations, names);
+ }
+
+ /**
+ * Get %cellhalign; declarations.
+ * %cellhaligh; consists of:
+ * - (align (left|center|right|justify|char) #IMPLIED)
+ * - (char %Character; #IMPLIED)
+ * - (charoff %Length; #IMPLIED)
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getCellhalign(CMNamedNodeMapImpl declarations) {
+ // (align (left|center|right|justify|char) #IMPLIED) should be defined
+ // locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ // set enum values
+ String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_CENTER, ATTR_VALUE_RIGHT, ATTR_VALUE_JUSTIFY, ATTR_VALUE_CHAR};
+ atype.setEnumValues(values);
+
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ declarations.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+
+ // the rest.
+ Iterator names = Arrays.asList(CELLHALIGN).iterator();
+ getDeclarations(declarations, names);
+ }
+
+ /**
+ * Get %cellvalign; declarations.
+ * %cellhaligh; is:
+ * - (valign (top|middle|bottom|baseline) #IMPLIED)
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getCellvalign(CMNamedNodeMapImpl declarations) {
+ HTMLAttributeDeclaration dec = getDeclaration(HTML40Namespace.ATTR_NAME_VALIGN);
+ if (dec != null)
+ declarations.putNamedItem(HTML40Namespace.ATTR_NAME_VALIGN, dec);
+ }
+
+ /**
+ * Get %coreattrs; declarations.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getCore(CMNamedNodeMapImpl declarations) {
+ Iterator names = Arrays.asList(CORE).iterator();
+ getDeclarations(declarations, names);
+ }
+
+ /**
+ * Get a global attribute declaration.
+ * @return com.ibm.sed.contentmodel.html.HTMLAttrributeDeclaration
+ * @param attrName java.lang.String
+ */
+ public HTMLAttributeDeclaration getDeclaration(String attrName) {
+ CMNode cmnode = getNamedItem(attrName);
+ if (cmnode != null)
+ return (HTMLAttributeDeclaration) cmnode; // already exists.
+
+ HTMLAttrDeclImpl dec = create(attrName);
+ if (dec != null)
+ putNamedItem(attrName, dec);
+
+ return dec;
+ }
+
+ /**
+ * Get declarations which are specified by names.
+ * @param declarations com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ * @param names java.util.Iterator
+ */
+ public void getDeclarations(CMNamedNodeMapImpl declarations, Iterator names) {
+ while (names.hasNext()) {
+ String attrName = (String) names.next();
+ HTMLAttributeDeclaration dec = getDeclaration(attrName);
+ if (dec != null)
+ declarations.putNamedItem(attrName, dec);
+ }
+ }
+
+ /**
+ * Get %events; declarations.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getEvents(CMNamedNodeMapImpl declarations) {
+ Iterator names = Arrays.asList(EVENTS).iterator();
+ getDeclarations(declarations, names);
+ }
+
+ /**
+ * Get %i18n; declarations.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getI18n(CMNamedNodeMapImpl declarations) {
+ Iterator names = Arrays.asList(I18N).iterator();
+ getDeclarations(declarations, names);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMContentImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMContentImpl.java
new file mode 100644
index 0000000000..dac7c81524
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMContentImpl.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+
+
+
+/**
+ * Implementation of CMContent for HTML CM.
+ */
+abstract class CMContentImpl extends CMNodeImpl implements CMContent {
+
+ public static final int UNBOUNDED = -1;
+ /** -1: it's UNBOUNDED. */
+ private int maxOccur = UNBOUNDED;
+ /** 0: it's OPTIONAL, 1, it's REQUIRED. */
+ private int minOccur = 0;
+
+ /**
+ * The primary consturctor.
+ * Use this one for usual cases.<br>
+ */
+ public CMContentImpl(String name, int min, int max) {
+ super(name);
+ minOccur = min;
+ maxOccur = max;
+ }
+
+ /**
+ * getMaxOccur method
+ * @return int
+ *
+ * If -1, it's UNBOUNDED.
+ */
+ public int getMaxOccur() {
+ return maxOccur;
+ }
+
+ /**
+ * getMinOccur method
+ * @return int
+ *
+ * If 0, it's OPTIONAL.
+ * If 1, it's REQUIRED.
+ */
+ public int getMinOccur() {
+ return minOccur;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMGroupImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMGroupImpl.java
new file mode 100644
index 0000000000..a8ab34c9c1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMGroupImpl.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+
+/**
+ */
+class CMGroupImpl extends CMContentImpl implements CMGroup {
+
+ private int operator = CMGroup.SEQUENCE;
+ private CMNodeListImpl children = null;
+
+ /**
+ * CMGroupImpl constructor comment.
+ */
+ public CMGroupImpl(int op, int minOccur, int maxOccur) {
+ super(null, minOccur, maxOccur);
+ switch (op) {
+ case CMGroup.ALL :
+ case CMGroup.CHOICE :
+ case CMGroup.SEQUENCE :
+ operator = op;
+ break;
+ default :
+ // should warn.
+ break;
+ }
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ * @param org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ protected CMNode appendChild(CMNode child) {
+ if (child == null)
+ return null;
+ if (children == null)
+ children = new CMNodeListImpl();
+ return children.appendNode(child);
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList
+ */
+ public CMNodeList getChildNodes() {
+ return children;
+ }
+
+ /**
+ * getNodeType method
+ * @return int
+ *
+ * Returns one of :
+ * ELEMENT_DECLARATION, ATTRIBUTE_DECLARATION, GROUP, ENTITY_DECLARATION.
+ */
+ public int getNodeType() {
+ return CMNode.GROUP;
+ }
+
+ /**
+ * getOperation method
+ * @return int
+ *
+ * Returns one of :
+ * ALONE (a), SEQUENCE (a,b), CHOICE (a|b), ALL (a&b).
+ */
+ public int getOperator() {
+ return operator;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamedNodeMapImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamedNodeMapImpl.java
new file mode 100644
index 0000000000..21ce1b23a2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamedNodeMapImpl.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * An implementation of the CMNamedNodeMap interface.
+ * This class is intented to be used as a container of attribute declarations.
+ * If someone wants to use this class for other purpose, he must pay attention
+ * to the fact that this class is tolerant of the key name case. That is, this
+ * class does not distinguish "name", "NAME", and "Name" as a key name.
+ */
+class CMNamedNodeMapImpl implements CMNamedNodeMap {
+
+ private Hashtable items = null;
+
+ /**
+ */
+ public CMNamedNodeMapImpl() {
+ super();
+ items = new Hashtable();
+ }
+
+ /**
+ * getLength method
+ * @return int
+ */
+ public int getLength() {
+ return items.size();
+ }
+
+ /**
+ * getNamedItem method
+ * @return CMNode <code>null</code> for unknown keys.
+ * @param name java.lang.String
+ */
+ public CMNode getNamedItem(String name) {
+ String cookedName = makeCanonicalForm(name);
+ if (!items.containsKey(cookedName))
+ return null;
+ return (CMNode) items.get(cookedName);
+ }
+
+ /**
+ * item method
+ * @return CMNode
+ * @param index int
+ */
+ public CMNode item(int index) {
+ Iterator iter = iterator();
+ while (iter.hasNext()) {
+ CMNode node = (CMNode) iter.next();
+ if (--index < 0)
+ return node;
+ }
+ return null;
+ }
+
+ /**
+ * @return java.util.Iterator
+ */
+ public Iterator iterator() {
+ return items.values().iterator();
+ }
+
+ /**
+ * @return java.lang.String
+ * @param rawForm java.lang.String
+ */
+ private String makeCanonicalForm(String rawForm) {
+ return rawForm.toUpperCase();
+ }
+
+ /**
+ * @param key java.lang.String
+ * @param item java.lang.String
+ */
+ void putNamedItem(String name, CMNode item) {
+ String cookedName = makeCanonicalForm(name);
+ if (items.containsKey(cookedName))
+ return; // already registered.
+ items.put(cookedName, item);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamespaceImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamespaceImpl.java
new file mode 100644
index 0000000000..20f4c283a7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNamespaceImpl.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * CMNamespace implementation.
+ */
+class CMNamespaceImpl extends CMNodeImpl implements CMNamespace {
+
+ private java.lang.String prefix = null;
+
+ /**
+ * CMNamespaceImpl constructor comment.
+ */
+ public CMNamespaceImpl(String uri, String pfx) {
+ super(uri);
+ prefix = pfx;
+ }
+
+ /**
+ * getNodeType method
+ * @return int
+ *
+ * Returns one of :
+ *
+ */
+ public int getNodeType() {
+ return CMNode.NAME_SPACE;
+ }
+
+ /**
+ * getPrefix method
+ * @return java.lang.String
+ */
+ public String getPrefix() {
+ return prefix;
+ }
+
+ /**
+ * getURI method
+ * @return java.lang.String
+ */
+ public String getURI() {
+ return getNodeName();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeImpl.java
new file mode 100644
index 0000000000..bb9d68e5bc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeImpl.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+
+
+/**
+ */
+abstract class CMNodeImpl implements CMNode {
+
+ private java.lang.String name = null;
+
+ /**
+ * CMNodeImpl constructor comment.
+ */
+ public CMNodeImpl(String nm) {
+ super();
+ name = nm;
+ }
+
+ /**
+ * getNodeName method
+ * @return java.lang.String
+ */
+ public String getNodeName() {
+ return name;
+ }
+
+ /**
+ * getProperty method
+ * @return java.lang.Object
+ *
+ * Returns the object property desciped by the propertyName
+ *
+ */
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.IS_XHTML))
+ return new Boolean(false);
+ return null;
+ }
+
+ /**
+ * supports method
+ * @return boolean
+ *
+ * Returns true if the CMNode supports a specified property
+ *
+ */
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.IS_XHTML))
+ return true;
+ return false;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeListImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeListImpl.java
new file mode 100644
index 0000000000..33ceec8f56
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CMNodeListImpl.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+
+/**
+ * Analog of dom.NodeList for CM.
+ * So, the implementation is very similar to
+ * {@link com.ibm.sed.model.xml.NodeListImpl}.<br>
+ */
+class CMNodeListImpl implements CMNodeList {
+
+ private java.util.Vector nodes = null;
+
+ /**
+ * CMNodeListImpl constructor comment.
+ */
+ public CMNodeListImpl() {
+ super();
+ nodes = new java.util.Vector();
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ * @param node org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ protected CMNode appendNode(CMNode node) {
+ nodes.addElement(node);
+ return node;
+ }
+
+ /**
+ * getLength method
+ * @return int
+ */
+ public int getLength() {
+ return nodes.size();
+ }
+
+ /**
+ * item method
+ * @return CMNode
+ * @param index int
+ */
+ public CMNode item(int index) {
+ if (index < 0 || index >= nodes.size())
+ return null;
+ return (CMNode) nodes.elementAt(index);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinition.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinition.java
new file mode 100644
index 0000000000..79a286c1b5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinition.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+/**
+ * This class is intended to represent a complex type definition
+ * in XML Schema.<br>
+ */
+abstract class ComplexTypeDefinition {
+
+ protected CMGroupImpl content = null;
+ protected ElementCollection collection = null;
+ protected String primaryCandidateName = null;
+
+ /**
+ * ComplexTypeDefinition constructor comment.
+ */
+ public ComplexTypeDefinition(ElementCollection elementCollection) {
+ super();
+ collection = elementCollection;
+ createContent();
+ }
+
+ /**
+ * Create an actual content model.
+ * This method should be called once and only once in the constructor.<br>
+ */
+ protected abstract void createContent();
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMGroup
+ */
+ public CMGroup getContent() {
+ return content;
+ }
+
+ /**
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ /* NOTE: Do we need LOGICAL type?
+ * -- 3/7/2001
+ */
+ public abstract int getContentType();
+
+ /**
+ * Get content hint.
+ * @return com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public HTMLElementDeclaration getPrimaryCandidate() {
+ if (primaryCandidateName == null)
+ return null;
+ return (HTMLElementDeclaration) collection.getNamedItem(primaryCandidateName);
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public abstract String getTypeName();
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java
new file mode 100644
index 0000000000..59552a32ae
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ComplexTypeDefinitionFactory.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * Factory of ComplexTypeDefinition.
+ */
+final class ComplexTypeDefinitionFactory {
+
+ private static ComplexTypeDefinitionFactory instance = null;
+ private java.util.Hashtable definitions = null;
+ // constants for complex type name
+ /** for ADDRESS. */
+ public final static String CTYPE_ADDRESS = "CTYPE_ADDRESS";//$NON-NLS-1$
+ /** CDATA content. No ComplexTypeDefinition instance shuld be created. */
+ public final static String CTYPE_CDATA = "CTYPE_CDATA";//$NON-NLS-1$
+ /** col group content. COL* */
+ public final static String CTYPE_COLUMN_GROUP = "CTYPE_COLUMN_GROUP";//$NON-NLS-1$
+ /** for DL. */
+ public final static String CTYPE_DEFINITION_LIST = "CTYPE_DEFINITION_LIST";//$NON-NLS-1$
+ /** for EMBED. */
+ public final static String CTYPE_EMBED = "CTYPE_EMBED";//$NON-NLS-1$
+ /** empty content. No ComplexTypeDefinition instance should be created. */
+ public final static String CTYPE_EMPTY = "CTYPE_EMPTY";//$NON-NLS-1$
+ /** for FIELDSET. */
+ public final static String CTYPE_FIELDSET = "CTYPE_FIELDSET";//$NON-NLS-1$
+ /** for FRAMESET. */
+ public final static String CTYPE_FRAMESET = "CTYPE_FRAMESET";//$NON-NLS-1$
+ /** flow content. (%flow;)* */
+ public final static String CTYPE_FLOW_CONTAINER = "CTYPE_FLOW_CONTAINER";//$NON-NLS-1$
+ /** html content. HEAD, (FRAMESET|BODY) */
+ public final static String CTYPE_HTML = "CTYPE_HTML";//$NON-NLS-1$
+ /** head content. TITLE & ISINDEX? & BASE? */
+ public final static String CTYPE_HEAD = "CTYPE_HEAD";//$NON-NLS-1$
+ /** inline content. (%inline;)* */
+ public final static String CTYPE_INLINE_CONTAINER = "CTYPE_INLINE_CONTAINER";//$NON-NLS-1$
+ /** list item container. (LI)+ */
+ public final static String CTYPE_LI_CONTAINER = "CTYPE_LI_CONTAINER";//$NON-NLS-1$
+ /** for MAP. */
+ public final static String CTYPE_MAP = "CTYPE_MAP";//$NON-NLS-1$
+ /** noframes content. */
+ public final static String CTYPE_NOFRAMES_CONTENT = "CTYPE_NOFRAMES_CONTENT";//$NON-NLS-1$
+ /** for OPTGROUP. */
+ public final static String CTYPE_OPTION_CONTAINER = "CTYPE_OPTION_CONTAINER";//$NON-NLS-1$
+ /** param container. For OBJECT/APPLET. */
+ public final static String CTYPE_PARAM_CONTAINER = "CTYPE_PARAM_CONTAINER";//$NON-NLS-1$
+ /** PCDATA content. No ComplexTypeDefinition instance shuld be created. */
+ public final static String CTYPE_PCDATA = "CTYPE_PCDATA";//$NON-NLS-1$
+ /** for SELECT. */
+ public final static String CTYPE_SELECT = "CTYPE_SELECT";//$NON-NLS-1$
+ /** table content. CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+ */
+ public final static String CTYPE_TABLE = "CTYPE_TABLE";//$NON-NLS-1$
+ /** table cell contaier. (TH|TD)+ */
+ public final static String CTYPE_TCELL_CONTAINER = "CTYPE_TCELL_CONTAINER";//$NON-NLS-1$
+ /** table record container. (TR)+ */
+ public final static String CTYPE_TR_CONTAINER = "CTYPE_TR_CONTAINER";//$NON-NLS-1$
+
+ /**
+ * ComplexTypeDefinitionFactory constructor comment.
+ */
+ private ComplexTypeDefinitionFactory() {
+ super();
+ definitions = new java.util.Hashtable();
+ }
+
+ /**
+ * Factory method for ComplexTypeDefinition.
+ * Each instance created in this method must be registered into
+ * the map with its name.
+ * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ * @param definitionName java.lang.String
+ * @param elementCollection ElementCollection
+ */
+ public ComplexTypeDefinition createTypeDefinition(String definitionName, ElementCollection elementCollection) {
+ if (definitions.containsKey(definitionName)) {
+ return (ComplexTypeDefinition) definitions.get(definitionName);
+ }
+
+ ComplexTypeDefinition def = null;
+ if (definitionName == CTYPE_ADDRESS) {
+ def = new CtdAddress(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_COLUMN_GROUP) {
+ def = new CtdColumnGroup(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_DEFINITION_LIST) {
+ def = new CtdDl(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_EMBED) {
+ def = new CtdEmbed(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_FIELDSET) {
+ def = new CtdFieldset(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_FLOW_CONTAINER) {
+ def = new CtdFlowContainer(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_FRAMESET) {
+ def = new CtdFrameset(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_HEAD) {
+ def = new CtdHead(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_HTML) {
+ def = new CtdHtml(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_INLINE_CONTAINER) {
+ def = new CtdInlineContainer(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_LI_CONTAINER) {
+ def = new CtdLiContainer(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_MAP) {
+ def = new CtdMap(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_NOFRAMES_CONTENT) {
+ def = new CtdNoframesContent(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_OPTION_CONTAINER) {
+ def = new CtdOptionContainer(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_PARAM_CONTAINER) {
+ def = new CtdParamContainer(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_SELECT) {
+ def = new CtdSelect(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_TABLE) {
+ def = new CtdTable(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_TCELL_CONTAINER) {
+ def = new CtdTableCellContainer(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_TR_CONTAINER) {
+ def = new CtdTrContainer(elementCollection);
+
+ }
+ else {
+ def = null;
+ }
+ if (def == null)
+ return null; // fail to create.
+ definitions.put(definitionName, def);
+ return def;
+ }
+
+ /**
+ * For singleton.<br>
+ * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinitionFactory
+ */
+ public synchronized static ComplexTypeDefinitionFactory getInstance() {
+ if (instance != null)
+ return instance;
+ instance = new ComplexTypeDefinitionFactory();
+ return instance;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdAddress.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdAddress.java
new file mode 100644
index 0000000000..c79f788eaa
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdAddress.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for ADDRESS.
+ */
+final class CtdAddress extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdAddress(ElementCollection elementCollection) {
+ super(elementCollection);
+ }
+
+ /**
+ * ((%inline) | P)*.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( | )*
+ content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ // (%inline)
+ CMGroupImpl inlines = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ if (inlines == null)
+ return;
+ collection.getInline(inlines);
+ content.appendChild(inlines);
+ // P
+ CMNode p = collection.getNamedItem(HTML40Namespace.ElementName.P);
+ if (p != null)
+ content.appendChild(p);
+ }
+
+ /**
+ * ((%inline) | P)*.
+ * Because %inline; contains #PCDATA, the type is MIXED.
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.MIXED;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_ADDRESS;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdColumnGroup.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdColumnGroup.java
new file mode 100644
index 0000000000..b0b2e59aa3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdColumnGroup.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * COL group.
+ * (COL)*
+ */
+final class CtdColumnGroup extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdColumnGroup(ElementCollection elementCollection) {
+ super(elementCollection);
+ }
+
+ /**
+ * (COL)*
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( )*
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 0, CMContentImpl.UNBOUNDED);
+ // COL
+ CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.COL);
+ if (dec != null)
+ content.appendChild(dec);
+ }
+
+ /**
+ * (COL)*
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_COLUMN_GROUP;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDl.java
new file mode 100644
index 0000000000..561b2142d6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdDl.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for DL.
+ */
+final class CtdDl extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdDl(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.DT;
+ }
+
+ /**
+ * (DT | DD)+
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( | )+
+ content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+ // DT
+ CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.DT);
+ if (dec != null)
+ content.appendChild(dec);
+ // DD
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.DD);
+ if (dec != null)
+ content.appendChild(dec);
+ }
+
+ /**
+ * (DT | DD)+.
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_DEFINITION_LIST;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdEmbed.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdEmbed.java
new file mode 100644
index 0000000000..a96fcc616a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdEmbed.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for EMBED.
+ */
+final class CtdEmbed extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdEmbed(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.NOEMBED;
+ }
+
+ /**
+ * (NOEMBED).
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( )
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ // NOEMBED
+ CMNode noembed = collection.getNamedItem(HTML40Namespace.ElementName.NOEMBED);
+ if (noembed != null)
+ content.appendChild(noembed);
+ }
+
+ /**
+ * (NOEMBED).
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_EMBED;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFieldset.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFieldset.java
new file mode 100644
index 0000000000..61713a377f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFieldset.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for FIELDSET.
+ */
+final class CtdFieldset extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdFieldset(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.LEGEND;
+ }
+
+ /**
+ * (#PCDATA, LEGEND, (%flow;)*)
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( , , )
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ // #PCDATA
+ // ...??
+
+ // LEGEND
+ CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.LEGEND);
+ if (dec != null)
+ content.appendChild(dec);
+ // (%flow;)*
+ CMGroupImpl flows = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ if (flows == null)
+ return;
+ collection.getFlow(flows);
+ content.appendChild(flows);
+ }
+
+ /**
+ * (#PCDATA, LEGEND, (%flow;)*)
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.MIXED;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_FIELDSET;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFlowContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFlowContainer.java
new file mode 100644
index 0000000000..3bdad70d20
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFlowContainer.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+/**
+ * Complex type definition for containers of <code>%flow;</code>.
+ */
+final class CtdFlowContainer extends ComplexTypeDefinition {
+
+ /**
+ */
+ public CtdFlowContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ }
+
+ /**
+ * (%flow;)*
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ collection.getFlow(content);
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public int getContentType() {
+ return CMElementDeclaration.MIXED;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_FLOW_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFrameset.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFrameset.java
new file mode 100644
index 0000000000..42b79bdc59
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdFrameset.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for FRAMESET.
+ * ((FRAMESET | FRAME)+ & NOFRAMES?)
+ */
+final class CtdFrameset extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdFrameset(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.FRAME;
+ }
+
+ /**
+ * ((FRAMESET | FRAME)+ & NOFRAMES?).
+ * --> ((FRAMESET | FRAME)+ & (NOFRAMES)?)
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( & )
+ content = new CMGroupImpl(CMGroup.ALL, 1, 1);
+
+ // ( | )+
+ CMGroupImpl group = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+ if (group == null)
+ return;
+ content.appendChild(group);
+
+ // FRAMESET
+ CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.FRAMESET);
+ if (dec != null)
+ group.appendChild(dec);
+ // FRAME
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.FRAME);
+ if (dec != null)
+ group.appendChild(dec);
+
+ // ( )?
+ group = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1);
+ if (group == null)
+ return;
+ content.appendChild(group);
+
+ // NOFRAMES
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.NOFRAMES);
+ if (dec != null)
+ group.appendChild(dec);
+ }
+
+ /**
+ * ((FRAMESET | FRAME)+ & NOFRAMES?)
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_FRAMESET;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHead.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHead.java
new file mode 100644
index 0000000000..e0e321c499
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHead.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Complex type definition for the head content.
+ * Content Model: (TITLE & ISINDEX? & BASE?)
+ */
+final class CtdHead extends ComplexTypeDefinition {
+
+ /**
+ */
+ public CtdHead(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.TITLE;
+ }
+
+ /**
+ * for HEAD.
+ * To avoid using inclusion, the content model comes from the XHTML 1.0.
+ *
+ * (%head.misc;, ((title, %head.misc;, (base, %head.misc;)?) | (base, %head.misc;, (title, %head.misc;))))
+ * And %head.misc; is:
+ * (script|style|meta|link|object|isindex)*
+ *
+ * 0: (%head.misc, A)
+ * A: (B | C)
+ * B: (title, %head.misc;, D)
+ * C: (base, %head.misc;, E)
+ * D: (base, %head.misc;)?
+ * E: (title, %head.misc;)
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // At 1st, create %head.misc; content.
+ // %head.misc;
+ // ( | )*
+ CMGroupImpl misc = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ if (misc == null)
+ return;
+ String[] names = {HTML40Namespace.ElementName.SCRIPT, HTML40Namespace.ElementName.STYLE, HTML40Namespace.ElementName.META, HTML40Namespace.ElementName.LINK, HTML40Namespace.ElementName.OBJECT, HTML40Namespace.ElementName.ISINDEX};
+ collection.getDeclarations(misc, Arrays.asList(names).iterator());
+ // 2nd, get a title
+ CMNode title = collection.getNamedItem(HTML40Namespace.ElementName.TITLE);
+ // 3rd, get a base
+ CMNode base = collection.getNamedItem(HTML40Namespace.ElementName.BASE);
+ if (title == null || base == null)
+ return;
+
+ // Top level content is a sequence of %head.misc; and A.
+ // 0: (%head.misc;, A)
+ // create a sequence
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (content == null)
+ return;
+ // append %head.misc;
+ content.appendChild(misc);
+ // create A and append it to the top level.
+ {
+ // A is a choice of B and C.
+ // A: (B | C)
+ // create a choice
+ CMGroupImpl gA = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ if (gA == null)
+ return;
+ // append A to the top level.
+ content.appendChild(gA);
+
+ // create B and append it to A
+ {
+ // B is a sequence of title, %head.misc;, and D.
+ // B: (title, %head.misc;, D)
+ // create a sequence
+ CMGroupImpl gB = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (gB == null)
+ return;
+ // append B to A.
+ gA.appendChild(gB);
+
+ // append title to B
+ gB.appendChild(title);
+ // append %head.misc; to B
+ gB.appendChild(misc);
+ // create D and append it to B.
+ {
+ // D is a sequence of base, %head.misc;.
+ // D: (base, %head.misc;)?
+ // create a sequence
+ CMGroupImpl gD = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1);
+ if (gD == null)
+ return;
+ // append D to B.
+ gB.appendChild(gD);
+
+ // append base to D
+ gD.appendChild(base);
+ // append %head.misc; to D.
+ gD.appendChild(misc);
+ }
+ }
+ // create C and append it to A
+ {
+ // C is a sequence of base, %head.misc;, and E
+ // C: (base, %head.misc;, E)
+ // create a sequence
+ CMGroupImpl gC = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (gC == null)
+ return;
+ // append C to A.
+ gA.appendChild(gC);
+
+ // append base to C
+ gC.appendChild(base);
+ // append %head.misc; to C
+ gC.appendChild(misc);
+
+ // create E and append it to C.
+ {
+ // E is a sequence of title and %head.misc;.
+ // E: (title, %head.misc;)
+ // create a sequence
+ CMGroupImpl gE = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (gE == null)
+ return;
+ // append E to C.
+ gC.appendChild(gE);
+
+ // append title to E
+ gE.appendChild(title);
+ // append %head.misc; to E.
+ gE.appendChild(misc);
+ }
+ }
+ }
+ }
+
+ /**
+ * Element content.<br>
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_HEAD;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java
new file mode 100644
index 0000000000..7949e14282
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdHtml.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Complex type definition for <code>HTML</code>.<br>
+ * Content Model:
+ * HEAD, (FRAMESET|BODY)<br>
+ */
+final class CtdHtml extends ComplexTypeDefinition {
+
+ /**
+ */
+ public CtdHtml(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.HEAD;
+ }
+
+ /**
+ * (%html.content;).
+ * %html.content; is HEAD, (FRAMESET | BODY).
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( )
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (content == null)
+ return;
+
+ // HEAD
+ CMNode edec = collection.getNamedItem(HTML40Namespace.ElementName.HEAD);
+ if (edec != null)
+ content.appendChild(edec);
+
+ // ( | )
+ CMGroupImpl group = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ content.appendChild(group);
+
+ // FRAMESET, BODY
+ String[] names = {HTML40Namespace.ElementName.FRAMESET, HTML40Namespace.ElementName.BODY};
+ collection.getDeclarations(group, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * Element content.
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_HTML;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdInlineContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdInlineContainer.java
new file mode 100644
index 0000000000..6a4cb93821
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdInlineContainer.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+/**
+ * Complex type definition for (%inline;)*.
+ */
+final class CtdInlineContainer extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdInlineContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ }
+
+ /**
+ * (%inline)*.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ collection.getInline(content);
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public int getContentType() {
+ return CMElementDeclaration.MIXED;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_INLINE_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdLiContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdLiContainer.java
new file mode 100644
index 0000000000..edc4b6929d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdLiContainer.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * List item container.
+ * (LI)+
+ */
+final class CtdLiContainer extends ComplexTypeDefinition {
+
+ /**
+ * @param elemenCollection ElementCollection
+ */
+ public CtdLiContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.LI;
+ }
+
+ /**
+ * (LI)+.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // (LI)+
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED);
+ CMNode li = collection.getNamedItem(HTML40Namespace.ElementName.LI);
+ if (li != null)
+ content.appendChild(li);
+ }
+
+ /**
+ * ELEMENT content.<br>
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_LI_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMap.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMap.java
new file mode 100644
index 0000000000..9e08bb3839
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdMap.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for MAP.
+ */
+final class CtdMap extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdMap(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.AREA;
+ }
+
+ /**
+ * ((%block;) | AREA)+.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( | )+
+ content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+ // (%block;)
+ CMGroupImpl blocks = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ if (blocks == null)
+ return;
+ collection.getBlock(blocks);
+ content.appendChild(blocks);
+ // AREA
+ CMNode area = collection.getNamedItem(HTML40Namespace.ElementName.AREA);
+ if (area != null)
+ content.appendChild(area);
+ }
+
+ /**
+ * ((%block;) | AREA)+.
+ * Because %block; consists of elements only, the type is ELEMENT.
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_MAP;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdNoframesContent.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdNoframesContent.java
new file mode 100644
index 0000000000..f9a30c1123
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdNoframesContent.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for NOFRAMES.
+ */
+final class CtdNoframesContent extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdNoframesContent(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.BODY;
+ }
+
+ /**
+ * (BODY).
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( )
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ // BODY
+ CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.BODY);
+ if (dec != null)
+ content.appendChild(dec);
+ }
+
+ /**
+ * (BODY)
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_NOFRAMES_CONTENT;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdOptionContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdOptionContainer.java
new file mode 100644
index 0000000000..e3f4fde2e3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdOptionContainer.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * OPTION container.
+ * (OPTION)+
+ */
+final class CtdOptionContainer extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdOptionContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.OPTION;
+ }
+
+ /**
+ * (OPTION)+.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( )+
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED);
+ // OPTION
+ CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.OPTION);
+ if (dec != null)
+ content.appendChild(dec);
+ }
+
+ /**
+ * (OPTION)+
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_OPTION_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java
new file mode 100644
index 0000000000..e2aa03ccd5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdParamContainer.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * PARAM container. For OBJECT and APPLET.
+ */
+final class CtdParamContainer extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdParamContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ }
+
+ /**
+ * (PARAM | %flow;)*.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( | )*
+ content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ // PARAM
+ CMNode param = collection.getNamedItem(HTML40Namespace.ElementName.PARAM);
+ if (param != null)
+ content.appendChild(param);
+ // %flow;
+ CMGroupImpl flows = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ if (flows == null)
+ return;
+ collection.getInline(flows);
+ content.appendChild(flows);
+ }
+
+ /**
+ * (PARAM | %flow;)*.
+ * Because %flow; contains #PCDATA, the type is MIXED.
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.MIXED;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_PARAM_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdSelect.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdSelect.java
new file mode 100644
index 0000000000..50659d06bc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdSelect.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for SELECT.
+ */
+final class CtdSelect extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdSelect(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.OPTION;
+ }
+
+ /**
+ * (OPTGROUP | OPTION)+.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( | )+
+ content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+ // OPTGROUP
+ CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.OPTGROUP);
+ if (dec != null)
+ content.appendChild(dec);
+ // OPTION
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.OPTION);
+ if (dec != null)
+ content.appendChild(dec);
+ }
+
+ /**
+ * (OPTGROUP | OPTION)+.
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_SELECT;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTable.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTable.java
new file mode 100644
index 0000000000..6357a3bb18
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTable.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for TABLE.
+ * (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)
+ */
+final class CtdTable extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdTable(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.TBODY;
+ }
+
+ /**
+ * (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)
+ * --> ((CAPTION)?, ((COL)* | (COLGROUP)*), (THEAD)?, (TFOOT)?, (TBODY)+)
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( , , , ,)
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+
+ // (CAPTION)?
+ // ( )?
+ CMGroupImpl wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1);
+ if (wrap == null)
+ return;
+ content.appendChild(wrap);
+ // CAPTION
+ CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.CAPTION);
+ if (dec != null)
+ wrap.appendChild(dec);
+
+ // ((COL)* | (COLGROUP)*)
+ // ( | )
+ CMGroupImpl group = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ if (group == null)
+ return;
+ content.appendChild(group);
+ // (COL)*
+ wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, CMContentImpl.UNBOUNDED);
+ if (wrap == null)
+ return;
+ group.appendChild(wrap);
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.COL);
+ if (dec != null)
+ wrap.appendChild(dec);
+ // (COLGROUP)*
+ wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, CMContentImpl.UNBOUNDED);
+ if (wrap == null)
+ return;
+ group.appendChild(wrap);
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.COLGROUP);
+ if (dec != null)
+ wrap.appendChild(dec);
+
+ // (THEAD)?
+ wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1);
+ if (wrap == null)
+ return;
+ content.appendChild(wrap);
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.THEAD);
+ if (dec != null)
+ wrap.appendChild(dec);
+
+ // (TFOOT)?
+ wrap = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1);
+ if (wrap == null)
+ return;
+ content.appendChild(wrap);
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.TFOOT);
+ if (dec != null)
+ wrap.appendChild(dec);
+
+ // (TBODY)+
+ wrap = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED);
+ if (wrap == null)
+ return;
+ content.appendChild(wrap);
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.TBODY);
+ if (dec != null)
+ wrap.appendChild(dec);
+ }
+
+ /**
+ * ((FRAMESET | FRAME)+ & NOFRAMES?)
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_TABLE;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTableCellContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTableCellContainer.java
new file mode 100644
index 0000000000..24a6ad61c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTableCellContainer.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Table cell container.
+ * (TH | TD)+
+ */
+final class CtdTableCellContainer extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdTableCellContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.TD;
+ }
+
+ /**
+ * (TH | TD)+.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( )+
+ content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+ // TH
+ CMNode dec = collection.getNamedItem(HTML40Namespace.ElementName.TH);
+ if (dec != null)
+ content.appendChild(dec);
+ // TD
+ dec = collection.getNamedItem(HTML40Namespace.ElementName.TD);
+ if (dec != null)
+ content.appendChild(dec);
+ }
+
+ /**
+ * (TH | TD)+
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_TCELL_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTrContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTrContainer.java
new file mode 100644
index 0000000000..2f8b5ef696
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/CtdTrContainer.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Table record container.
+ * (TR)+
+ */
+final class CtdTrContainer extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdTrContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = HTML40Namespace.ElementName.TR;
+ }
+
+ /**
+ * (TR)+.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // (TR)+
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED);
+ CMNode tr = collection.getNamedItem(HTML40Namespace.ElementName.TR);
+ if (tr != null)
+ content.appendChild(tr);
+ }
+
+ /**
+ * ELEMENT content.<br>
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_TR_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/DeclCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/DeclCollection.java
new file mode 100644
index 0000000000..4b0d55840d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/DeclCollection.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ */
+abstract class DeclCollection implements CMNamedNodeMap {
+
+
+ protected class DualMap {
+ public DualMap() {
+ super();
+ }
+
+ public DualMap(Object[] objects) {
+ super();
+ initialize(objects);
+ }
+
+ public int size() {
+ return table.length;
+ }
+
+ public Object getValue(int key) {
+ if (!isValidIndex(key))
+ return null;
+ return table[key];
+ }
+
+ public int getKey(Object value) {
+ Integer keyObj = (Integer) map.get(value);
+ if (keyObj == null)
+ return ID_UNKNOWN;
+ return keyObj.intValue();
+ }
+
+ protected void initialize(Object[] objects) {
+ if (objects == null)
+ return;
+ table = objects;
+ map = new HashMap();
+ for (int key = 0; key < objects.length; key++) {
+ Object value = table[key];
+ map.put(value, new Integer(key));
+ }
+ }
+
+ private Object[] table = null;
+ private HashMap map = null;
+
+ private boolean isValidIndex(int index) {
+ return index >= 0 && index < table.length;
+ }
+ }
+
+ protected class TolerantStringDualMap extends DualMap {
+ public TolerantStringDualMap(String[] names) {
+ super();
+ Object[] objects = new Object[names.length];
+ for (int i = 0; i < names.length; i++) {
+ objects[i] = makeCanonicalForm(names[i]);
+ }
+ initialize(objects);
+ }
+
+ public int getKey(Object value) {
+ try {
+ String name = (String) value;
+ return super.getKey(makeCanonicalForm(name));
+ }
+ catch (ClassCastException e) {
+ return ID_UNKNOWN;
+ }
+ }
+
+ private String makeCanonicalForm(String raw) {
+ return raw.toUpperCase();
+ }
+ }
+
+ private class DeclIterator implements Iterator {
+ public DeclIterator() {
+ maxid = fDecls.length - 1;
+ }
+
+ public boolean hasNext() {
+ return id < maxid;
+ }
+
+ public Object next() {
+ if (!hasNext())
+ return null;
+ return item(++id);
+ }
+
+ public void remove() { /* nothing should be done. */
+ }
+
+ private int id = -1;
+ private int maxid = -1;
+ }
+
+ CMNode[] fDecls = null;
+ protected final static boolean STRICT_CASE = false;
+ protected final static boolean TOLERANT_CASE = true;
+ protected final static int ID_UNKNOWN = -1;
+ private DualMap fMap = null;
+
+ /**
+ */
+ public DeclCollection(String[] names, boolean tolerant) {
+ super();
+ fDecls = new CMNode[names.length];
+ if (tolerant) {
+ fMap = new TolerantStringDualMap(names);
+ }
+ else {
+ fMap = new DualMap(names);
+ }
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ * @param id int
+ */
+ protected abstract CMNode create(String name);
+
+ /**
+ */
+ public CMNamedNodeMap getDeclarations(String[] names) {
+ CMNamedNodeMapImpl map = new CMNamedNodeMapImpl();
+ for (int i = 0; i < names.length; i++) {
+ String name = names[i];
+ CMNode node = getNamedItem(name);
+ if (node == null)
+ continue;
+ map.putNamedItem(name, node);
+ }
+ return map;
+ }
+
+ /**
+ * @param declarations com.ibm.sed.contentmodel.html.CMGroupImpl
+ * @param names java.util.Iterator
+ */
+ public void getDeclarations(CMGroupImpl group, Iterator names) {
+ while (names.hasNext()) {
+ String entityName = (String) names.next();
+ CMNode dec = getNamedItem(entityName);
+ if (dec != null)
+ group.appendChild(dec);
+ }
+ }
+
+ /**
+ * Map name to id.
+ * @return int
+ * @param name java.lang.String
+ */
+ protected int getID(String name) {
+ return fMap.getKey(name);
+ }
+
+ /**
+ * getLength method
+ * @return int
+ */
+ public int getLength() {
+ return fDecls.length;
+ }
+
+ /**
+ * @return java.lang.String
+ * @param id int
+ */
+ protected String getName(int id) {
+ return (String) fMap.getValue(id);
+ }
+
+ /**
+ * getNamedItem method
+ * @return CMNode
+ * @param name java.lang.String
+ */
+ public CMNode getNamedItem(String name) {
+ int id = getID(name);
+ if (!isValidID(id))
+ return null;
+ return item(id);
+ }
+
+ /**
+ * @return boolean
+ * @param id int
+ */
+ private boolean isValidID(int id) {
+ return id >= 0 && id < fDecls.length;
+ }
+
+ /**
+ * item method
+ * @return CMNode
+ * @param index int
+ */
+ public CMNode item(int index) {
+ if (!isValidID(index))
+ return null;
+ CMNode decl = fDecls[index];
+ if (decl != null)
+ return decl; // already exist.
+
+ decl = create(getName(index));
+ fDecls[index] = decl;
+ return decl;
+ }
+
+ /**
+ */
+ public Iterator iterator() {
+ return new DeclIterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java
new file mode 100644
index 0000000000..db0c9888d2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ElementCollection.java
@@ -0,0 +1,886 @@
+/*******************************************************************************
+ * 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;
+
+
+
+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.HTML40Namespace.ElementName {
+
+
+ // Element IDs
+ private static class Ids {
+ public static final int ID_A = 0;
+ public static final int ID_ABBR = 1;
+ public static final int ID_ACRONYM = 2;
+ public static final int ID_ADDRESS = 3;
+ public static final int ID_APPLET = 4;
+ public static final int ID_AREA = 5;
+ public static final int ID_B = 6;
+ public static final int ID_BASE = 7;
+ public static final int ID_BASEFONT = 8;
+ public static final int ID_BDO = 9;
+ public static final int ID_BIG = 10;
+ public static final int ID_BLINK = 11;
+ public static final int ID_BLOCKQUOTE = 12;
+ public static final int ID_BODY = 13;
+ public static final int ID_BR = 14;
+ public static final int ID_BUTTON = 15;
+ public static final int ID_CAPTION = 16;
+ public static final int ID_CENTER = 17;
+ public static final int ID_CITE = 18;
+ public static final int ID_CODE = 19;
+ public static final int ID_COL = 20;
+ public static final int ID_COLGROUP = 21;
+ public static final int ID_DD = 22;
+ public static final int ID_DEL = 23;
+ public static final int ID_DFN = 24;
+ public static final int ID_DIR = 25;
+ public static final int ID_DIV = 26;
+ public static final int ID_DL = 27;
+ public static final int ID_DT = 28;
+ public static final int ID_EM = 29;
+ public static final int ID_EMBED = 30;
+ public static final int ID_FIELDSET = 31;
+ public static final int ID_FONT = 32;
+ public static final int ID_FORM = 33;
+ public static final int ID_FRAME = 34;
+ public static final int ID_FRAMESET = 35;
+ public static final int ID_H1 = 36;
+ public static final int ID_H2 = 37;
+ public static final int ID_H3 = 38;
+ public static final int ID_H4 = 39;
+ public static final int ID_H5 = 40;
+ public static final int ID_H6 = 41;
+ public static final int ID_HEAD = 42;
+ public static final int ID_HR = 43;
+ public static final int ID_HTML = 44;
+ public static final int ID_I = 45;
+ public static final int ID_IFRAME = 46;
+ public static final int ID_IMG = 47;
+ public static final int ID_INPUT = 48;
+ public static final int ID_INS = 49;
+ public static final int ID_ISINDEX = 50;
+ public static final int ID_KBD = 51;
+ public static final int ID_LABEL = 52;
+ public static final int ID_LEGEND = 53;
+ public static final int ID_LI = 54;
+ public static final int ID_LINK = 55;
+ public static final int ID_MAP = 56;
+ public static final int ID_MENU = 57;
+ public static final int ID_META = 58;
+ public static final int ID_NOEMBED = 59;
+ public static final int ID_NOFRAMES = 60;
+ public static final int ID_NOSCRIPT = 61;
+ public static final int ID_OBJECT = 62;
+ public static final int ID_OL = 63;
+ public static final int ID_OPTGROUP = 64;
+ public static final int ID_OPTION = 65;
+ public static final int ID_P = 66;
+ public static final int ID_PARAM = 67;
+ public static final int ID_PRE = 68;
+ public static final int ID_Q = 69;
+ public static final int ID_S = 70;
+ public static final int ID_SAMP = 71;
+ public static final int ID_SCRIPT = 72;
+ public static final int ID_SELECT = 73;
+ public static final int ID_SMALL = 74;
+ public static final int ID_SPAN = 75;
+ public static final int ID_STRIKE = 76;
+ public static final int ID_STRONG = 77;
+ public static final int ID_STYLE = 78;
+ public static final int ID_SUB = 79;
+ public static final int ID_SUP = 80;
+ public static final int ID_TABLE = 81;
+ public static final int ID_TBODY = 82;
+ public static final int ID_TD = 83;
+ public static final int ID_TEXTAREA = 84;
+ public static final int ID_TFOOT = 85;
+ public static final int ID_TH = 86;
+ public static final int ID_THEAD = 87;
+ public static final int ID_TITLE = 88;
+ public static final int ID_TR = 89;
+ public static final int ID_TT = 90;
+ public static final int ID_U = 91;
+ public static final int ID_UL = 92;
+ public static final int ID_VAR = 93;
+ public static final int ID_MARQUEE = 94;
+ public static final int ID_SSI_CONFIG = 95;
+ public static final int ID_SSI_ECHO = 96;
+ public static final int ID_SSI_EXEC = 97;
+ public static final int ID_SSI_FSIZE = 98;
+ public static final int ID_SSI_FLASTMOD = 99;
+ public static final int ID_SSI_INCLUDE = 100;
+ public static final int ID_SSI_PRINTENV = 101;
+ public static final int ID_SSI_SET = 102;
+ // <<D205513
+ public static final int ID_BGSOUND = 103;
+ public static final int ID_NOBR = 104;
+ public static final int ID_WBR = 105;
+
+ // D205513
+
+ 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;
+ }
+
+ /** %fontstyle;. TT | I | B | U | S | STRIKE | BIG | SMALL | BLINK */
+ private static final String[] FONTSTYLE = {TT, I, B, U, S, STRIKE, BIG, SMALL, BLINK};
+ /** %formctl;. INPUT | SELECT | TEXTAREA | LABEL | BUTTON */
+ private static final String[] FORMCTL = {INPUT, SELECT, TEXTAREA, LABEL, BUTTON};
+ /** %phrase;.
+ * EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE | ABBR | ACRONYM
+ */
+ private static final String[] PHRASE = {EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, ABBR, ACRONYM};
+ /** %special;.
+ * A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
+ * MAP | Q | SUB | SUP | SPAN | BDO | IFRAME | EMBED | MARQUEE |
+ * D2W | SUBMIT
+ * WBR | NOBR | BGSOUND
+ */
+ private static final String[] SPECIAL = {A, IMG, APPLET, OBJECT, FONT, BASEFONT, BR, WBR, // D205513
+ SCRIPT, MAP, Q, SUB, SUP, SPAN, BDO, IFRAME, EMBED, BGSOUND, // D205513
+ MARQUEE, NOBR // D205513
+ };
+ /** %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[] fNames = null;
+
+ static {
+ fNames = new String[Ids.getNumOfIds()];
+ fNames[Ids.ID_A] = A;
+ fNames[Ids.ID_ABBR] = ABBR;
+ fNames[Ids.ID_ACRONYM] = ACRONYM;
+ fNames[Ids.ID_ADDRESS] = ADDRESS;
+ fNames[Ids.ID_APPLET] = APPLET;
+ fNames[Ids.ID_AREA] = AREA;
+ fNames[Ids.ID_B] = B;
+ fNames[Ids.ID_BASE] = BASE;
+ fNames[Ids.ID_BASEFONT] = BASEFONT;
+ fNames[Ids.ID_BDO] = BDO;
+ fNames[Ids.ID_BIG] = BIG;
+ fNames[Ids.ID_BLINK] = BLINK;
+ fNames[Ids.ID_BLOCKQUOTE] = BLOCKQUOTE;
+ fNames[Ids.ID_BODY] = BODY;
+ fNames[Ids.ID_BR] = BR;
+ fNames[Ids.ID_BUTTON] = BUTTON;
+ fNames[Ids.ID_CAPTION] = CAPTION;
+ fNames[Ids.ID_CENTER] = CENTER;
+ fNames[Ids.ID_CITE] = CITE;
+ fNames[Ids.ID_CODE] = CODE;
+ fNames[Ids.ID_COL] = COL;
+ fNames[Ids.ID_COLGROUP] = COLGROUP;
+ fNames[Ids.ID_DD] = DD;
+ fNames[Ids.ID_DEL] = DEL;
+ fNames[Ids.ID_DFN] = DFN;
+ fNames[Ids.ID_DIR] = DIR;
+ fNames[Ids.ID_DIV] = DIV;
+ fNames[Ids.ID_DL] = DL;
+ fNames[Ids.ID_DT] = DT;
+ fNames[Ids.ID_EM] = EM;
+ fNames[Ids.ID_EMBED] = EMBED;
+ fNames[Ids.ID_FIELDSET] = FIELDSET;
+ fNames[Ids.ID_FONT] = FONT;
+ fNames[Ids.ID_FORM] = FORM;
+ fNames[Ids.ID_FRAME] = FRAME;
+ fNames[Ids.ID_FRAMESET] = FRAMESET;
+ fNames[Ids.ID_H1] = H1;
+ fNames[Ids.ID_H2] = H2;
+ fNames[Ids.ID_H3] = H3;
+ fNames[Ids.ID_H4] = H4;
+ fNames[Ids.ID_H5] = H5;
+ fNames[Ids.ID_H6] = H6;
+ fNames[Ids.ID_HEAD] = HEAD;
+ fNames[Ids.ID_HR] = HR;
+ fNames[Ids.ID_HTML] = HTML;
+ fNames[Ids.ID_I] = I;
+ fNames[Ids.ID_IFRAME] = IFRAME;
+ fNames[Ids.ID_IMG] = IMG;
+ fNames[Ids.ID_INPUT] = INPUT;
+ fNames[Ids.ID_INS] = INS;
+ fNames[Ids.ID_ISINDEX] = ISINDEX;
+ fNames[Ids.ID_KBD] = KBD;
+ fNames[Ids.ID_LABEL] = LABEL;
+ fNames[Ids.ID_LEGEND] = LEGEND;
+ fNames[Ids.ID_LI] = LI;
+ fNames[Ids.ID_LINK] = LINK;
+ fNames[Ids.ID_MAP] = MAP;
+ fNames[Ids.ID_MENU] = MENU;
+ fNames[Ids.ID_META] = META;
+ fNames[Ids.ID_NOEMBED] = NOEMBED;
+ fNames[Ids.ID_NOFRAMES] = NOFRAMES;
+ fNames[Ids.ID_NOSCRIPT] = NOSCRIPT;
+ fNames[Ids.ID_OBJECT] = OBJECT;
+ fNames[Ids.ID_OL] = OL;
+ fNames[Ids.ID_OPTGROUP] = OPTGROUP;
+ fNames[Ids.ID_OPTION] = OPTION;
+ fNames[Ids.ID_P] = P;
+ fNames[Ids.ID_PARAM] = PARAM;
+ fNames[Ids.ID_PRE] = PRE;
+ fNames[Ids.ID_Q] = Q;
+ fNames[Ids.ID_S] = S;
+ fNames[Ids.ID_SAMP] = SAMP;
+ fNames[Ids.ID_SCRIPT] = SCRIPT;
+ fNames[Ids.ID_SELECT] = SELECT;
+ fNames[Ids.ID_SMALL] = SMALL;
+ fNames[Ids.ID_SPAN] = SPAN;
+ fNames[Ids.ID_STRIKE] = STRIKE;
+ fNames[Ids.ID_STRONG] = STRONG;
+ fNames[Ids.ID_STYLE] = STYLE;
+ fNames[Ids.ID_SUB] = SUB;
+ fNames[Ids.ID_SUP] = SUP;
+ fNames[Ids.ID_TABLE] = TABLE;
+ fNames[Ids.ID_TBODY] = TBODY;
+ fNames[Ids.ID_TD] = TD;
+ fNames[Ids.ID_TEXTAREA] = TEXTAREA;
+ fNames[Ids.ID_TFOOT] = TFOOT;
+ fNames[Ids.ID_TH] = TH;
+ fNames[Ids.ID_THEAD] = THEAD;
+ fNames[Ids.ID_TITLE] = TITLE;
+ fNames[Ids.ID_TR] = TR;
+ fNames[Ids.ID_TT] = TT;
+ fNames[Ids.ID_U] = U;
+ fNames[Ids.ID_UL] = UL;
+ fNames[Ids.ID_VAR] = VAR;
+ fNames[Ids.ID_MARQUEE] = MARQUEE;
+ fNames[Ids.ID_SSI_CONFIG] = SSI_CONFIG;
+ fNames[Ids.ID_SSI_ECHO] = SSI_ECHO;
+ fNames[Ids.ID_SSI_EXEC] = SSI_EXEC;
+ fNames[Ids.ID_SSI_FSIZE] = SSI_FSIZE;
+ fNames[Ids.ID_SSI_FLASTMOD] = SSI_FLASTMOD;
+ fNames[Ids.ID_SSI_INCLUDE] = SSI_INCLUDE;
+ fNames[Ids.ID_SSI_PRINTENV] = SSI_PRINTENV;
+ fNames[Ids.ID_SSI_SET] = SSI_SET;
+ fNames[Ids.ID_BGSOUND] = BGSOUND;
+ fNames[Ids.ID_NOBR] = NOBR;
+ fNames[Ids.ID_WBR] = WBR;
+ }
+
+ /**
+ */
+ public ElementCollection(AttributeCollection collection) {
+ super(fNames, 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(ABBR)) {
+ edec = new HedPhrase(ABBR, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(ACRONYM)) {
+ edec = new HedPhrase(ACRONYM, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(ADDRESS)) {
+ edec = new HedADDRESS(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(APPLET)) {
+ edec = new HedAPPLET(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(AREA)) {
+ edec = new HedAREA(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(B)) {
+ edec = new HedFontStyle(B, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(BASE)) {
+ edec = new HedBASE(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(BASEFONT)) {
+ edec = new HedBASEFONT(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(BDO)) {
+ edec = new HedBDO(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(BIG)) {
+ edec = new HedFontStyle(BIG, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(BLINK)) {
+ edec = new HedFontStyle(BLINK, 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(BUTTON)) {
+ edec = new HedBUTTON(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(CAPTION)) {
+ edec = new HedCAPTION(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(CENTER)) {
+ edec = new HedCENTER(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(CITE)) {
+ edec = new HedPhrase(CITE, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(CODE)) {
+ edec = new HedPhrase(CODE, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(COL)) {
+ edec = new HedCOL(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(COLGROUP)) {
+ edec = new HedCOLGROUP(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(DD)) {
+ edec = new HedDD(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(DEL)) {
+ edec = new HedMarkChanges(DEL, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(DFN)) {
+ edec = new HedPhrase(DFN, 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(EM)) {
+ edec = new HedPhrase(EM, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(EMBED)) {
+ edec = new HedEMBED(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(FIELDSET)) {
+ edec = new HedFIELDSET(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(FONT)) {
+ edec = new HedFONT(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(FORM)) {
+ edec = new HedFORM(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(FRAME)) {
+ edec = new HedFRAME(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(FRAMESET)) {
+ edec = new HedFRAMESET(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(I)) {
+ edec = new HedFontStyle(I, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(IFRAME)) {
+ edec = new HedIFRAME(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(IMG)) {
+ edec = new HedIMG(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(INPUT)) {
+ edec = new HedINPUT(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(INS)) {
+ edec = new HedMarkChanges(INS, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(ISINDEX)) {
+ edec = new HedISINDEX(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(KBD)) {
+ edec = new HedPhrase(KBD, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(LABEL)) {
+ edec = new HedLABEL(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(LEGEND)) {
+ edec = new HedLEGEND(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(LI)) {
+ edec = new HedLI(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(LINK)) {
+ edec = new HedLINK(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(MAP)) {
+ edec = new HedMAP(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(MARQUEE)) {
+ edec = new HedMARQUEE(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(MENU)) {
+ edec = new HedMENU(MENU, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(META)) {
+ edec = new HedMETA(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(NOEMBED)) {
+ edec = new HedNOEMBED(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(NOFRAMES)) {
+ edec = new HedNOFRAMES(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(NOSCRIPT)) {
+ edec = new HedNOSCRIPT(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(OBJECT)) {
+ edec = new HedOBJECT(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(OL)) {
+ edec = new HedOL(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(OPTGROUP)) {
+ edec = new HedOPTGROUP(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(OPTION)) {
+ edec = new HedOPTION(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(P)) {
+ edec = new HedP(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(PARAM)) {
+ edec = new HedPARAM(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(PRE)) {
+ edec = new HedPRE(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(Q)) {
+ edec = new HedQ(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(S)) {
+ edec = new HedFontStyle(S, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(SAMP)) {
+ edec = new HedPhrase(SAMP, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(SCRIPT)) {
+ edec = new HedSCRIPT(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(SELECT)) {
+ edec = new HedSELECT(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(SMALL)) {
+ edec = new HedFontStyle(SMALL, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(SPAN)) {
+ edec = new HedSPAN(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(STRIKE)) {
+ edec = new HedFontStyle(STRIKE, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(STRONG)) {
+ edec = new HedPhrase(STRONG, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(STYLE)) {
+ edec = new HedSTYLE(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(SUB)) {
+ edec = new HedScripts(SUB, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(SUP)) {
+ edec = new HedScripts(SUP, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(TABLE)) {
+ edec = new HedTABLE(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(TBODY)) {
+ edec = new HedTableBody(TBODY, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(TD)) {
+ edec = new HedTableCell(TD, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(TEXTAREA)) {
+ edec = new HedTEXTAREA(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(TFOOT)) {
+ edec = new HedTableBody(TFOOT, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(TH)) {
+ edec = new HedTableCell(TH, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(THEAD)) {
+ edec = new HedTableBody(THEAD, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(TITLE)) {
+ edec = new HedTITLE(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(TR)) {
+ edec = new HedTR(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(TT)) {
+ edec = new HedFontStyle(TT, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(U)) {
+ edec = new HedFontStyle(U, this);
+
+ }
+ else if (elementName.equalsIgnoreCase(UL)) {
+ edec = new HedUL(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(VAR)) {
+ edec = new HedPhrase(VAR, 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);
+
+ }
+ else if (elementName.equalsIgnoreCase(BGSOUND)) {
+ edec = new HedBGSOUND(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(NOBR)) {
+ edec = new HedNOBR(this);
+
+ }
+ else if (elementName.equalsIgnoreCase(WBR)) {
+ edec = new HedWBR(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;
+ }
+
+ /**
+ * @return com.ibm.sed.contentmodel.html.AttributeCollection
+ */
+ public AttributeCollection getAttributeCollection() {
+ return attributeCollection;
+ }
+
+ /**
+ */
+ public final Collection getNamesOfBlock() {
+ // P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR,
+ // TABLE, FIELDSET, ADDRESS
+ String[] blockMisc = {P, DL, DIV, CENTER, NOSCRIPT, NOFRAMES, BLOCKQUOTE, FORM, ISINDEX, HR, TABLE, FIELDSET, ADDRESS};
+ Vector names = new Vector(Arrays.asList(blockMisc));
+ // %heading;
+ names.addAll(Arrays.asList(HEADING));
+ // %list;
+ names.addAll(Arrays.asList(LIST));
+ // %preformatted;
+ names.addAll(Arrays.asList(PREFORMATTED));
+
+ return names;
+ }
+
+ /**
+ * %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) {
+ if (group == null)
+ return;
+ getDeclarations(group, Arrays.asList(FONTSTYLE).iterator());
+ }
+
+ /**
+ * 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());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/EntityCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/EntityCollection.java
new file mode 100644
index 0000000000..8343a9256c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/EntityCollection.java
@@ -0,0 +1,837 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.lang.reflect.Field;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Factory for entity declarations.
+ */
+final class EntityCollection extends DeclCollection implements org.eclipse.wst.html.core.HTML40Namespace.EntityName {
+
+
+ private static class Ids {
+ public static final int ID_AACUTE_L = 0;
+ public static final int ID_AACUTE_U = 1;
+ public static final int ID_ACIRC_L = 2;
+ public static final int ID_ACIRC_U = 3;
+ public static final int ID_ACUTE = 4;
+ public static final int ID_AELIG_L = 5;
+ public static final int ID_AELIG_U = 6;
+ public static final int ID_AGRAVE_L = 7;
+ public static final int ID_AGRAVE_U = 8;
+ public static final int ID_ALEFSYM = 9;
+ public static final int ID_ALPHA_L = 10;
+ public static final int ID_ALPHA_U = 11;
+ public static final int ID_AMP = 12;
+ public static final int ID_AND = 13;
+ public static final int ID_ANG = 14;
+ public static final int ID_ARING_L = 15;
+ public static final int ID_ARING_U = 16;
+ public static final int ID_ASYMP = 17;
+ public static final int ID_ATILDE_L = 18;
+ public static final int ID_ATILDE_U = 19;
+ public static final int ID_AUML_L = 20;
+ public static final int ID_AUML_U = 21;
+ public static final int ID_BDQUO = 22;
+ public static final int ID_BETA_L = 23;
+ public static final int ID_BETA_U = 24;
+ public static final int ID_BRVBAR = 25;
+ public static final int ID_BULL = 26;
+ public static final int ID_CAP = 27;
+ public static final int ID_CCEDIL_L = 28;
+ public static final int ID_CCEDIL_U = 29;
+ public static final int ID_CEDIL = 30;
+ public static final int ID_CENT = 31;
+ public static final int ID_CHI_L = 32;
+ public static final int ID_CHI_U = 33;
+ public static final int ID_CIRC = 34;
+ public static final int ID_CLUBS = 35;
+ public static final int ID_CONG = 36;
+ public static final int ID_COPY = 37;
+ public static final int ID_CRARR = 38;
+ public static final int ID_CUP = 39;
+ public static final int ID_CURREN = 40;
+ public static final int ID_DAGGER_L = 41;
+ public static final int ID_DAGGER_U = 42;
+ public static final int ID_DARR_L = 43;
+ public static final int ID_DARR_U = 44;
+ public static final int ID_DEG = 45;
+ public static final int ID_DELTA_L = 46;
+ public static final int ID_DELTA_U = 47;
+ public static final int ID_DIAMS = 48;
+ public static final int ID_DIVIDE = 49;
+ public static final int ID_EACUTE_L = 50;
+ public static final int ID_EACUTE_U = 51;
+ public static final int ID_ECIRC_L = 52;
+ public static final int ID_ECIRC_U = 53;
+ public static final int ID_EGRAVE_L = 54;
+ public static final int ID_EGRAVE_U = 55;
+ public static final int ID_EMPTY = 56;
+ public static final int ID_EMSP = 57;
+ public static final int ID_ENSP = 58;
+ public static final int ID_EPSILON_L = 59;
+ public static final int ID_EPSILON_U = 60;
+ public static final int ID_EQUIV = 61;
+ public static final int ID_ETA_L = 62;
+ public static final int ID_ETA_U = 63;
+ public static final int ID_ETH_L = 64;
+ public static final int ID_ETH_U = 65;
+ public static final int ID_EUML_L = 66;
+ public static final int ID_EUML_U = 67;
+ public static final int ID_EURO = 68;
+ public static final int ID_EXIST = 69;
+ public static final int ID_FNOF = 70;
+ public static final int ID_FORALL = 71;
+ public static final int ID_FRAC12 = 72;
+ public static final int ID_FRAC14 = 73;
+ public static final int ID_FRAC34 = 74;
+ public static final int ID_FRASL = 75;
+ public static final int ID_GAMMA_L = 76;
+ public static final int ID_GAMMA_U = 77;
+ public static final int ID_GE = 78;
+ public static final int ID_GT = 79;
+ public static final int ID_HARR_L = 80;
+ public static final int ID_HARR_U = 81;
+ public static final int ID_HEARTS = 82;
+ public static final int ID_HELLIP = 83;
+ public static final int ID_IACUTE_L = 84;
+ public static final int ID_IACUTE_U = 85;
+ public static final int ID_ICIRC_L = 86;
+ public static final int ID_ICIRC_U = 87;
+ public static final int ID_IEXCL = 88;
+ public static final int ID_IGRAVE_L = 89;
+ public static final int ID_IGRAVE_U = 90;
+ public static final int ID_IMAGE = 91;
+ public static final int ID_INFIN = 92;
+ public static final int ID_INT = 93;
+ public static final int ID_IOTA_L = 94;
+ public static final int ID_IOTA_U = 95;
+ public static final int ID_IQUEST = 96;
+ public static final int ID_ISIN = 97;
+ public static final int ID_IUML_L = 98;
+ public static final int ID_IUML_U = 99;
+ public static final int ID_KAPPA_L = 100;
+ public static final int ID_KAPPA_U = 101;
+ public static final int ID_LAMBDA_L = 102;
+ public static final int ID_LAMBDA_U = 103;
+ public static final int ID_LANG = 104;
+ public static final int ID_LAQUO = 105;
+ public static final int ID_LARR_L = 106;
+ public static final int ID_LARR_U = 107;
+ public static final int ID_LCEIL = 108;
+ public static final int ID_LDQUO = 109;
+ public static final int ID_LE = 110;
+ public static final int ID_LFLOOR = 111;
+ public static final int ID_LOWAST = 112;
+ public static final int ID_LOZ = 113;
+ public static final int ID_LRM = 114;
+ public static final int ID_LSAQUO = 115;
+ public static final int ID_LSQUO = 116;
+ public static final int ID_LT = 117;
+ public static final int ID_MACR = 118;
+ public static final int ID_MDASH = 119;
+ public static final int ID_MICRO = 120;
+ public static final int ID_MIDDOT = 121;
+ public static final int ID_MINUS = 122;
+ public static final int ID_MU_L = 123;
+ public static final int ID_MU_U = 124;
+ public static final int ID_NABLA = 125;
+ public static final int ID_NBSP = 126;
+ public static final int ID_NDASH = 127;
+ public static final int ID_NE = 128;
+ public static final int ID_NI = 129;
+ public static final int ID_NOT = 130;
+ public static final int ID_NOTIN = 131;
+ public static final int ID_NSUB = 132;
+ public static final int ID_NTILDE_L = 133;
+ public static final int ID_NTILDE_U = 134;
+ public static final int ID_NU_L = 135;
+ public static final int ID_NU_U = 136;
+ public static final int ID_OACUTE_L = 137;
+ public static final int ID_OACUTE_U = 138;
+ public static final int ID_OCIRC_L = 139;
+ public static final int ID_OCIRC_U = 140;
+ public static final int ID_OELIG_L = 141;
+ public static final int ID_OELIG_U = 142;
+ public static final int ID_OGRAVE_L = 143;
+ public static final int ID_OGRAVE_U = 144;
+ public static final int ID_OLINE = 145;
+ public static final int ID_OMEGA_L = 146;
+ public static final int ID_OMEGA_U = 147;
+ public static final int ID_OMICRON_L = 148;
+ public static final int ID_OMICRON_U = 149;
+ public static final int ID_OPLUS = 150;
+ public static final int ID_OR = 151;
+ public static final int ID_ORDF = 152;
+ public static final int ID_ORDM = 153;
+ public static final int ID_OSLASH_L = 154;
+ public static final int ID_OSLASH_U = 155;
+ public static final int ID_OTILDE_L = 156;
+ public static final int ID_OTILDE_U = 157;
+ public static final int ID_OTIMES = 158;
+ public static final int ID_OUML_L = 159;
+ public static final int ID_OUML_U = 160;
+ public static final int ID_PARA = 161;
+ public static final int ID_PART = 162;
+ public static final int ID_PERMIL = 163;
+ public static final int ID_PERP = 164;
+ public static final int ID_PHI_L = 165;
+ public static final int ID_PHI_U = 166;
+ public static final int ID_PIV = 167;
+ public static final int ID_PI_L = 168;
+ public static final int ID_PI_U = 169;
+ public static final int ID_PLUSMN = 170;
+ public static final int ID_POUND = 171;
+ public static final int ID_PRIME_L = 172;
+ public static final int ID_PRIME_U = 173;
+ public static final int ID_PROD = 174;
+ public static final int ID_PROP = 175;
+ public static final int ID_PSI_L = 176;
+ public static final int ID_PSI_U = 177;
+ public static final int ID_QUOT = 178;
+ public static final int ID_RADIC = 179;
+ public static final int ID_RANG = 180;
+ public static final int ID_RAQUO = 181;
+ public static final int ID_RARR_L = 182;
+ public static final int ID_RARR_U = 183;
+ public static final int ID_RCEIL = 184;
+ public static final int ID_RDQUO = 185;
+ public static final int ID_REAL = 186;
+ public static final int ID_REG = 187;
+ public static final int ID_RFLOOR = 188;
+ public static final int ID_RHO_L = 189;
+ public static final int ID_RHO_U = 190;
+ public static final int ID_RLM = 191;
+ public static final int ID_RSAQUO = 192;
+ public static final int ID_RSQUO = 193;
+ public static final int ID_SBQUO = 194;
+ public static final int ID_SCARON_L = 195;
+ public static final int ID_SCARON_U = 196;
+ public static final int ID_SDOT = 197;
+ public static final int ID_SECT = 198;
+ public static final int ID_SHY = 199;
+ public static final int ID_SIGMAF = 200;
+ public static final int ID_SIGMA_L = 201;
+ public static final int ID_SIGMA_U = 202;
+ public static final int ID_SIM = 203;
+ public static final int ID_SPADES = 204;
+ public static final int ID_SUB = 205;
+ public static final int ID_SUBE = 206;
+ public static final int ID_SUM = 207;
+ public static final int ID_SUP = 208;
+ public static final int ID_SUP1 = 209;
+ public static final int ID_SUP2 = 210;
+ public static final int ID_SUP3 = 211;
+ public static final int ID_SUPE = 212;
+ public static final int ID_SZLIG = 213;
+ public static final int ID_TAU_L = 214;
+ public static final int ID_TAU_U = 215;
+ public static final int ID_THERE4 = 216;
+ public static final int ID_THETASYM = 217;
+ public static final int ID_THETA_L = 218;
+ public static final int ID_THETA_U = 219;
+ public static final int ID_THINSP = 220;
+ public static final int ID_THORN_L = 221;
+ public static final int ID_THORN_U = 222;
+ public static final int ID_TILDE = 223;
+ public static final int ID_TIMES = 224;
+ public static final int ID_TRADE = 225;
+ public static final int ID_UACUTE_L = 226;
+ public static final int ID_UACUTE_U = 227;
+ public static final int ID_UARR_L = 228;
+ public static final int ID_UARR_U = 229;
+ public static final int ID_UCIRC_L = 230;
+ public static final int ID_UCIRC_U = 231;
+ public static final int ID_UGRAVE_L = 232;
+ public static final int ID_UGRAVE_U = 233;
+ public static final int ID_UML = 234;
+ public static final int ID_UPSIH = 235;
+ public static final int ID_UPSILON_L = 236;
+ public static final int ID_UPSILON_U = 237;
+ public static final int ID_UUML_L = 238;
+ public static final int ID_UUML_U = 239;
+ public static final int ID_WEIERP = 240;
+ public static final int ID_XI_L = 241;
+ public static final int ID_XI_U = 242;
+ public static final int ID_YACUTE_L = 243;
+ public static final int ID_YACUTE_U = 244;
+ public static final int ID_YEN = 245;
+ public static final int ID_YUML_L = 246;
+ public static final int ID_YUML_U = 247;
+ public static final int ID_ZETA_L = 248;
+ public static final int ID_ZETA_U = 249;
+ public static final int ID_ZWJ = 250;
+ public static final int ID_ZWNJ = 251;
+
+ 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 252.
+ // -- 5/24/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;
+ }
+
+ private static String[] names = null;
+
+ static {
+ names = new String[Ids.getNumOfIds()];
+ names[Ids.ID_AACUTE_L] = AACUTE_L;
+ names[Ids.ID_AACUTE_U] = AACUTE_U;
+ names[Ids.ID_ACIRC_L] = ACIRC_L;
+ names[Ids.ID_ACIRC_U] = ACIRC_U;
+ names[Ids.ID_ACUTE] = ACUTE;
+ names[Ids.ID_AELIG_L] = AELIG_L;
+ names[Ids.ID_AELIG_U] = AELIG_U;
+ names[Ids.ID_AGRAVE_L] = AGRAVE_L;
+ names[Ids.ID_AGRAVE_U] = AGRAVE_U;
+ names[Ids.ID_ALEFSYM] = ALEFSYM;
+ names[Ids.ID_ALPHA_L] = ALPHA_L;
+ names[Ids.ID_ALPHA_U] = ALPHA_U;
+ names[Ids.ID_AMP] = AMP;
+ names[Ids.ID_AND] = AND;
+ names[Ids.ID_ANG] = ANG;
+ names[Ids.ID_ARING_L] = ARING_L;
+ names[Ids.ID_ARING_U] = ARING_U;
+ names[Ids.ID_ASYMP] = ASYMP;
+ names[Ids.ID_ATILDE_L] = ATILDE_L;
+ names[Ids.ID_ATILDE_U] = ATILDE_U;
+ names[Ids.ID_AUML_L] = AUML_L;
+ names[Ids.ID_AUML_U] = AUML_U;
+ names[Ids.ID_BDQUO] = BDQUO;
+ names[Ids.ID_BETA_L] = BETA_L;
+ names[Ids.ID_BETA_U] = BETA_U;
+ names[Ids.ID_BRVBAR] = BRVBAR;
+ names[Ids.ID_BULL] = BULL;
+ names[Ids.ID_CAP] = CAP;
+ names[Ids.ID_CCEDIL_L] = CCEDIL_L;
+ names[Ids.ID_CCEDIL_U] = CCEDIL_U;
+ names[Ids.ID_CEDIL] = CEDIL;
+ names[Ids.ID_CENT] = CENT;
+ names[Ids.ID_CHI_L] = CHI_L;
+ names[Ids.ID_CHI_U] = CHI_U;
+ names[Ids.ID_CIRC] = CIRC;
+ names[Ids.ID_CLUBS] = CLUBS;
+ names[Ids.ID_CONG] = CONG;
+ names[Ids.ID_COPY] = COPY;
+ names[Ids.ID_CRARR] = CRARR;
+ names[Ids.ID_CUP] = CUP;
+ names[Ids.ID_CURREN] = CURREN;
+ names[Ids.ID_DAGGER_L] = DAGGER_L;
+ names[Ids.ID_DAGGER_U] = DAGGER_U;
+ names[Ids.ID_DARR_L] = DARR_L;
+ names[Ids.ID_DARR_U] = DARR_U;
+ names[Ids.ID_DEG] = DEG;
+ names[Ids.ID_DELTA_L] = DELTA_L;
+ names[Ids.ID_DELTA_U] = DELTA_U;
+ names[Ids.ID_DIAMS] = DIAMS;
+ names[Ids.ID_DIVIDE] = DIVIDE;
+ names[Ids.ID_EACUTE_L] = EACUTE_L;
+ names[Ids.ID_EACUTE_U] = EACUTE_U;
+ names[Ids.ID_ECIRC_L] = ECIRC_L;
+ names[Ids.ID_ECIRC_U] = ECIRC_U;
+ names[Ids.ID_EGRAVE_L] = EGRAVE_L;
+ names[Ids.ID_EGRAVE_U] = EGRAVE_U;
+ names[Ids.ID_EMPTY] = EMPTY;
+ names[Ids.ID_EMSP] = EMSP;
+ names[Ids.ID_ENSP] = ENSP;
+ names[Ids.ID_EPSILON_L] = EPSILON_L;
+ names[Ids.ID_EPSILON_U] = EPSILON_U;
+ names[Ids.ID_EQUIV] = EQUIV;
+ names[Ids.ID_ETA_L] = ETA_L;
+ names[Ids.ID_ETA_U] = ETA_U;
+ names[Ids.ID_ETH_L] = ETH_L;
+ names[Ids.ID_ETH_U] = ETH_U;
+ names[Ids.ID_EUML_L] = EUML_L;
+ names[Ids.ID_EUML_U] = EUML_U;
+ names[Ids.ID_EURO] = EURO;
+ names[Ids.ID_EXIST] = EXIST;
+ names[Ids.ID_FNOF] = FNOF;
+ names[Ids.ID_FORALL] = FORALL;
+ names[Ids.ID_FRAC12] = FRAC12;
+ names[Ids.ID_FRAC14] = FRAC14;
+ names[Ids.ID_FRAC34] = FRAC34;
+ names[Ids.ID_FRASL] = FRASL;
+ names[Ids.ID_GAMMA_L] = GAMMA_L;
+ names[Ids.ID_GAMMA_U] = GAMMA_U;
+ names[Ids.ID_GE] = GE;
+ names[Ids.ID_GT] = GT;
+ names[Ids.ID_HARR_L] = HARR_L;
+ names[Ids.ID_HARR_U] = HARR_U;
+ names[Ids.ID_HEARTS] = HEARTS;
+ names[Ids.ID_HELLIP] = HELLIP;
+ names[Ids.ID_IACUTE_L] = IACUTE_L;
+ names[Ids.ID_IACUTE_U] = IACUTE_U;
+ names[Ids.ID_ICIRC_L] = ICIRC_L;
+ names[Ids.ID_ICIRC_U] = ICIRC_U;
+ names[Ids.ID_IEXCL] = IEXCL;
+ names[Ids.ID_IGRAVE_L] = IGRAVE_L;
+ names[Ids.ID_IGRAVE_U] = IGRAVE_U;
+ names[Ids.ID_IMAGE] = IMAGE;
+ names[Ids.ID_INFIN] = INFIN;
+ names[Ids.ID_INT] = INT;
+ names[Ids.ID_IOTA_L] = IOTA_L;
+ names[Ids.ID_IOTA_U] = IOTA_U;
+ names[Ids.ID_IQUEST] = IQUEST;
+ names[Ids.ID_ISIN] = ISIN;
+ names[Ids.ID_IUML_L] = IUML_L;
+ names[Ids.ID_IUML_U] = IUML_U;
+ names[Ids.ID_KAPPA_L] = KAPPA_L;
+ names[Ids.ID_KAPPA_U] = KAPPA_U;
+ names[Ids.ID_LAMBDA_L] = LAMBDA_L;
+ names[Ids.ID_LAMBDA_U] = LAMBDA_U;
+ names[Ids.ID_LANG] = LANG;
+ names[Ids.ID_LAQUO] = LAQUO;
+ names[Ids.ID_LARR_L] = LARR_L;
+ names[Ids.ID_LARR_U] = LARR_U;
+ names[Ids.ID_LCEIL] = LCEIL;
+ names[Ids.ID_LDQUO] = LDQUO;
+ names[Ids.ID_LE] = LE;
+ names[Ids.ID_LFLOOR] = LFLOOR;
+ names[Ids.ID_LOWAST] = LOWAST;
+ names[Ids.ID_LOZ] = LOZ;
+ names[Ids.ID_LRM] = LRM;
+ names[Ids.ID_LSAQUO] = LSAQUO;
+ names[Ids.ID_LSQUO] = LSQUO;
+ names[Ids.ID_LT] = LT;
+ names[Ids.ID_MACR] = MACR;
+ names[Ids.ID_MDASH] = MDASH;
+ names[Ids.ID_MICRO] = MICRO;
+ names[Ids.ID_MIDDOT] = MIDDOT;
+ names[Ids.ID_MINUS] = MINUS;
+ names[Ids.ID_MU_L] = MU_L;
+ names[Ids.ID_MU_U] = MU_U;
+ names[Ids.ID_NABLA] = NABLA;
+ names[Ids.ID_NBSP] = NBSP;
+ names[Ids.ID_NDASH] = NDASH;
+ names[Ids.ID_NE] = NE;
+ names[Ids.ID_NI] = NI;
+ names[Ids.ID_NOT] = NOT;
+ names[Ids.ID_NOTIN] = NOTIN;
+ names[Ids.ID_NSUB] = NSUB;
+ names[Ids.ID_NTILDE_L] = NTILDE_L;
+ names[Ids.ID_NTILDE_U] = NTILDE_U;
+ names[Ids.ID_NU_L] = NU_L;
+ names[Ids.ID_NU_U] = NU_U;
+ names[Ids.ID_OACUTE_L] = OACUTE_L;
+ names[Ids.ID_OACUTE_U] = OACUTE_U;
+ names[Ids.ID_OCIRC_L] = OCIRC_L;
+ names[Ids.ID_OCIRC_U] = OCIRC_U;
+ names[Ids.ID_OELIG_L] = OELIG_L;
+ names[Ids.ID_OELIG_U] = OELIG_U;
+ names[Ids.ID_OGRAVE_L] = OGRAVE_L;
+ names[Ids.ID_OGRAVE_U] = OGRAVE_U;
+ names[Ids.ID_OLINE] = OLINE;
+ names[Ids.ID_OMEGA_L] = OMEGA_L;
+ names[Ids.ID_OMEGA_U] = OMEGA_U;
+ names[Ids.ID_OMICRON_L] = OMICRON_L;
+ names[Ids.ID_OMICRON_U] = OMICRON_U;
+ names[Ids.ID_OPLUS] = OPLUS;
+ names[Ids.ID_OR] = OR;
+ names[Ids.ID_ORDF] = ORDF;
+ names[Ids.ID_ORDM] = ORDM;
+ names[Ids.ID_OSLASH_L] = OSLASH_L;
+ names[Ids.ID_OSLASH_U] = OSLASH_U;
+ names[Ids.ID_OTILDE_L] = OTILDE_L;
+ names[Ids.ID_OTILDE_U] = OTILDE_U;
+ names[Ids.ID_OTIMES] = OTIMES;
+ names[Ids.ID_OUML_L] = OUML_L;
+ names[Ids.ID_OUML_U] = OUML_U;
+ names[Ids.ID_PARA] = PARA;
+ names[Ids.ID_PART] = PART;
+ names[Ids.ID_PERMIL] = PERMIL;
+ names[Ids.ID_PERP] = PERP;
+ names[Ids.ID_PHI_L] = PHI_L;
+ names[Ids.ID_PHI_U] = PHI_U;
+ names[Ids.ID_PIV] = PIV;
+ names[Ids.ID_PI_L] = PI_L;
+ names[Ids.ID_PI_U] = PI_U;
+ names[Ids.ID_PLUSMN] = PLUSMN;
+ names[Ids.ID_POUND] = POUND;
+ names[Ids.ID_PRIME_L] = PRIME_L;
+ names[Ids.ID_PRIME_U] = PRIME_U;
+ names[Ids.ID_PROD] = PROD;
+ names[Ids.ID_PROP] = PROP;
+ names[Ids.ID_PSI_L] = PSI_L;
+ names[Ids.ID_PSI_U] = PSI_U;
+ names[Ids.ID_QUOT] = QUOT;
+ names[Ids.ID_RADIC] = RADIC;
+ names[Ids.ID_RANG] = RANG;
+ names[Ids.ID_RAQUO] = RAQUO;
+ names[Ids.ID_RARR_L] = RARR_L;
+ names[Ids.ID_RARR_U] = RARR_U;
+ names[Ids.ID_RCEIL] = RCEIL;
+ names[Ids.ID_RDQUO] = RDQUO;
+ names[Ids.ID_REAL] = REAL;
+ names[Ids.ID_REG] = REG;
+ names[Ids.ID_RFLOOR] = RFLOOR;
+ names[Ids.ID_RHO_L] = RHO_L;
+ names[Ids.ID_RHO_U] = RHO_U;
+ names[Ids.ID_RLM] = RLM;
+ names[Ids.ID_RSAQUO] = RSAQUO;
+ names[Ids.ID_RSQUO] = RSQUO;
+ names[Ids.ID_SBQUO] = SBQUO;
+ names[Ids.ID_SCARON_L] = SCARON_L;
+ names[Ids.ID_SCARON_U] = SCARON_U;
+ names[Ids.ID_SDOT] = SDOT;
+ names[Ids.ID_SECT] = SECT;
+ names[Ids.ID_SHY] = SHY;
+ names[Ids.ID_SIGMAF] = SIGMAF;
+ names[Ids.ID_SIGMA_L] = SIGMA_L;
+ names[Ids.ID_SIGMA_U] = SIGMA_U;
+ names[Ids.ID_SIM] = SIM;
+ names[Ids.ID_SPADES] = SPADES;
+ names[Ids.ID_SUB] = SUB;
+ names[Ids.ID_SUBE] = SUBE;
+ names[Ids.ID_SUM] = SUM;
+ names[Ids.ID_SUP] = SUP;
+ names[Ids.ID_SUP1] = SUP1;
+ names[Ids.ID_SUP2] = SUP2;
+ names[Ids.ID_SUP3] = SUP3;
+ names[Ids.ID_SUPE] = SUPE;
+ names[Ids.ID_SZLIG] = SZLIG;
+ names[Ids.ID_TAU_L] = TAU_L;
+ names[Ids.ID_TAU_U] = TAU_U;
+ names[Ids.ID_THERE4] = THERE4;
+ names[Ids.ID_THETASYM] = THETASYM;
+ names[Ids.ID_THETA_L] = THETA_L;
+ names[Ids.ID_THETA_U] = THETA_U;
+ names[Ids.ID_THINSP] = THINSP;
+ names[Ids.ID_THORN_L] = THORN_L;
+ names[Ids.ID_THORN_U] = THORN_U;
+ names[Ids.ID_TILDE] = TILDE;
+ names[Ids.ID_TIMES] = TIMES;
+ names[Ids.ID_TRADE] = TRADE;
+ names[Ids.ID_UACUTE_L] = UACUTE_L;
+ names[Ids.ID_UACUTE_U] = UACUTE_U;
+ names[Ids.ID_UARR_L] = UARR_L;
+ names[Ids.ID_UARR_U] = UARR_U;
+ names[Ids.ID_UCIRC_L] = UCIRC_L;
+ names[Ids.ID_UCIRC_U] = UCIRC_U;
+ names[Ids.ID_UGRAVE_L] = UGRAVE_L;
+ names[Ids.ID_UGRAVE_U] = UGRAVE_U;
+ names[Ids.ID_UML] = UML;
+ names[Ids.ID_UPSIH] = UPSIH;
+ names[Ids.ID_UPSILON_L] = UPSILON_L;
+ names[Ids.ID_UPSILON_U] = UPSILON_U;
+ names[Ids.ID_UUML_L] = UUML_L;
+ names[Ids.ID_UUML_U] = UUML_U;
+ names[Ids.ID_WEIERP] = WEIERP;
+ names[Ids.ID_XI_L] = XI_L;
+ names[Ids.ID_XI_U] = XI_U;
+ names[Ids.ID_YACUTE_L] = YACUTE_L;
+ names[Ids.ID_YACUTE_U] = YACUTE_U;
+ names[Ids.ID_YEN] = YEN;
+ names[Ids.ID_YUML_L] = YUML_L;
+ names[Ids.ID_YUML_U] = YUML_U;
+ names[Ids.ID_ZETA_L] = ZETA_L;
+ names[Ids.ID_ZETA_U] = ZETA_U;
+ names[Ids.ID_ZWJ] = ZWJ;
+ names[Ids.ID_ZWNJ] = ZWNJ;
+ }
+ private static char[] values = null;
+
+ static {
+ values = new char[Ids.getNumOfIds()];
+ values[Ids.ID_AACUTE_L] = 225;
+ values[Ids.ID_AACUTE_U] = 193;
+ values[Ids.ID_ACIRC_L] = 226;
+ values[Ids.ID_ACIRC_U] = 194;
+ values[Ids.ID_ACUTE] = 180;
+ values[Ids.ID_AELIG_L] = 230;
+ values[Ids.ID_AELIG_U] = 198;
+ values[Ids.ID_AGRAVE_L] = 224;
+ values[Ids.ID_AGRAVE_U] = 192;
+ values[Ids.ID_ALEFSYM] = 8501;
+ values[Ids.ID_ALPHA_L] = 945;
+ values[Ids.ID_ALPHA_U] = 913;
+ values[Ids.ID_AMP] = 38;
+ values[Ids.ID_AND] = 8743;
+ values[Ids.ID_ANG] = 8736;
+ values[Ids.ID_ARING_L] = 229;
+ values[Ids.ID_ARING_U] = 197;
+ values[Ids.ID_ASYMP] = 8776;
+ values[Ids.ID_ATILDE_L] = 227;
+ values[Ids.ID_ATILDE_U] = 195;
+ values[Ids.ID_AUML_L] = 228;
+ values[Ids.ID_AUML_U] = 196;
+ values[Ids.ID_BDQUO] = 8222;
+ values[Ids.ID_BETA_L] = 946;
+ values[Ids.ID_BETA_U] = 914;
+ values[Ids.ID_BRVBAR] = 166;
+ values[Ids.ID_BULL] = 8226;
+ values[Ids.ID_CAP] = 8745;
+ values[Ids.ID_CCEDIL_L] = 231;
+ values[Ids.ID_CCEDIL_U] = 199;
+ values[Ids.ID_CEDIL] = 184;
+ values[Ids.ID_CENT] = 162;
+ values[Ids.ID_CHI_L] = 967;
+ values[Ids.ID_CHI_U] = 935;
+ values[Ids.ID_CIRC] = 710;
+ values[Ids.ID_CLUBS] = 9827;
+ values[Ids.ID_CONG] = 8773;
+ values[Ids.ID_COPY] = 169;
+ values[Ids.ID_CRARR] = 8629;
+ values[Ids.ID_CUP] = 8746;
+ values[Ids.ID_CURREN] = 164;
+ values[Ids.ID_DAGGER_L] = 8224;
+ values[Ids.ID_DAGGER_U] = 8225;
+ values[Ids.ID_DARR_L] = 8595;
+ values[Ids.ID_DARR_U] = 8659;
+ values[Ids.ID_DEG] = 176;
+ values[Ids.ID_DELTA_L] = 948;
+ values[Ids.ID_DELTA_U] = 916;
+ values[Ids.ID_DIAMS] = 9830;
+ values[Ids.ID_DIVIDE] = 247;
+ values[Ids.ID_EACUTE_L] = 233;
+ values[Ids.ID_EACUTE_U] = 201;
+ values[Ids.ID_ECIRC_L] = 234;
+ values[Ids.ID_ECIRC_U] = 202;
+ values[Ids.ID_EGRAVE_L] = 232;
+ values[Ids.ID_EGRAVE_U] = 200;
+ values[Ids.ID_EMPTY] = 8709;
+ values[Ids.ID_EMSP] = 8195;
+ values[Ids.ID_ENSP] = 8194;
+ values[Ids.ID_EPSILON_L] = 949;
+ values[Ids.ID_EPSILON_U] = 917;
+ values[Ids.ID_EQUIV] = 8801;
+ values[Ids.ID_ETA_L] = 951;
+ values[Ids.ID_ETA_U] = 919;
+ values[Ids.ID_ETH_L] = 240;
+ values[Ids.ID_ETH_U] = 208;
+ values[Ids.ID_EUML_L] = 235;
+ values[Ids.ID_EUML_U] = 203;
+ values[Ids.ID_EURO] = 8364;
+ values[Ids.ID_EXIST] = 8707;
+ values[Ids.ID_FNOF] = 402;
+ values[Ids.ID_FORALL] = 8704;
+ values[Ids.ID_FRAC12] = 189;
+ values[Ids.ID_FRAC14] = 188;
+ values[Ids.ID_FRAC34] = 190;
+ values[Ids.ID_FRASL] = 8260;
+ values[Ids.ID_GAMMA_L] = 947;
+ values[Ids.ID_GAMMA_U] = 915;
+ values[Ids.ID_GE] = 8805;
+ values[Ids.ID_GT] = 62;
+ values[Ids.ID_HARR_L] = 8596;
+ values[Ids.ID_HARR_U] = 8660;
+ values[Ids.ID_HEARTS] = 9829;
+ values[Ids.ID_HELLIP] = 8230;
+ values[Ids.ID_IACUTE_L] = 237;
+ values[Ids.ID_IACUTE_U] = 205;
+ values[Ids.ID_ICIRC_L] = 238;
+ values[Ids.ID_ICIRC_U] = 206;
+ values[Ids.ID_IEXCL] = 161;
+ values[Ids.ID_IGRAVE_L] = 236;
+ values[Ids.ID_IGRAVE_U] = 204;
+ values[Ids.ID_IMAGE] = 8465;
+ values[Ids.ID_INFIN] = 8734;
+ values[Ids.ID_INT] = 8747;
+ values[Ids.ID_IOTA_L] = 953;
+ values[Ids.ID_IOTA_U] = 921;
+ values[Ids.ID_IQUEST] = 191;
+ values[Ids.ID_ISIN] = 8712;
+ values[Ids.ID_IUML_L] = 239;
+ values[Ids.ID_IUML_U] = 207;
+ values[Ids.ID_KAPPA_L] = 954;
+ values[Ids.ID_KAPPA_U] = 922;
+ values[Ids.ID_LAMBDA_L] = 955;
+ values[Ids.ID_LAMBDA_U] = 923;
+ values[Ids.ID_LANG] = 9001;
+ values[Ids.ID_LAQUO] = 171;
+ values[Ids.ID_LARR_L] = 8592;
+ values[Ids.ID_LARR_U] = 8656;
+ values[Ids.ID_LCEIL] = 8968;
+ values[Ids.ID_LDQUO] = 8220;
+ values[Ids.ID_LE] = 8804;
+ values[Ids.ID_LFLOOR] = 8970;
+ values[Ids.ID_LOWAST] = 8727;
+ values[Ids.ID_LOZ] = 9674;
+ values[Ids.ID_LRM] = 8206;
+ values[Ids.ID_LSAQUO] = 8249;
+ values[Ids.ID_LSQUO] = 8216;
+ values[Ids.ID_LT] = 60;
+ values[Ids.ID_MACR] = 175;
+ values[Ids.ID_MDASH] = 8212;
+ values[Ids.ID_MICRO] = 181;
+ values[Ids.ID_MIDDOT] = 183;
+ values[Ids.ID_MINUS] = 8722;
+ values[Ids.ID_MU_L] = 956;
+ values[Ids.ID_MU_U] = 924;
+ values[Ids.ID_NABLA] = 8711;
+ values[Ids.ID_NBSP] = 160;
+ values[Ids.ID_NDASH] = 8211;
+ values[Ids.ID_NE] = 8800;
+ values[Ids.ID_NI] = 8715;
+ values[Ids.ID_NOT] = 172;
+ values[Ids.ID_NOTIN] = 8713;
+ values[Ids.ID_NSUB] = 8836;
+ values[Ids.ID_NTILDE_L] = 241;
+ values[Ids.ID_NTILDE_U] = 209;
+ values[Ids.ID_NU_L] = 957;
+ values[Ids.ID_NU_U] = 925;
+ values[Ids.ID_OACUTE_L] = 243;
+ values[Ids.ID_OACUTE_U] = 211;
+ values[Ids.ID_OCIRC_L] = 244;
+ values[Ids.ID_OCIRC_U] = 212;
+ values[Ids.ID_OELIG_L] = 339;
+ values[Ids.ID_OELIG_U] = 338;
+ values[Ids.ID_OGRAVE_L] = 242;
+ values[Ids.ID_OGRAVE_U] = 210;
+ values[Ids.ID_OLINE] = 8254;
+ values[Ids.ID_OMEGA_L] = 969;
+ values[Ids.ID_OMEGA_U] = 937;
+ values[Ids.ID_OMICRON_L] = 959;
+ values[Ids.ID_OMICRON_U] = 927;
+ values[Ids.ID_OPLUS] = 8853;
+ values[Ids.ID_OR] = 8744;
+ values[Ids.ID_ORDF] = 170;
+ values[Ids.ID_ORDM] = 186;
+ values[Ids.ID_OSLASH_L] = 248;
+ values[Ids.ID_OSLASH_U] = 216;
+ values[Ids.ID_OTILDE_L] = 245;
+ values[Ids.ID_OTILDE_U] = 213;
+ values[Ids.ID_OTIMES] = 8855;
+ values[Ids.ID_OUML_L] = 246;
+ values[Ids.ID_OUML_U] = 214;
+ values[Ids.ID_PARA] = 182;
+ values[Ids.ID_PART] = 8706;
+ values[Ids.ID_PERMIL] = 8240;
+ values[Ids.ID_PERP] = 8869;
+ values[Ids.ID_PHI_L] = 966;
+ values[Ids.ID_PHI_U] = 934;
+ values[Ids.ID_PIV] = 982;
+ values[Ids.ID_PI_L] = 960;
+ values[Ids.ID_PI_U] = 928;
+ values[Ids.ID_PLUSMN] = 177;
+ values[Ids.ID_POUND] = 163;
+ values[Ids.ID_PRIME_L] = 8242;
+ values[Ids.ID_PRIME_U] = 8243;
+ values[Ids.ID_PROD] = 8719;
+ values[Ids.ID_PROP] = 8733;
+ values[Ids.ID_PSI_L] = 968;
+ values[Ids.ID_PSI_U] = 936;
+ values[Ids.ID_QUOT] = 34;
+ values[Ids.ID_RADIC] = 8730;
+ values[Ids.ID_RANG] = 9002;
+ values[Ids.ID_RAQUO] = 187;
+ values[Ids.ID_RARR_L] = 8594;
+ values[Ids.ID_RARR_U] = 8658;
+ values[Ids.ID_RCEIL] = 8969;
+ values[Ids.ID_RDQUO] = 8221;
+ values[Ids.ID_REAL] = 8476;
+ values[Ids.ID_REG] = 174;
+ values[Ids.ID_RFLOOR] = 8971;
+ values[Ids.ID_RHO_L] = 961;
+ values[Ids.ID_RHO_U] = 929;
+ values[Ids.ID_RLM] = 8207;
+ values[Ids.ID_RSAQUO] = 8250;
+ values[Ids.ID_RSQUO] = 8217;
+ values[Ids.ID_SBQUO] = 8218;
+ values[Ids.ID_SCARON_L] = 353;
+ values[Ids.ID_SCARON_U] = 352;
+ values[Ids.ID_SDOT] = 8901;
+ values[Ids.ID_SECT] = 167;
+ values[Ids.ID_SHY] = 173;
+ values[Ids.ID_SIGMAF] = 962;
+ values[Ids.ID_SIGMA_L] = 963;
+ values[Ids.ID_SIGMA_U] = 931;
+ values[Ids.ID_SIM] = 8764;
+ values[Ids.ID_SPADES] = 9824;
+ values[Ids.ID_SUB] = 8834;
+ values[Ids.ID_SUBE] = 8838;
+ values[Ids.ID_SUM] = 8721;
+ values[Ids.ID_SUP] = 8835;
+ values[Ids.ID_SUP1] = 185;
+ values[Ids.ID_SUP2] = 178;
+ values[Ids.ID_SUP3] = 179;
+ values[Ids.ID_SUPE] = 8839;
+ values[Ids.ID_SZLIG] = 223;
+ values[Ids.ID_TAU_L] = 964;
+ values[Ids.ID_TAU_U] = 932;
+ values[Ids.ID_THERE4] = 8756;
+ values[Ids.ID_THETASYM] = 977;
+ values[Ids.ID_THETA_L] = 952;
+ values[Ids.ID_THETA_U] = 920;
+ values[Ids.ID_THINSP] = 8201;
+ values[Ids.ID_THORN_L] = 254;
+ values[Ids.ID_THORN_U] = 222;
+ values[Ids.ID_TILDE] = 732;
+ values[Ids.ID_TIMES] = 215;
+ values[Ids.ID_TRADE] = 8482;
+ values[Ids.ID_UACUTE_L] = 250;
+ values[Ids.ID_UACUTE_U] = 218;
+ values[Ids.ID_UARR_L] = 8593;
+ values[Ids.ID_UARR_U] = 8657;
+ values[Ids.ID_UCIRC_L] = 251;
+ values[Ids.ID_UCIRC_U] = 219;
+ values[Ids.ID_UGRAVE_L] = 249;
+ values[Ids.ID_UGRAVE_U] = 217;
+ values[Ids.ID_UML] = 168;
+ values[Ids.ID_UPSIH] = 978;
+ values[Ids.ID_UPSILON_L] = 965;
+ values[Ids.ID_UPSILON_U] = 933;
+ values[Ids.ID_UUML_L] = 252;
+ values[Ids.ID_UUML_U] = 220;
+ values[Ids.ID_WEIERP] = 8472;
+ values[Ids.ID_XI_L] = 958;
+ values[Ids.ID_XI_U] = 926;
+ values[Ids.ID_YACUTE_L] = 253;
+ values[Ids.ID_YACUTE_U] = 221;
+ values[Ids.ID_YEN] = 165;
+ values[Ids.ID_YUML_L] = 255;
+ values[Ids.ID_YUML_U] = 376;
+ values[Ids.ID_ZETA_L] = 950;
+ values[Ids.ID_ZETA_U] = 918;
+ values[Ids.ID_ZWJ] = 8205;
+ values[Ids.ID_ZWNJ] = 8204;
+ }
+
+ /**
+ */
+ public EntityCollection() {
+ super(names, STRICT_CASE);
+ }
+
+ /**
+ * Create an entity declaration.
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ * @param attrName java.lang.String
+ */
+ protected CMNode create(String entityName) {
+ int id = getID(entityName);
+ if (id == ID_UNKNOWN)
+ return null;
+
+ String value = String.valueOf(values[id]);
+ HTMLEntityDeclImpl dec = new HTMLEntityDeclImpl(entityName, value);
+
+ return dec;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HCMDocImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HCMDocImpl.java
new file mode 100644
index 0000000000..2fb191c230
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HCMDocImpl.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * CMDocument implementation for the HTML.
+ */
+class HCMDocImpl extends CMNodeImpl implements HTMLCMDocument {
+
+ /** Namespace for all names of elements, entities and attributes. */
+ private CMNamespaceImpl namespace = null;
+ private ElementCollection elements = null;
+ private EntityCollection entities = null;
+ private AttributeCollection attributes = null;
+
+ /**
+ */
+ public HCMDocImpl(String docTypeName, CMNamespaceImpl targetNamespace) {
+ super(docTypeName);
+ namespace = targetNamespace;
+ attributes = new AttributeCollection();
+ elements = new ElementCollection(attributes);
+ entities = new EntityCollection();
+ }
+
+ /**
+ * @return com.ibm.sed.contentmodel.html.AttributeCollection
+ */
+ AttributeCollection getAttributes() {
+ return attributes;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.HTMLCMDocument
+ */
+ public HTMLElementDeclaration getElementDeclaration(String elementName) {
+ if (elements == null)
+ return null;
+ return (HTMLElementDeclaration) elements.getNamedItem(elementName);
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ */
+ public CMNamedNodeMap getElements() {
+ return elements;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ */
+ public CMNamedNodeMap getEntities() {
+ return entities;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.HTMLCMDocument
+ */
+ public HTMLEntityDeclaration getEntityDeclaration(String entityName) {
+ if (entities == null)
+ return null;
+ return (HTMLEntityDeclaration) entities.getNamedItem(entityName);
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ */
+ public CMNamespace getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * @see CMNode
+ */
+ public int getNodeType() {
+ return CMNode.DOCUMENT;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java
new file mode 100644
index 0000000000..f044ef6571
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttrDeclImpl.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Implementation class of {@link <code>HTMLAttributeDeclaration</code>} interface.<br>
+ */
+class HTMLAttrDeclImpl extends CMNodeImpl implements HTMLAttributeDeclaration {
+
+ private HTMLCMDataTypeImpl type = null;
+ private int usage = 0;
+
+ /**
+ */
+ public HTMLAttrDeclImpl(String attrName, HTMLCMDataTypeImpl valueType, int valueUsage) {
+ super(attrName);
+ this.type = valueType;
+
+ switch (valueUsage) {
+ case OPTIONAL :
+ case REQUIRED :
+ case FIXED :
+ case PROHIBITED :
+ this.usage = valueUsage;
+ break;
+ default :
+ // should warn...
+ this.usage = OPTIONAL; // fall back
+ break;
+ }
+ }
+
+ /**
+ * getAttrName method
+ * @return java.lang.String
+ */
+ public String getAttrName() {
+ return getNodeName();
+ }
+
+ /**
+ * getAttrType method
+ * @return CMDataType
+ */
+ public CMDataType getAttrType() {
+ return type;
+ }
+
+ /**
+ * @deprecated by superinterface
+ */
+ public String getDefaultValue() {
+ if (type.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_DEFAULT)
+ return null;
+ return type.getImpliedValue();
+ }
+
+ /**
+ * @deprecated by superinterface
+ */
+ public Enumeration getEnumAttr() {
+ Vector v = new Vector(Arrays.asList(type.getEnumeratedValues()));
+ return v.elements();
+ }
+
+ /**
+ * getNodeType method
+ * @return int
+ *
+ * Returns one of :
+ * ELEMENT_DECLARATION, ATTRIBUTE_DECLARATION, GROUP, ENTITY_DECLARATION.
+ */
+ public int getNodeType() {
+ return CMNode.ATTRIBUTE_DECLARATION;
+ }
+
+ /**
+ * @return int
+ */
+ public int getUsage() {
+ return usage;
+ }
+
+ /**
+ */
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE))
+ return true;
+ else if (propertyName.equals(HTMLCMProperties.IS_SCRIPTABLE))
+ return true;
+ return super.supports(propertyName);
+ }
+
+ /**
+ */
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE))
+ return new Boolean(true);
+ else if (propertyName.equals(HTMLCMProperties.IS_SCRIPTABLE)) {
+ return getAttrType().getDataTypeName() == HTMLCMDataType.SCRIPT ? new Boolean(true) : new Boolean(false);
+ }
+ return super.getProperty(propertyName);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java
new file mode 100644
index 0000000000..1bff6f675a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLAttributeDeclaration.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+
+
+
+/**
+ * This interface is intended to be a public interface which has
+ * interfaces defined in both of {@link <code>CMAttributeDeclaration</code>}
+ * and {@link <code>HTMLCMNode</code>}.<br>
+ */
+public interface HTMLAttributeDeclaration extends CMAttributeDeclaration {
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java
new file mode 100644
index 0000000000..34361dd96b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataType.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * HTML extension for data types.
+ */
+public interface HTMLCMDataType extends CMDataType {
+
+ /** Boolean; it should be defined in CMDataType. */
+ public static final String BOOLEAN = "BOOLEAN"; //$NON-NLS-1$
+ public static final String COLOR = "COLOR"; //$NON-NLS-1$
+ public static final String EVENT = "EVENT"; //$NON-NLS-1$
+ public static final String IDREFS = "IDREFS"; //$NON-NLS-1$
+ /** Name; it should be defined in CMDataType. */
+ public static final String NAME = "NAME"; //$NON-NLS-1$
+ // Following types are just aliases.
+ /** %Character; == CDATA */
+ public static final String CHARACTER = CMDataType.CDATA;
+ /** %Charset; == CDATA */
+ public static final String CHARSET = CMDataType.CDATA;
+ /** %Charsets; == CDATA */
+ public static final String CHARSETS = CMDataType.CDATA;
+ /** %ContentType; == CDATA */
+ public static final String CONTENT_TYPE = CMDataType.CDATA;
+ /** %Coords; == CDATA */
+ public static final String COORDS = CMDataType.CDATA;
+ /** %Datetime; == CDATA */
+ public static final String DATETIME = CMDataType.CDATA;
+ /** %FrameTarget; == CDATA */
+ public static final String FRAME_TARGET = CMDataType.CDATA;
+ /** %LanguageCode; == NAME */
+ public static final String LANGUAGE_CODE = NAME;
+ /** %Length; == CDATA */
+ public static final String LENGTH = CMDataType.CDATA;
+ /** %LinkTypes; == CDATA */
+ public static final String LINK_TYPES = CMDataType.CDATA;
+ /** %LIStyle; == CDATA */
+ public static final String LI_STYLE = CMDataType.CDATA;
+ /** %MediaDesc; == CDATA */
+ public static final String MEDIA_DESC = CMDataType.CDATA;
+ /** %MultiLength; == CDATA */
+ public static final String MULTI_LENGTH = CMDataType.CDATA;
+ /** %OLStyle; == CDATA */
+ public static final String OL_STYLE = CMDataType.CDATA;
+ /** %Pixles; == CDATA */
+ public static final String PIXELS = CMDataType.CDATA;
+ /** %Script; == EVENT */
+ public static final String SCRIPT = EVENT;
+ /** %StyleSheet; == EVENT */
+ public static final String STYLE_SHEET = CMDataType.CDATA;
+ /** %Text; == CDATA */
+ public static final String TEXT = CMDataType.CDATA;
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataTypeImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataTypeImpl.java
new file mode 100644
index 0000000000..fe6e6881b7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDataTypeImpl.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+
+
+/**
+ */
+class HTMLCMDataTypeImpl extends CMNodeImpl implements HTMLCMDataType {
+
+ private int impliedValueKind = IMPLIED_VALUE_NONE;
+ private String impliedValue = null;
+ private final static String[] emptyArray = new String[0];
+ private String[] enumValues = emptyArray;
+ private String instanceValue = null;
+
+ /**
+ * HTMLCMDataTypeImpl constructor comment.
+ * @param nm java.lang.String
+ */
+ public HTMLCMDataTypeImpl(String typeName) {
+ super(typeName);
+ }
+
+ /**
+ * HTMLCMDataTypeImpl constructor comment.
+ * @param nm java.lang.String
+ */
+ public HTMLCMDataTypeImpl(String typeName, String instanceValue) {
+ super(typeName);
+ this.instanceValue = instanceValue;
+ }
+
+ /**
+ * getTypeName method
+ * @return java.lang.String
+ *
+ * This method returns a suitable default value that can be used when an instance of the data type is created.
+ * This returns null of a suitable default is not available.
+ */
+ public String generateInstanceValue() {
+ return instanceValue;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDataType
+ */
+ public String getDataTypeName() {
+ return getNodeName();
+ }
+
+ /**
+ * getTypeName method
+ * @return java.lang.String[]
+ *
+ */
+ public String[] getEnumeratedValues() {
+ return enumValues;
+ }
+
+ /**
+ * getTypeName method
+ * @return java.lang.String
+ *
+ * Returns the implied value or null if none exists.
+ */
+ public String getImpliedValue() {
+ return impliedValue;
+ }
+
+ /**
+ * getImpliedValueKind method
+ * @return int
+ *
+ * Returns one of :
+ * IMPLIED_VALUE_NONE, IMPLIED_VALUE_FIXED, IMPLIED_VALUE_DEFAULT.
+ */
+ public int getImpliedValueKind() {
+ return impliedValueKind;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ public int getNodeType() {
+ return CMNode.DATA_TYPE;
+ }
+
+ /**
+ */
+ void setEnumValues(String[] values) {
+ enumValues = new String[values.length];
+ for (int i = 0; i < values.length; i++) {
+ enumValues[i] = values[i];
+ }
+ }
+
+ /**
+ * package scope.
+ */
+ void setImpliedValue(int kind, String value) {
+ switch (kind) {
+ case IMPLIED_VALUE_FIXED :
+ case IMPLIED_VALUE_DEFAULT :
+ impliedValueKind = kind;
+ impliedValue = value;
+ break;
+ case IMPLIED_VALUE_NONE :
+ default :
+ impliedValueKind = IMPLIED_VALUE_NONE;
+ impliedValue = null; // maybe a null string?
+ break;
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocument.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocument.java
new file mode 100644
index 0000000000..8a5a1ecaf0
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocument.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+
+
+
+/**
+ * HTML extension for CMDocument.
+ * This interface provides some short hand methods to get declarations
+ * by a name.
+ */
+public interface HTMLCMDocument extends CMDocument {
+
+ /**
+ * A short hand method to get a element declaration for a HTML element.<br>
+ * @return com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ * @param elementName java.lang.String
+ */
+ HTMLElementDeclaration getElementDeclaration(String elementName);
+
+ /**
+ * A short hand method to get a entity declaration of HTML documents.<br>
+ * @return com.ibm.sed.contentmodel.html.HTMLEntityDeclaration
+ * @param entityName java.lang.String
+ */
+ HTMLEntityDeclaration getEntityDeclaration(String entityName);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java
new file mode 100644
index 0000000000..00650f5720
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMDocumentFactory.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Hashtable;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.contentmodel.chtml.CHCMDocImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
+
+/**
+ * INodeAdapter factory for HTML and JSP documents.
+ */
+public final class HTMLCMDocumentFactory {
+
+ private static Hashtable cmdocs = new Hashtable();
+
+ static {
+ CMNamespaceImpl h40ns = new CMNamespaceImpl(HTML40Namespace.HTML40_URI, HTML40Namespace.HTML40_TAG_PREFIX);
+ CMNamespaceImpl j11ns = new CMNamespaceImpl(JSP11Namespace.JSP11_URI, JSP11Namespace.JSP_TAG_PREFIX);
+
+ HCMDocImpl html40doc = new HCMDocImpl(CMDocType.HTML_DOC_TYPE, h40ns);
+ CHCMDocImpl chtmldoc = new CHCMDocImpl(CMDocType.CHTML_DOC_TYPE, h40ns);
+ JCMDocImpl jsp11doc = new JCMDocImpl(CMDocType.JSP11_DOC_TYPE, j11ns);
+
+ cmdocs.put(CMDocType.HTML_DOC_TYPE, html40doc);
+ cmdocs.put(CMDocType.CHTML_DOC_TYPE, chtmldoc);
+ cmdocs.put(CMDocType.JSP11_DOC_TYPE, jsp11doc);
+ }
+
+ /**
+ * HTMLCMAdapterFactory constructor.
+ */
+ private HTMLCMDocumentFactory() {
+ super();
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ * @param cmtype java.lang.String
+ */
+ public static CMDocument getCMDocument(String cmtype) {
+ Object obj = cmdocs.get(cmtype);
+ if (obj == null)
+ return null;
+
+ return (CMDocument) obj;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMNode.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMNode.java
new file mode 100644
index 0000000000..8538731aef
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLCMNode.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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;
+
+
+/**
+ * In HTML Documents, name and value of an attribute/element/entity
+ * should be treated ignoring theirs case. However, in XML documents,
+ * they should be distinguished with sensitiveness of their case.
+ * CMNode is basically designed to represent DTDs or Schemas for XML
+ * documents. So, it doesn't have interfaces to retrieve such information.
+ * However, declarations in the HTML CM should provide such information.
+ * This intermediate interface is intended to provide whether ignore cases
+ * or not.<br>
+ */
+interface HTMLCMNode extends org.eclipse.wst.xml.core.internal.contentmodel.CMNode {
+
+ /**
+ * Returns <code>true</code>, if declaration is for HTML attribute/element/entity.
+ * Otherwise, returns <code>false</code>.
+ * @return boolean
+ */
+ boolean shouldIgnoreCase();
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java
new file mode 100644
index 0000000000..4ef99ba35f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElemDeclImpl.java
@@ -0,0 +1,377 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Base class for all Hed???? classes.
+ */
+abstract class HTMLElemDeclImpl extends CMContentImpl implements HTMLElementDeclaration, HTMLPropertyDeclaration {
+
+ // DTD
+ protected CMNamedNodeMapImpl attributes = null;
+ protected String typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMPTY;
+ /** Never access this field directly. Instead, use getComplexTypeDefinition method. */
+ private ComplexTypeDefinition typeDefinition = null;
+ protected CMGroupImpl inclusion = null;
+ protected CMGroupImpl exclusion = null;
+ // advanced information
+ protected CMNamedNodeMap prohibitedAncestors = null;
+ protected int correctionType = CORRECT_NONE;
+ protected int formatType = FORMAT_HTML;
+ protected int layoutType = LAYOUT_NONE;
+ protected int omitType = OMIT_NONE;
+ protected boolean keepSpaces = false;
+ protected boolean indentChild = false;
+ protected ElementCollection elementCollection = null;
+ protected AttributeCollection attributeCollection = null;
+ protected final static CMNamedNodeMap EMPTY_MAP = new CMNamedNodeMap() {
+ public int getLength() {
+ return 0;
+ }
+
+ public CMNode getNamedItem(String name) {
+ return null;
+ }
+
+ public CMNode item(int index) {
+ return null;
+ }
+
+ public Iterator iterator() {
+ return new Iterator() {
+ public boolean hasNext() {
+ return false;
+ }
+
+ public Object next() {
+ return null;
+ }
+
+ public void remove() {
+ }
+ };
+ }
+ };
+
+ /**
+ * HTMLElemDeclImpl constructor.
+ * In the HTML DTD, an element declaration has no specification
+ * for its occurrence. Occurrence is specifed in content model, like
+ * <code>(LI)+</code>. To avoid confusion (and complexity),
+ * occurrence of an element declaration is always 1 (it means, min = 1 and
+ * max = 1). Instead, occurrence of CMGroup represents actual occurrence
+ * of the content.
+ * <br>
+ * @param name java.lang.String
+ */
+ public HTMLElemDeclImpl(String elementName, ElementCollection collection) {
+ super(elementName, 1, 1);
+ elementCollection = collection;
+ attributeCollection = collection.getAttributeCollection();
+ }
+
+ /**
+ */
+ protected abstract void createAttributeDeclarations();
+
+ /**
+ *
+ * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ private ComplexTypeDefinition createComplexTypeDefinition() {
+ if (typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_CDATA) || typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_EMPTY) || typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_PCDATA))
+ return null;
+
+ ComplexTypeDefinitionFactory factory = ComplexTypeDefinitionFactory.getInstance();
+ if (factory == null)
+ return null; // fatal error.
+
+ ComplexTypeDefinition def = factory.createTypeDefinition(typeDefinitionName, elementCollection);
+ return def;
+ }
+
+ /**
+ * Get an attribute declaration.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public HTMLAttributeDeclaration getAttributeDeclaration(String attrName) {
+ if (attributes == null) {
+ createAttributeDeclarations();
+ if (attributes == null)
+ return null; // fail to create
+ }
+
+ CMNode cmnode = attributes.getNamedItem(attrName);
+ if (cmnode == null) {
+ return null;
+ }
+ else {
+ return (HTMLAttributeDeclaration) cmnode; // already exists.
+ }
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public CMNamedNodeMap getAttributes() {
+ if (attributes == null)
+ createAttributeDeclarations(); // lazy eval.
+ return attributes;
+ }
+
+ /**
+ * Get an instance of complex type definition.
+ * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ private ComplexTypeDefinition getComplexTypeDefinition() {
+ if (typeDefinition == null)
+ typeDefinition = createComplexTypeDefinition();
+ return typeDefinition;
+ }
+
+ /**
+ * Content.<br>
+ * Element declarations which type is EMPTY or CDATA (maybe PCDATA)
+ * <strong>MUST</strong> override this method and always return null.
+ * This default implementation always tries to create a complex type definition
+ * instance and access to it.
+ * <br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public CMContent getContent() {
+ ComplexTypeDefinition def = getComplexTypeDefinition(); // lazy eval.
+ return (def != null) ? def.getContent() : null;
+ }
+
+ /**
+ * Content type.<br>
+ * Element declarations which type is EMPTY or CDATA (maybe PCDATA)
+ * <strong>MUST</strong> override this method and return an appropriate type.
+ * This default implementation always tries to create a complex type definition
+ * instance and access to it.
+ * <br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public int getContentType() {
+ ComplexTypeDefinition def = getComplexTypeDefinition(); // lazy eval.
+ return (def != null) ? def.getContentType() : CMElementDeclaration.CDATA;
+ }
+
+ /**
+ * @see HTMLElementDeclaration#getCorrectionType
+ */
+ public int getCorrectionType() {
+ return correctionType;
+ }
+
+ /**
+ * HTML element doesn't have any data type. So, this method always
+ * returns <code>null</code>.<br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public CMDataType getDataType() {
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public String getElementName() {
+ return getNodeName();
+ }
+
+ /**
+ * Exclusion.
+ * Almost elements don't have a exclusion.
+ * Only classes those have exclusion should override this method.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ return null;
+ }
+
+ /**
+ * Default format type is <code>FORMAT_HTML</code>.<br>
+ */
+ public int getFormatType() {
+ return formatType;
+ }
+
+ /**
+ * Inclusion.
+ * Almost elements don't have a inclusion.
+ * Only classes those have inclusion should override this method.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getInclusion() {
+ return null;
+ }
+
+ /**
+ */
+ public int getLayoutType() {
+ return layoutType;
+ }
+
+ /**
+ * Line break hint is strongly related to layout type.
+ * Indeed, in the C++DOM, it is determined from layout type only.
+ * So, this implementation, as the default implementation for all declarations,
+ * also determines from layout type only.<br>
+ * @return int
+ */
+ public int getLineBreakHint() {
+ switch (getLayoutType()) {
+ case HTMLElementDeclaration.LAYOUT_BLOCK :
+ return HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END;
+ case HTMLElementDeclaration.LAYOUT_BREAK :
+ return HTMLElementDeclaration.BREAK_AFTER_START;
+ case HTMLElementDeclaration.LAYOUT_HIDDEN :
+ return HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END;
+ default :
+ return HTMLElementDeclaration.BREAK_NONE;
+ }
+ }
+
+ /**
+ * No HTML element has local elements. So, this method always
+ * returns an empty map.
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public CMNamedNodeMap getLocalElements() {
+ return EMPTY_MAP;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ public int getNodeType() {
+ return CMNode.ELEMENT_DECLARATION;
+ }
+
+ /**
+ */
+ public int getOmitType() {
+ return omitType;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ return EMPTY_MAP;
+ }
+
+ /**
+ */
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) {
+ return true;
+ }
+ else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) {
+ ComplexTypeDefinition def = getComplexTypeDefinition();
+ return (def != null);
+ }
+ else {
+ PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName);
+ if (pp == null)
+ return false;
+ return pp.supports(this);
+ }
+
+ }
+
+ /**
+ */
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) {
+ return new Boolean(true);
+ }
+ else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) {
+ ComplexTypeDefinition def = getComplexTypeDefinition();
+ return (def != null) ? def.getPrimaryCandidate() : null;
+ }
+ else {
+ PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName);
+ if (pp == null)
+ return null;
+ return pp.get(this);
+ }
+ }
+
+ /**
+ * Return element names which terminates this element.<br>
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return null;
+ }
+
+ /**
+ * return true when the element is a JSP element.
+ */
+ public boolean isJSP() {
+ return false;
+ }
+
+ /**
+ * In some elements, such as APPLET, a source generator should indent child
+ * elements that their parents. That is, a source generator should generate
+ * source of APPLET and PARAMS like this:
+ * <PRE>
+ * &lt;APPLET ...&gt;
+ * &lt;PARAM ... &gt;
+ * &lt;PARAM ... &gt;
+ * &lt;/APPLET&gt;
+ * <PRE>
+ * @return boolean
+ */
+ public boolean shouldIndentChildSource() {
+ return indentChild;
+ }
+
+ /**
+ * Most of elements can compact spaces in their child text nodes.
+ * Some special elements should keep them in their source.
+ * @return boolean
+ */
+ public boolean shouldKeepSpaces() {
+ return keepSpaces;
+ }
+
+ /**
+ * @return boolean
+ */
+ public boolean shouldTerminateAt(HTMLElementDeclaration nextElement) {
+ Iterator i = getTerminators();
+ if (i == null)
+ return false;
+ String nextName = nextElement.getElementName();
+ while (i.hasNext()) {
+ if (nextName.equals(i.next()))
+ return true;
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElementDeclaration.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElementDeclaration.java
new file mode 100644
index 0000000000..12a2ceb393
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLElementDeclaration.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+
+/**
+ * This interface is intended to be a public interface which has
+ * interfaces defined in both of {@link <code>CMElementDeclaration</code>}
+ * and {@link <code>HTMLCMNode</code>}.<br>
+ * In addition to this, some interfaces are added to this interface,
+ * those are specially to HTML elements.<br>
+ */
+public interface HTMLElementDeclaration extends CMElementDeclaration {
+
+ /** Tag ommission; Not ommisible. */
+ int OMIT_NONE = 0;
+ /** Tag ommission; Both tags are ommisible. */
+ int OMIT_BOTH = 1;
+ /** Tag ommission; The end tag is ommisible. */
+ int OMIT_END = 2;
+ /** Tag ommission; The end tag is ommitted when created. */
+ int OMIT_END_DEFAULT = 3;
+ /** Tag ommission; The end tag must be omitted. */
+ int OMIT_END_MUST = 4;
+ /** Line Break; No break. */
+ int BREAK_NONE = 10;
+ /** Line Break; Break after the start tag. */
+ int BREAK_AFTER_START = 11;
+ /** Line Break; Break both before the start tagn and after the end tag. */
+ int BREAK_BEFORE_START_AND_AFTER_END = 12;
+ /* Layout */
+ /** initial value; the value should never returns to client programs. */
+ int LAYOUT_NONE = 100;
+ int LAYOUT_BLOCK = 101;
+ int LAYOUT_WRAP = 102;
+ /** No wrap object; like IMG, APPLET,... */
+ int LAYOUT_OBJECT = 103;
+ /** BR */
+ int LAYOUT_BREAK = 104;
+ /** Hidden object; like HTML or HEAD */
+ int LAYOUT_HIDDEN = 105;
+ /* Correction */
+ /** Correct; No correct. */
+ int CORRECT_NONE = 1000;
+ /** Correct; Meaningless when the content is empty. */
+ int CORRECT_EMPTY = 1001;
+ /** Correct; Meaningless when no attribut is set. */
+ int CORRECT_NEUTRAL = 1002;
+ /** Correct; Meaningless when same element is nested. */
+ int CORRECT_DUPLICATED = 1003;
+ /** Format; HTML */
+ int FORMAT_HTML = 10000;
+ /** Format; SSI */
+ int FORMAT_SSI = 10001;
+ /** Format; JSP script */
+ int FORMAT_JSP_SCRIPT = 10002;
+ /** Format; JSP directive */
+ int FORMAT_JSP_DIRECTIVE = 10003;
+ /** Format; XML */
+ int FORMAT_XML = 10004;
+ /** Format; MW */
+ int FORMAT_MW = 10005;
+
+ /**
+ * A short hand method to get an attribute declaration of a HTML element.
+ * @return com.ibm.sed.contentmodel.html.HTMLAttributeDeclaration
+ * @param attrName java.lang.String
+ */
+ HTMLAttributeDeclaration getAttributeDeclaration(String attrName);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclImpl.java
new file mode 100644
index 0000000000..61f4eaf2f0
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclImpl.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+
+
+/**
+ */
+class HTMLEntityDeclImpl extends CMNodeImpl implements HTMLEntityDeclaration {
+
+ private java.lang.String value = null;
+
+ /**
+ * CMEntityDeclImpl constructor comment.
+ * @param entityName java.lang.String; Entity name.
+ * @param entityValue java.lang.String; Value string.
+ */
+ public HTMLEntityDeclImpl(String entityName, String entityValue) {
+ super(entityName);
+ value = entityValue;
+ }
+
+ /**
+ * getName method
+ * @return java.lang.String
+ */
+ public String getName() {
+ return getNodeName();
+ }
+
+ /**
+ * Get CMNode type.<br>
+ * @return int; Always return ENTITY_DECLARATION.
+ */
+ public int getNodeType() {
+ return CMNode.ENTITY_DECLARATION;
+ }
+
+ /**
+ * getValue method
+ * @return java.lang.String
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ */
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE))
+ return true;
+ return super.supports(propertyName);
+ }
+
+ /**
+ * Entities in HTML documents are always treated with ignoring cases.
+ * Because no special entities are defined in JSP 1.0, this method
+ * can always return <code>true</code>.<br>
+ */
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE))
+ return new Boolean(true);
+ return super.getProperty(propertyName);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclaration.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclaration.java
new file mode 100644
index 0000000000..2663e23fcb
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLEntityDeclaration.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * This interface is intended to be a public interface which has
+ * interfaces defined in both of {@link <code>CMEntityDeclaration</code>}
+ * and {@link <code>HTMLCMNode</code>}.<br>
+ */
+public interface HTMLEntityDeclaration extends org.eclipse.wst.xml.core.internal.contentmodel.CMEntityDeclaration {
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLPropertyDeclaration.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLPropertyDeclaration.java
new file mode 100644
index 0000000000..d3a4b266d5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HTMLPropertyDeclaration.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * This interface is commonly used in declaration implementation, and internal use.
+ * Use getProperty() method for public use.
+ */
+public interface HTMLPropertyDeclaration {
+ /**
+ * To determin the type, look up the following keywords in C++DOM/DTDParser.cpp:
+ * <ul>
+ * <li>CORRECT_DUPLICATED - <code>GROUP_NODUP</code></li>
+ * <li>CORRECT_EMPTY - <code>GROUP_COMPACT</code></li>
+ * <li>CORRECT_NEUTRAL - <code>GROUP_NEUTRAL</code></li>
+ * <li>CORRECT_NONE - <code>(N/A)</code></li>
+ * </ul>
+ * @return int
+ */
+ int getCorrectionType();
+ /**
+ * Get the list of declarations those should be excluded from the content.<br>
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent
+ */
+ CMContent getExclusion();
+ /**
+ * To determin the type, see the following files in the C++DOM:
+ * ElementType.cpp - ElementType#setGroup().
+ * Element.cpp - Element#getStartTag().
+ * @return int
+ */
+ int getFormatType();
+ /**
+ * Get the list of declarations those should be included into the content.<br>
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent
+ */
+ CMContent getInclusion();
+ /**
+ * To determin the type, look up the following keywords in C++DOM/DTDParser.cpp:
+ * <ul>
+ * <li>LAYOUT_BLOCK - <code>GROUP_BLOCK</code></li>
+ * <li>LAYOUT_BREAK - <code>GROUP_BREAK</code></li>
+ * <li>LAYOUT_HIDDEN - <code>GROUP_HIDDEN</code></li>
+ * <li>LAYOUT_NONE - <code>(N/A)</code></li>
+ * <li>LAYOUT_OBJECT - <code>GROUP_NOWRAP</code></li>
+ * <li>LAYOUT_WRAP - <code>(N/A)</code></li>
+ * </ul>
+ * @return int
+ */
+ int getLayoutType();
+ /**
+ * To determine the type, see <code>Element::isBreakingBeforeElement()</code>
+ * and <code>Element::isBreakingAfterElement()</code> defined in C++DOM/Element.cpp.<br>
+ * @return int
+ */
+ int getLineBreakHint();
+ /**
+ * To determine the type, Check the HTML DTD.
+ * And look up <code>GROUP_NOEND</code> in C++DOM/DTDParser.cpp.<br>
+ * @return int
+ */
+ int getOmitType();
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap
+ */
+ CMNamedNodeMap getProhibitedAncestors();
+ /**
+ * return true when the element is a JSP element.
+ */
+ boolean isJSP();
+ /**
+ * @return boolean
+ */
+ boolean shouldIndentChildSource();
+ /**
+ * Some elements should keep spaces in its child text nodes.
+ * For example, PRE and TEXTAREA. This method returns true,
+ * if a target element is one of such elements.
+ * @return boolean
+ */
+ boolean shouldKeepSpaces();
+ /**
+ * Returns <code>true</code>, if <code>nextElement</code> terminates
+ * the current element.
+ * Some elements like <code>P</code> terminates other <code>P</code>.
+ * That is, when <code>&lt;P&gt;</code> appears at the next to <code>P</code>,
+ * which end tags is omitted, it represents not only the beginning of the
+ * new <code>P</code> element but also the end of the previous <code>P</code>.
+ * <br>
+ * See the C++DOM/HTMLParser#_terminate(Element*) method.
+ * @param nextElement com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ boolean shouldTerminateAt(HTMLElementDeclaration nextElement);
+}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java
new file mode 100644
index 0000000000..b4890041a5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedA.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * A.
+ */
+final class HedA extends HedInlineContainer {
+
+ /**
+ */
+ public HedA(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.A, collection);
+ // CORRECT_EMPTY - GROUP_COMPACT
+ correctionType = CORRECT_EMPTY;
+ }
+
+ /**
+ * %attrs;
+ * (charset %Charset; #IMPLIED)
+ * (type %ContentType; #IMPLIED)
+ * (name CDATA #IMPLIED)
+ * (href %URI; #IMPLIED)
+ * (hreflang %LanguageCode; #IMPLIED)
+ * (target %FrameTarget; #IMPLIED)
+ * (rel %LinkTypes; #IMPLIED)
+ * (rev %LinkTypes; #IMPLIED)
+ * (accesskey %Character; #IMPLIED)
+ * (directkey %Character; #IMPLIED)
+ * (shape %Shape; rect)
+ * (coords %Coords; #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_CHARSET, HTML40Namespace.ATTR_NAME_TYPE, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_HREFLANG, HTML40Namespace.ATTR_NAME_TARGET, HTML40Namespace.ATTR_NAME_REL, HTML40Namespace.ATTR_NAME_REV, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_DIRECTKEY, HTML40Namespace.ATTR_NAME_SHAPE, HTML40Namespace.ATTR_NAME_COORDS, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * Exclusion.
+ * <code>A</code> has the exclusion.
+ * It is <code>A</code> itself.
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ CMNode a = elementCollection.getNamedItem(HTML40Namespace.ElementName.A);
+ if (a != null)
+ exclusion.appendChild(a);
+
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.A, HTML40Namespace.ElementName.BUTTON};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedADDRESS.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedADDRESS.java
new file mode 100644
index 0000000000..8210a00fcc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedADDRESS.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * ADDRESS.
+ */
+final class HedADDRESS extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedADDRESS(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.ADDRESS, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_ADDRESS;
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAPPLET.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAPPLET.java
new file mode 100644
index 0000000000..7365806f4a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAPPLET.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * APPLET.
+ */
+final class HedAPPLET extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedAPPLET(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.APPLET, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_PARAM_CONTAINER;
+ layoutType = LAYOUT_OBJECT;
+ indentChild = true;
+ }
+
+ /**
+ * %coreattrs;
+ * (codebase %URI; #IMPLIED)
+ * (archive CDATA #IMPLIED)
+ * (code CDATA #IMPLIED)
+ * (object CDATA #IMPLIED)
+ * (alt %Text; #IMPLIED) ... should be defined locally.
+ * (name CDATA #IMPLIED)
+ * (width %Length; #REQUIRED)
+ * (height %Length; #REQUIRED)
+ * (align %IAlign; #IMPLIED)
+ * (hspace %Pixels; #IMPLIED)
+ * (vspace %Pixels; #IMPLIED)
+ * (mayscript (mayscript) #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_CODEBASE, HTML40Namespace.ATTR_NAME_ARCHIVE, HTML40Namespace.ATTR_NAME_CODE, HTML40Namespace.ATTR_NAME_OBJECT, HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_HSPACE, HTML40Namespace.ATTR_NAME_VSPACE, HTML40Namespace.ATTR_NAME_MAYSCRIPT};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // %align; ... should be defined locally.
+ HTMLAttrDeclImpl attr = AttributeCollection.createAlignForImage();
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java
new file mode 100644
index 0000000000..69d951a0a1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedAREA.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * AREA.
+ */
+final class HedAREA extends HedEmpty {
+
+ /**
+ */
+ public HedAREA(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.AREA, collection);
+ // LAYOUT_HIDDEN.
+ // Because, AREA is GROUP_HIDDEN in the C++DOM/DTDParser.cpp.
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * AREA.
+ * %attrs;
+ * (shape %Shape; rect)
+ * (coords %Coords; #IMPLIED)
+ * (href %URI; #IMPLIED)
+ * (target %FrameTarget; #IMPLIED)
+ * (nohref (nohref) #IMPLIED)
+ * (alt %Text; #REQUIRED)
+ * (tabindex NUMBER #IMPLIED)
+ * (accesskey %Character; #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_SHAPE, HTML40Namespace.ATTR_NAME_COORDS, HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_TARGET, HTML40Namespace.ATTR_NAME_NOHREF, HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASE.java
new file mode 100644
index 0000000000..2c001719bd
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASE.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * BASE.
+ */
+final class HedBASE extends HedEmpty {
+
+ /**
+ */
+ public HedBASE(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.BASE, collection);
+ // LAYOUT_HIDDEN.
+ // Because, BASE is GROUP_HIDDEN in the C++DOM/DTDParser.cpp.
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * BASE.
+ * (href %URI; #IMPLIED)
+ * (target %FrameTarget; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_TARGET};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASEFONT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASEFONT.java
new file mode 100644
index 0000000000..c2bd5e9f32
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBASEFONT.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * BASEFONT.
+ */
+final class HedBASEFONT extends HedEmpty {
+
+ /**
+ */
+ public HedBASEFONT(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.BASEFONT, collection);
+ // LAYOUT_OBJECT - GROUP_NOWRAP.
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ * BASEFONT.
+ * (id ID #IMPLIED)
+ * (size CDATA #REQUIRED) ... should be localy defined.
+ * (color %Color; #IMPLIED)
+ * (face CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ID, HTML40Namespace.ATTR_NAME_COLOR, HTML40Namespace.ATTR_NAME_FACE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (size CDATA #REQUIRED) ... should be localy defined.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBDO.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBDO.java
new file mode 100644
index 0000000000..d8365bf4d3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBDO.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * BDO.
+ */
+final class HedBDO extends HedInlineContainer {
+
+ /**
+ */
+ public HedBDO(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.BDO, collection);
+ // CORRECT_EMPTY - GROUP_COMPACT
+ correctionType = CORRECT_EMPTY;
+ }
+
+ /**
+ * %coreattrs;
+ * (lang %LanguageCode; #IMPLIED)
+ * (dir (ltr|rtl) #REQUIRED) ... should be defined locally.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_LANG};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (dir (ltr|rtl) #REQUIRED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {HTML40Namespace.ATTR_VALUE_LTR, HTML40Namespace.ATTR_VALUE_RTL};
+ atype.setEnumValues(values);
+
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_DIR, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_DIR, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBGSOUND.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBGSOUND.java
new file mode 100644
index 0000000000..e85ee5af47
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBGSOUND.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+
+
+final class HedBGSOUND extends HedEmpty {
+
+ public HedBGSOUND(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.BGSOUND, collection);
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ * (src, CDATA, #IMPLIED)
+ * (loop, CDATA, #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return;
+ if (attributeCollection == null)
+ return; // fatal
+ attributes = new CMNamedNodeMapImpl();
+ // src
+ HTMLAttributeDeclaration attr = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_SRC);
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SRC, attr);
+ // loop
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML40Namespace.ATTR_VALUE_INFINITE);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_LOOP, atype, CMAttributeDeclaration.OPTIONAL);
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_LOOP, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBLOCKQUOTE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBLOCKQUOTE.java
new file mode 100644
index 0000000000..75dfe539b0
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBLOCKQUOTE.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * BLOCKQUOTE.
+ */
+final class HedBLOCKQUOTE extends HedFlowContainer {
+
+ /**
+ */
+ public HedBLOCKQUOTE(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.BLOCKQUOTE, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ * (cite %URI; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_CITE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBODY.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBODY.java
new file mode 100644
index 0000000000..4cfd615559
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBODY.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+/**
+ * BODY.
+ */
+final class HedBODY extends HedFlowContainer {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.HEAD, HTML40Namespace.ElementName.BODY, HTML40Namespace.ElementName.FRAMESET, HTML40Namespace.ElementName.HTML};
+
+ /**
+ */
+ public HedBODY(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.BODY, collection);
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_BOTH;
+ }
+
+ /**
+ * %attrs;
+ * %bodycolors;
+ * (onload %Script; #IMPLIED)
+ * (onunload %Script; #IMPLIED)
+ * (background %URI; #IMPLIED)
+ * (marginwidth %Pixels; #IMPLIED) ... D205514
+ * (marginheight %Pixels; #IMPLIED) .. D205514
+ * (topmargin, CDATA, #IMPLIED) ...... D205514
+ * (bottommargin, CDATA, #IMPLIED) ... D205514
+ * (leftmargin, CDATA, #IMPLIED) ..... D205514
+ * (rightmargin, CDATA, #IMPLIED) .... D205514
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %bodycolors;
+ attributeCollection.getBodycolors(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ONLOAD, HTML40Namespace.ATTR_NAME_ONUNLOAD, HTML40Namespace.ATTR_NAME_BACKGROUND,
+ // <<D205514
+ HTML40Namespace.ATTR_NAME_MARGINWIDTH, HTML40Namespace.ATTR_NAME_MARGINHEIGHT, HTML40Namespace.ATTR_NAME_TOPMARGIN, HTML40Namespace.ATTR_NAME_BOTTOMMARGIN, HTML40Namespace.ATTR_NAME_LEFTMARGIN, HTML40Namespace.ATTR_NAME_RIGHTMARGIN
+ // D205514
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * Inclusion.
+ * "Lazy eval."<br>
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent
+ */
+ public CMContent getInclusion() {
+ if (inclusion != null)
+ return inclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ // (INS|DEL)
+ inclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ String[] names = {HTML40Namespace.ElementName.INS, HTML40Namespace.ElementName.DEL};
+ elementCollection.getDeclarations(inclusion, Arrays.asList(names).iterator());
+ return inclusion;
+ }
+
+ /**
+ * BODY has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBR.java
new file mode 100644
index 0000000000..6232117b58
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBR.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+
+/**
+ * BR.
+ */
+final class HedBR extends HedEmpty {
+
+ /**
+ */
+ public HedBR(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.BR, collection);
+ // LAYOUT_BREAK.
+ // Because, BR is GROUP_BREAK in the C++DOM/DTDParser.cpp.
+ layoutType = LAYOUT_BREAK;
+ }
+
+ /**
+ * BR.
+ * %coreattrs;
+ * (clear (left | all | right | none) none)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+ // clear
+ HTMLAttributeDeclaration attr = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_CLEAR);
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_CLEAR, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java
new file mode 100644
index 0000000000..568fb476aa
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedBUTTON.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * BUTTON.
+ */
+final class HedBUTTON extends HedFlowContainer {
+
+ /**
+ */
+ public HedBUTTON(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.BUTTON, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ * %reserved; ... empty.
+ * (name CDATA #IMPLIED)
+ * (value CDATA #IMPLIED)
+ * (type (button|submit|reset) submit) ... should be defined locally.
+ * (disabled (disabled) #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (accesskey %Character; #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_VALUE, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (type (button|submit|reset) submit) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {HTML40Namespace.ATTR_VALUE_BUTTON, HTML40Namespace.ATTR_VALUE_SUBMIT, HTML40Namespace.ATTR_VALUE_RESET};
+ atype.setEnumValues(values);
+
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+ }
+
+ /**
+ * Exclusion.
+ * <code>FORM</code> has the exclusion.
+ * It is <code>FORM</code> itself.
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null; // fatal
+
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ String[] names = {HTML40Namespace.ElementName.A, HTML40Namespace.ElementName.FORM, HTML40Namespace.ElementName.ISINDEX, HTML40Namespace.ElementName.FIELDSET, HTML40Namespace.ElementName.IFRAME};
+ elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator());
+ elementCollection.getFormctrl(exclusion);
+
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.BUTTON};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCAPTION.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCAPTION.java
new file mode 100644
index 0000000000..7f409280bb
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCAPTION.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+
+/**
+ * CAPTION.
+ */
+final class HedCAPTION extends HedInlineContainer {
+
+ /**
+ */
+ public HedCAPTION(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.CAPTION, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ * (align %CAlign; #IMPLIED) ... should be defined locally.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ HTMLAttrDeclImpl attr = AttributeCollection.createAlignForCaption();
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCENTER.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCENTER.java
new file mode 100644
index 0000000000..029e3656a2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCENTER.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * CENTER.
+ */
+final class HedCENTER extends HedFlowContainer {
+
+ /**
+ */
+ public HedCENTER(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.CENTER, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOL.java
new file mode 100644
index 0000000000..2e2214a7f0
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOL.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+
+/**
+ * COL.
+ */
+final class HedCOL extends HedEmpty {
+
+ /**
+ */
+ public HedCOL(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.COL, collection);
+ // LAYOUT_BLOCK.
+ // Because, COL is GROUP_BLOCK in the C++DOM/DTDParser.cpp.
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * COL.
+ * %attrs;
+ * (span NUMBER 1)
+ * (width %MultiLength; #IMPLIED) ... should be defined locally.
+ * %cellhalign;
+ * %cellvalign;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (span NUMBER 1)
+ String[] names = {HTML40Namespace.ATTR_NAME_SPAN};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (width %MultiLength; #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.MULTI_LENGTH);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_WIDTH, attr);
+
+ // %cellhalign;
+ attributeCollection.getCellhalign(attributes);
+ // %cellvalign;
+ attributeCollection.getCellvalign(attributes);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOLGROUP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOLGROUP.java
new file mode 100644
index 0000000000..2903b7e8db
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedCOLGROUP.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+
+/**
+ * COLGROUP.
+ */
+final class HedCOLGROUP extends HTMLElemDeclImpl {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.COLGROUP, HTML40Namespace.ElementName.CAPTION, HTML40Namespace.ElementName.THEAD, HTML40Namespace.ElementName.TBODY, HTML40Namespace.ElementName.TFOOT, HTML40Namespace.ElementName.TR};
+
+ /**
+ * @param ownerDocument com.ibm.sed.contentmodel.html.HCMDocImpl
+ */
+ public HedCOLGROUP(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.COLGROUP, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_COLUMN_GROUP;
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END;
+ indentChild = true;
+ }
+
+ /**
+ * %attrs;
+ * (span NUMBER 1)
+ * (width %MultiLength; #IMPLIED) ... should be defined locally.
+ * %cellhalign;
+ * %cellvalign;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %cellhalign;
+ attributeCollection.getCellhalign(attributes);
+ // %cellvalign;
+ attributeCollection.getCellvalign(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_SPAN};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (width %MultiLength; #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.MULTI_LENGTH);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_WIDTH, attr);
+ }
+
+ /**
+ * LI has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDD.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDD.java
new file mode 100644
index 0000000000..06676e76f2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDD.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * DD.
+ */
+final class HedDD extends HedFlowContainer {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.DT, HTML40Namespace.ElementName.DD};
+
+ /**
+ */
+ public HedDD(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.DD, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END_DEFAULT;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ * DD has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDIV.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDIV.java
new file mode 100644
index 0000000000..401399ed7a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDIV.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * DIV.
+ */
+final class HedDIV extends HedFlowContainer {
+
+ /**
+ */
+ public HedDIV(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.DIV, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ * %align;
+ * %reserved;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %align;
+ HTMLAttrDeclImpl attr = AttributeCollection.createAlignForParagraph();
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+ // %reserved; ... empty
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDL.java
new file mode 100644
index 0000000000..c6535a553e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDL.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * DL.
+ */
+final class HedDL extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedDL(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.DL, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_DEFINITION_LIST;
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ indentChild = true;
+ }
+
+ /**
+ * %arrays;
+ * (compact (compact) #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_COMPACT};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDT.java
new file mode 100644
index 0000000000..4fa23ab9a7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedDT.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * DT.
+ */
+final class HedDT extends HedInlineContainer {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.DT, HTML40Namespace.ElementName.DD};
+
+ /**
+ */
+ public HedDT(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.DT, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END_DEFAULT;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ * DT has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEMBED.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEMBED.java
new file mode 100644
index 0000000000..89b4c6a796
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEMBED.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * EMBED.
+ */
+final class HedEMBED extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedEMBED(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.EMBED, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMBED;
+ layoutType = LAYOUT_OBJECT;
+ omitType = OMIT_END_DEFAULT;
+ }
+
+ /**
+ * %coreattrs;
+ * %events;
+ * (src %URI; #REQUIRED) ... should be defined locally.
+ * (height %Length; #IMPLIED)
+ * (width %Length; #IMPLIED)
+ * (align %IAlign; #IMPLIED) ... should be defined locally.
+ * (hspace %Pixels; #IMPLIED)
+ * (vspace %Pixels; #IMPLIED)
+ * (loop CDATA #IMPLIED)
+ * (hidden CDATA #IMPLIED)
+ * (volume CDATA #IMPLIED)
+ * (autostart (true|false) #IMPLIED)
+ * (autoplay (true|false) #IMPLIED)
+ * (autosize (true|false) #IMPLIED)
+ * (controller (true|false) true)
+ * (scale CDATA #IMPLIED)
+ * (showcontrols (true|false) #IMPLIED)
+ * (playcount NUMBER #IMPLIED)
+ * (repeat CDATA #IMPLIED)
+ * (panel CDATA #IMPLIED)
+ * (text CDATA #IMPLIED)
+ * (palette CDATA #IMPLIED)
+ * (textfocus CDATA #IMPLIED)
+ * (type CDATA #IMPLIED) ... should be defined locally.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+ // %events;
+ attributeCollection.getEvents(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HSPACE, HTML40Namespace.ATTR_NAME_VSPACE, HTML40Namespace.ATTR_NAME_LOOP, HTML40Namespace.ATTR_NAME_HIDDEN, HTML40Namespace.ATTR_NAME_VOLUME, HTML40Namespace.ATTR_NAME_AUTOSTART, HTML40Namespace.ATTR_NAME_AUTOPLAY, HTML40Namespace.ATTR_NAME_AUTOSIZE, HTML40Namespace.ATTR_NAME_CONTROLLER, HTML40Namespace.ATTR_NAME_SCALE, HTML40Namespace.ATTR_NAME_SHOWCONTROLS, HTML40Namespace.ATTR_NAME_PLAYCOUNT, HTML40Namespace.ATTR_NAME_REPEAT, HTML40Namespace.ATTR_NAME_PANEL, HTML40Namespace.ATTR_NAME_TEXT, HTML40Namespace.ATTR_NAME_PALETTE, HTML40Namespace.ATTR_NAME_TEXTFOCUS};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ HTMLCMDataTypeImpl atype = null;
+ HTMLAttrDeclImpl attr = null;
+ // (src %URI; #REQUIRED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SRC, attr);
+
+ // (align %IAlign; #IMPLIED) ... should be defined locally.
+ attr = AttributeCollection.createAlignForImage();
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+
+ // (type CDATA #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEmpty.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEmpty.java
new file mode 100644
index 0000000000..8f5898a5fe
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedEmpty.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+
+/**
+ * Base class for EMPTY type element declarations.
+ */
+abstract class HedEmpty extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedEmpty(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMPTY;
+ // EMPTY type has no end tag.
+ omitType = OMIT_END_MUST;
+ }
+
+ /**
+ * Content.<br>
+ * EMPTY type always returns <code>null</code>.
+ * <br>
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent
+ */
+ public CMContent getContent() {
+ return null;
+ }
+
+ /**
+ * Content type.<br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public int getContentType() {
+ return CMElementDeclaration.EMPTY;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java
new file mode 100644
index 0000000000..1d76bff525
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFIELDSET.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * FIELDSET.
+ */
+final class HedFIELDSET extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedFIELDSET(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.FIELDSET, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_FIELDSET;
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.BUTTON, HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFONT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFONT.java
new file mode 100644
index 0000000000..21da885a3c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFONT.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * FONT.
+ */
+final class HedFONT extends HedInlineContainer {
+
+ /**
+ */
+ public HedFONT(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.FONT, collection);
+ // CORRECT_EMPTY - GROUP_COMPACT
+ correctionType = CORRECT_EMPTY;
+ }
+
+ /**
+ * %coreattrs;
+ * %i18n;
+ * (size CDATA #IMPLIED) ... should be defined locally.
+ * (color %Color; #IMPLIED)
+ * (face CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_COLOR, HTML40Namespace.ATTR_NAME_FACE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (size CDATA #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFORM.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFORM.java
new file mode 100644
index 0000000000..561610ed23
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFORM.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * FORM.
+ */
+final class HedFORM extends HedFlowContainer {
+
+ /**
+ */
+ public HedFORM(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.FORM, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ * (action %URI; #REQUIRED)
+ * (method (GET|POST) GET)
+ * (enctype %ContentType; "application/x-www-form-urlencoded")
+ * (accept %ContentTypes; #IMPLIED)
+ * (name CDATA #IMPLIED)
+ * (onsubmit %Script; #IMPLIED)
+ * (onreset %Script; #IMPLIED)
+ * (target %FrameTarget; #IMPLIED)
+ * (accept-charset %Charsets; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ACTION, HTML40Namespace.ATTR_NAME_METHOD, HTML40Namespace.ATTR_NAME_ENCTYPE, HTML40Namespace.ATTR_NAME_ACCEPT, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_ONSUBMIT, HTML40Namespace.ATTR_NAME_ONRESET, HTML40Namespace.ATTR_NAME_TARGET, HTML40Namespace.ATTR_NAME_ACCEPT_CHARSET};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * Exclusion.
+ * <code>FORM</code> has the exclusion.
+ * It is <code>FORM</code> itself.
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null; // fatal
+
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ CMNode form = elementCollection.getNamedItem(HTML40Namespace.ElementName.FORM);
+ if (form != null)
+ exclusion.appendChild(form);
+
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.BUTTON, HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.FORM, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAME.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAME.java
new file mode 100644
index 0000000000..6c91365f10
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAME.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * FRAME.
+ */
+final class HedFRAME extends HedEmpty {
+
+ /**
+ */
+ public HedFRAME(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.FRAME, collection);
+ // LAYOUT_HIDDEN.
+ // Because, FRAME is GROUP_HIDDEN in the C++DOM/DTDParser.cpp.
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * FRAME.
+ * %coreattrs;
+ * (longdesc %URI; #IMPLIED)
+ * (name CDATA #IMPLIED)
+ * (src %URI; #IMPLIED)
+ * (frameborder (1|0) 1)
+ * (marginwidth %Pixels; #IMPLIED)
+ * (marginheight %Pixels; #IMPLIED)
+ * (noresize (noresize) #IMPLIED)
+ * (scrolling (yes|no|auto) auto)
+ * (bordercolor %Color #IMPLIED) ... D205514
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_LONGDESC, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_FRAMEBORDER, HTML40Namespace.ATTR_NAME_MARGINWIDTH, HTML40Namespace.ATTR_NAME_MARGINHEIGHT, HTML40Namespace.ATTR_NAME_NORESIZE, HTML40Namespace.ATTR_NAME_SCROLLING, HTML40Namespace.ATTR_NAME_BORDERCOLOR // D20554
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAMESET.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAMESET.java
new file mode 100644
index 0000000000..a3be42bb97
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFRAMESET.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * FRAMESET.
+ */
+final class HedFRAMESET extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedFRAMESET(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.FRAMESET, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_FRAMESET;
+ layoutType = LAYOUT_HIDDEN;
+ indentChild = true;
+ }
+
+ /**
+ * %coreattrs;
+ * (rows %MultiLengths; #IMPLIED) ... should be defined locally.
+ * (cols %MultiLengths; #IMPLIED) ... should be defined locally.
+ * (onload %Script; #IMPLIED)
+ * (onunload %Script; #IMPLIED)
+ * (frameborder (yes|no) #IMPLIED) ... should be defined locally.
+ * (border %Pixels; #IMPLIED)
+ * (bordercolor %Color #IMPLIED) ... D205514
+ * (framespacing CDATA #IMPLIED) ... D215684
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getCore(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ONLOAD, HTML40Namespace.ATTR_NAME_ONUNLOAD, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_BORDERCOLOR, // D205514
+ HTML40Namespace.ATTR_NAME_FRAMESPACING // D215684
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ HTMLCMDataTypeImpl atype = null;
+ HTMLAttrDeclImpl attr = null;
+ // (rows %MultiLengths; #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.MULTI_LENGTH);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ROWS, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ROWS, attr);
+
+ // (cols %MultiLengths; #IMPLIED) ... should be defined locally.
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_COLS, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_COLS, attr);
+
+ // (frameborder (yes|no) #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {HTML40Namespace.ATTR_VALUE_YES, HTML40Namespace.ATTR_VALUE_NO};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_FRAMEBORDER, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_FRAMEBORDER, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFlowContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFlowContainer.java
new file mode 100644
index 0000000000..96d47e2055
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFlowContainer.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * Base class for (%flow;)* containers.
+ */
+abstract class HedFlowContainer extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedFlowContainer(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_FLOW_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFontStyle.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFontStyle.java
new file mode 100644
index 0000000000..c02371e9fc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedFontStyle.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * %fontstyle;
+ */
+final class HedFontStyle extends HedInlineContainer {
+
+ /**
+ */
+ public HedFontStyle(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ if (elementName.equalsIgnoreCase(HTML40Namespace.ElementName.BIG) || elementName.equalsIgnoreCase(HTML40Namespace.ElementName.SMALL)) {
+ correctionType = CORRECT_EMPTY;
+ }
+ else { // B, I, U, ...
+ correctionType = CORRECT_DUPLICATED;
+ }
+ }
+
+ /**
+ * %attrs;
+ * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ String myName = getElementName();
+ if (!myName.equalsIgnoreCase(HTML40Namespace.ElementName.BIG) && !myName.equalsIgnoreCase(HTML40Namespace.ElementName.SMALL))
+ return EMPTY_MAP;
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.PRE};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEAD.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEAD.java
new file mode 100644
index 0000000000..c9323dad86
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHEAD.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * HTML.
+ */
+final class HedHEAD extends HTMLElemDeclImpl {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.HEAD, HTML40Namespace.ElementName.BODY, HTML40Namespace.ElementName.FRAMESET, HTML40Namespace.ElementName.HTML};
+
+ /**
+ */
+ public HedHEAD(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.HEAD, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_HEAD;
+ layoutType = LAYOUT_HIDDEN;
+ omitType = OMIT_BOTH;
+ }
+
+ /**
+ * Create all attribute declarations.
+ * This method is called once in the constructor of the super class.
+ * The <code>HEAD</code> element may have the following attributes:
+ * <table>
+ * <tbody>
+ * <tr>
+ * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th>
+ * </tr>
+ * <tr>
+ * <td>%i18n;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * <tr>
+ * <td>profile</td><td>URI</td><td>#IMPLIED</td><td>N/A</td><td>-</td>
+ * </tr>
+ * </tbody>
+ * </table>
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+ // profile
+ HTMLAttributeDeclaration adec = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_PROFILE);
+ if (adec != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_PROFILE, adec);
+ }
+
+ /**
+ * HEAD has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHR.java
new file mode 100644
index 0000000000..d7a5f6dd99
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHR.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * HR.
+ */
+final class HedHR extends HedEmpty {
+
+ /**
+ */
+ public HedHR(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.HR, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs
+ * (align (left|center|right) #IMPLIED) ... should be defined locally.
+ * (noshade (noshade) #IMPLIED)
+ * (size %Pixels; #IMPLIED)
+ * (width %Length; #IMPLIED)
+ * (color %Color; #IMPLIED) ... D205514
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (align (left|center|right) #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {HTML40Namespace.ATTR_VALUE_LEFT, HTML40Namespace.ATTR_VALUE_CENTER, HTML40Namespace.ATTR_VALUE_RIGHT};
+ atype.setEnumValues(values);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+
+ // the rest.
+ String[] names = {HTML40Namespace.ATTR_NAME_NOSHADE, HTML40Namespace.ATTR_NAME_SIZE, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_COLOR // D205514
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java
new file mode 100644
index 0000000000..d4934c3296
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHTML.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * HTML.
+ */
+final class HedHTML extends HTMLElemDeclImpl {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.HTML};
+
+ /**
+ */
+ public HedHTML(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.HTML, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_HTML;
+ layoutType = LAYOUT_HIDDEN;
+ omitType = OMIT_BOTH;
+ }
+
+ /**
+ * Create all attribute declarations.
+ * This method is called once in the constructor of the super class.
+ * The <code>HTML</code> element may have the following attributes:
+ * <table>
+ * <tbody>
+ * <tr>
+ * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th>
+ * </tr>
+ * <tr>
+ * <td><code>%i18n;</code></td><td>-</td><td>-</td><td>-</td>
+ * <td>{@link PDCMDocImpl#getAttrDeclarationsI18n}</td>
+ * </tr>
+ * <tr>
+ * <td>version</td><td>CDATA</td><td>#FIXED</td>
+ * <td>{@link HTML_VERSION_TRANSITIONAL}</td><td>deplecated in HTML4.01</td>
+ * </tr>
+ * </tbody>
+ * </table><br>
+ * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+ // version
+ HTMLAttributeDeclaration adec = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_VERSION);
+ if (adec != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_VERSION, adec);
+ }
+
+ /**
+ * HTML has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHeading.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHeading.java
new file mode 100644
index 0000000000..d6b644e34e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedHeading.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * H[1-6].
+ */
+final class HedHeading extends HedInlineContainer {
+
+ /**
+ */
+ public HedHeading(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * Create all attribute declarations.
+ * This method is called once in the constructor of the super class.
+ * The <code>H1</code> element may have the following attributes:
+ * <table>
+ * <tbody>
+ * <tr>
+ * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th>
+ * </tr>
+ * <tr>
+ * <td>%attrs;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * <tr>
+ * <td>%align;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * </tbody>
+ * </table>
+ * <p><b>%align;</b> means <code>align (left|center|right|justify) #IMPLIED</code>.
+ * Unfortunately, this <code>align</code> is different from one in
+ * <code>IMG</code> or <code>TABLE</code>. So, the attribute declaration
+ * of <code>align</code> should be localy created and it shouldn't be registered
+ * in a <code>HCMDocImpl</code> instance.</p>
+ * <p>However, %align is used in sevaral times. I wouldn't write same code
+ * in many times. So, I add a new utility method into <code>CMUtil</code>
+ * to create the attribute declaration.</p>
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // align
+ HTMLAttrDeclImpl attr = AttributeCollection.createAlignForParagraph();
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java
new file mode 100644
index 0000000000..cc9290c474
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIFRAME.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * IFRAME.
+ */
+final class HedIFRAME extends HedFlowContainer {
+
+ /**
+ */
+ public HedIFRAME(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.IFRAME, collection);
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ * %coreattrs;
+ * (longdesc %URI; #IMPLIED)
+ * (name CDATA #IMPLIED)
+ * (src %URI; #IMPLIED)
+ * (frameborder (1|0) 1)
+ * (marginwidth %Pixels; #IMPLIED)
+ * (marginheight %Pixels; #IMPLIED)
+ * (scrolling (yes|no|auto) auto)
+ * (align %IAlign; #IMPLIED) ... should be defined locally.
+ * (height %Length; #IMPLIED)
+ * (width %Length; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_LONGDESC, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_FRAMEBORDER, HTML40Namespace.ATTR_NAME_MARGINWIDTH, HTML40Namespace.ATTR_NAME_MARGINHEIGHT, HTML40Namespace.ATTR_NAME_SCROLLING, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // align
+ HTMLAttrDeclImpl attr = AttributeCollection.createAlignForImage();
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.BUTTON};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java
new file mode 100644
index 0000000000..c73fcc9079
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedIMG.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * IMG.
+ */
+final class HedIMG extends HedEmpty {
+
+ /**
+ */
+ public HedIMG(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.IMG, collection);
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ * IMG.
+ * %attrs;
+ * (src %URI; #REQUIRED): should be defined locally.
+ * (alt %Text; #REQUIRED)
+ * (longdesc %URI; #IMPLIED)
+ * (name CDATA #IMPLIED)
+ * (height %Length; #IMPLIED)
+ * (width %Length; #IMPLIED)
+ * (usemap %URI; #IMPLIED)
+ * (ismap (ismap) #IMPLIED)
+ * (align %IAlign; #IMPLIED): should be defined locally.
+ * (border %Pixels; #IMPLIED)
+ * (hspace %Pixels; #IMPLIED)
+ * (vspace %Pixels; #IMPLIED)
+ * (mapfile %URI; #IMPLIED)
+ * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (src %URI; #REQUIRED): should be defined locally.
+ HTMLCMDataTypeImpl atype = null;
+ HTMLAttrDeclImpl attr = null;
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SRC, attr);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_LONGDESC, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_USEMAP, HTML40Namespace.ATTR_NAME_ISMAP, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_HSPACE, HTML40Namespace.ATTR_NAME_VSPACE, HTML40Namespace.ATTR_NAME_MAPFILE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // align (local); should be defined locally.
+ attr = AttributeCollection.createAlignForImage();
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.PRE};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java
new file mode 100644
index 0000000000..deca6e6328
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedINPUT.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * INPUT.
+ */
+final class HedINPUT extends HedEmpty {
+
+ /**
+ */
+ public HedINPUT(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.INPUT, collection);
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ * INPUT.
+ * %attrs;
+ * (type %InputType; TEXT) ... should be defined locally.
+ * (name CDATA #IMPLIED)
+ * (value CDATA #IMPLIED)
+ * (checked (checked) #IMPLIED)
+ * (disabled (disabled) #IMPLIED)
+ * (readonly (readonly) #IMPLIED)
+ * (size CDATA #IMPLIED) ... should be defined locally.
+ * (maxlength NUMBER #IMPLIED)
+ * (src %URI; #IMPLIED)
+ * (alt CDATA #IMPLIED) ... should be defined locally.
+ * (usemap %URI; #IMPLIED)
+ * (ismap (ismap) #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (accesskey %Character; #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ * (onselect %Script; #IMPLIED)
+ * (onchange %Script; #IMPLIED)
+ * (accept %ContentTypes; #IMPLIED)
+ * (align %IAlign; #IMPLIED) ... should be defined locally.
+ * (istyle CDATA #IMPLIED)
+ * <<D215684
+ * (width CDATA; #IMPLIED)
+ * (height CDATA; #IMPLIED)
+ * (border CDATA; #IMPLIED)
+ * D215684
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ HTMLCMDataTypeImpl atype = null;
+ HTMLAttrDeclImpl attr = null;
+ // (type %InputType; TEXT) ... should be defined locally.
+ // NOTE: %InputType is ENUM;
+ // (text | password | checkbox | radio | submit | reset |
+ // file | hidden | image | button)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {HTML40Namespace.ATTR_VALUE_TEXT, HTML40Namespace.ATTR_VALUE_PASSWORD, HTML40Namespace.ATTR_VALUE_CHECKBOX, HTML40Namespace.ATTR_VALUE_RADIO, HTML40Namespace.ATTR_VALUE_SUBMIT, HTML40Namespace.ATTR_VALUE_RESET, HTML40Namespace.ATTR_VALUE_FILE, HTML40Namespace.ATTR_VALUE_HIDDEN, HTML40Namespace.ATTR_VALUE_IMAGE, HTML40Namespace.ATTR_VALUE_BUTTON};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, HTML40Namespace.ATTR_VALUE_TEXT);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+
+ // (size CDATA #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr);
+
+ // (alt CDATA #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ALT, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALT, attr);
+
+ // (align %IAlign; #IMPLIED) ... should be defined locally.
+ attr = AttributeCollection.createAlignForImage();
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+
+ // the rest.
+ String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_VALUE, HTML40Namespace.ATTR_NAME_CHECKED, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_READONLY, HTML40Namespace.ATTR_NAME_SIZE, HTML40Namespace.ATTR_NAME_MAXLENGTH, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_ALT, HTML40Namespace.ATTR_NAME_USEMAP, HTML40Namespace.ATTR_NAME_ISMAP, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR, HTML40Namespace.ATTR_NAME_ONSELECT, HTML40Namespace.ATTR_NAME_ONCHANGE, HTML40Namespace.ATTR_NAME_ACCEPT, HTML40Namespace.ATTR_NAME_ALIGN, HTML40Namespace.ATTR_NAME_ISTYLE,
+ //<<D215684
+ HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_BORDER
+ //<D215684
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.BUTTON};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedISINDEX.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedISINDEX.java
new file mode 100644
index 0000000000..2a7df91a79
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedISINDEX.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * ISINDEX.
+ */
+final class HedISINDEX extends HedEmpty {
+
+ /**
+ */
+ public HedISINDEX(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.ISINDEX, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * ISINDEX.
+ * %coreattrs;
+ * %i18n;
+ * (prompt %Text; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+
+ HTMLAttributeDeclaration attr = attributeCollection.getDeclaration(HTML40Namespace.ATTR_NAME_PROMPT);
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_PROMPT, attr);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.BUTTON, HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedInlineContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedInlineContainer.java
new file mode 100644
index 0000000000..08812aa8ad
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedInlineContainer.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * Base class for (%inline;)* containers.
+ */
+abstract class HedInlineContainer extends HTMLElemDeclImpl {
+
+ /**
+ * HedInlineContainer.
+ * @param elementName java.lang.String
+ * @param collection ElementCollection
+ */
+ public HedInlineContainer(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_INLINE_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLABEL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLABEL.java
new file mode 100644
index 0000000000..f172b46591
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLABEL.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * LABEL.
+ */
+final class HedLABEL extends HedInlineContainer {
+
+ /**
+ */
+ public HedLABEL(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.LABEL, collection);
+ }
+
+ /**
+ * %attrs;
+ * (for IDREF #IMPLIED) ... should be defined locally.
+ * (accesskey %Character; #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (for IDREF #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.IDREF);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_FOR, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_FOR, attr);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * Exclusion.
+ * <code>LABEL</code> has the exclusion.
+ * It is <code>LABEL</code> itself.
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ CMNode label = elementCollection.getNamedItem(HTML40Namespace.ElementName.LABEL);
+ if (label != null)
+ exclusion.appendChild(label);
+
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.BUTTON, HTML40Namespace.ElementName.LABEL};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLEGEND.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLEGEND.java
new file mode 100644
index 0000000000..888c5656b4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLEGEND.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * LEGEND.
+ */
+final class HedLEGEND extends HedInlineContainer {
+
+ /**
+ */
+ public HedLEGEND(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.LEGEND, collection);
+ }
+
+ /**
+ * (accesskey %Character; #IMPLIED)
+ * (align %LAlign; #IMPLIED) ... shuld be defined locally.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ACCESSKEY};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // align
+ HTMLAttrDeclImpl attr = AttributeCollection.createAlignForLegend();
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java
new file mode 100644
index 0000000000..5dacdfb167
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLI.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * LI.
+ */
+final class HedLI extends HedFlowContainer {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.LI};
+
+ /**
+ */
+ public HedLI(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.LI, collection);
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END_DEFAULT;
+ }
+
+ /**
+ * %attrs;
+ * (type %LIStyle; #IMPLIED) ... should be defined locally.
+ * (value NUMBER #IMPLIED) ... should be defined locally.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (type %LIStyle; #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LI_STYLE);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+
+ // (value NUMBER #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_VALUE, attr);
+ }
+
+ /**
+ * LI has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java
new file mode 100644
index 0000000000..b7779c3b4d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedLINK.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+
+/**
+ * LINK.
+ */
+final class HedLINK extends HedEmpty {
+
+ /**
+ */
+ public HedLINK(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.LINK, collection);
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * LINK.
+ * %attrs;
+ * (charset %Charset; #IMPLIED)
+ * (href %URI; #IMPLIED)
+ * (hreflang %LanguageCode; #IMPLIED)
+ * (type %ContentType; #IMPLIED): should be defined locally.
+ * (rel %LinkTypes; #IMPLIED)
+ * (rev %LinkTypes; #IMPLIED)
+ * (media %MediaDesc; #IMPLIED)
+ * (target %FrameTarget; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_CHARSET, HTML40Namespace.ATTR_NAME_HREF, HTML40Namespace.ATTR_NAME_HREFLANG, HTML40Namespace.ATTR_NAME_REL, HTML40Namespace.ATTR_NAME_REV, HTML40Namespace.ATTR_NAME_MEDIA, HTML40Namespace.ATTR_NAME_TARGET};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (type %ContentType; #IMPLIED)
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedListItemContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedListItemContainer.java
new file mode 100644
index 0000000000..ca497170be
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedListItemContainer.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * Base class for list item container declarations.
+ * - OL, UL, MENU, DIR.
+ */
+abstract class HedListItemContainer extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedListItemContainer(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_LI_CONTAINER;
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ indentChild = true;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMAP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMAP.java
new file mode 100644
index 0000000000..13ce8b61ec
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMAP.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+
+
+/**
+ * MAP.
+ */
+final class HedMAP extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedMAP(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.MAP, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_MAP;
+ layoutType = LAYOUT_OBJECT;
+ indentChild = true;
+ }
+
+ /**
+ * %attrs;
+ * (name CDATA #REQUIRED) ... should be defined locally
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (name CDATA #REQUIRED) ... should be defined locally
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_NAME, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMARQUEE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMARQUEE.java
new file mode 100644
index 0000000000..4dd399f612
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMARQUEE.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * MARQUEE.
+ */
+final class HedMARQUEE extends HedFlowContainer {
+
+ /**
+ */
+ public HedMARQUEE(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.MARQUEE, collection);
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ * %attrs;
+ * (behavior (scroll|slide|alternate) scroll)
+ * (bgcolor %Color; #IMPLIED)
+ * (direction (left|right|up|down) left)
+ * (height CDATA #IMPLIED) ... should be defined locally.
+ * (hspace NUMBER #IMPLIED) ... should be defined locally.
+ * (loop CDATA #IMPLIED)
+ * (scrollamount NUMBER #IMPLIED)
+ * (scrolldelay NUMBER #IMPLIED)
+ * (vspace NUMBER #IMPLIED) ... should be defined locally.
+ * (width CDATA #IMPLIED) ... should be defined locally.
+ * (truespeed (truespeed) #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_BEHAVIOR, HTML40Namespace.ATTR_NAME_BGCOLOR, HTML40Namespace.ATTR_NAME_DIRECTION, HTML40Namespace.ATTR_NAME_LOOP, HTML40Namespace.ATTR_NAME_SCROLLAMOUNT, HTML40Namespace.ATTR_NAME_SCROLLDELAY, HTML40Namespace.ATTR_NAME_TRUESPEED};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ HTMLCMDataTypeImpl atype = null;
+ HTMLAttrDeclImpl attr = null;
+ // (height CDATA #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_HEIGHT, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_HEIGHT, attr);
+
+ // (width CDATA #IMPLIED) ... should be defined locally.
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_WIDTH, attr);
+
+ // (hspace NUMBER #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_HSPACE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_HSPACE, attr);
+
+ // (vspace NUMBER #IMPLIED) ... should be defined locally.
+ attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_VSPACE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_VSPACE, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java
new file mode 100644
index 0000000000..d6bb4642d5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMENU.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * MENU/DIR.
+ */
+final class HedMENU extends HedListItemContainer {
+
+ /**
+ */
+ public HedMENU(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ }
+
+ /**
+ * MENU/DIR.
+ * (compact (compact) #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_COMPACT};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * Exclusion.
+ * <code>MENU/DIR</code> has the exclusion.
+ * It is <code>%block;</code>.
+ * %block; is:
+ * P | %heading; | %list; | %preformatted; | DL | DIV | CENTER |
+ * NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR |
+ * TABLE | FIELDSET | ADDRESS.
+ * %heading; is: H1 | H2 | H3 | H4 | H5 | H6.
+ * %list; is : UL | OL | DIR | MENU.
+ * %preformatted; is PRE.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ // %block;
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ String[] names = {HTML40Namespace.ElementName.P, HTML40Namespace.ElementName.H1, HTML40Namespace.ElementName.H2, HTML40Namespace.ElementName.H3, HTML40Namespace.ElementName.H4, HTML40Namespace.ElementName.H5, HTML40Namespace.ElementName.H6, HTML40Namespace.ElementName.UL, HTML40Namespace.ElementName.OL, HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU, HTML40Namespace.ElementName.PRE, HTML40Namespace.ElementName.DL, HTML40Namespace.ElementName.DIV, HTML40Namespace.ElementName.CENTER, HTML40Namespace.ElementName.NOSCRIPT, HTML40Namespace.ElementName.NOFRAMES, HTML40Namespace.ElementName.BLOCKQUOTE, HTML40Namespace.ElementName.FORM, HTML40Namespace.ElementName.ISINDEX, HTML40Namespace.ElementName.HR, HTML40Namespace.ElementName.TABLE, HTML40Namespace.ElementName.FIELDSET, HTML40Namespace.ElementName.ADDRESS};
+ elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator());
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java
new file mode 100644
index 0000000000..e9cbdea413
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMETA.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+
+/**
+ * META.
+ */
+final class HedMETA extends HedEmpty {
+
+ /**
+ */
+ public HedMETA(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.META, collection);
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * META.
+ * %i18n;
+ * (http-equiv NAME #IMPLIED)
+ * (name NAME #IMPLIED) ... should be defined locally.
+ * (content CDATA #REQUIRED)
+ * (scheme CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+
+ // (name NAME #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_NAME, attr);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_HTTP_EQUIV, HTML40Namespace.ATTR_NAME_CONTENT, HTML40Namespace.ATTR_NAME_SCHEME};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMarkChanges.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMarkChanges.java
new file mode 100644
index 0000000000..0e97abd4fc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedMarkChanges.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * (INS|DEL)
+ */
+final class HedMarkChanges extends HedFlowContainer {
+
+ /**
+ */
+ public HedMarkChanges(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ }
+
+ /**
+ * %attrs;
+ * (cite %URI; #IMPLIED)
+ * (datetime %Datetime; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_CITE, HTML40Namespace.ATTR_NAME_DATETIME};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOBR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOBR.java
new file mode 100644
index 0000000000..e1041258f8
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOBR.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * NOBR -- not standard tag but it is commonly used.
+ */
+final class HedNOBR extends HedInlineContainer {
+
+
+ public HedNOBR(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.NOBR, collection);
+ correctionType = HTMLElementDeclaration.CORRECT_DUPLICATED;
+ }
+
+ protected void createAttributeDeclarations() {
+ // No attributes is defined.
+ if (attributes != null)
+ return;
+ attributes = new CMNamedNodeMapImpl();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOEMBED.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOEMBED.java
new file mode 100644
index 0000000000..6be05205de
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOEMBED.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+
+/**
+ * NOEMBED.
+ */
+final class HedNOEMBED extends HedFlowContainer {
+
+ /**
+ */
+ public HedNOEMBED(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.NOEMBED, collection);
+ }
+
+ /**
+ * %coreattrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOFRAMES.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOFRAMES.java
new file mode 100644
index 0000000000..83940650a9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOFRAMES.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * NOFRAMES.
+ */
+final class HedNOFRAMES extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedNOFRAMES(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.NOFRAMES, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_NOFRAMES_CONTENT;
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ * Exclusion.
+ * <code>NOFRAMES</code> has the exclusion.
+ * It is <code>NOFRAMES</code> itself.
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ CMNode label = elementCollection.getNamedItem(HTML40Namespace.ElementName.NOFRAMES);
+ if (label != null)
+ exclusion.appendChild(label);
+
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU, HTML40Namespace.ElementName.NOFRAMES};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOSCRIPT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOSCRIPT.java
new file mode 100644
index 0000000000..2f29dd8bf9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedNOSCRIPT.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * NOSCRIPT.
+ */
+final class HedNOSCRIPT extends HedFlowContainer {
+
+ /**
+ */
+ public HedNOSCRIPT(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.NOSCRIPT, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOBJECT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOBJECT.java
new file mode 100644
index 0000000000..8d9f98ddae
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOBJECT.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * OBJECT.
+ */
+final class HedOBJECT extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedOBJECT(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.OBJECT, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_PARAM_CONTAINER;
+ layoutType = LAYOUT_OBJECT;
+ indentChild = true;
+ }
+
+ /**
+ * %attrs;
+ * %reserved; ... empty.
+ * (declare (declare) #IMPLIED)
+ * (classid %URI; #IMPLIED)
+ * (codebase %URI; #IMPLIED)
+ * (data %URI; #IMPLIED)
+ * (type %ContentType; #IMPLIED)
+ * (codetype %ContentType; #IMPLIED)
+ * (archive CDATA #IMPLIED)
+ * (standby %Text; #IMPLIED)
+ * (height %Length; #IMPLIED)
+ * (width %Length; #IMPLIED)
+ * (usemap %URI; #IMPLIED)
+ * (name CDATA #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (align %IAlign; #IMPLIED) ... should be defined locally.
+ * (border %Pixels; #IMPLIED)
+ * (hspace %Pixels; #IMPLIED)
+ * (vspace %Pixels; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %reserved; ... empty.
+
+ String[] names = {HTML40Namespace.ATTR_NAME_DECLARE, HTML40Namespace.ATTR_NAME_CLASSID, HTML40Namespace.ATTR_NAME_CODEBASE, HTML40Namespace.ATTR_NAME_DATA, HTML40Namespace.ATTR_NAME_TYPE, HTML40Namespace.ATTR_NAME_CODETYPE, HTML40Namespace.ATTR_NAME_ARCHIVE, HTML40Namespace.ATTR_NAME_STANDBY, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_USEMAP, HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_HSPACE, HTML40Namespace.ATTR_NAME_VSPACE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ // %align; ... should be defined locally.
+ HTMLAttrDeclImpl attr = AttributeCollection.createAlignForImage();
+ if (attr != null)
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, attr);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.PRE};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java
new file mode 100644
index 0000000000..6c0fbf21c1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOL.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * OL.
+ */
+final class HedOL extends HedListItemContainer {
+
+ /**
+ */
+ public HedOL(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.OL, collection);
+ }
+
+ /**
+ * OL.
+ * (type %OLStyle; #IMPLIED) ... should be defined locally.
+ * (compact (compact) #IMPLIED)
+ * (start NUMBER #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (type %OLStyle; #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.OL_STYLE);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+
+ // the rest.
+ String[] names = {HTML40Namespace.ATTR_NAME_COMPACT, HTML40Namespace.ATTR_NAME_START};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTGROUP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTGROUP.java
new file mode 100644
index 0000000000..be680cb9f6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTGROUP.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+
+/**
+ * OPTGROUP.
+ */
+final class HedOPTGROUP extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedOPTGROUP(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.OPTGROUP, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_OPTION_CONTAINER;
+ layoutType = LAYOUT_HIDDEN;
+ indentChild = true;
+ }
+
+ /**
+ * %attrs;
+ * (disabled (disabled) #IMPLIED)
+ * (label %Text; #REQUIRED) ... should be defined locally.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // (disabled (disabled) #IMPLIED)
+ String[] names = {HTML40Namespace.ATTR_NAME_DISABLED};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (label %Text; #REQUIRED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_LABEL, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_LABEL, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTION.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTION.java
new file mode 100644
index 0000000000..2de188e0e3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedOPTION.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * OPTION.
+ */
+final class HedOPTION extends HedPcdata {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.OPTION};
+
+ /**
+ */
+ public HedOPTION(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.OPTION, collection);
+ layoutType = LAYOUT_HIDDEN;
+ omitType = OMIT_END;
+ }
+
+ /**
+ * OPTION.
+ * %attrs;
+ * (selected (selected) #IMPLIED)
+ * (disabled (disabled) #IMPLIED)
+ * (label %Text; #IMPLIED)
+ * (value CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_SELECTED, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_LABEL, HTML40Namespace.ATTR_NAME_VALUE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * OPTION has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedP.java
new file mode 100644
index 0000000000..9bf079f06d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedP.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * P.
+ */
+final class HedP extends HedInlineContainer {
+
+ private static Collection terminators = null;
+
+ /**
+ */
+ public HedP(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.P, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END;
+ }
+
+ /**
+ * Create all attribute declarations.
+ * This method is called once in the constructor of the super class.
+ * The <code>P</code> element may have the following attributes:
+ * <table>
+ * <tbody>
+ * <tr>
+ * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th>
+ * </tr>
+ * <tr>
+ * <td>%attrs;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * <tr>
+ * <td>%align;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * </tbody>
+ * </table>
+ * <p><b>%align;</b> means <code>align (left|center|right|justify) #IMPLIED</code>.
+ * Unfortunately, this <code>align</code> is different from one in
+ * <code>IMG</code> or <code>TABLE</code>. So, the attribute declaration
+ * of <code>align</code> should be localy created and it shouldn't be registered
+ * in a <code>HCMDocImpl</code> instance.</p>
+ * <p>However, %align is used in sevaral times. I wouldn't write same code
+ * in many times. So, I add a new utility method into <code>CMUtil</code>
+ * to create the attribute declaration.</p>
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+ attributes = new CMNamedNodeMapImpl();
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // align
+ HTMLAttrDeclImpl adec = AttributeCollection.createAlignForParagraph();
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, adec);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+ return prohibitedAncestors;
+ }
+
+ /**
+ * Return names of terminators.
+ * <code>P</code> has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ if (terminators != null)
+ return terminators.iterator();
+ //<<D217982
+ terminators = new Vector();
+ terminators.addAll(elementCollection.getNamesOfBlock());
+ terminators.add(HTML40Namespace.ElementName.LI);
+ terminators.add(HTML40Namespace.ElementName.DT);
+ terminators.add(HTML40Namespace.ElementName.DD);
+ //D217982
+ return terminators.iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java
new file mode 100644
index 0000000000..ba9879cee3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPARAM.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * PARAM.
+ */
+final class HedPARAM extends HedEmpty {
+
+ /**
+ */
+ public HedPARAM(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.PARAM, collection);
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * PARAM.
+ * (id ID #IMPLIED)
+ * (name CDATA #REQUIRED) ... should be defined locally.
+ * (value CDATA #IMPLIED)
+ * (valuetype (DATA|REF|OBJECT) DATA)
+ * (type %ContentType; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ID, HTML40Namespace.ATTR_NAME_VALUE, HTML40Namespace.ATTR_NAME_VALUETYPE, HTML40Namespace.ATTR_NAME_TYPE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (name CDATA #REQUIRED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_NAME, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPRE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPRE.java
new file mode 100644
index 0000000000..6df4ec2eed
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPRE.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * PRE.
+ */
+final class HedPRE extends HedInlineContainer {
+
+ /**
+ * PRE element should keep spaces in its source.
+ */
+ public HedPRE(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.PRE, collection);
+ // CORRECT_EMPTY - GROUP_COMPACT
+ correctionType = CORRECT_EMPTY;
+
+ keepSpaces = true;
+ }
+
+ /**
+ * %attrs;
+ * (width NUMBER #IMPLIED) ... should be defined locally.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // (width NUMBER #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_WIDTH, attr);
+ }
+
+ /**
+ * Exclusion.
+ * <code>PRE</code> has the exclusion.
+ * It is <code>%pre.exclusion;</code>.
+ * %pre.exclusion is:
+ * IMG | OBJECT | APPLET | BIG | SMALL | SUB | SUP | FONT | BASEFONT
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ String[] names = {HTML40Namespace.ElementName.IMG, HTML40Namespace.ElementName.OBJECT, HTML40Namespace.ElementName.APPLET, HTML40Namespace.ElementName.BIG, HTML40Namespace.ElementName.SMALL, HTML40Namespace.ElementName.SUB, HTML40Namespace.ElementName.SUP, HTML40Namespace.ElementName.FONT, HTML40Namespace.ElementName.BASEFONT};
+ elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator());
+
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPcdata.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPcdata.java
new file mode 100644
index 0000000000..7e14c31104
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPcdata.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+
+/**
+ * Base class for PCDATA type element declarations.<br>
+ */
+abstract class HedPcdata extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedPcdata(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_PCDATA;
+ }
+
+ /**
+ * Content.<br>
+ * PCDATA type always returns <code>null</code>.
+ * <br>
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent
+ */
+ public CMContent getContent() {
+ return null;
+ }
+
+ /**
+ * Content type.<br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public int getContentType() {
+ return CMElementDeclaration.PCDATA;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPhrase.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPhrase.java
new file mode 100644
index 0000000000..7471184794
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedPhrase.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * %phrase;
+ */
+final class HedPhrase extends HedInlineContainer {
+
+ /**
+ */
+ public HedPhrase(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ correctionType = HTMLElementDeclaration.CORRECT_DUPLICATED;
+ }
+
+ /**
+ * %attrs;
+ * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedQ.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedQ.java
new file mode 100644
index 0000000000..b8a0de29df
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedQ.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * Q.
+ */
+final class HedQ extends HedInlineContainer {
+
+ /**
+ */
+ public HedQ(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.Q, collection);
+ correctionType = CORRECT_DUPLICATED;
+ }
+
+ /**
+ * %attrs;
+ * (cite %URI; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_CITE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java
new file mode 100644
index 0000000000..b66b0f32f1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSCRIPT.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+
+/**
+ * SCRIPT.
+ */
+final class HedSCRIPT extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedSCRIPT(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SCRIPT, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_CDATA;
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ * SCRIPT.
+ * (charset %Charset; #IMPLIED)
+ * (type %ContentType; #REQUIRED) ... should be defined locally.
+ * (language CDATA #IMPLIED)
+ * (src %URI; #IMPLIED)
+ * (defer (defer) #IMPLIED)
+ * (event CDATA #IMPLIED)
+ * (for %URI; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_CHARSET, HTML40Namespace.ATTR_NAME_LANGUAGE, HTML40Namespace.ATTR_NAME_SRC, HTML40Namespace.ATTR_NAME_DEFER, HTML40Namespace.ATTR_NAME_EVENT, HTML40Namespace.ATTR_NAME_FOR};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // (type %ContentType; #REQUIRED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, "text/javascript"); //$NON-NLS-1$
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+ }
+
+ /**
+ * <code>SCRIPT</code> is CDATA type.
+ * So, the method always returns <code>null</code>.
+ * <br>
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent
+ */
+ public CMContent getContent() {
+ return null;
+ }
+
+ /**
+ * CDATA content.<br>
+ * @return int
+ */
+ public int getContentType() {
+ return CMElementDeclaration.CDATA;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java
new file mode 100644
index 0000000000..e3155f6dd2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSELECT.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * SELECT.
+ */
+final class HedSELECT extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedSELECT(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SELECT, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_SELECT;
+ layoutType = LAYOUT_OBJECT;
+ indentChild = true;
+ }
+
+ /**
+ * %attrs;
+ * %reserved;
+ * (name CDATA #IMPLIED)
+ * (size NUMBER #IMPLIED) ... should be defined locally.
+ * (multiple (multiple) #IMPLIED)
+ * (disabled (disabled) #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ * (onchange %Script; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (size NUMBER #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_SIZE, attr);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_MULTIPLE, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR, HTML40Namespace.ATTR_NAME_ONCHANGE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.BUTTON};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSPAN.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSPAN.java
new file mode 100644
index 0000000000..1ab6079d95
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSPAN.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+
+/**
+ * SPAN.
+ */
+final class HedSPAN extends HedInlineContainer {
+
+ /**
+ * SPAN.
+ */
+ public HedSPAN(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SPAN, collection);
+ }
+
+ /**
+ * %attrs;
+ * %reserved; ... empty.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIBase.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIBase.java
new file mode 100644
index 0000000000..71330951bc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIBase.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+
+
+
+/**
+ * Base class for SSI declarations.
+ */
+abstract class HedSSIBase extends HedEmpty {
+
+ /**
+ */
+ public HedSSIBase(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ */
+ public int getFormatType() {
+ return HTMLElementDeclaration.FORMAT_SSI;
+ }
+
+ /**
+ */
+ public boolean supports(String propName) {
+ if (propName.equals(HTMLCMProperties.IS_SSI))
+ return true;
+ return super.supports(propName);
+ }
+
+ /*
+ */
+ public Object getProperty(String propName) {
+ if (propName.equals(HTMLCMProperties.IS_SSI))
+ return new Boolean(true);
+ return super.getProperty(propName);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIConfig.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIConfig.java
new file mode 100644
index 0000000000..f8117bff96
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIConfig.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * SSI:CONFIG.
+ */
+final class HedSSIConfig extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIConfig(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SSI_CONFIG, collection);
+ }
+
+ /**
+ * SSI:CONFIG.
+ * (errmsg CDATA #IMPLIED)
+ * (sizefmt CDATA #IMPLIED)
+ * (timefmt CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ERRMSG, HTML40Namespace.ATTR_NAME_SIZEFMT, HTML40Namespace.ATTR_NAME_TIMEFMT};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIEcho.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIEcho.java
new file mode 100644
index 0000000000..4a18ea576b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIEcho.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * SSI:ECHO.
+ */
+final class HedSSIEcho extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIEcho(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SSI_ECHO, collection);
+ }
+
+ /**
+ * SSI:ECHO
+ * (var CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_VAR};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIExec.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIExec.java
new file mode 100644
index 0000000000..7d2e0cd68d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIExec.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * SSI:EXEC.
+ */
+final class HedSSIExec extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIExec(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SSI_EXEC, collection);
+ }
+
+ /**
+ * SSI:EXEC
+ * (cgi %URI; #IMPLIED)
+ * (cmd CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_CGI, HTML40Namespace.ATTR_NAME_CMD};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFlastmod.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFlastmod.java
new file mode 100644
index 0000000000..7c4b124d81
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFlastmod.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * SSI:FLASTMOD.
+ */
+final class HedSSIFlastmod extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIFlastmod(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SSI_FLASTMOD, collection);
+ }
+
+ /**
+ * SSI:FLASTMOD
+ * (file %URI; #IMPLIED)
+ * (virtual %URI #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_FILE, HTML40Namespace.ATTR_NAME_VIRTUAL};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFsize.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFsize.java
new file mode 100644
index 0000000000..a60a47e77f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIFsize.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * SSI:FSIZE.
+ */
+final class HedSSIFsize extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIFsize(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SSI_FSIZE, collection);
+ }
+
+ /**
+ * SSI:FSIZE
+ * (file %URI; #IMPLIED)
+ * (virtual %URI #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_FILE, HTML40Namespace.ATTR_NAME_VIRTUAL};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIInclude.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIInclude.java
new file mode 100644
index 0000000000..2b73be4327
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIInclude.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * SSI:INCLUDE.
+ */
+final class HedSSIInclude extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIInclude(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SSI_INCLUDE, collection);
+ }
+
+ /**
+ * SSI:INCLUDE
+ * (file %URI; #IMPLIED)
+ * (virtual %URI #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_FILE, HTML40Namespace.ATTR_NAME_VIRTUAL};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIPrintenv.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIPrintenv.java
new file mode 100644
index 0000000000..351942a286
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSIPrintenv.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * SSI:PRINTENV.
+ */
+final class HedSSIPrintenv extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIPrintenv(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SSI_PRINTENV, collection);
+ }
+
+ /**
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+ }
+
+ /**
+ * SSI:PRINTENV has no attributes. So, this method should
+ * always return <code>null</code>.
+ * Note: Since somebody doesn't expect null is returned, return the empty attribute
+ * like a custom tag which doesn't have attributes
+ */
+ public CMNamedNodeMap getAttributes() {
+ return super.getAttributes();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSISet.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSISet.java
new file mode 100644
index 0000000000..50faca1513
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSSISet.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * SSI:SET.
+ */
+final class HedSSISet extends HedSSIBase {
+
+ /**
+ */
+ public HedSSISet(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.SSI_SET, collection);
+ }
+
+ /**
+ * SSI:SET
+ * (var CDATA #IMPLIED)
+ * (value CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {HTML40Namespace.ATTR_NAME_VAR, HTML40Namespace.ATTR_NAME_VALUE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java
new file mode 100644
index 0000000000..ad9c3a67d1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedSTYLE.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+
+/**
+ * STYLE.
+ */
+final class HedSTYLE extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedSTYLE(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.STYLE, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_CDATA;
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * STYLE
+ * %i18n;
+ * (type %ContentType; #REQUIRED) ... should be defined locally.
+ * (media %MediaDesc; #IMPLIED)
+ * (title %Text; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_MEDIA, HTML40Namespace.ATTR_NAME_TITLE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ // (type %ContentType; #REQUIRED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+ }
+
+ /**
+ * Content.<br>
+ * <code>STYLE</code> is CDATA content type. So, it always returns <code>null</code>.
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent
+ */
+ public CMContent getContent() {
+ return null;
+ }
+
+ /**
+ * CDATA content.<br>
+ * @return int
+ */
+ public int getContentType() {
+ return CMElementDeclaration.CDATA;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedScripts.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedScripts.java
new file mode 100644
index 0000000000..d921ada949
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedScripts.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * SUB and SUP.
+ */
+final class HedScripts extends HedInlineContainer {
+
+ /**
+ */
+ public HedScripts(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ correctionType = CORRECT_EMPTY;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.PRE};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java
new file mode 100644
index 0000000000..e0e0139762
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTABLE.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * TABLE.
+ */
+final class HedTABLE extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedTABLE(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.TABLE, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_TABLE;
+ layoutType = LAYOUT_BLOCK;
+ indentChild = true;
+ }
+
+ /**
+ * TABLE.
+ * %attrs;
+ * %reserved;
+ * (summary %Text; #IMPLIED)
+ * (width %Length; #IMPLIED)
+ * (border %Pixels; #IMPLIED)
+ * (frame %TFrame; #IMPLIED)
+ * (rules %TRules; #IMPLIED)
+ * (cellspacing %Length; #IMPLIED)
+ * (cellpadding %Length; #IMPLIED)
+ * (align %TAlign; #IMPLIED)
+ * (bgcolor %Color; #IMPLIED)
+ * (datapagesize CDATA #IMPLIED)
+ * (height %Pixels; #IMPLIED)
+ * (background %URI; #IMPLIED)
+ * (bordercolor %Color #IMPLIED) ... D205514
+ * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %reserved;
+ // ... %reserved; is empty in the current DTD.
+
+ String[] names = {HTML40Namespace.ATTR_NAME_SUMMARY, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_BORDER, HTML40Namespace.ATTR_NAME_FRAME, HTML40Namespace.ATTR_NAME_RULES, HTML40Namespace.ATTR_NAME_CELLSPACING, HTML40Namespace.ATTR_NAME_CELLPADDING, HTML40Namespace.ATTR_NAME_BGCOLOR, HTML40Namespace.ATTR_NAME_DATAPAGESIZE, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_BACKGROUND, HTML40Namespace.ATTR_NAME_BORDERCOLOR // D205514
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // align (local)
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] alignValues = {HTML40Namespace.ATTR_VALUE_LEFT, HTML40Namespace.ATTR_VALUE_CENTER, HTML40Namespace.ATTR_VALUE_RIGHT};
+ atype.setEnumValues(alignValues);
+ HTMLAttrDeclImpl adec = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_ALIGN, adec);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java
new file mode 100644
index 0000000000..576538cd34
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTEXTAREA.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * TEXTAREA.
+ */
+final class HedTEXTAREA extends HedPcdata {
+
+ /**
+ * TEXTAREA should keep spaces in its source.
+ */
+ public HedTEXTAREA(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.TEXTAREA, collection);
+ layoutType = LAYOUT_OBJECT;
+
+ keepSpaces = true;
+ }
+
+ /**
+ * TEXTAREA.
+ * %attrs;
+ * %reserved; ... empty
+ * (name CDATA #IMPLIED)
+ * (rows NUMBER #REQUIRED)
+ * (cols NUMBER #REQUIRED)
+ * (disabled (disabled) #IMPLIED)
+ * (readonly (readonly) #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (accesskey %Character; #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ * (onselect %Script; #IMPLIED)
+ * (onchange %Script; #IMPLIED)
+ * (istyle CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_NAME, HTML40Namespace.ATTR_NAME_ROWS, HTML40Namespace.ATTR_NAME_COLS, HTML40Namespace.ATTR_NAME_DISABLED, HTML40Namespace.ATTR_NAME_READONLY, HTML40Namespace.ATTR_NAME_TABINDEX, HTML40Namespace.ATTR_NAME_ACCESSKEY, HTML40Namespace.ATTR_NAME_ONFOCUS, HTML40Namespace.ATTR_NAME_ONBLUR, HTML40Namespace.ATTR_NAME_ONSELECT, HTML40Namespace.ATTR_NAME_ONCHANGE, HTML40Namespace.ATTR_NAME_ISTYLE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.BUTTON};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTITLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTITLE.java
new file mode 100644
index 0000000000..19eefc9b3e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTITLE.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+/**
+ * TITLE.
+ */
+final class HedTITLE extends HedPcdata {
+
+ /**
+ */
+ public HedTITLE(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.TITLE, collection);
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * TITLE.
+ * %i18n;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+ }
+
+ /**
+ * Exclusion.
+ * <code>TITLE</code> has the exclusion.
+ * It is <code>%head.misc;</code>.
+ * %head.misc; is <code>SCRIPT|STYLE|META|LINK|OBJECT</code>.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ // (SCRIPT|STYLE|META|LINK|OBJECT)
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+
+ String[] names = {HTML40Namespace.ElementName.SCRIPT, HTML40Namespace.ElementName.STYLE, HTML40Namespace.ElementName.META, HTML40Namespace.ElementName.LINK, HTML40Namespace.ElementName.OBJECT};
+ elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator());
+ return exclusion;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTR.java
new file mode 100644
index 0000000000..1c3eddd278
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTR.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * TR.
+ */
+final class HedTR extends HTMLElemDeclImpl {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.TR};
+
+ /**
+ */
+ public HedTR(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.TR, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_TCELL_CONTAINER;
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END;
+ indentChild = true;
+ }
+
+ /**
+ * %attrs;
+ * %cellhalign;
+ * %cellvalign;
+ * (bgcolor %Color; #IMPLIED)
+ * (background %URI; #IMPLIED)
+ * (bordercolor %Color #IMPLIED) ... D205514
+ * (height %Length #IMPLIED) bug2246
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %cellhalign;
+ attributeCollection.getCellhalign(attributes);
+ // %cellvalign;
+ attributeCollection.getCellvalign(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_BGCOLOR, HTML40Namespace.ATTR_NAME_BACKGROUND, HTML40Namespace.ATTR_NAME_BORDERCOLOR, HTML40Namespace.ATTR_NAME_HEIGHT // D205514
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * TR has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableBody.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableBody.java
new file mode 100644
index 0000000000..4aaa8d053d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableBody.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * THEAD/TFOOT/TBODY
+ */
+final class HedTableBody extends HTMLElemDeclImpl {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.CAPTION, HTML40Namespace.ElementName.COL, HTML40Namespace.ElementName.COLGROUP, HTML40Namespace.ElementName.THEAD, HTML40Namespace.ElementName.TBODY, HTML40Namespace.ElementName.TFOOT};
+
+ /**
+ */
+ public HedTableBody(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_TR_CONTAINER;
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ if (elementName == HTML40Namespace.ElementName.TBODY) {
+ omitType = OMIT_BOTH;
+ }
+ else {
+ omitType = OMIT_END;
+ }
+ indentChild = true;
+ }
+
+ /**
+ * TBODY/TFOOT/THEAD
+ * %attrs;
+ * %cellhalign;
+ * %cellvalign;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %cellhalign;
+ attributeCollection.getCellhalign(attributes);
+ // %cellvalign;
+ attributeCollection.getCellvalign(attributes);
+ }
+
+ /**
+ * THEAD, TFOOT and TBODY have terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableCell.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableCell.java
new file mode 100644
index 0000000000..2ff0d3099a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedTableCell.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+/**
+ * (TH | TD).
+ */
+final class HedTableCell extends HedFlowContainer {
+
+ private static String[] terminators = {HTML40Namespace.ElementName.TR, HTML40Namespace.ElementName.TH, HTML40Namespace.ElementName.TD};
+
+ /**
+ */
+ public HedTableCell(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END;
+ }
+
+ /**
+ * %attrs;
+ * (abbr %Text; #IMPLIED)
+ * (axis CDATA #IMPLIED)
+ * (headers IDREFS #IMPLIED)
+ * (scope %Scope; #IMPLIED)
+ * (rowspan NUMBER 1)
+ * (colspan NUMBER 1)
+ * %cellhalign;
+ * %cellvalign;
+ * (nowrap (nowrap) #IMPLIED)
+ * (bgcolor %Color; #IMPLIED)
+ * (width %Length; #IMPLIED)
+ * (height %Length; #IMPLIED)
+ * (background %URI; #IMPLIED)
+ * (bordercolor %Color #IMPLIED) ... D205514
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %cellhalign;
+ attributeCollection.getCellhalign(attributes);
+ // %cellvalign;
+ attributeCollection.getCellvalign(attributes);
+
+ String[] names = {HTML40Namespace.ATTR_NAME_ABBR, HTML40Namespace.ATTR_NAME_AXIS, HTML40Namespace.ATTR_NAME_HEADERS, HTML40Namespace.ATTR_NAME_SCOPE, HTML40Namespace.ATTR_NAME_ROWSPAN, HTML40Namespace.ATTR_NAME_COLSPAN, HTML40Namespace.ATTR_NAME_NOWRAP, HTML40Namespace.ATTR_NAME_BGCOLOR, HTML40Namespace.ATTR_NAME_WIDTH, HTML40Namespace.ATTR_NAME_HEIGHT, HTML40Namespace.ATTR_NAME_BACKGROUND, HTML40Namespace.ATTR_NAME_BORDERCOLOR // D205514
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * TH and TD have terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedUL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedUL.java
new file mode 100644
index 0000000000..14f8dacfe4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedUL.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.util.Arrays;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * UL.
+ */
+final class HedUL extends HedListItemContainer {
+
+ /**
+ */
+ public HedUL(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.UL, collection);
+ }
+
+ /**
+ * UL.
+ * (type %ULStyle; #IMPLIED) ... should be defined locally.
+ * (compact (compact) #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (type %ULStyle; #IMPLIED) ... should be defined locally.
+ // %ULStyle; is (disc|square|circle).
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {HTML40Namespace.ATTR_VALUE_DISC, HTML40Namespace.ATTR_VALUE_SQUARE, HTML40Namespace.ATTR_VALUE_CIRCLE};
+ atype.setEnumValues(values);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(HTML40Namespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(HTML40Namespace.ATTR_NAME_TYPE, attr);
+
+ // the rest.
+ String[] names = {HTML40Namespace.ATTR_NAME_COMPACT};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {HTML40Namespace.ElementName.DIR, HTML40Namespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedWBR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedWBR.java
new file mode 100644
index 0000000000..f7b08d6c10
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/HedWBR.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+
+
+
+final class HedWBR extends HedEmpty {
+
+ public HedWBR(ElementCollection collection) {
+ super(HTML40Namespace.ElementName.WBR, collection);
+ // LAYOUT_BREAK.
+ // same as BR.
+ layoutType = LAYOUT_BREAK;
+ }
+
+ protected void createAttributeDeclarations() {
+ // No attributes is defined.
+ if (attributes != null)
+ return;
+ attributes = new CMNamedNodeMapImpl();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCMDocImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCMDocImpl.java
new file mode 100644
index 0000000000..89d76e4d14
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JCMDocImpl.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Implementation of CMDocument for the JSP 1.1.
+ */
+class JCMDocImpl extends CMNodeImpl implements JSPCMDocument {
+
+ /** Namespace for all names of elements, entities and attributes. */
+ private CMNamespaceImpl namespace = null;
+ private JSPElementCollection elements = null;
+
+ /**
+ * HCMDocImpl constructor comment.
+ */
+ public JCMDocImpl(String docTypeName, CMNamespaceImpl targetNamespace) {
+ super(docTypeName);
+ namespace = targetNamespace;
+ elements = new JSPElementCollection();
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.HTMLCMDocument
+ */
+ public HTMLElementDeclaration getElementDeclaration(String elementName) {
+ if (elements == null)
+ return null;
+ return (HTMLElementDeclaration) elements.getNamedItem(elementName);
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ */
+ public CMNamedNodeMap getElements() {
+ return elements;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ */
+ public CMNamedNodeMap getEntities() {
+ return null;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.HTMLCMDocument
+ */
+ public HTMLEntityDeclaration getEntityDeclaration(String entityName) {
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ */
+ public org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ public int getNodeType() {
+ return CMNode.DOCUMENT;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP11Namespace.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP11Namespace.java
new file mode 100644
index 0000000000..acfff3b016
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSP11Namespace.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * 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;
+
+
+/**
+ * JSP 1.1 Namespace. Note, this interface was
+ * copied form JSP core packages. One implication
+ * is that extra care is needed in using '==' instead
+ * of '.equals'.
+ */
+public interface JSP11Namespace {
+
+ public static interface ElementName {
+ // Element names
+ public static final String SCRIPTLET = "jsp:scriptlet"; //$NON-NLS-1$
+ public static final String EXPRESSION = "jsp:expression"; //$NON-NLS-1$
+ public static final String DECLARATION = "jsp:declaration"; //$NON-NLS-1$
+ public static final String DIRECTIVE_PAGE = "jsp:directive.page"; //$NON-NLS-1$
+ public static final String DIRECTIVE_INCLUDE = "jsp:directive.include"; //$NON-NLS-1$
+ public static final String DIRECTIVE_TAGLIB = "jsp:directive.taglib"; //$NON-NLS-1$
+ public static final String USEBEAN = "jsp:useBean"; //$NON-NLS-1$
+ public static final String SETPROPERTY = "jsp:setProperty"; //$NON-NLS-1$
+ public static final String GETPROPERTY = "jsp:getProperty"; //$NON-NLS-1$
+ public static final String INCLUDE = "jsp:include"; //$NON-NLS-1$
+ public static final String FORWARD = "jsp:forward"; //$NON-NLS-1$
+ public static final String PLUGIN = "jsp:plugin"; //$NON-NLS-1$
+ public static final String PARAMS = "jsp:params"; //$NON-NLS-1$
+ public static final String FALLBACK = "jsp:fallback"; //$NON-NLS-1$
+ public static final String PARAM = "jsp:param"; //$NON-NLS-1$
+ public static final String ROOT = "jsp:root"; //$NON-NLS-1$
+ public static final String TEXT = "jsp:text"; //$NON-NLS-1$
+ }
+
+ public static final String JSP11_URI = ""; //$NON-NLS-1$
+ public static final String JSP_TAG_PREFIX = "jsp"; //$NON-NLS-1$
+ // attribute names
+ // directive.page
+ public static final String ATTR_NAME_LANGUAGE = "language"; //$NON-NLS-1$
+ public static final String ATTR_NAME_EXTENDS = "extends"; //$NON-NLS-1$
+ public static final String ATTR_NAME_CONTENT_TYPE = "contentType"; //$NON-NLS-1$
+ public static final String ATTR_NAME_IMPORT = "import"; //$NON-NLS-1$
+ public static final String ATTR_NAME_SESSION = "session"; //$NON-NLS-1$
+ public static final String ATTR_NAME_BUFFER = "buffer"; //$NON-NLS-1$
+ public static final String ATTR_NAME_AUTOFLUSH = "autoFlush"; //$NON-NLS-1$
+ public static final String ATTR_NAME_IS_THREAD_SAFE = "isThreadSafe"; //$NON-NLS-1$
+ public static final String ATTR_NAME_INFO = "info"; //$NON-NLS-1$
+ public static final String ATTR_NAME_ERROR_PAGE = "errorPage"; //$NON-NLS-1$
+ public static final String ATTR_NAME_IS_ERROR_PAGE = "isErrorPage"; //$NON-NLS-1$
+ public static final String ATTR_NAME_PAGE_ENCODING = "pageEncoding"; //$NON-NLS-1$
+ // directive.include
+ public static final String ATTR_NAME_FILE = "file"; //$NON-NLS-1$
+ // directive.taglib
+ public static final String ATTR_NAME_URI = "uri"; //$NON-NLS-1$
+ public static final String ATTR_NAME_PREFIX = "prefix"; //$NON-NLS-1$
+ // useBean
+ public static final String ATTR_NAME_ID = "id"; //$NON-NLS-1$
+ public static final String ATTR_NAME_SCOPE = "scope"; //$NON-NLS-1$
+ public static final String ATTR_NAME_CLASS = "class"; //$NON-NLS-1$
+ public static final String ATTR_NAME_BEAN_NAME = "beanName"; //$NON-NLS-1$
+ public static final String ATTR_NAME_TYPE = "type"; //$NON-NLS-1$
+ // setProperty
+ public static final String ATTR_NAME_NAME = "name"; //$NON-NLS-1$
+ public static final String ATTR_NAME_PROPERTY = "property"; //$NON-NLS-1$
+ public static final String ATTR_NAME_VALUE = "value"; //$NON-NLS-1$
+ public static final String ATTR_NAME_PARAM = "param"; //$NON-NLS-1$
+ // include
+ public static final String ATTR_NAME_PAGE = "page"; //$NON-NLS-1$
+ public static final String ATTR_NAME_FLUSH = "flush"; //$NON-NLS-1$
+ // plugin
+ public static final String ATTR_NAME_CODE = "code"; //$NON-NLS-1$
+ public static final String ATTR_NAME_CODEBASE = "codebase"; //$NON-NLS-1$
+ public static final String ATTR_NAME_ALIGN = "align"; //$NON-NLS-1$
+ public static final String ATTR_NAME_ARCHIVE = "archive"; //$NON-NLS-1$
+ public static final String ATTR_NAME_HEIGHT = "height"; //$NON-NLS-1$
+ public static final String ATTR_NAME_HSPACE = "hspace"; //$NON-NLS-1$
+ public static final String ATTR_NAME_JREVERSION = "jreversion"; //$NON-NLS-1$
+ public static final String ATTR_NAME_VSPACE = "vspace"; //$NON-NLS-1$
+ public static final String ATTR_NAME_WIDTH = "width"; //$NON-NLS-1$
+ public static final String ATTR_NAME_NSPLUGINURL = "nspluginurl"; //$NON-NLS-1$
+ public static final String ATTR_NAME_IEPLUGINURL = "iepluginurl"; //$NON-NLS-1$
+ // root
+ public static final String ATTR_NAME_XMLNS_JSP = "xmlns:jsp"; //$NON-NLS-1$
+ public static final String ATTR_NAME_VERSION = "version"; //$NON-NLS-1$
+ // attribute values
+ public static final String ATTR_VALUE_TRUE = "true"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_FALSE = "false"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_JAVA = "java"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_CT_DEFAULT = "text/html; charset=ISO-8859-1";//D195366 //$NON-NLS-1$
+ public static final String ATTR_VALUE_BUFSIZ_DEFAULT = "8kb"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_PAGE = "page"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_SESSION = "session"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_REQUEST = "request"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_APPLICATION = "application"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_BEAN = "bean"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_APPLET = "applet"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_TOP = "top"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_MIDDLE = "middle"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_BOTTOM = "bottom"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_LEFT = "left"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_RIGHT = "right"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_JVER11 = "1.1"; //$NON-NLS-1$
+ public static final String ATTR_VALUE_XMLNS_JSP = "http://java.sun.com/JSP/Page"; //$NON-NLS-1$
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPCMDocument.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPCMDocument.java
new file mode 100644
index 0000000000..959063d13c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPCMDocument.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * JSP extension for CMDocument.
+ * This interface provides some short hand methods to get declarations
+ * by a name.
+ */
+public interface JSPCMDocument extends org.eclipse.wst.xml.core.internal.contentmodel.CMDocument {
+
+ /**
+ * A short hand method to get a element declaration for a JSP element.
+ * JSP declaration class implements HTMLElementDeclaration interface.
+ * @return com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ * @param elementName java.lang.String
+ */
+ HTMLElementDeclaration getElementDeclaration(String elementName);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPElementCollection.java
new file mode 100644
index 0000000000..cc8acf6b45
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/JSPElementCollection.java
@@ -0,0 +1,897 @@
+/*******************************************************************************
+ * 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;
+
+
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Factory for element declarations of the JSP 1.1.
+ */
+final class JSPElementCollection extends DeclCollection implements JSP11Namespace.ElementName {
+
+
+ private class TypePacket {
+ public String name = null;
+ public int content = CMElementDeclaration.EMPTY;
+ public int omit = HTMLElementDeclaration.OMIT_NONE;
+ public int lineBreak = HTMLElementDeclaration.BREAK_NONE;
+ public int layout = HTMLElementDeclaration.LAYOUT_NONE;
+ public int correct = HTMLElementDeclaration.CORRECT_NONE;
+ public int format = HTMLElementDeclaration.FORMAT_XML;
+ public boolean indentChild = false;
+
+ public TypePacket() {
+ }
+ }
+
+ /** JSP element declaration. */
+ private class ElemDecl extends CMContentImpl implements HTMLElementDeclaration, HTMLPropertyDeclaration {
+ private TypePacket type = null;
+ private CMGroupImpl content = null;
+ private CMNamedNodeMapImpl attributes = null;
+
+ public ElemDecl(TypePacket t) {
+ super(t.name, 1, 1);
+ type = t;
+ }
+
+ public void setContent(CMGroupImpl group) {
+ content = group;
+ }
+
+ public void setAttributes(CMNamedNodeMapImpl attrs) {
+ attributes = attrs;
+ }
+
+ // implementes CMNode
+ public int getNodeType() {
+ return CMNode.ELEMENT_DECLARATION;
+ }
+
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) {
+ return true;
+ }
+ else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) {
+ return true;
+ }
+ else {
+ PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName);
+ if (pp == null)
+ return false;
+ return pp.supports(this);
+ }
+ }
+
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) {
+ return new Boolean(false); //D208839
+ }
+ else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) {
+ String myName = getElementName();
+ if (myName == JSP11Namespace.ElementName.PLUGIN) {
+ return getNamedItem(JSP11Namespace.ElementName.PARAMS); // outer class method.
+ }
+ else if (myName == JSP11Namespace.ElementName.PARAMS) {
+ return getNamedItem(JSP11Namespace.ElementName.PARAM); // outer class method.
+ }
+ else {
+ return null;
+ }
+ }
+ else {
+ PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName);
+ if (pp == null)
+ return null;
+ return pp.get(this);
+ }
+ }
+
+ // implementes CMElementDeclaration
+ public CMNamedNodeMap getAttributes() {
+ return attributes;
+ }
+
+ public CMContent getContent() {
+ return content;
+ }
+
+ public int getContentType() {
+ return type.content;
+ }
+
+ public CMDataType getDataType() {
+ return null;
+ }
+
+ public String getElementName() {
+ return getNodeName();
+ }
+
+ public CMNamedNodeMap getLocalElements() {
+ return null;
+ }
+
+ // implementes HTMLElementDeclaration
+ public HTMLAttributeDeclaration getAttributeDeclaration(String attrName) {
+ if (attributes == null)
+ return null;
+ return (HTMLAttributeDeclaration) attributes.getNamedItem(attrName);
+ }
+
+ public int getCorrectionType() {
+ return type.correct;
+ }
+
+ public CMContent getExclusion() {
+ return null;
+ }
+
+ public CMContent getInclusion() {
+ return null;
+ }
+
+ public CMNamedNodeMap getProhibitedAncestors() {
+ return EMPTY_MAP;
+ }
+
+ public int getFormatType() {
+ return type.format;
+ }
+
+ public int getLayoutType() {
+ return type.layout;
+ }
+
+ public int getLineBreakHint() {
+ return type.lineBreak;
+ }
+
+ public int getOmitType() {
+ return type.omit;
+ }
+
+ public boolean shouldTerminateAt(HTMLElementDeclaration dec) {
+ return false;
+ }
+
+ public boolean shouldKeepSpaces() {
+ return false;
+ }
+
+ public boolean shouldIndentChildSource() {
+ return type.indentChild;
+ }
+
+ public boolean isJSP() {
+ return true;
+ }
+ }
+
+ // element IDs
+ private static class Ids {
+ public static final int ID_SCRIPTLET = 0;
+ public static final int ID_EXPRESSION = 1;
+ public static final int ID_DECLARATION = 2;
+ public static final int ID_DIRECTIVE_PAGE = 3;
+ public static final int ID_DIRECTIVE_INCLUDE = 4;
+ public static final int ID_DIRECTIVE_TAGLIB = 5;
+ public static final int ID_USEBEAN = 6;
+ public static final int ID_SETPROPERTY = 7;
+ public static final int ID_GETPROPERTY = 8;
+ public static final int ID_INCLUDE = 9;
+ public static final int ID_FORWARD = 10;
+ public static final int ID_PLUGIN = 11;
+ public static final int ID_PARAMS = 12;
+ public static final int ID_FALLBACK = 13;
+ public static final int ID_PARAM = 14;
+ public static final int ID_ROOT = 15;
+ public static final int ID_TEXT = 16;
+
+ 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;
+ }
+
+ // attribute creater
+ private class JACreater implements JSP11Namespace {
+ // attribute declaration
+ private class AttrDecl extends CMNodeImpl implements HTMLAttributeDeclaration {
+ HTMLCMDataTypeImpl type = null;
+ int usage = CMAttributeDeclaration.OPTIONAL;
+
+ // methods
+ public AttrDecl(String attrName) {
+ super(attrName);
+ }
+
+ public String getAttrName() {
+ return getNodeName();
+ }
+
+ public CMDataType getAttrType() {
+ return type;
+ }
+
+ /** @deprecated by superclass */
+ public String getDefaultValue() {
+ if (type.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_DEFAULT)
+ return null;
+ return type.getImpliedValue();
+ }
+
+ /** @deprecated by superclass */
+ public Enumeration getEnumAttr() {
+ Vector v = new Vector(Arrays.asList(type.getEnumeratedValues()));
+ return v.elements();
+ }
+
+ public int getNodeType() {
+ return CMNode.ATTRIBUTE_DECLARATION;
+ }
+
+ public int getUsage() {
+ return usage;
+ }
+
+ public boolean shouldIgnoreCase() {
+ return false;
+ }
+ }
+
+ private CMNamedNodeMapImpl declarations = null;
+
+ public JACreater() {
+ declarations = new CMNamedNodeMapImpl();
+ }
+
+ public CMNamedNodeMapImpl getDeclarations(int eid) {
+ switch (eid) {
+ case Ids.ID_DIRECTIVE_PAGE :
+ createForDirPage();
+ break;
+ case Ids.ID_DIRECTIVE_INCLUDE :
+ createForDirInclude();
+ break;
+ case Ids.ID_DIRECTIVE_TAGLIB :
+ createForDirTaglib();
+ break;
+ case Ids.ID_USEBEAN :
+ createForUseBean();
+ break;
+ case Ids.ID_SETPROPERTY :
+ createForSetProperty();
+ break;
+ case Ids.ID_GETPROPERTY :
+ createForGetProperty();
+ break;
+ case Ids.ID_INCLUDE :
+ createForInclude();
+ break;
+ case Ids.ID_FORWARD :
+ createForForward();
+ break;
+ case Ids.ID_PLUGIN :
+ createForPlugin();
+ break;
+ case Ids.ID_PARAM :
+ createForParam();
+ break;
+ case Ids.ID_ROOT :
+ createForRoot();
+ break;
+ default :
+ // should warn.
+ break;
+ }
+ return declarations;
+ }
+
+ private AttrDecl createBoolType(String name, String defValue) {
+ AttrDecl adec = new AttrDecl(name);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE};
+ adec.type.setEnumValues(values);
+ adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, defValue);
+ return adec;
+ }
+
+ private void createForDirPage() {
+ AttrDecl adec = null;
+ // ("language" CDATA DECLARED "java")
+ adec = new AttrDecl(ATTR_NAME_LANGUAGE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_JAVA);
+ declarations.putNamedItem(ATTR_NAME_LANGUAGE, adec);
+
+ // ("extends" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_EXTENDS);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_EXTENDS, adec);
+
+ // ("contentType" CDATA DECLARED "text/html; ISO-8859-1")
+ adec = new AttrDecl(ATTR_NAME_CONTENT_TYPE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_CT_DEFAULT);
+ declarations.putNamedItem(ATTR_NAME_CONTENT_TYPE, adec);
+
+ // ("import" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_IMPORT);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_IMPORT, adec);
+
+ // ("session" ENUM DECLARED (true|false) "true")
+ adec = createBoolType(ATTR_NAME_SESSION, ATTR_VALUE_TRUE);
+ if (adec != null)
+ declarations.putNamedItem(ATTR_NAME_SESSION, adec);
+
+ // ("buffer" CDATA DECLARED "8kb")
+ adec = new AttrDecl(ATTR_NAME_BUFFER);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_BUFSIZ_DEFAULT);
+ declarations.putNamedItem(ATTR_NAME_BUFFER, adec);
+
+ // ("autoFlush" ENUM DECLARED (true|false) "true")
+ adec = createBoolType(ATTR_NAME_AUTOFLUSH, ATTR_VALUE_TRUE);
+ if (adec != null)
+ declarations.putNamedItem(ATTR_NAME_AUTOFLUSH, adec);
+
+ // ("isThreadSafe" ENUM DECLARED (true|false) "true")
+ adec = createBoolType(ATTR_NAME_IS_THREAD_SAFE, ATTR_VALUE_TRUE);
+ if (adec != null)
+ declarations.putNamedItem(ATTR_NAME_IS_THREAD_SAFE, adec);
+
+ // ("info" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_INFO);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_INFO, adec);
+
+ // ("errorPage" URI IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_ERROR_PAGE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.URI);
+ declarations.putNamedItem(ATTR_NAME_ERROR_PAGE, adec);
+
+ // ("isErrorPage" ENUM DECLARED (true|false) "false")
+ adec = createBoolType(ATTR_NAME_IS_ERROR_PAGE, ATTR_VALUE_FALSE);
+ if (adec != null)
+ declarations.putNamedItem(ATTR_NAME_IS_ERROR_PAGE, adec);
+
+ // ("pageEncoding" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_PAGE_ENCODING);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_PAGE_ENCODING, adec);
+
+ }
+
+ private void createForDirInclude() {
+ // ("file" URI REQUIRED); Defect TORO:185241
+ AttrDecl adec = new AttrDecl(ATTR_NAME_FILE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.URI);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_FILE, adec);
+ }
+
+ private void createForDirTaglib() {
+ // ("uri" URI REQUIRED)
+ AttrDecl adec = new AttrDecl(ATTR_NAME_URI);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.URI);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_URI, adec);
+
+ // ("prefix" CDATA REQUIRED)
+ adec = new AttrDecl(ATTR_NAME_PREFIX);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_PREFIX, adec);
+ }
+
+ private void createForUseBean() {
+ // ("id" ID REQUIRED)
+ AttrDecl adec = new AttrDecl(ATTR_NAME_ID);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.ID);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_ID, adec);
+
+ // ("scope" ENUM DECLARED (page|session|request|application) "page")
+ adec = new AttrDecl(ATTR_NAME_SCOPE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_PAGE, ATTR_VALUE_SESSION, ATTR_VALUE_REQUEST, ATTR_VALUE_APPLICATION};
+ adec.type.setEnumValues(values);
+ adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_PAGE);
+ declarations.putNamedItem(ATTR_NAME_SCOPE, adec);
+
+ // ("class" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_CLASS);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_CLASS, adec);
+
+ // ("beanName" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_BEAN_NAME);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_BEAN_NAME, adec);
+
+ // ("type" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_TYPE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_TYPE, adec);
+ }
+
+ private void createForSetProperty() {
+ // ("name" IDREF REQUIRED)
+ AttrDecl adec = new AttrDecl(ATTR_NAME_NAME);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.IDREF);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_NAME, adec);
+
+ // ("property" CDATA REQUIRED)
+ adec = new AttrDecl(ATTR_NAME_PROPERTY);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_PROPERTY, adec);
+
+ // ("value" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_VALUE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_VALUE, adec);
+
+ // ("param" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_PARAM);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_PARAM, adec);
+
+ }
+
+ private void createForGetProperty() {
+ // ("name" IDREF REQUIRED)
+ AttrDecl adec = new AttrDecl(ATTR_NAME_NAME);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.IDREF);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_NAME, adec);
+
+ // ("property" CDATA REQUIRED)
+ adec = new AttrDecl(ATTR_NAME_PROPERTY);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_PROPERTY, adec);
+
+ }
+
+ private void createForInclude() {
+ AttrDecl adec = null;
+ // ("page" URI REQUIRED)
+ adec = new AttrDecl(ATTR_NAME_PAGE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.URI);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_PAGE, adec);
+
+ // ("flush" ENUM REQUIRED (true|false)); Defect TORO:185241
+ adec = new AttrDecl(ATTR_NAME_FLUSH);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ String[] values = {ATTR_VALUE_TRUE, ATTR_VALUE_FALSE};
+ adec.type.setEnumValues(values);
+ declarations.putNamedItem(ATTR_NAME_FLUSH, adec);
+ }
+
+ private void createForForward() {
+ // ("page" URI REQUIRED)
+ AttrDecl adec = new AttrDecl(ATTR_NAME_PAGE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.URI);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_PAGE, adec);
+ }
+
+ private void createForPlugin() {
+ // ("type" ENUM REQUIRED (bean|applet))
+ AttrDecl adec = new AttrDecl(ATTR_NAME_TYPE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ String[] values = {ATTR_VALUE_BEAN, ATTR_VALUE_APPLET};
+ adec.type.setEnumValues(values);
+ declarations.putNamedItem(ATTR_NAME_TYPE, adec);
+
+ // ("code" CDATA REQUIRED)
+ adec = new AttrDecl(ATTR_NAME_CODE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.URI);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_CODE, adec);
+
+ // ("codebase" URI REQUIRED)
+ adec = new AttrDecl(ATTR_NAME_CODEBASE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.URI);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_CODEBASE, adec);
+
+ // ("align" ENUM IMPLIED (top|middle|bottom|left|right))
+ adec = new AttrDecl(ATTR_NAME_ALIGN);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] aligns = {ATTR_VALUE_TOP, ATTR_VALUE_MIDDLE, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT};
+ adec.type.setEnumValues(aligns);
+ declarations.putNamedItem(ATTR_NAME_ALIGN, adec);
+
+ // ("archive" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_ARCHIVE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_ARCHIVE, adec);
+
+ // ("height" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_HEIGHT);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_HEIGHT, adec);
+
+ // ("hspace" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_HSPACE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_HSPACE, adec);
+
+ // ("jreversion" CDATA DECLARED "1.1")
+ adec = new AttrDecl(ATTR_NAME_JREVERSION);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_JVER11);
+ declarations.putNamedItem(ATTR_NAME_JREVERSION, adec);
+
+ // ("name" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_NAME);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_NAME, adec);
+
+ // ("vspace" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_VSPACE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_VSPACE, adec);
+
+ // ("width" CDATA IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_WIDTH);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ declarations.putNamedItem(ATTR_NAME_WIDTH, adec);
+
+ // ("nspluginurl" URI IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_NSPLUGINURL);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.URI);
+ declarations.putNamedItem(ATTR_NAME_NSPLUGINURL, adec);
+
+ // ("iepluginurl" URI IMPLIED)
+ adec = new AttrDecl(ATTR_NAME_IEPLUGINURL);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.URI);
+ declarations.putNamedItem(ATTR_NAME_IEPLUGINURL, adec);
+ }
+
+ private void createForParam() {
+ // ("name" CDATA REQUIRED)
+ AttrDecl adec = new AttrDecl(ATTR_NAME_NAME);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_NAME, adec);
+
+ // ("value" CDATA REQUIRED); Defect TORO:185241
+ adec = new AttrDecl(ATTR_NAME_VALUE);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_VALUE, adec);
+
+ }
+
+ private void createForRoot() {
+ // ("xmlns:jsp" CDATA "http://jva.sun.com/JSP/Page")
+ AttrDecl adec = new AttrDecl(ATTR_NAME_XMLNS_JSP);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.type.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_XMLNS_JSP);
+ declarations.putNamedItem(ATTR_NAME_XMLNS_JSP, adec);
+ // ("version" CDATA REQUIRED)
+ adec = new AttrDecl(ATTR_NAME_VERSION);
+ adec.type = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ adec.usage = CMAttributeDeclaration.REQUIRED;
+ declarations.putNamedItem(ATTR_NAME_VERSION, adec);
+ }
+ }
+
+ private final static CMNamedNodeMap EMPTY_MAP = new CMNamedNodeMap() {
+ public int getLength() {
+ return 0;
+ }
+
+ public CMNode getNamedItem(String name) {
+ return null;
+ }
+
+ public CMNode item(int index) {
+ return null;
+ }
+
+ public Iterator iterator() {
+ return new Iterator() {
+ public boolean hasNext() {
+ return false;
+ }
+
+ public Object next() {
+ return null;
+ }
+
+ public void remove() {
+ }
+ };
+ }
+ };
+ private static String[] names = null;
+
+ static {
+ names = new String[Ids.getNumOfIds()];
+ names[Ids.ID_SCRIPTLET] = SCRIPTLET;
+ names[Ids.ID_EXPRESSION] = EXPRESSION;
+ names[Ids.ID_DECLARATION] = DECLARATION;
+ names[Ids.ID_DIRECTIVE_PAGE] = DIRECTIVE_PAGE;
+ names[Ids.ID_DIRECTIVE_INCLUDE] = DIRECTIVE_INCLUDE;
+ names[Ids.ID_DIRECTIVE_TAGLIB] = DIRECTIVE_TAGLIB;
+ names[Ids.ID_USEBEAN] = USEBEAN;
+ names[Ids.ID_SETPROPERTY] = SETPROPERTY;
+ names[Ids.ID_GETPROPERTY] = GETPROPERTY;
+ names[Ids.ID_INCLUDE] = INCLUDE;
+ names[Ids.ID_FORWARD] = FORWARD;
+ names[Ids.ID_PLUGIN] = PLUGIN;
+ names[Ids.ID_PARAMS] = PARAMS;
+ names[Ids.ID_FALLBACK] = FALLBACK;
+ names[Ids.ID_PARAM] = PARAM;
+ names[Ids.ID_ROOT] = ROOT;
+ names[Ids.ID_TEXT] = TEXT;
+ }
+
+ /**
+ */
+ public JSPElementCollection() {
+ super(names, TOLERANT_CASE);
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ * @param elementName java.lang.String
+ */
+ protected CMNode create(String elementName) {
+ return createElemDecl(getID(elementName));
+ }
+
+ /**
+ * @return com.ibm.sed.contentmodel.html.CMGroupImpl
+ * @param eid int
+ */
+ private CMGroupImpl createContent(int eid) {
+ if (eid == ID_UNKNOWN)
+ return null;
+
+ CMGroupImpl content = null;
+ CMNode child = null;
+
+ switch (eid) {
+ case Ids.ID_INCLUDE :
+ case Ids.ID_FORWARD :
+ // (jsp:param)*
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 0, CMContentImpl.UNBOUNDED);
+ child = item(Ids.ID_PARAM);
+ if (child != null)
+ content.appendChild(child);
+ break;
+ case Ids.ID_PLUGIN :
+ // (jsp:params | jsp:fallback)?
+ content = new CMGroupImpl(CMGroup.CHOICE, 0, 1);
+ // jsp:params
+ child = item(Ids.ID_PARAMS);
+ if (child != null)
+ content.appendChild(child);
+ // jsp:fallback
+ child = item(Ids.ID_FALLBACK);
+ if (child != null)
+ content.appendChild(child);
+ break;
+ case Ids.ID_PARAMS :
+ // (jsp:param)+
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED);
+ child = item(Ids.ID_PARAM);
+ if (child != null)
+ content.appendChild(child);
+ break;
+ case Ids.ID_ROOT :
+ // %Body;
+ // --> (jsp:text|%Directives;|%Scripts;|%Actions;)*
+ // %Directives --> jsp:directive.page|jsp:directive.include
+ // %Scripts; --> jsp:scriptlet|jsp:declaration|jsp:expression
+ // %Actions --> jsp:useBean|jsp.setProperty|jsp:getProperty
+ // |jsp:include|jsp:forward|jsp:plugin
+ content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ int validChildren[] = {Ids.ID_TEXT,
+ // %Directves;
+ Ids.ID_DIRECTIVE_PAGE, Ids.ID_DIRECTIVE_INCLUDE,
+ // %Scripts;
+ Ids.ID_SCRIPTLET, Ids.ID_DECLARATION, Ids.ID_EXPRESSION,
+ // %Actions;
+ Ids.ID_USEBEAN, Ids.ID_SETPROPERTY, Ids.ID_GETPROPERTY, Ids.ID_INCLUDE, Ids.ID_FORWARD, Ids.ID_PLUGIN};
+ for (int i = 0; i < validChildren.length; i++) {
+ child = item(validChildren[i]);
+ if (child != null)
+ content.appendChild(child);
+ }
+ break;
+ }
+
+ return content;
+ }
+
+ /**
+ * @return com.ibm.sed.contentmodel.html.HTMLElemDeclImpl
+ * @param eid int
+ */
+ private HTMLElementDeclaration createElemDecl(int eid) {
+ if (eid == ID_UNKNOWN)
+ return null;
+
+ TypePacket packet = new TypePacket();
+ switch (eid) {
+ case Ids.ID_SCRIPTLET :
+ // content, omit, lineBreak, layout, correct, format
+ // scriptlet
+ packet.name = SCRIPTLET;
+ packet.content = CMElementDeclaration.CDATA;
+ packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT;
+ packet.format = HTMLElementDeclaration.FORMAT_JSP_SCRIPT;
+ break;
+ case Ids.ID_EXPRESSION :
+ // expression
+ packet.name = EXPRESSION;
+ packet.content = CMElementDeclaration.CDATA;
+ packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT;
+ packet.format = HTMLElementDeclaration.FORMAT_JSP_SCRIPT;
+ break;
+ case Ids.ID_DECLARATION :
+ // declaration
+ packet.name = DECLARATION;
+ packet.content = CMElementDeclaration.CDATA;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN;
+ packet.format = HTMLElementDeclaration.FORMAT_JSP_SCRIPT;
+ break;
+ case Ids.ID_DIRECTIVE_PAGE :
+ // directive.page
+ packet.name = DIRECTIVE_PAGE;
+ packet.omit = HTMLElementDeclaration.OMIT_END;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN;
+ packet.format = HTMLElementDeclaration.FORMAT_JSP_DIRECTIVE;
+ break;
+ case Ids.ID_DIRECTIVE_INCLUDE :
+ // directive.inlcude
+ packet.name = DIRECTIVE_INCLUDE;
+ packet.omit = HTMLElementDeclaration.OMIT_END;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN;
+ packet.format = HTMLElementDeclaration.FORMAT_JSP_DIRECTIVE;
+ break;
+ case Ids.ID_DIRECTIVE_TAGLIB :
+ // directive.taglib
+ packet.name = DIRECTIVE_TAGLIB;
+ packet.omit = HTMLElementDeclaration.OMIT_END;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN;
+ packet.format = HTMLElementDeclaration.FORMAT_JSP_DIRECTIVE;
+ break;
+ case Ids.ID_USEBEAN :
+ // useBean
+ packet.name = USEBEAN;
+ packet.content = CMElementDeclaration.ANY;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN;
+ packet.indentChild = true;
+ break;
+ case Ids.ID_SETPROPERTY :
+ // setProperty
+ packet.name = SETPROPERTY;
+ packet.omit = HTMLElementDeclaration.OMIT_END;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN;
+ break;
+ case Ids.ID_GETPROPERTY :
+ // getProperty
+ packet.name = GETPROPERTY;
+ packet.omit = HTMLElementDeclaration.OMIT_END;
+ packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT;
+ break;
+ case Ids.ID_INCLUDE :
+ // include
+ packet.name = INCLUDE;
+ packet.content = CMElementDeclaration.ELEMENT;
+ packet.omit = HTMLElementDeclaration.OMIT_END;
+ packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT;
+ packet.indentChild = true;
+ break;
+ case Ids.ID_FORWARD :
+ // forward
+ packet.name = FORWARD;
+ packet.content = CMElementDeclaration.ELEMENT;
+ packet.omit = HTMLElementDeclaration.OMIT_END;
+ packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT;
+ packet.indentChild = true;
+ break;
+ case Ids.ID_PLUGIN :
+ // plugin
+ packet.name = PLUGIN;
+ packet.content = CMElementDeclaration.ELEMENT;
+ packet.layout = HTMLElementDeclaration.LAYOUT_OBJECT;
+ packet.indentChild = true;
+ break;
+ case Ids.ID_PARAMS :
+ // params
+ packet.name = PARAMS;
+ packet.content = CMElementDeclaration.ELEMENT;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN;
+ packet.indentChild = true;
+ break;
+ case Ids.ID_FALLBACK :
+ // fallback
+ packet.name = FALLBACK;
+ packet.content = CMElementDeclaration.CDATA;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN;
+ break;
+ case Ids.ID_PARAM :
+ // param
+ packet.name = PARAM;
+ packet.omit = HTMLElementDeclaration.OMIT_END;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN;
+ break;
+ case Ids.ID_ROOT :
+ packet.name = ROOT;
+ packet.content = CMElementDeclaration.ELEMENT;
+ packet.layout = HTMLElementDeclaration.LAYOUT_HIDDEN; // same as HTML
+ break;
+ case Ids.ID_TEXT :
+ packet.name = TEXT;
+ packet.content = CMElementDeclaration.PCDATA;
+ break;
+ default :
+ // unknown ID
+ return null;
+ }
+
+ ElemDecl dec = new ElemDecl(packet);
+
+ CMGroupImpl content = createContent(eid);
+ if (content != null)
+ dec.setContent(content);
+
+ JACreater creater = new JACreater();
+ dec.setAttributes(creater.getDeclarations(eid));
+
+ return dec;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProvider.java
new file mode 100644
index 0000000000..09cba4b407
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProvider.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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;
+
+
+/**
+ * PropertyProvider class.
+ * This class is intended to be used in HTMLElementDeclaration instances.
+ */
+interface PropertyProvider {
+
+ boolean supports(HTMLElementDeclaration edecl);
+
+ Object get(HTMLElementDeclaration edecl);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProviderFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProviderFactory.java
new file mode 100644
index 0000000000..3ffb396e50
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/PropertyProviderFactory.java
@@ -0,0 +1,359 @@
+/*******************************************************************************
+ * 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;
+
+import java.util.Hashtable;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.annotation.AnnotationMap;
+
+/**
+ * The factory object of PropertyProvider.
+ */
+final class PropertyProviderFactory {
+
+
+ /**
+ * DefaultProvider is intended to be used for unknown properties.
+ * It always returns null value for any properties.
+ */
+ class DefaultProvider implements PropertyProvider {
+ public DefaultProvider() {
+ super();
+ }
+
+ public boolean supports(HTMLElementDeclaration edecl) {
+ return false;
+ }
+
+ public Object get(HTMLElementDeclaration edecl) {
+ return null;
+ }
+ }
+
+ abstract class AbstractElementPropertyProvider implements PropertyProvider {
+ protected AbstractElementPropertyProvider() {
+ super();
+ }
+
+ public boolean supports(HTMLElementDeclaration edecl) {
+ return (edecl != null);
+ }
+
+ public Object get(HTMLElementDeclaration edecl) {
+ if (!(edecl instanceof HTMLPropertyDeclaration))
+ return null;
+ return getElementProperty((HTMLPropertyDeclaration)edecl);
+ }
+
+ abstract protected Object getElementProperty(HTMLPropertyDeclaration decl);
+ }
+
+ /*
+ * "tagInfo"
+ * gets documentation for the element
+ */
+ class PPTagInfo extends AbstractElementPropertyProvider {
+ private final static String htmlAnnotationLoc = "platform:/plugin/org.eclipse.wst.html.core/data/htmref.xml"; //$NON-NLS-1$
+ protected AnnotationMap fAnnotationMap = null;
+
+ public PPTagInfo() {
+ super();
+ }
+
+ /**
+ * Gets the annotationMap.
+ * @return Returns a AnnotationMap
+ */
+ protected AnnotationMap getAnnotationMap() {
+ if (fAnnotationMap == null) {
+ fAnnotationMap = new AnnotationMap();
+ try {
+ fAnnotationMap.load(htmlAnnotationLoc);
+ }
+ catch (Exception e) {
+ // no annotation available
+ }
+ }
+ return fAnnotationMap;
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ if (decl instanceof HTMLElementDeclaration) {
+ return getAnnotationMap().getProperty(((HTMLElementDeclaration)decl).getElementName(), "tagInfo"); //$NON-NLS-1$
+ } else {
+ return null;
+ }
+ }
+ }
+
+ /*
+ * "shouldKeepSpace"
+ */
+ class PPShouldKeepSpace extends AbstractElementPropertyProvider {
+ public PPShouldKeepSpace() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(decl.shouldKeepSpaces());
+ }
+ }
+
+ /*
+ * "shouldIndentChildSource"
+ */
+ class PPShouldIndentChildSource extends AbstractElementPropertyProvider {
+ public PPShouldIndentChildSource() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(decl.shouldIndentChildSource());
+ }
+ }
+
+ /*
+ * "terminators"
+ */
+ class PPTerminators extends AbstractElementPropertyProvider {
+ public PPTerminators() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ if (! (decl instanceof HTMLElemDeclImpl)) return null;
+ return ((HTMLElemDeclImpl)decl).getTerminators();
+ }
+ }
+
+ /*
+ * "prohibitedAncestors"
+ */
+ class PPProhibitedAncestors extends AbstractElementPropertyProvider {
+ public PPProhibitedAncestors() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return decl.getProhibitedAncestors();
+ }
+ }
+
+ /*
+ * "isJSP"
+ */
+ class PPIsJSP extends AbstractElementPropertyProvider {
+ public PPIsJSP() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(decl.isJSP());
+ }
+ }
+
+ /*
+ * "isXHTML"
+ * HTMLElementDeclaration itself never represent any XHTML element declaration.
+ * So, this property must be always false.
+ */
+ class PPIsXHTML extends AbstractElementPropertyProvider {
+ public PPIsXHTML() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(false);
+ }
+ }
+
+ /*
+ * "isSSI"
+ * Each declaration class for SSI elements must provide this property itself,
+ * and then return true. Other declaration must always return false.
+ */
+ class PPIsSSI extends AbstractElementPropertyProvider {
+ public PPIsSSI() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(false);
+ }
+ }
+
+ /*
+ * "lineBreakHint"
+ */
+ class PPLineBreakHint extends AbstractElementPropertyProvider {
+ public PPLineBreakHint() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ String hint = HTMLCMProperties.Values.BREAK_NONE;
+ switch (decl.getLineBreakHint()) {
+ case HTMLElementDeclaration.BREAK_AFTER_START :
+ hint = HTMLCMProperties.Values.BREAK_AFTER_START;
+ break;
+ case HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END :
+ hint = HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END;
+ break;
+ case HTMLElementDeclaration.BREAK_NONE :
+ // nothing to do
+ default :
+ break;
+ }
+ return hint;
+ }
+ }
+
+ /*
+ * "layoutType"
+ */
+ class PPLayoutType extends AbstractElementPropertyProvider {
+ public PPLayoutType() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ String type = HTMLCMProperties.Values.LAYOUT_NONE;
+ switch (decl.getLayoutType()) {
+ case HTMLElementDeclaration.LAYOUT_BLOCK :
+ type = HTMLCMProperties.Values.LAYOUT_BLOCK;
+ break;
+ case HTMLElementDeclaration.LAYOUT_BREAK :
+ type = HTMLCMProperties.Values.LAYOUT_BREAK;
+ break;
+ case HTMLElementDeclaration.LAYOUT_HIDDEN :
+ type = HTMLCMProperties.Values.LAYOUT_HIDDEN;
+ break;
+ case HTMLElementDeclaration.LAYOUT_OBJECT :
+ type = HTMLCMProperties.Values.LAYOUT_OBJECT;
+ break;
+ case HTMLElementDeclaration.LAYOUT_WRAP :
+ type = HTMLCMProperties.Values.LAYOUT_WRAP;
+ break;
+ case HTMLElementDeclaration.LAYOUT_NONE :
+ // nothing to do.
+ default :
+ break;
+ }
+ return type;
+ }
+ }
+
+ /*
+ * "omitType"
+ */
+ class PPOmitType extends AbstractElementPropertyProvider {
+ public PPOmitType() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ String type = HTMLCMProperties.Values.OMIT_NONE;
+ switch (decl.getOmitType()) {
+ case HTMLElementDeclaration.OMIT_BOTH :
+ type = HTMLCMProperties.Values.OMIT_BOTH;
+ break;
+ case HTMLElementDeclaration.OMIT_END :
+ type = HTMLCMProperties.Values.OMIT_END;
+ break;
+ case HTMLElementDeclaration.OMIT_END_DEFAULT :
+ type = HTMLCMProperties.Values.OMIT_END_DEFAULT;
+ break;
+ case HTMLElementDeclaration.OMIT_END_MUST :
+ type = HTMLCMProperties.Values.OMIT_END_MUST;
+ break;
+ case HTMLElementDeclaration.OMIT_NONE :
+ // nothing to do.
+ default :
+ break;
+ }
+ return type;
+ }
+ }
+
+ /*
+ * "inclusion"
+ */
+ class PPInclusion extends AbstractElementPropertyProvider {
+ public PPInclusion() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return decl.getInclusion();
+ }
+ }
+
+ public static PropertyProvider getProvider(String propName) {
+ PropertyProviderFactory factory = getInstance();
+ PropertyProvider pp = (PropertyProvider) factory.registry.get(propName);
+ if (pp != null)
+ return pp;
+
+ pp = factory.create(propName);
+ if (pp == null)
+ return factory.defaultProvider;
+
+ factory.registry.put(propName, pp);
+ return pp;
+ }
+
+ private static PropertyProviderFactory instance = null;
+
+ private synchronized static PropertyProviderFactory getInstance() {
+ if (instance != null)
+ return instance;
+ instance = new PropertyProviderFactory();
+ return instance;
+ }
+
+ private Hashtable registry = new Hashtable();
+ private PropertyProvider defaultProvider = new DefaultProvider();
+
+ private PropertyProviderFactory() {
+ super();
+ }
+
+ private PropertyProvider create(String propName) {
+ PropertyProvider pp = null;
+ if (propName.equals(HTMLCMProperties.IS_JSP))
+ pp = new PPIsJSP();
+ else if (propName.equals(HTMLCMProperties.IS_XHTML))
+ pp = new PPIsXHTML();
+ else if (propName.equals(HTMLCMProperties.IS_SSI))
+ pp = new PPIsSSI();
+ else if (propName.equals(HTMLCMProperties.LAYOUT_TYPE))
+ pp = new PPLayoutType();
+ else if (propName.equals(HTMLCMProperties.LINE_BREAK_HINT))
+ pp = new PPLineBreakHint();
+ else if (propName.equals(HTMLCMProperties.PROHIBITED_ANCESTORS))
+ pp = new PPProhibitedAncestors();
+ else if (propName.equals(HTMLCMProperties.SHOULD_KEEP_SPACE))
+ pp = new PPShouldKeepSpace();
+ else if (propName.equals(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE))
+ pp = new PPShouldIndentChildSource();
+ else if (propName.equals(HTMLCMProperties.TERMINATORS))
+ pp = new PPTerminators();
+ else if (propName.equals(HTMLCMProperties.TAGINFO))
+ pp = new PPTagInfo();
+ else if (propName.equals(HTMLCMProperties.OMIT_TYPE))
+ pp = new PPOmitType();
+ else if (propName.equals(HTMLCMProperties.INCLUSION))
+ pp = new PPInclusion();
+
+ return pp;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/AttributeCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/AttributeCollection.java
new file mode 100644
index 0000000000..ab8d2eac1b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/AttributeCollection.java
@@ -0,0 +1,324 @@
+/*******************************************************************************
+ * 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.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Factory for attribute declarations.
+ */
+final class AttributeCollection extends CMNamedNodeMapImpl implements CHTMLNamespace {
+ /**
+ * constructor.
+ */
+ public AttributeCollection() {
+ super();
+ }
+
+ /**
+ * Create an attribute declaration.
+ * @return com.ibm.sed.contentmodel.html.HTMLAttrDeclImpl
+ * @param attrName java.lang.String
+ */
+ private HTMLAttrDeclImpl create(String attrName) {
+ HTMLAttrDeclImpl attr = null;
+ HTMLCMDataTypeImpl atype = null;
+
+ if (attrName.equalsIgnoreCase(ATTR_NAME_ACTION)) {
+ // (action %URI #REQUIRED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ACTION, atype, CMAttributeDeclaration.REQUIRED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ALT)) {
+ // (alt %Text; #REQUIRED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.TEXT);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ALT, atype, CMAttributeDeclaration.REQUIRED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_BORDER)) {
+ // (border %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_BORDER, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CHECKED)) {
+ // (checked (checked) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_CHECKED};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CHECKED, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_CLEAR)) {
+ // (clear (left | all | right | none) none)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_ALL, ATTR_VALUE_RIGHT, ATTR_VALUE_NONE};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_NONE);
+
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_CLEAR, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_COLS)) {
+ // (cols NUMBER #REQUIRED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_COLS, atype, CMAttributeDeclaration.REQUIRED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ENCTYPE)) {
+ // (enctype %ContentType; "application/x-www-form-urlencoded")
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_WWW_FORM_URLENCODED);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ENCTYPE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HEIGHT)) {
+ // (height %Length; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HEIGHT, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HREF)) {
+ // (href %URI; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HREF, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HSPACE)) {
+ // (hspace %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HSPACE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_HTTP_EQUIV)) {
+ // (http-equiv NAME #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_HTTP_EQUIV, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MAXLENGTH)) {
+ // (maxlength NUMBER #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MAXLENGTH, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_METHOD)) {
+ // (method (GET|POST) GET)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_VALUE_GET, ATTR_VALUE_POST};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, ATTR_VALUE_GET);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_METHOD, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_MULTIPLE)) {
+ // (multiple (multiple) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_MULTIPLE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_MULTIPLE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_NAME)) {
+ // (name CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_NOSHADE)) {
+ // (noshade (noshade) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_NOSHADE};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_NOSHADE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_ROWS)) {
+ // (rows NUMBER #REQUIRED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_ROWS, atype, CMAttributeDeclaration.REQUIRED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SELECTED)) {
+ // (selected (selected) #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {ATTR_NAME_SELECTED};
+ atype.setEnumValues(values);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SELECTED, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SIZE)) {
+ // (size %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_SRC)) {
+ // (src %URI; #IMPLIED)
+ // NOTE: "src" attributes are defined in several elements.
+ // The definition of IMG is different from others.
+ // So, it should be locally defined.
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_SRC, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_TYPE)) {
+ // (type %CotentType; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.CONTENT_TYPE);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VALUE)) {
+ // (value CDATA #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VALUE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VERSION)) {
+ // (version CDATA #FIXED '%HTML.Version;)
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_FIXED, ATTR_VALUE_VERSION_TRANSITIONAL);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VERSION, atype, CMAttributeDeclaration.FIXED);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_WIDTH)) {
+ // (width %Length; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.LENGTH);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+
+ }
+ else if (attrName.equalsIgnoreCase(ATTR_NAME_VSPACE)) {
+ // (vspace %Pixels; #IMPLIED)
+ atype = new HTMLCMDataTypeImpl(HTMLCMDataType.PIXELS);
+ attr = new HTMLAttrDeclImpl(ATTR_NAME_VSPACE, atype, CMAttributeDeclaration.OPTIONAL);
+
+ // <<D205514
+ }
+ else {
+ // unknown attribute; maybe error.
+ // should warn.
+ attr = null;
+ }
+
+ return attr;
+ }
+
+ /**
+ * Get %bodycolors; declarations.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getBodycolors(CMNamedNodeMapImpl declarations) {
+ }
+
+ /**
+ * Get align attribute which has %IAlign; as values..
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public static final HTMLAttrDeclImpl createAlignForImage() {
+ // align (local)
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ // set enum values
+ String[] values = {ATTR_VALUE_TOP, ATTR_VALUE_MIDDLE, ATTR_VALUE_BOTTOM, ATTR_VALUE_LEFT, ATTR_VALUE_RIGHT};
+ atype.setEnumValues(values);
+
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ return attr;
+ }
+
+ /**
+ * Create an attribute declaration for <code>align</code>
+ * in several elements, like <code>P</code>, <code>DIV</code>.
+ * The values are different from attributes those have the same name
+ * in other elements (<code>IMG</code> and <code>TABLE</code>).
+ * So, it can't treat as global attributes.
+ * <strong>NOTE: These attribute declaration has
+ * no owner CMDocument instance.</strong>
+ * @return com.ibm.sed.contentmodel.html.HTMLAttrDeclImpl
+ */
+ public static final HTMLAttrDeclImpl createAlignForParagraph() {
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ // set enum values: left|center|right|justify
+ String[] values = {ATTR_VALUE_LEFT, ATTR_VALUE_CENTER, ATTR_VALUE_RIGHT,};
+ atype.setEnumValues(values);
+
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ return attr;
+ }
+
+ /**
+ * Get %attrs; declarations.
+ * %attrs; consists of %coreattrs;, %i18n, and %events;.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getAttrs(CMNamedNodeMapImpl declarations) {
+ }
+
+ /**
+ * Get %coreattrs; declarations.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getCore(CMNamedNodeMapImpl declarations) {
+ }
+
+ /**
+ * Get a global attribute declaration.
+ * @return com.ibm.sed.contentmodel.html.HTMLAttrributeDeclaration
+ * @param attrName java.lang.String
+ */
+ public HTMLAttributeDeclaration getDeclaration(String attrName) {
+ CMNode cmnode = getNamedItem(attrName);
+ if (cmnode != null)
+ return (HTMLAttributeDeclaration) cmnode; // already exists.
+
+ HTMLAttrDeclImpl dec = create(attrName);
+ if (dec != null)
+ putNamedItem(attrName, dec);
+
+ return dec;
+ }
+
+ /**
+ * Get declarations which are specified by names.
+ * @param declarations com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ * @param names java.util.Iterator
+ */
+ public void getDeclarations(CMNamedNodeMapImpl declarations, Iterator names) {
+ while (names.hasNext()) {
+ String attrName = (String) names.next();
+ HTMLAttributeDeclaration dec = getDeclaration(attrName);
+ if (dec != null)
+ declarations.putNamedItem(attrName, dec);
+ }
+ }
+
+ /**
+ * Get %events; declarations.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getEvents(CMNamedNodeMapImpl declarations) {
+ }
+
+ /**
+ * Get %i18n; declarations.
+ * @param attributes com.ibm.sed.contentmodel.html.CMNamedNodeMapImpl
+ */
+ public void getI18n(CMNamedNodeMapImpl declarations) {
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHCMDocImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHCMDocImpl.java
new file mode 100644
index 0000000000..6627ae8ac8
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHCMDocImpl.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocument;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLEntityDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * CMDocument implementation for the HTML.
+ */
+public class CHCMDocImpl extends CMNodeImpl implements HTMLCMDocument {
+
+ /** Namespace for all names of elements, entities and attributes. */
+ private CMNamespace namespace = null;
+ private ElementCollection elements = null;
+ private EntityCollection entities = null;
+ private AttributeCollection attributes = null;
+
+ /**
+ */
+ public CHCMDocImpl(String docTypeName, CMNamespace targetNamespace) {
+ super(docTypeName);
+ namespace = targetNamespace;
+ attributes = new AttributeCollection();
+ elements = new ElementCollection(attributes);
+ entities = new EntityCollection();
+ }
+
+ /**
+ * @return com.ibm.sed.contentmodel.html.AttributeCollection
+ */
+ AttributeCollection getAttributes() {
+ return attributes;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.HTMLCMDocument
+ */
+ public HTMLElementDeclaration getElementDeclaration(String elementName) {
+ if (elements == null)
+ return null;
+ return (HTMLElementDeclaration) elements.getNamedItem(elementName);
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ */
+ public CMNamedNodeMap getElements() {
+ return elements;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ */
+ public CMNamedNodeMap getEntities() {
+ return entities;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.HTMLCMDocument
+ */
+ public HTMLEntityDeclaration getEntityDeclaration(String entityName) {
+ if (entities == null)
+ return null;
+ return (HTMLEntityDeclaration) entities.getNamedItem(entityName);
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDocument
+ */
+ public org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ public int getNodeType() {
+ return CMNode.DOCUMENT;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHTMLNamespace.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHTMLNamespace.java
new file mode 100644
index 0000000000..3aa8424ac2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CHTMLNamespace.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.html.core.HTML40Namespace;
+
+
+
+/**
+ * Provide all names defined in the HTML 4.0? specification.
+ */
+public interface CHTMLNamespace {
+
+ // Element names
+ public static interface ElementName {
+ public static final String A = HTML40Namespace.ElementName.A;
+ public static final String ADDRESS = HTML40Namespace.ElementName.ADDRESS;
+ public static final String BASE = HTML40Namespace.ElementName.BASE;
+ public static final String BLOCKQUOTE = HTML40Namespace.ElementName.BLOCKQUOTE;
+ public static final String BODY = HTML40Namespace.ElementName.BODY;
+ public static final String BR = HTML40Namespace.ElementName.BR;
+ public static final String CENTER = HTML40Namespace.ElementName.CENTER;
+ public static final String DD = HTML40Namespace.ElementName.DD;
+ public static final String DIR = HTML40Namespace.ElementName.DIR;
+ public static final String DIV = HTML40Namespace.ElementName.DIV;
+ public static final String DL = HTML40Namespace.ElementName.DL;
+ public static final String DT = HTML40Namespace.ElementName.DT;
+ public static final String FORM = HTML40Namespace.ElementName.FORM;
+ public static final String H1 = HTML40Namespace.ElementName.H1;
+ public static final String H2 = HTML40Namespace.ElementName.H2;
+ public static final String H3 = HTML40Namespace.ElementName.H3;
+ public static final String H4 = HTML40Namespace.ElementName.H4;
+ public static final String H5 = HTML40Namespace.ElementName.H5;
+ public static final String H6 = HTML40Namespace.ElementName.H6;
+ public static final String HEAD = HTML40Namespace.ElementName.HEAD;
+ public static final String HR = HTML40Namespace.ElementName.HR;
+ public static final String HTML = HTML40Namespace.ElementName.HTML;
+ public static final String IMG = HTML40Namespace.ElementName.IMG;
+ public static final String INPUT = HTML40Namespace.ElementName.INPUT;
+ public static final String LI = HTML40Namespace.ElementName.LI;
+ public static final String MENU = HTML40Namespace.ElementName.MENU;
+ public static final String META = HTML40Namespace.ElementName.META;
+ public static final String OL = HTML40Namespace.ElementName.OL;
+ public static final String OPTION = HTML40Namespace.ElementName.OPTION;
+ public static final String P = HTML40Namespace.ElementName.P;
+ public static final String PRE = HTML40Namespace.ElementName.PRE;
+ public static final String SELECT = HTML40Namespace.ElementName.SELECT;
+ public static final String TEXTAREA = HTML40Namespace.ElementName.TEXTAREA;
+ public static final String TITLE = HTML40Namespace.ElementName.TITLE;
+ public static final String UL = HTML40Namespace.ElementName.UL;
+ public static final String SSI_CONFIG = HTML40Namespace.ElementName.SSI_CONFIG;
+ public static final String SSI_ECHO = HTML40Namespace.ElementName.SSI_ECHO;
+ public static final String SSI_EXEC = HTML40Namespace.ElementName.SSI_EXEC;
+ public static final String SSI_FSIZE = HTML40Namespace.ElementName.SSI_FSIZE;
+ public static final String SSI_FLASTMOD = HTML40Namespace.ElementName.SSI_FLASTMOD;
+ public static final String SSI_INCLUDE = HTML40Namespace.ElementName.SSI_INCLUDE;
+ public static final String SSI_PRINTENV = HTML40Namespace.ElementName.SSI_PRINTENV;
+ public static final String SSI_SET = HTML40Namespace.ElementName.SSI_SET;
+ }
+
+ // Character Entities
+ public static interface EntityName {
+ }
+
+ // global attribute names
+ public static final String ATTR_NAME_VERSION = HTML40Namespace.ATTR_NAME_VERSION;
+ public static final String ATTR_NAME_SRC = HTML40Namespace.ATTR_NAME_SRC;
+ public static final String ATTR_NAME_ALT = HTML40Namespace.ATTR_NAME_ALT;
+ public static final String ATTR_NAME_HEIGHT = HTML40Namespace.ATTR_NAME_HEIGHT;
+ public static final String ATTR_NAME_WIDTH = HTML40Namespace.ATTR_NAME_WIDTH;
+ public static final String ATTR_NAME_ALIGN = HTML40Namespace.ATTR_NAME_ALIGN;
+ public static final String ATTR_NAME_BORDER = HTML40Namespace.ATTR_NAME_BORDER;
+ public static final String ATTR_NAME_HSPACE = HTML40Namespace.ATTR_NAME_HSPACE;
+ public static final String ATTR_NAME_VSPACE = HTML40Namespace.ATTR_NAME_VSPACE;
+ public static final String ATTR_NAME_NAME = HTML40Namespace.ATTR_NAME_NAME;
+ public static final String ATTR_NAME_CLEAR = HTML40Namespace.ATTR_NAME_CLEAR;
+ public static final String ATTR_NAME_NOSHADE = HTML40Namespace.ATTR_NAME_NOSHADE;
+ public static final String ATTR_NAME_CHECKED = HTML40Namespace.ATTR_NAME_CHECKED;
+ public static final String ATTR_NAME_MAXLENGTH = HTML40Namespace.ATTR_NAME_MAXLENGTH;
+ public static final String ATTR_NAME_ISTYLE = HTML40Namespace.ATTR_NAME_ISTYLE;
+ public static final String ATTR_NAME_HTTP_EQUIV = HTML40Namespace.ATTR_NAME_HTTP_EQUIV;
+ public static final String ATTR_NAME_CONTENT = HTML40Namespace.ATTR_NAME_CONTENT;
+
+ public static final String ATTR_NAME_HREF = HTML40Namespace.ATTR_NAME_HREF;
+ public static final String ATTR_NAME_MULTIPLE = HTML40Namespace.ATTR_NAME_MULTIPLE;
+ public static final String ATTR_NAME_SELECTED = HTML40Namespace.ATTR_NAME_SELECTED;
+ public static final String ATTR_NAME_ROWS = HTML40Namespace.ATTR_NAME_ROWS;
+ public static final String ATTR_NAME_COLS = HTML40Namespace.ATTR_NAME_COLS;
+ public static final String ATTR_NAME_ACTION = HTML40Namespace.ATTR_NAME_ACTION;
+ public static final String ATTR_NAME_METHOD = HTML40Namespace.ATTR_NAME_METHOD;
+ public static final String ATTR_NAME_ENCTYPE = HTML40Namespace.ATTR_NAME_ENCTYPE;
+ public static final String ATTR_NAME_SIZE = HTML40Namespace.ATTR_NAME_SIZE;
+ public static final String ATTR_NAME_TYPE = HTML40Namespace.ATTR_NAME_TYPE;
+ public static final String ATTR_NAME_VALUE = HTML40Namespace.ATTR_NAME_VALUE;
+
+
+
+ public static final String ATTR_NAME_ERRMSG = HTML40Namespace.ATTR_NAME_ERRMSG;
+ public static final String ATTR_NAME_SIZEFMT = HTML40Namespace.ATTR_NAME_SIZEFMT;
+ public static final String ATTR_NAME_TIMEFMT = HTML40Namespace.ATTR_NAME_TIMEFMT;
+ public static final String ATTR_NAME_VAR = HTML40Namespace.ATTR_NAME_VAR;
+ public static final String ATTR_NAME_CGI = HTML40Namespace.ATTR_NAME_CGI;
+ public static final String ATTR_NAME_CMD = HTML40Namespace.ATTR_NAME_CMD;
+ public static final String ATTR_NAME_FILE = HTML40Namespace.ATTR_NAME_FILE;
+ public static final String ATTR_NAME_VIRTUAL = HTML40Namespace.ATTR_NAME_VIRTUAL;
+
+ // global attribute values; mainly used in enumeration.
+ public static final String ATTR_VALUE_VERSION_TRANSITIONAL = "-//W3C//DTD Compact HTML 1.0 Draft//EN"; //$NON-NLS-1$
+ // for align (top|middle|bottom|left|right)
+ public static final String ATTR_VALUE_TOP = HTML40Namespace.ATTR_VALUE_TOP;
+ public static final String ATTR_VALUE_MIDDLE = HTML40Namespace.ATTR_VALUE_MIDDLE;
+ public static final String ATTR_VALUE_BOTTOM = HTML40Namespace.ATTR_VALUE_BOTTOM;
+ public static final String ATTR_VALUE_LEFT = HTML40Namespace.ATTR_VALUE_LEFT;
+ public static final String ATTR_VALUE_CENTER = HTML40Namespace.ATTR_VALUE_CENTER;
+ public static final String ATTR_VALUE_RIGHT = HTML40Namespace.ATTR_VALUE_RIGHT;
+ // for clear (left|all|right|none): left and right are already defined above.
+ public static final String ATTR_VALUE_ALL = HTML40Namespace.ATTR_VALUE_ALL;
+ public static final String ATTR_VALUE_NONE = HTML40Namespace.ATTR_VALUE_NONE;
+ // for type of INPUT
+ // (text | password | checkbox | radio | submit | reset |
+ // file | hidden | image | button)
+ public static final String ATTR_VALUE_TEXT = HTML40Namespace.ATTR_VALUE_TEXT;
+ public static final String ATTR_VALUE_PASSWORD = HTML40Namespace.ATTR_VALUE_PASSWORD;
+ public static final String ATTR_VALUE_CHECKBOX = HTML40Namespace.ATTR_VALUE_CHECKBOX;
+ public static final String ATTR_VALUE_RADIO = HTML40Namespace.ATTR_VALUE_RADIO;
+ public static final String ATTR_VALUE_SUBMIT = HTML40Namespace.ATTR_VALUE_SUBMIT;
+ public static final String ATTR_VALUE_RESET = HTML40Namespace.ATTR_VALUE_RESET;
+ public static final String ATTR_VALUE_HIDDEN = HTML40Namespace.ATTR_VALUE_HIDDEN;
+ // for span, colspan, rowspan
+ public static final String ATTR_VALUE_1 = HTML40Namespace.ATTR_VALUE_1;
+ // for frameborder
+ public static final String ATTR_VALUE_0 = HTML40Namespace.ATTR_VALUE_0;
+ // for method of FORM
+ public static final String ATTR_VALUE_GET = HTML40Namespace.ATTR_VALUE_GET;
+ public static final String ATTR_VALUE_POST = HTML40Namespace.ATTR_VALUE_POST;
+ public static final String ATTR_VALUE_WWW_FORM_URLENCODED = HTML40Namespace.ATTR_VALUE_WWW_FORM_URLENCODED;
+ // for behaviro of MARQUEE
+ public static final String ATTR_VALUE_SCROLL = HTML40Namespace.ATTR_VALUE_SCROLL;
+ public static final String ATTR_VALUE_SLIDE = HTML40Namespace.ATTR_VALUE_SLIDE;
+ public static final String ATTR_VALUE_ALTERNATE = HTML40Namespace.ATTR_VALUE_ALTERNATE;
+ // for direction of MARQUEE
+ public static final String ATTR_VALUE_UP = HTML40Namespace.ATTR_VALUE_UP;
+ public static final String ATTR_VALUE_DOWN = HTML40Namespace.ATTR_VALUE_DOWN;
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMContentImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMContentImpl.java
new file mode 100644
index 0000000000..28b7966b9d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMContentImpl.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * Implementation of CMContent for HTML CM.
+ */
+abstract class CMContentImpl extends CMNodeImpl implements org.eclipse.wst.xml.core.internal.contentmodel.CMContent {
+
+ public static final int UNBOUNDED = -1;
+ /** -1: it's UNBOUNDED. */
+ private int maxOccur = UNBOUNDED;
+ /** 0: it's OPTIONAL, 1, it's REQUIRED. */
+ private int minOccur = 0;
+
+ /**
+ * The primary consturctor.
+ * Use this one for usual cases.<br>
+ */
+ public CMContentImpl(String name, int min, int max) {
+ super(name);
+ minOccur = min;
+ maxOccur = max;
+ }
+
+ /**
+ * getMaxOccur method
+ * @return int
+ *
+ * If -1, it's UNBOUNDED.
+ */
+ public int getMaxOccur() {
+ return maxOccur;
+ }
+
+ /**
+ * getMinOccur method
+ * @return int
+ *
+ * If 0, it's OPTIONAL.
+ * If 1, it's REQUIRED.
+ */
+ public int getMinOccur() {
+ return minOccur;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMGroupImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMGroupImpl.java
new file mode 100644
index 0000000000..812b3ed3dc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMGroupImpl.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+
+/**
+ */
+class CMGroupImpl extends CMContentImpl implements CMGroup {
+
+ private int operator = CMGroup.SEQUENCE;
+ private CMNodeListImpl children = null;
+
+ /**
+ * CMGroupImpl constructor comment.
+ */
+ public CMGroupImpl(int op, int minOccur, int maxOccur) {
+ super(null, minOccur, maxOccur);
+ switch (op) {
+ case CMGroup.ALL :
+ case CMGroup.CHOICE :
+ case CMGroup.SEQUENCE :
+ operator = op;
+ break;
+ default :
+ // should warn.
+ break;
+ }
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ * @param org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ protected CMNode appendChild(CMNode child) {
+ if (child == null)
+ return null;
+ if (children == null)
+ children = new CMNodeListImpl();
+ return children.appendNode(child);
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList
+ */
+ public CMNodeList getChildNodes() {
+ return children;
+ }
+
+ /**
+ * getNodeType method
+ * @return int
+ *
+ * Returns one of :
+ * ELEMENT_DECLARATION, ATTRIBUTE_DECLARATION, GROUP, ENTITY_DECLARATION.
+ */
+ public int getNodeType() {
+ return CMNode.GROUP;
+ }
+
+ /**
+ * getOperation method
+ * @return int
+ *
+ * Returns one of :
+ * ALONE (a), SEQUENCE (a,b), CHOICE (a|b), ALL (a&b).
+ */
+ public int getOperator() {
+ return operator;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNamedNodeMapImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNamedNodeMapImpl.java
new file mode 100644
index 0000000000..a32cdfdba6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNamedNodeMapImpl.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * 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.util.Iterator;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * An implementation of the CMNamedNodeMap interface.
+ * This class is intented to be used as a container of attribute declarations.
+ * If someone wants to use this class for other purpose, he must pay attention
+ * to the fact that this class is tolerant of the key name case. That is, this
+ * class does not distinguish "name", "NAME", and "Name" as a key name.
+ */
+class CMNamedNodeMapImpl implements org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap {
+
+ private java.util.Hashtable items = null;
+
+ /**
+ */
+ public CMNamedNodeMapImpl() {
+ super();
+ items = new java.util.Hashtable();
+ }
+
+ /**
+ * getLength method
+ * @return int
+ */
+ public int getLength() {
+ return items.size();
+ }
+
+ /**
+ * getNamedItem method
+ * @return CMNode <code>null</code> for unknown keys.
+ * @param name java.lang.String
+ */
+ public CMNode getNamedItem(String name) {
+ String cookedName = makeCanonicalForm(name);
+ if (!items.containsKey(cookedName))
+ return null;
+ return (CMNode) items.get(cookedName);
+ }
+
+ /**
+ * item method
+ * @return CMNode
+ * @param index int
+ */
+ public CMNode item(int index) {
+ Iterator iter = iterator();
+ while (iter.hasNext()) {
+ CMNode node = (CMNode) iter.next();
+ if (--index < 0)
+ return node;
+ }
+ return null;
+ }
+
+ /**
+ * @return java.util.Iterator
+ */
+ public Iterator iterator() {
+ return items.values().iterator();
+ }
+
+ /**
+ * @return java.lang.String
+ * @param rawForm java.lang.String
+ */
+ private String makeCanonicalForm(String rawForm) {
+ return rawForm.toUpperCase();
+ }
+
+ /**
+ * @param key java.lang.String
+ * @param item java.lang.String
+ */
+ void putNamedItem(String name, CMNode item) {
+ String cookedName = makeCanonicalForm(name);
+ if (items.containsKey(cookedName))
+ return; // already registered.
+ items.put(cookedName, item);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeImpl.java
new file mode 100644
index 0000000000..fb242d68e5
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeImpl.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.html.core.HTMLCMProperties;
+
+
+
+/**
+ */
+abstract class CMNodeImpl implements org.eclipse.wst.xml.core.internal.contentmodel.CMNode {
+
+ private java.lang.String name = null;
+
+ /**
+ * CMNodeImpl constructor comment.
+ */
+ public CMNodeImpl(String nm) {
+ super();
+ name = nm;
+ }
+
+ /**
+ * getNodeName method
+ * @return java.lang.String
+ */
+ public String getNodeName() {
+ return name;
+ }
+
+ /**
+ * getProperty method
+ * @return java.lang.Object
+ *
+ * Returns the object property desciped by the propertyName
+ *
+ */
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.IS_XHTML))
+ return new Boolean(false);
+ return null;
+ }
+
+ /**
+ * supports method
+ * @return boolean
+ *
+ * Returns true if the CMNode supports a specified property
+ *
+ */
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.IS_XHTML))
+ return true;
+ return false;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeListImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeListImpl.java
new file mode 100644
index 0000000000..80581b0149
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CMNodeListImpl.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Analog of dom.NodeList for CM.
+ * So, the implementation is very similar to
+ * {@link com.ibm.sed.model.xml.NodeListImpl}.<br>
+ */
+class CMNodeListImpl implements org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList {
+
+ private java.util.Vector nodes = null;
+
+ /**
+ * CMNodeListImpl constructor comment.
+ */
+ public CMNodeListImpl() {
+ super();
+ nodes = new java.util.Vector();
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ * @param node org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ protected CMNode appendNode(CMNode node) {
+ nodes.addElement(node);
+ return node;
+ }
+
+ /**
+ * getLength method
+ * @return int
+ */
+ public int getLength() {
+ return nodes.size();
+ }
+
+ /**
+ * item method
+ * @return CMNode
+ * @param index int
+ */
+ public CMNode item(int index) {
+ if (index < 0 || index >= nodes.size())
+ return null;
+ return (CMNode) nodes.elementAt(index);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinition.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinition.java
new file mode 100644
index 0000000000..a5ce36c636
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinition.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+/**
+ * This class is intended to represent a complex type definition
+ * in XML Schema.<br>
+ */
+abstract class ComplexTypeDefinition {
+
+ protected CMGroupImpl content = null;
+ protected ElementCollection collection = null;
+ protected String primaryCandidateName = null;
+
+ /**
+ * ComplexTypeDefinition constructor comment.
+ */
+ public ComplexTypeDefinition(ElementCollection elementCollection) {
+ super();
+ collection = elementCollection;
+ createContent();
+ }
+
+ /**
+ * Create an actual content model.
+ * This method should be called once and only once in the constructor.<br>
+ */
+ protected abstract void createContent();
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMGroup
+ */
+ public CMGroup getContent() {
+ return content;
+ }
+
+ /**
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ /* NOTE: Do we need LOGICAL type?
+ * -- 3/7/2001
+ */
+ public abstract int getContentType();
+
+ /**
+ * Get content hint.
+ * @return com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public HTMLElementDeclaration getPrimaryCandidate() {
+ if (primaryCandidateName == null)
+ return null;
+ return (HTMLElementDeclaration) collection.getNamedItem(primaryCandidateName);
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public abstract String getTypeName();
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinitionFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinitionFactory.java
new file mode 100644
index 0000000000..02e1081879
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ComplexTypeDefinitionFactory.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * Factory of ComplexTypeDefinition.
+ */
+final class ComplexTypeDefinitionFactory {
+
+ private static ComplexTypeDefinitionFactory instance = null;
+ private java.util.Hashtable definitions = null;
+ // constants for complex type name
+ /** for ADDRESS. */
+ public final static String CTYPE_ADDRESS = "CTYPE_ADDRESS";//$NON-NLS-1$
+ /** CDATA content. No ComplexTypeDefinition instance shuld be created. */
+ public final static String CTYPE_CDATA = "CTYPE_CDATA";//$NON-NLS-1$
+ /** col group content. COL* */
+ public final static String CTYPE_COLUMN_GROUP = "CTYPE_COLUMN_GROUP";//$NON-NLS-1$
+ /** for DL. */
+ public final static String CTYPE_DEFINITION_LIST = "CTYPE_DEFINITION_LIST";//$NON-NLS-1$
+ /** for EMBED. */
+ public final static String CTYPE_EMBED = "CTYPE_EMBED";//$NON-NLS-1$
+ /** empty content. No ComplexTypeDefinition instance should be created. */
+ public final static String CTYPE_EMPTY = "CTYPE_EMPTY";//$NON-NLS-1$
+ /** for FIELDSET. */
+ public final static String CTYPE_FIELDSET = "CTYPE_FIELDSET";//$NON-NLS-1$
+ /** for FRAMESET. */
+ public final static String CTYPE_FRAMESET = "CTYPE_FRAMESET";//$NON-NLS-1$
+ /** flow content. (%flow;)* */
+ public final static String CTYPE_FLOW_CONTAINER = "CTYPE_FLOW_CONTAINER";//$NON-NLS-1$
+ /** html content. HEAD, (FRAMESET|BODY) */
+ public final static String CTYPE_HTML = "CTYPE_HTML";//$NON-NLS-1$
+ /** head content. TITLE & ISINDEX? & BASE? */
+ public final static String CTYPE_HEAD = "CTYPE_HEAD";//$NON-NLS-1$
+ /** inline content. (%inline;)* */
+ public final static String CTYPE_INLINE_CONTAINER = "CTYPE_INLINE_CONTAINER";//$NON-NLS-1$
+ /** list item container. (LI)+ */
+ public final static String CTYPE_LI_CONTAINER = "CTYPE_LI_CONTAINER";//$NON-NLS-1$
+ /** for MAP. */
+ public final static String CTYPE_MAP = "CTYPE_MAP";//$NON-NLS-1$
+ /** noframes content. */
+ public final static String CTYPE_NOFRAMES_CONTENT = "CTYPE_NOFRAMES_CONTENT";//$NON-NLS-1$
+ /** for OPTGROUP. */
+ public final static String CTYPE_OPTION_CONTAINER = "CTYPE_OPTION_CONTAINER";//$NON-NLS-1$
+ /** param container. For OBJECT/APPLET. */
+ public final static String CTYPE_PARAM_CONTAINER = "CTYPE_PARAM_CONTAINER";//$NON-NLS-1$
+ /** PCDATA content. No ComplexTypeDefinition instance shuld be created. */
+ public final static String CTYPE_PCDATA = "CTYPE_PCDATA";//$NON-NLS-1$
+ /** for SELECT. */
+ public final static String CTYPE_SELECT = "CTYPE_SELECT";//$NON-NLS-1$
+ /** table content. CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+ */
+ public final static String CTYPE_TABLE = "CTYPE_TABLE";//$NON-NLS-1$
+ /** table cell contaier. (TH|TD)+ */
+ public final static String CTYPE_TCELL_CONTAINER = "CTYPE_TCELL_CONTAINER";//$NON-NLS-1$
+ /** table record container. (TR)+ */
+ public final static String CTYPE_TR_CONTAINER = "CTYPE_TR_CONTAINER";//$NON-NLS-1$
+
+ /**
+ * ComplexTypeDefinitionFactory constructor comment.
+ */
+ private ComplexTypeDefinitionFactory() {
+ super();
+ definitions = new java.util.Hashtable();
+ }
+
+ /**
+ * Factory method for ComplexTypeDefinition.
+ * Each instance created in this method must be registered into
+ * the map with its name.
+ * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ * @param definitionName java.lang.String
+ * @param elementCollection ElementCollection
+ */
+ public ComplexTypeDefinition createTypeDefinition(String definitionName, ElementCollection elementCollection) {
+ if (definitions.containsKey(definitionName)) {
+ return (ComplexTypeDefinition) definitions.get(definitionName);
+ }
+
+ ComplexTypeDefinition def = null;
+ if (definitionName == CTYPE_ADDRESS) {
+ def = new CtdAddress(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_DEFINITION_LIST) {
+ def = new CtdDl(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_FLOW_CONTAINER) {
+ def = new CtdFlowContainer(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_HEAD) {
+ def = new CtdHead(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_HTML) {
+ def = new CtdHtml(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_INLINE_CONTAINER) {
+ def = new CtdInlineContainer(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_LI_CONTAINER) {
+ def = new CtdLiContainer(elementCollection);
+
+
+ }
+ else if (definitionName == CTYPE_OPTION_CONTAINER) {
+ def = new CtdOptionContainer(elementCollection);
+
+ }
+ else if (definitionName == CTYPE_SELECT) {
+ def = new CtdSelect(elementCollection);
+
+ }
+ else {
+ def = null;
+ }
+ if (def == null)
+ return null; // fail to create.
+ definitions.put(definitionName, def);
+ return def;
+ }
+
+ /**
+ * For singleton.<br>
+ * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinitionFactory
+ */
+ public synchronized static ComplexTypeDefinitionFactory getInstance() {
+ if (instance != null)
+ return instance;
+ instance = new ComplexTypeDefinitionFactory();
+ return instance;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdAddress.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdAddress.java
new file mode 100644
index 0000000000..84796f4af4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdAddress.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for ADDRESS.
+ */
+final class CtdAddress extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdAddress(ElementCollection elementCollection) {
+ super(elementCollection);
+ }
+
+ /**
+ * ((%inline) | P)*.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( | )*
+ content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ // (%inline)
+ CMGroupImpl inlines = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ if (inlines == null)
+ return;
+ collection.getInline(inlines);
+ content.appendChild(inlines);
+ // P
+ CMNode p = collection.getNamedItem(CHTMLNamespace.ElementName.P);
+ if (p != null)
+ content.appendChild(p);
+ }
+
+ /**
+ * ((%inline) | P)*.
+ * Because %inline; contains #PCDATA, the type is MIXED.
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.MIXED;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_ADDRESS;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdDl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdDl.java
new file mode 100644
index 0000000000..dcfb159a3d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdDl.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for DL.
+ */
+final class CtdDl extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdDl(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = CHTMLNamespace.ElementName.DT;
+ }
+
+ /**
+ * (DT | DD)+
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( | )+
+ content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+ // DT
+ CMNode dec = collection.getNamedItem(CHTMLNamespace.ElementName.DT);
+ if (dec != null)
+ content.appendChild(dec);
+ // DD
+ dec = collection.getNamedItem(CHTMLNamespace.ElementName.DD);
+ if (dec != null)
+ content.appendChild(dec);
+ }
+
+ /**
+ * (DT | DD)+.
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_DEFINITION_LIST;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdFlowContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdFlowContainer.java
new file mode 100644
index 0000000000..99e4bf99a1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdFlowContainer.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+/**
+ * Complex type definition for containers of <code>%flow;</code>.
+ */
+final class CtdFlowContainer extends ComplexTypeDefinition {
+
+ /**
+ */
+ public CtdFlowContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ }
+
+ /**
+ * (%flow;)*
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ collection.getFlow(content);
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public int getContentType() {
+ return CMElementDeclaration.MIXED;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_FLOW_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHead.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHead.java
new file mode 100644
index 0000000000..c54ae883ac
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHead.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Complex type definition for the head content.
+ * Content Model: (TITLE & ISINDEX? & BASE?)
+ */
+final class CtdHead extends ComplexTypeDefinition {
+
+ /**
+ */
+ public CtdHead(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = CHTMLNamespace.ElementName.TITLE;
+ }
+
+ /**
+ * for HEAD.
+ * To avoid using inclusion, the content model comes from the XHTML 1.0.
+ *
+ * (%head.misc;, ((title, %head.misc;, (base, %head.misc;)?) | (base, %head.misc;, (title, %head.misc;))))
+ * And %head.misc; is:
+ * (script|style|meta|link|object|isindex)*
+ *
+ * 0: (%head.misc, A)
+ * A: (B | C)
+ * B: (title, %head.misc;, D)
+ * C: (base, %head.misc;, E)
+ * D: (base, %head.misc;)?
+ * E: (title, %head.misc;)
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // At 1st, create %head.misc; content.
+ // %head.misc;
+ // ( | )*
+ CMGroupImpl misc = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ if (misc == null)
+ return;
+ String[] names = {CHTMLNamespace.ElementName.META,};
+ collection.getDeclarations(misc, Arrays.asList(names).iterator());
+ // 2nd, get a title
+ CMNode title = collection.getNamedItem(CHTMLNamespace.ElementName.TITLE);
+ // 3rd, get a base
+ CMNode base = collection.getNamedItem(CHTMLNamespace.ElementName.BASE);
+ if (title == null || base == null)
+ return;
+
+ // Top level content is a sequence of %head.misc; and A.
+ // 0: (%head.misc;, A)
+ // create a sequence
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (content == null)
+ return;
+ // append %head.misc;
+ content.appendChild(misc);
+ // create A and append it to the top level.
+ {
+ // A is a choice of B and C.
+ // A: (B | C)
+ // create a choice
+ CMGroupImpl gA = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ if (gA == null)
+ return;
+ // append A to the top level.
+ content.appendChild(gA);
+
+ // create B and append it to A
+ {
+ // B is a sequence of title, %head.misc;, and D.
+ // B: (title, %head.misc;, D)
+ // create a sequence
+ CMGroupImpl gB = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (gB == null)
+ return;
+ // append B to A.
+ gA.appendChild(gB);
+
+ // append title to B
+ gB.appendChild(title);
+ // append %head.misc; to B
+ gB.appendChild(misc);
+ // create D and append it to B.
+ {
+ // D is a sequence of base, %head.misc;.
+ // D: (base, %head.misc;)?
+ // create a sequence
+ CMGroupImpl gD = new CMGroupImpl(CMGroup.SEQUENCE, 0, 1);
+ if (gD == null)
+ return;
+ // append D to B.
+ gB.appendChild(gD);
+
+ // append base to D
+ gD.appendChild(base);
+ // append %head.misc; to D.
+ gD.appendChild(misc);
+ }
+ }
+ // create C and append it to A
+ {
+ // C is a sequence of base, %head.misc;, and E
+ // C: (base, %head.misc;, E)
+ // create a sequence
+ CMGroupImpl gC = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (gC == null)
+ return;
+ // append C to A.
+ gA.appendChild(gC);
+
+ // append base to C
+ gC.appendChild(base);
+ // append %head.misc; to C
+ gC.appendChild(misc);
+
+ // create E and append it to C.
+ {
+ // E is a sequence of title and %head.misc;.
+ // E: (title, %head.misc;)
+ // create a sequence
+ CMGroupImpl gE = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (gE == null)
+ return;
+ // append E to C.
+ gC.appendChild(gE);
+
+ // append title to E
+ gE.appendChild(title);
+ // append %head.misc; to E.
+ gE.appendChild(misc);
+ }
+ }
+ }
+ }
+
+ /**
+ * Element content.<br>
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_HEAD;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHtml.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHtml.java
new file mode 100644
index 0000000000..5887c64928
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdHtml.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Complex type definition for <code>HTML</code>.<br>
+ * Content Model:
+ * HEAD, (FRAMESET|BODY)<br>
+ */
+final class CtdHtml extends ComplexTypeDefinition {
+
+ /**
+ */
+ public CtdHtml(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = CHTMLNamespace.ElementName.HEAD;
+ }
+
+ /**
+ * (%html.content;).
+ * %html.content; is HEAD, (FRAMESET | BODY).
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( )
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, 1);
+ if (content == null)
+ return;
+
+ // HEAD
+ CMNode edec = collection.getNamedItem(CHTMLNamespace.ElementName.HEAD);
+ if (edec != null)
+ content.appendChild(edec);
+
+ // ( | )
+ CMGroupImpl group = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ content.appendChild(group);
+
+ // FRAMESET, BODY
+ String[] names = {CHTMLNamespace.ElementName.BODY};
+ collection.getDeclarations(group, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * Element content.
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_HTML;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdInlineContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdInlineContainer.java
new file mode 100644
index 0000000000..92293d4603
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdInlineContainer.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+/**
+ * Complex type definition for (%inline;)*.
+ */
+final class CtdInlineContainer extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdInlineContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ }
+
+ /**
+ * (%inline)*.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ content = new CMGroupImpl(CMGroup.CHOICE, 0, CMContentImpl.UNBOUNDED);
+ collection.getInline(content);
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public int getContentType() {
+ return CMElementDeclaration.MIXED;
+ }
+
+ /**
+ * @see com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_INLINE_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdLiContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdLiContainer.java
new file mode 100644
index 0000000000..8e4716a019
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdLiContainer.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * List item container.
+ * (LI)+
+ */
+final class CtdLiContainer extends ComplexTypeDefinition {
+
+ /**
+ * @param elemenCollection ElementCollection
+ */
+ public CtdLiContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = CHTMLNamespace.ElementName.LI;
+ }
+
+ /**
+ * (LI)+.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // (LI)+
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED);
+ CMNode li = collection.getNamedItem(CHTMLNamespace.ElementName.LI);
+ if (li != null)
+ content.appendChild(li);
+ }
+
+ /**
+ * ELEMENT content.<br>
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_LI_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdOptionContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdOptionContainer.java
new file mode 100644
index 0000000000..b1e0a5496c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdOptionContainer.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * OPTION container.
+ * (OPTION)+
+ */
+final class CtdOptionContainer extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdOptionContainer(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = CHTMLNamespace.ElementName.OPTION;
+ }
+
+ /**
+ * (OPTION)+.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( )+
+ content = new CMGroupImpl(CMGroup.SEQUENCE, 1, CMContentImpl.UNBOUNDED);
+ // OPTION
+ CMNode dec = collection.getNamedItem(CHTMLNamespace.ElementName.OPTION);
+ if (dec != null)
+ content.appendChild(dec);
+ }
+
+ /**
+ * (OPTION)+
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * Name of complex type definition.
+ * Each singleton must know its own name.
+ * All names should be defined in
+ * {@link <code>ComplexTypeDefinitionFactory</code>} as constants.<br>
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_OPTION_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdSelect.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdSelect.java
new file mode 100644
index 0000000000..cc0d61ed69
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/CtdSelect.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * for SELECT.
+ */
+final class CtdSelect extends ComplexTypeDefinition {
+
+ /**
+ * @param elementCollection ElementCollection
+ */
+ public CtdSelect(ElementCollection elementCollection) {
+ super(elementCollection);
+ primaryCandidateName = CHTMLNamespace.ElementName.OPTION;
+ }
+
+ /**
+ * (OPTGROUP | OPTION)+.
+ */
+ protected void createContent() {
+ if (content != null)
+ return; // already created.
+ if (collection == null)
+ return;
+
+ // ( | )+
+ content = new CMGroupImpl(CMGroup.CHOICE, 1, CMContentImpl.UNBOUNDED);
+ // OPTION
+ CMNode dec = collection.getNamedItem(CHTMLNamespace.ElementName.OPTION);
+ if (dec != null)
+ content.appendChild(dec);
+ }
+
+ /**
+ * (OPTGROUP | OPTION)+.
+ * @return int; Should be one of ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA,
+ * those are defined in CMElementDeclaration.
+ */
+ public int getContentType() {
+ return CMElementDeclaration.ELEMENT;
+ }
+
+ /**
+ * @return java.lang.String
+ */
+ public String getTypeName() {
+ return ComplexTypeDefinitionFactory.CTYPE_SELECT;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/DeclCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/DeclCollection.java
new file mode 100644
index 0000000000..30b6beaa58
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/DeclCollection.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * 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.util.HashMap;
+import java.util.Iterator;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ */
+abstract class DeclCollection implements CMNamedNodeMap {
+
+
+ protected class DualMap {
+ public DualMap() {
+ super();
+ }
+
+ public DualMap(Object[] objects) {
+ super();
+ initialize(objects);
+ }
+
+ public int size() {
+ return table.length;
+ }
+
+ public Object getValue(int key) {
+ if (!isValidIndex(key))
+ return null;
+ return table[key];
+ }
+
+ public int getKey(Object value) {
+ Integer keyObj = (Integer) map.get(value);
+ if (keyObj == null)
+ return ID_UNKNOWN;
+ return keyObj.intValue();
+ }
+
+ protected void initialize(Object[] objects) {
+ if (objects == null)
+ return;
+ table = objects;
+ map = new HashMap();
+ for (int key = 0; key < objects.length; key++) {
+ Object value = table[key];
+ map.put(value, new Integer(key));
+ }
+ }
+
+ private Object[] table = null;
+ private HashMap map = null;
+
+ private boolean isValidIndex(int index) {
+ return index >= 0 && index < table.length;
+ }
+ }
+
+ protected class TolerantStringDualMap extends DualMap {
+ public TolerantStringDualMap(String[] names) {
+ super();
+ Object[] objects = new Object[names.length];
+ for (int i = 0; i < names.length; i++) {
+ objects[i] = makeCanonicalForm(names[i]);
+ }
+ initialize(objects);
+ }
+
+ public int getKey(Object value) {
+ try {
+ String name = (String) value;
+ return super.getKey(makeCanonicalForm(name));
+ }
+ catch (ClassCastException e) {
+ return ID_UNKNOWN;
+ }
+ }
+
+ private String makeCanonicalForm(String raw) {
+ return raw.toUpperCase();
+ }
+ }
+
+ private class DeclIterator implements Iterator {
+ public DeclIterator() {
+ maxid = fDecls.length - 1;
+ }
+
+ public boolean hasNext() {
+ return id < maxid;
+ }
+
+ public Object next() {
+ if (!hasNext())
+ return null;
+ return item(++id);
+ }
+
+ public void remove() { /* nothing should be done. */
+ }
+
+ private int id = -1;
+ private int maxid = -1;
+ }
+
+ CMNode[] fDecls = null;
+ protected final static boolean STRICT_CASE = false;
+ protected final static boolean TOLERANT_CASE = true;
+ protected final static int ID_UNKNOWN = -1;
+ private DualMap fMap = null;
+
+ /**
+ */
+ public DeclCollection(String[] names, boolean tolerant) {
+ super();
+ fDecls = new CMNode[names.length];
+ if (tolerant) {
+ fMap = new TolerantStringDualMap(names);
+ }
+ else {
+ fMap = new DualMap(names);
+ }
+ }
+
+ /**
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ * @param id int
+ */
+ protected abstract CMNode create(String name);
+
+ /**
+ */
+ public CMNamedNodeMap getDeclarations(String[] names) {
+ CMNamedNodeMapImpl map = new CMNamedNodeMapImpl();
+ for (int i = 0; i < names.length; i++) {
+ String name = names[i];
+ CMNode node = getNamedItem(name);
+ if (node == null)
+ continue;
+ map.putNamedItem(name, node);
+ }
+ return map;
+ }
+
+ /**
+ * @param declarations com.ibm.sed.contentmodel.html.CMGroupImpl
+ * @param names java.util.Iterator
+ */
+ public void getDeclarations(CMGroupImpl group, Iterator names) {
+ while (names.hasNext()) {
+ String entityName = (String) names.next();
+ CMNode dec = getNamedItem(entityName);
+ if (dec != null)
+ group.appendChild(dec);
+ }
+ }
+
+ /**
+ * Map name to id.
+ * @return int
+ * @param name java.lang.String
+ */
+ protected int getID(String name) {
+ return fMap.getKey(name);
+ }
+
+ /**
+ * getLength method
+ * @return int
+ */
+ public int getLength() {
+ return fDecls.length;
+ }
+
+ /**
+ * @return java.lang.String
+ * @param id int
+ */
+ protected String getName(int id) {
+ return (String) fMap.getValue(id);
+ }
+
+ /**
+ * getNamedItem method
+ * @return CMNode
+ * @param name java.lang.String
+ */
+ public CMNode getNamedItem(String name) {
+ int id = getID(name);
+ if (!isValidID(id))
+ return null;
+ return item(id);
+ }
+
+ /**
+ * @return boolean
+ * @param id int
+ */
+ private boolean isValidID(int id) {
+ return id >= 0 && id < fDecls.length;
+ }
+
+ /**
+ * item method
+ * @return CMNode
+ * @param index int
+ */
+ public CMNode item(int index) {
+ if (!isValidID(index))
+ return null;
+ CMNode decl = fDecls[index];
+ if (decl != null)
+ return decl; // already exist.
+
+ decl = create(getName(index));
+ fDecls[index] = decl;
+ return decl;
+ }
+
+ /**
+ */
+ public Iterator iterator() {
+ return new DeclIterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ElementCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ElementCollection.java
new file mode 100644
index 0000000000..826be12f3b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/ElementCollection.java
@@ -0,0 +1,495 @@
+/*******************************************************************************
+ * 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.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;
+ }
+
+ /**
+ * @return com.ibm.sed.contentmodel.html.AttributeCollection
+ */
+ 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());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/EntityCollection.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/EntityCollection.java
new file mode 100644
index 0000000000..fe0ae2803c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/EntityCollection.java
@@ -0,0 +1,837 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Factory for entity declarations.
+ */
+final class EntityCollection extends DeclCollection implements org.eclipse.wst.html.core.HTML40Namespace.EntityName {
+
+
+ private static class Ids {
+ public static final int ID_AACUTE_L = 0;
+ public static final int ID_AACUTE_U = 1;
+ public static final int ID_ACIRC_L = 2;
+ public static final int ID_ACIRC_U = 3;
+ public static final int ID_ACUTE = 4;
+ public static final int ID_AELIG_L = 5;
+ public static final int ID_AELIG_U = 6;
+ public static final int ID_AGRAVE_L = 7;
+ public static final int ID_AGRAVE_U = 8;
+ public static final int ID_ALEFSYM = 9;
+ public static final int ID_ALPHA_L = 10;
+ public static final int ID_ALPHA_U = 11;
+ public static final int ID_AMP = 12;
+ public static final int ID_AND = 13;
+ public static final int ID_ANG = 14;
+ public static final int ID_ARING_L = 15;
+ public static final int ID_ARING_U = 16;
+ public static final int ID_ASYMP = 17;
+ public static final int ID_ATILDE_L = 18;
+ public static final int ID_ATILDE_U = 19;
+ public static final int ID_AUML_L = 20;
+ public static final int ID_AUML_U = 21;
+ public static final int ID_BDQUO = 22;
+ public static final int ID_BETA_L = 23;
+ public static final int ID_BETA_U = 24;
+ public static final int ID_BRVBAR = 25;
+ public static final int ID_BULL = 26;
+ public static final int ID_CAP = 27;
+ public static final int ID_CCEDIL_L = 28;
+ public static final int ID_CCEDIL_U = 29;
+ public static final int ID_CEDIL = 30;
+ public static final int ID_CENT = 31;
+ public static final int ID_CHI_L = 32;
+ public static final int ID_CHI_U = 33;
+ public static final int ID_CIRC = 34;
+ public static final int ID_CLUBS = 35;
+ public static final int ID_CONG = 36;
+ public static final int ID_COPY = 37;
+ public static final int ID_CRARR = 38;
+ public static final int ID_CUP = 39;
+ public static final int ID_CURREN = 40;
+ public static final int ID_DAGGER_L = 41;
+ public static final int ID_DAGGER_U = 42;
+ public static final int ID_DARR_L = 43;
+ public static final int ID_DARR_U = 44;
+ public static final int ID_DEG = 45;
+ public static final int ID_DELTA_L = 46;
+ public static final int ID_DELTA_U = 47;
+ public static final int ID_DIAMS = 48;
+ public static final int ID_DIVIDE = 49;
+ public static final int ID_EACUTE_L = 50;
+ public static final int ID_EACUTE_U = 51;
+ public static final int ID_ECIRC_L = 52;
+ public static final int ID_ECIRC_U = 53;
+ public static final int ID_EGRAVE_L = 54;
+ public static final int ID_EGRAVE_U = 55;
+ public static final int ID_EMPTY = 56;
+ public static final int ID_EMSP = 57;
+ public static final int ID_ENSP = 58;
+ public static final int ID_EPSILON_L = 59;
+ public static final int ID_EPSILON_U = 60;
+ public static final int ID_EQUIV = 61;
+ public static final int ID_ETA_L = 62;
+ public static final int ID_ETA_U = 63;
+ public static final int ID_ETH_L = 64;
+ public static final int ID_ETH_U = 65;
+ public static final int ID_EUML_L = 66;
+ public static final int ID_EUML_U = 67;
+ public static final int ID_EURO = 68;
+ public static final int ID_EXIST = 69;
+ public static final int ID_FNOF = 70;
+ public static final int ID_FORALL = 71;
+ public static final int ID_FRAC12 = 72;
+ public static final int ID_FRAC14 = 73;
+ public static final int ID_FRAC34 = 74;
+ public static final int ID_FRASL = 75;
+ public static final int ID_GAMMA_L = 76;
+ public static final int ID_GAMMA_U = 77;
+ public static final int ID_GE = 78;
+ public static final int ID_GT = 79;
+ public static final int ID_HARR_L = 80;
+ public static final int ID_HARR_U = 81;
+ public static final int ID_HEARTS = 82;
+ public static final int ID_HELLIP = 83;
+ public static final int ID_IACUTE_L = 84;
+ public static final int ID_IACUTE_U = 85;
+ public static final int ID_ICIRC_L = 86;
+ public static final int ID_ICIRC_U = 87;
+ public static final int ID_IEXCL = 88;
+ public static final int ID_IGRAVE_L = 89;
+ public static final int ID_IGRAVE_U = 90;
+ public static final int ID_IMAGE = 91;
+ public static final int ID_INFIN = 92;
+ public static final int ID_INT = 93;
+ public static final int ID_IOTA_L = 94;
+ public static final int ID_IOTA_U = 95;
+ public static final int ID_IQUEST = 96;
+ public static final int ID_ISIN = 97;
+ public static final int ID_IUML_L = 98;
+ public static final int ID_IUML_U = 99;
+ public static final int ID_KAPPA_L = 100;
+ public static final int ID_KAPPA_U = 101;
+ public static final int ID_LAMBDA_L = 102;
+ public static final int ID_LAMBDA_U = 103;
+ public static final int ID_LANG = 104;
+ public static final int ID_LAQUO = 105;
+ public static final int ID_LARR_L = 106;
+ public static final int ID_LARR_U = 107;
+ public static final int ID_LCEIL = 108;
+ public static final int ID_LDQUO = 109;
+ public static final int ID_LE = 110;
+ public static final int ID_LFLOOR = 111;
+ public static final int ID_LOWAST = 112;
+ public static final int ID_LOZ = 113;
+ public static final int ID_LRM = 114;
+ public static final int ID_LSAQUO = 115;
+ public static final int ID_LSQUO = 116;
+ public static final int ID_LT = 117;
+ public static final int ID_MACR = 118;
+ public static final int ID_MDASH = 119;
+ public static final int ID_MICRO = 120;
+ public static final int ID_MIDDOT = 121;
+ public static final int ID_MINUS = 122;
+ public static final int ID_MU_L = 123;
+ public static final int ID_MU_U = 124;
+ public static final int ID_NABLA = 125;
+ public static final int ID_NBSP = 126;
+ public static final int ID_NDASH = 127;
+ public static final int ID_NE = 128;
+ public static final int ID_NI = 129;
+ public static final int ID_NOT = 130;
+ public static final int ID_NOTIN = 131;
+ public static final int ID_NSUB = 132;
+ public static final int ID_NTILDE_L = 133;
+ public static final int ID_NTILDE_U = 134;
+ public static final int ID_NU_L = 135;
+ public static final int ID_NU_U = 136;
+ public static final int ID_OACUTE_L = 137;
+ public static final int ID_OACUTE_U = 138;
+ public static final int ID_OCIRC_L = 139;
+ public static final int ID_OCIRC_U = 140;
+ public static final int ID_OELIG_L = 141;
+ public static final int ID_OELIG_U = 142;
+ public static final int ID_OGRAVE_L = 143;
+ public static final int ID_OGRAVE_U = 144;
+ public static final int ID_OLINE = 145;
+ public static final int ID_OMEGA_L = 146;
+ public static final int ID_OMEGA_U = 147;
+ public static final int ID_OMICRON_L = 148;
+ public static final int ID_OMICRON_U = 149;
+ public static final int ID_OPLUS = 150;
+ public static final int ID_OR = 151;
+ public static final int ID_ORDF = 152;
+ public static final int ID_ORDM = 153;
+ public static final int ID_OSLASH_L = 154;
+ public static final int ID_OSLASH_U = 155;
+ public static final int ID_OTILDE_L = 156;
+ public static final int ID_OTILDE_U = 157;
+ public static final int ID_OTIMES = 158;
+ public static final int ID_OUML_L = 159;
+ public static final int ID_OUML_U = 160;
+ public static final int ID_PARA = 161;
+ public static final int ID_PART = 162;
+ public static final int ID_PERMIL = 163;
+ public static final int ID_PERP = 164;
+ public static final int ID_PHI_L = 165;
+ public static final int ID_PHI_U = 166;
+ public static final int ID_PIV = 167;
+ public static final int ID_PI_L = 168;
+ public static final int ID_PI_U = 169;
+ public static final int ID_PLUSMN = 170;
+ public static final int ID_POUND = 171;
+ public static final int ID_PRIME_L = 172;
+ public static final int ID_PRIME_U = 173;
+ public static final int ID_PROD = 174;
+ public static final int ID_PROP = 175;
+ public static final int ID_PSI_L = 176;
+ public static final int ID_PSI_U = 177;
+ public static final int ID_QUOT = 178;
+ public static final int ID_RADIC = 179;
+ public static final int ID_RANG = 180;
+ public static final int ID_RAQUO = 181;
+ public static final int ID_RARR_L = 182;
+ public static final int ID_RARR_U = 183;
+ public static final int ID_RCEIL = 184;
+ public static final int ID_RDQUO = 185;
+ public static final int ID_REAL = 186;
+ public static final int ID_REG = 187;
+ public static final int ID_RFLOOR = 188;
+ public static final int ID_RHO_L = 189;
+ public static final int ID_RHO_U = 190;
+ public static final int ID_RLM = 191;
+ public static final int ID_RSAQUO = 192;
+ public static final int ID_RSQUO = 193;
+ public static final int ID_SBQUO = 194;
+ public static final int ID_SCARON_L = 195;
+ public static final int ID_SCARON_U = 196;
+ public static final int ID_SDOT = 197;
+ public static final int ID_SECT = 198;
+ public static final int ID_SHY = 199;
+ public static final int ID_SIGMAF = 200;
+ public static final int ID_SIGMA_L = 201;
+ public static final int ID_SIGMA_U = 202;
+ public static final int ID_SIM = 203;
+ public static final int ID_SPADES = 204;
+ public static final int ID_SUB = 205;
+ public static final int ID_SUBE = 206;
+ public static final int ID_SUM = 207;
+ public static final int ID_SUP = 208;
+ public static final int ID_SUP1 = 209;
+ public static final int ID_SUP2 = 210;
+ public static final int ID_SUP3 = 211;
+ public static final int ID_SUPE = 212;
+ public static final int ID_SZLIG = 213;
+ public static final int ID_TAU_L = 214;
+ public static final int ID_TAU_U = 215;
+ public static final int ID_THERE4 = 216;
+ public static final int ID_THETASYM = 217;
+ public static final int ID_THETA_L = 218;
+ public static final int ID_THETA_U = 219;
+ public static final int ID_THINSP = 220;
+ public static final int ID_THORN_L = 221;
+ public static final int ID_THORN_U = 222;
+ public static final int ID_TILDE = 223;
+ public static final int ID_TIMES = 224;
+ public static final int ID_TRADE = 225;
+ public static final int ID_UACUTE_L = 226;
+ public static final int ID_UACUTE_U = 227;
+ public static final int ID_UARR_L = 228;
+ public static final int ID_UARR_U = 229;
+ public static final int ID_UCIRC_L = 230;
+ public static final int ID_UCIRC_U = 231;
+ public static final int ID_UGRAVE_L = 232;
+ public static final int ID_UGRAVE_U = 233;
+ public static final int ID_UML = 234;
+ public static final int ID_UPSIH = 235;
+ public static final int ID_UPSILON_L = 236;
+ public static final int ID_UPSILON_U = 237;
+ public static final int ID_UUML_L = 238;
+ public static final int ID_UUML_U = 239;
+ public static final int ID_WEIERP = 240;
+ public static final int ID_XI_L = 241;
+ public static final int ID_XI_U = 242;
+ public static final int ID_YACUTE_L = 243;
+ public static final int ID_YACUTE_U = 244;
+ public static final int ID_YEN = 245;
+ public static final int ID_YUML_L = 246;
+ public static final int ID_YUML_U = 247;
+ public static final int ID_ZETA_L = 248;
+ public static final int ID_ZETA_U = 249;
+ public static final int ID_ZWJ = 250;
+ public static final int ID_ZWNJ = 251;
+
+ 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 252.
+ // -- 5/24/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;
+ }
+
+ private static String[] names = null;
+
+ static {
+ names = new String[Ids.getNumOfIds()];
+ names[Ids.ID_AACUTE_L] = AACUTE_L;
+ names[Ids.ID_AACUTE_U] = AACUTE_U;
+ names[Ids.ID_ACIRC_L] = ACIRC_L;
+ names[Ids.ID_ACIRC_U] = ACIRC_U;
+ names[Ids.ID_ACUTE] = ACUTE;
+ names[Ids.ID_AELIG_L] = AELIG_L;
+ names[Ids.ID_AELIG_U] = AELIG_U;
+ names[Ids.ID_AGRAVE_L] = AGRAVE_L;
+ names[Ids.ID_AGRAVE_U] = AGRAVE_U;
+ names[Ids.ID_ALEFSYM] = ALEFSYM;
+ names[Ids.ID_ALPHA_L] = ALPHA_L;
+ names[Ids.ID_ALPHA_U] = ALPHA_U;
+ names[Ids.ID_AMP] = AMP;
+ names[Ids.ID_AND] = AND;
+ names[Ids.ID_ANG] = ANG;
+ names[Ids.ID_ARING_L] = ARING_L;
+ names[Ids.ID_ARING_U] = ARING_U;
+ names[Ids.ID_ASYMP] = ASYMP;
+ names[Ids.ID_ATILDE_L] = ATILDE_L;
+ names[Ids.ID_ATILDE_U] = ATILDE_U;
+ names[Ids.ID_AUML_L] = AUML_L;
+ names[Ids.ID_AUML_U] = AUML_U;
+ names[Ids.ID_BDQUO] = BDQUO;
+ names[Ids.ID_BETA_L] = BETA_L;
+ names[Ids.ID_BETA_U] = BETA_U;
+ names[Ids.ID_BRVBAR] = BRVBAR;
+ names[Ids.ID_BULL] = BULL;
+ names[Ids.ID_CAP] = CAP;
+ names[Ids.ID_CCEDIL_L] = CCEDIL_L;
+ names[Ids.ID_CCEDIL_U] = CCEDIL_U;
+ names[Ids.ID_CEDIL] = CEDIL;
+ names[Ids.ID_CENT] = CENT;
+ names[Ids.ID_CHI_L] = CHI_L;
+ names[Ids.ID_CHI_U] = CHI_U;
+ names[Ids.ID_CIRC] = CIRC;
+ names[Ids.ID_CLUBS] = CLUBS;
+ names[Ids.ID_CONG] = CONG;
+ names[Ids.ID_COPY] = COPY;
+ names[Ids.ID_CRARR] = CRARR;
+ names[Ids.ID_CUP] = CUP;
+ names[Ids.ID_CURREN] = CURREN;
+ names[Ids.ID_DAGGER_L] = DAGGER_L;
+ names[Ids.ID_DAGGER_U] = DAGGER_U;
+ names[Ids.ID_DARR_L] = DARR_L;
+ names[Ids.ID_DARR_U] = DARR_U;
+ names[Ids.ID_DEG] = DEG;
+ names[Ids.ID_DELTA_L] = DELTA_L;
+ names[Ids.ID_DELTA_U] = DELTA_U;
+ names[Ids.ID_DIAMS] = DIAMS;
+ names[Ids.ID_DIVIDE] = DIVIDE;
+ names[Ids.ID_EACUTE_L] = EACUTE_L;
+ names[Ids.ID_EACUTE_U] = EACUTE_U;
+ names[Ids.ID_ECIRC_L] = ECIRC_L;
+ names[Ids.ID_ECIRC_U] = ECIRC_U;
+ names[Ids.ID_EGRAVE_L] = EGRAVE_L;
+ names[Ids.ID_EGRAVE_U] = EGRAVE_U;
+ names[Ids.ID_EMPTY] = EMPTY;
+ names[Ids.ID_EMSP] = EMSP;
+ names[Ids.ID_ENSP] = ENSP;
+ names[Ids.ID_EPSILON_L] = EPSILON_L;
+ names[Ids.ID_EPSILON_U] = EPSILON_U;
+ names[Ids.ID_EQUIV] = EQUIV;
+ names[Ids.ID_ETA_L] = ETA_L;
+ names[Ids.ID_ETA_U] = ETA_U;
+ names[Ids.ID_ETH_L] = ETH_L;
+ names[Ids.ID_ETH_U] = ETH_U;
+ names[Ids.ID_EUML_L] = EUML_L;
+ names[Ids.ID_EUML_U] = EUML_U;
+ names[Ids.ID_EURO] = EURO;
+ names[Ids.ID_EXIST] = EXIST;
+ names[Ids.ID_FNOF] = FNOF;
+ names[Ids.ID_FORALL] = FORALL;
+ names[Ids.ID_FRAC12] = FRAC12;
+ names[Ids.ID_FRAC14] = FRAC14;
+ names[Ids.ID_FRAC34] = FRAC34;
+ names[Ids.ID_FRASL] = FRASL;
+ names[Ids.ID_GAMMA_L] = GAMMA_L;
+ names[Ids.ID_GAMMA_U] = GAMMA_U;
+ names[Ids.ID_GE] = GE;
+ names[Ids.ID_GT] = GT;
+ names[Ids.ID_HARR_L] = HARR_L;
+ names[Ids.ID_HARR_U] = HARR_U;
+ names[Ids.ID_HEARTS] = HEARTS;
+ names[Ids.ID_HELLIP] = HELLIP;
+ names[Ids.ID_IACUTE_L] = IACUTE_L;
+ names[Ids.ID_IACUTE_U] = IACUTE_U;
+ names[Ids.ID_ICIRC_L] = ICIRC_L;
+ names[Ids.ID_ICIRC_U] = ICIRC_U;
+ names[Ids.ID_IEXCL] = IEXCL;
+ names[Ids.ID_IGRAVE_L] = IGRAVE_L;
+ names[Ids.ID_IGRAVE_U] = IGRAVE_U;
+ names[Ids.ID_IMAGE] = IMAGE;
+ names[Ids.ID_INFIN] = INFIN;
+ names[Ids.ID_INT] = INT;
+ names[Ids.ID_IOTA_L] = IOTA_L;
+ names[Ids.ID_IOTA_U] = IOTA_U;
+ names[Ids.ID_IQUEST] = IQUEST;
+ names[Ids.ID_ISIN] = ISIN;
+ names[Ids.ID_IUML_L] = IUML_L;
+ names[Ids.ID_IUML_U] = IUML_U;
+ names[Ids.ID_KAPPA_L] = KAPPA_L;
+ names[Ids.ID_KAPPA_U] = KAPPA_U;
+ names[Ids.ID_LAMBDA_L] = LAMBDA_L;
+ names[Ids.ID_LAMBDA_U] = LAMBDA_U;
+ names[Ids.ID_LANG] = LANG;
+ names[Ids.ID_LAQUO] = LAQUO;
+ names[Ids.ID_LARR_L] = LARR_L;
+ names[Ids.ID_LARR_U] = LARR_U;
+ names[Ids.ID_LCEIL] = LCEIL;
+ names[Ids.ID_LDQUO] = LDQUO;
+ names[Ids.ID_LE] = LE;
+ names[Ids.ID_LFLOOR] = LFLOOR;
+ names[Ids.ID_LOWAST] = LOWAST;
+ names[Ids.ID_LOZ] = LOZ;
+ names[Ids.ID_LRM] = LRM;
+ names[Ids.ID_LSAQUO] = LSAQUO;
+ names[Ids.ID_LSQUO] = LSQUO;
+ names[Ids.ID_LT] = LT;
+ names[Ids.ID_MACR] = MACR;
+ names[Ids.ID_MDASH] = MDASH;
+ names[Ids.ID_MICRO] = MICRO;
+ names[Ids.ID_MIDDOT] = MIDDOT;
+ names[Ids.ID_MINUS] = MINUS;
+ names[Ids.ID_MU_L] = MU_L;
+ names[Ids.ID_MU_U] = MU_U;
+ names[Ids.ID_NABLA] = NABLA;
+ names[Ids.ID_NBSP] = NBSP;
+ names[Ids.ID_NDASH] = NDASH;
+ names[Ids.ID_NE] = NE;
+ names[Ids.ID_NI] = NI;
+ names[Ids.ID_NOT] = NOT;
+ names[Ids.ID_NOTIN] = NOTIN;
+ names[Ids.ID_NSUB] = NSUB;
+ names[Ids.ID_NTILDE_L] = NTILDE_L;
+ names[Ids.ID_NTILDE_U] = NTILDE_U;
+ names[Ids.ID_NU_L] = NU_L;
+ names[Ids.ID_NU_U] = NU_U;
+ names[Ids.ID_OACUTE_L] = OACUTE_L;
+ names[Ids.ID_OACUTE_U] = OACUTE_U;
+ names[Ids.ID_OCIRC_L] = OCIRC_L;
+ names[Ids.ID_OCIRC_U] = OCIRC_U;
+ names[Ids.ID_OELIG_L] = OELIG_L;
+ names[Ids.ID_OELIG_U] = OELIG_U;
+ names[Ids.ID_OGRAVE_L] = OGRAVE_L;
+ names[Ids.ID_OGRAVE_U] = OGRAVE_U;
+ names[Ids.ID_OLINE] = OLINE;
+ names[Ids.ID_OMEGA_L] = OMEGA_L;
+ names[Ids.ID_OMEGA_U] = OMEGA_U;
+ names[Ids.ID_OMICRON_L] = OMICRON_L;
+ names[Ids.ID_OMICRON_U] = OMICRON_U;
+ names[Ids.ID_OPLUS] = OPLUS;
+ names[Ids.ID_OR] = OR;
+ names[Ids.ID_ORDF] = ORDF;
+ names[Ids.ID_ORDM] = ORDM;
+ names[Ids.ID_OSLASH_L] = OSLASH_L;
+ names[Ids.ID_OSLASH_U] = OSLASH_U;
+ names[Ids.ID_OTILDE_L] = OTILDE_L;
+ names[Ids.ID_OTILDE_U] = OTILDE_U;
+ names[Ids.ID_OTIMES] = OTIMES;
+ names[Ids.ID_OUML_L] = OUML_L;
+ names[Ids.ID_OUML_U] = OUML_U;
+ names[Ids.ID_PARA] = PARA;
+ names[Ids.ID_PART] = PART;
+ names[Ids.ID_PERMIL] = PERMIL;
+ names[Ids.ID_PERP] = PERP;
+ names[Ids.ID_PHI_L] = PHI_L;
+ names[Ids.ID_PHI_U] = PHI_U;
+ names[Ids.ID_PIV] = PIV;
+ names[Ids.ID_PI_L] = PI_L;
+ names[Ids.ID_PI_U] = PI_U;
+ names[Ids.ID_PLUSMN] = PLUSMN;
+ names[Ids.ID_POUND] = POUND;
+ names[Ids.ID_PRIME_L] = PRIME_L;
+ names[Ids.ID_PRIME_U] = PRIME_U;
+ names[Ids.ID_PROD] = PROD;
+ names[Ids.ID_PROP] = PROP;
+ names[Ids.ID_PSI_L] = PSI_L;
+ names[Ids.ID_PSI_U] = PSI_U;
+ names[Ids.ID_QUOT] = QUOT;
+ names[Ids.ID_RADIC] = RADIC;
+ names[Ids.ID_RANG] = RANG;
+ names[Ids.ID_RAQUO] = RAQUO;
+ names[Ids.ID_RARR_L] = RARR_L;
+ names[Ids.ID_RARR_U] = RARR_U;
+ names[Ids.ID_RCEIL] = RCEIL;
+ names[Ids.ID_RDQUO] = RDQUO;
+ names[Ids.ID_REAL] = REAL;
+ names[Ids.ID_REG] = REG;
+ names[Ids.ID_RFLOOR] = RFLOOR;
+ names[Ids.ID_RHO_L] = RHO_L;
+ names[Ids.ID_RHO_U] = RHO_U;
+ names[Ids.ID_RLM] = RLM;
+ names[Ids.ID_RSAQUO] = RSAQUO;
+ names[Ids.ID_RSQUO] = RSQUO;
+ names[Ids.ID_SBQUO] = SBQUO;
+ names[Ids.ID_SCARON_L] = SCARON_L;
+ names[Ids.ID_SCARON_U] = SCARON_U;
+ names[Ids.ID_SDOT] = SDOT;
+ names[Ids.ID_SECT] = SECT;
+ names[Ids.ID_SHY] = SHY;
+ names[Ids.ID_SIGMAF] = SIGMAF;
+ names[Ids.ID_SIGMA_L] = SIGMA_L;
+ names[Ids.ID_SIGMA_U] = SIGMA_U;
+ names[Ids.ID_SIM] = SIM;
+ names[Ids.ID_SPADES] = SPADES;
+ names[Ids.ID_SUB] = SUB;
+ names[Ids.ID_SUBE] = SUBE;
+ names[Ids.ID_SUM] = SUM;
+ names[Ids.ID_SUP] = SUP;
+ names[Ids.ID_SUP1] = SUP1;
+ names[Ids.ID_SUP2] = SUP2;
+ names[Ids.ID_SUP3] = SUP3;
+ names[Ids.ID_SUPE] = SUPE;
+ names[Ids.ID_SZLIG] = SZLIG;
+ names[Ids.ID_TAU_L] = TAU_L;
+ names[Ids.ID_TAU_U] = TAU_U;
+ names[Ids.ID_THERE4] = THERE4;
+ names[Ids.ID_THETASYM] = THETASYM;
+ names[Ids.ID_THETA_L] = THETA_L;
+ names[Ids.ID_THETA_U] = THETA_U;
+ names[Ids.ID_THINSP] = THINSP;
+ names[Ids.ID_THORN_L] = THORN_L;
+ names[Ids.ID_THORN_U] = THORN_U;
+ names[Ids.ID_TILDE] = TILDE;
+ names[Ids.ID_TIMES] = TIMES;
+ names[Ids.ID_TRADE] = TRADE;
+ names[Ids.ID_UACUTE_L] = UACUTE_L;
+ names[Ids.ID_UACUTE_U] = UACUTE_U;
+ names[Ids.ID_UARR_L] = UARR_L;
+ names[Ids.ID_UARR_U] = UARR_U;
+ names[Ids.ID_UCIRC_L] = UCIRC_L;
+ names[Ids.ID_UCIRC_U] = UCIRC_U;
+ names[Ids.ID_UGRAVE_L] = UGRAVE_L;
+ names[Ids.ID_UGRAVE_U] = UGRAVE_U;
+ names[Ids.ID_UML] = UML;
+ names[Ids.ID_UPSIH] = UPSIH;
+ names[Ids.ID_UPSILON_L] = UPSILON_L;
+ names[Ids.ID_UPSILON_U] = UPSILON_U;
+ names[Ids.ID_UUML_L] = UUML_L;
+ names[Ids.ID_UUML_U] = UUML_U;
+ names[Ids.ID_WEIERP] = WEIERP;
+ names[Ids.ID_XI_L] = XI_L;
+ names[Ids.ID_XI_U] = XI_U;
+ names[Ids.ID_YACUTE_L] = YACUTE_L;
+ names[Ids.ID_YACUTE_U] = YACUTE_U;
+ names[Ids.ID_YEN] = YEN;
+ names[Ids.ID_YUML_L] = YUML_L;
+ names[Ids.ID_YUML_U] = YUML_U;
+ names[Ids.ID_ZETA_L] = ZETA_L;
+ names[Ids.ID_ZETA_U] = ZETA_U;
+ names[Ids.ID_ZWJ] = ZWJ;
+ names[Ids.ID_ZWNJ] = ZWNJ;
+ }
+ private static char[] values = null;
+
+ static {
+ values = new char[Ids.getNumOfIds()];
+ values[Ids.ID_AACUTE_L] = 225;
+ values[Ids.ID_AACUTE_U] = 193;
+ values[Ids.ID_ACIRC_L] = 226;
+ values[Ids.ID_ACIRC_U] = 194;
+ values[Ids.ID_ACUTE] = 180;
+ values[Ids.ID_AELIG_L] = 230;
+ values[Ids.ID_AELIG_U] = 198;
+ values[Ids.ID_AGRAVE_L] = 224;
+ values[Ids.ID_AGRAVE_U] = 192;
+ values[Ids.ID_ALEFSYM] = 8501;
+ values[Ids.ID_ALPHA_L] = 945;
+ values[Ids.ID_ALPHA_U] = 913;
+ values[Ids.ID_AMP] = 38;
+ values[Ids.ID_AND] = 8743;
+ values[Ids.ID_ANG] = 8736;
+ values[Ids.ID_ARING_L] = 229;
+ values[Ids.ID_ARING_U] = 197;
+ values[Ids.ID_ASYMP] = 8776;
+ values[Ids.ID_ATILDE_L] = 227;
+ values[Ids.ID_ATILDE_U] = 195;
+ values[Ids.ID_AUML_L] = 228;
+ values[Ids.ID_AUML_U] = 196;
+ values[Ids.ID_BDQUO] = 8222;
+ values[Ids.ID_BETA_L] = 946;
+ values[Ids.ID_BETA_U] = 914;
+ values[Ids.ID_BRVBAR] = 166;
+ values[Ids.ID_BULL] = 8226;
+ values[Ids.ID_CAP] = 8745;
+ values[Ids.ID_CCEDIL_L] = 231;
+ values[Ids.ID_CCEDIL_U] = 199;
+ values[Ids.ID_CEDIL] = 184;
+ values[Ids.ID_CENT] = 162;
+ values[Ids.ID_CHI_L] = 967;
+ values[Ids.ID_CHI_U] = 935;
+ values[Ids.ID_CIRC] = 710;
+ values[Ids.ID_CLUBS] = 9827;
+ values[Ids.ID_CONG] = 8773;
+ values[Ids.ID_COPY] = 169;
+ values[Ids.ID_CRARR] = 8629;
+ values[Ids.ID_CUP] = 8746;
+ values[Ids.ID_CURREN] = 164;
+ values[Ids.ID_DAGGER_L] = 8224;
+ values[Ids.ID_DAGGER_U] = 8225;
+ values[Ids.ID_DARR_L] = 8595;
+ values[Ids.ID_DARR_U] = 8659;
+ values[Ids.ID_DEG] = 176;
+ values[Ids.ID_DELTA_L] = 948;
+ values[Ids.ID_DELTA_U] = 916;
+ values[Ids.ID_DIAMS] = 9830;
+ values[Ids.ID_DIVIDE] = 247;
+ values[Ids.ID_EACUTE_L] = 233;
+ values[Ids.ID_EACUTE_U] = 201;
+ values[Ids.ID_ECIRC_L] = 234;
+ values[Ids.ID_ECIRC_U] = 202;
+ values[Ids.ID_EGRAVE_L] = 232;
+ values[Ids.ID_EGRAVE_U] = 200;
+ values[Ids.ID_EMPTY] = 8709;
+ values[Ids.ID_EMSP] = 8195;
+ values[Ids.ID_ENSP] = 8194;
+ values[Ids.ID_EPSILON_L] = 949;
+ values[Ids.ID_EPSILON_U] = 917;
+ values[Ids.ID_EQUIV] = 8801;
+ values[Ids.ID_ETA_L] = 951;
+ values[Ids.ID_ETA_U] = 919;
+ values[Ids.ID_ETH_L] = 240;
+ values[Ids.ID_ETH_U] = 208;
+ values[Ids.ID_EUML_L] = 235;
+ values[Ids.ID_EUML_U] = 203;
+ values[Ids.ID_EURO] = 8364;
+ values[Ids.ID_EXIST] = 8707;
+ values[Ids.ID_FNOF] = 402;
+ values[Ids.ID_FORALL] = 8704;
+ values[Ids.ID_FRAC12] = 189;
+ values[Ids.ID_FRAC14] = 188;
+ values[Ids.ID_FRAC34] = 190;
+ values[Ids.ID_FRASL] = 8260;
+ values[Ids.ID_GAMMA_L] = 947;
+ values[Ids.ID_GAMMA_U] = 915;
+ values[Ids.ID_GE] = 8805;
+ values[Ids.ID_GT] = 62;
+ values[Ids.ID_HARR_L] = 8596;
+ values[Ids.ID_HARR_U] = 8660;
+ values[Ids.ID_HEARTS] = 9829;
+ values[Ids.ID_HELLIP] = 8230;
+ values[Ids.ID_IACUTE_L] = 237;
+ values[Ids.ID_IACUTE_U] = 205;
+ values[Ids.ID_ICIRC_L] = 238;
+ values[Ids.ID_ICIRC_U] = 206;
+ values[Ids.ID_IEXCL] = 161;
+ values[Ids.ID_IGRAVE_L] = 236;
+ values[Ids.ID_IGRAVE_U] = 204;
+ values[Ids.ID_IMAGE] = 8465;
+ values[Ids.ID_INFIN] = 8734;
+ values[Ids.ID_INT] = 8747;
+ values[Ids.ID_IOTA_L] = 953;
+ values[Ids.ID_IOTA_U] = 921;
+ values[Ids.ID_IQUEST] = 191;
+ values[Ids.ID_ISIN] = 8712;
+ values[Ids.ID_IUML_L] = 239;
+ values[Ids.ID_IUML_U] = 207;
+ values[Ids.ID_KAPPA_L] = 954;
+ values[Ids.ID_KAPPA_U] = 922;
+ values[Ids.ID_LAMBDA_L] = 955;
+ values[Ids.ID_LAMBDA_U] = 923;
+ values[Ids.ID_LANG] = 9001;
+ values[Ids.ID_LAQUO] = 171;
+ values[Ids.ID_LARR_L] = 8592;
+ values[Ids.ID_LARR_U] = 8656;
+ values[Ids.ID_LCEIL] = 8968;
+ values[Ids.ID_LDQUO] = 8220;
+ values[Ids.ID_LE] = 8804;
+ values[Ids.ID_LFLOOR] = 8970;
+ values[Ids.ID_LOWAST] = 8727;
+ values[Ids.ID_LOZ] = 9674;
+ values[Ids.ID_LRM] = 8206;
+ values[Ids.ID_LSAQUO] = 8249;
+ values[Ids.ID_LSQUO] = 8216;
+ values[Ids.ID_LT] = 60;
+ values[Ids.ID_MACR] = 175;
+ values[Ids.ID_MDASH] = 8212;
+ values[Ids.ID_MICRO] = 181;
+ values[Ids.ID_MIDDOT] = 183;
+ values[Ids.ID_MINUS] = 8722;
+ values[Ids.ID_MU_L] = 956;
+ values[Ids.ID_MU_U] = 924;
+ values[Ids.ID_NABLA] = 8711;
+ values[Ids.ID_NBSP] = 160;
+ values[Ids.ID_NDASH] = 8211;
+ values[Ids.ID_NE] = 8800;
+ values[Ids.ID_NI] = 8715;
+ values[Ids.ID_NOT] = 172;
+ values[Ids.ID_NOTIN] = 8713;
+ values[Ids.ID_NSUB] = 8836;
+ values[Ids.ID_NTILDE_L] = 241;
+ values[Ids.ID_NTILDE_U] = 209;
+ values[Ids.ID_NU_L] = 957;
+ values[Ids.ID_NU_U] = 925;
+ values[Ids.ID_OACUTE_L] = 243;
+ values[Ids.ID_OACUTE_U] = 211;
+ values[Ids.ID_OCIRC_L] = 244;
+ values[Ids.ID_OCIRC_U] = 212;
+ values[Ids.ID_OELIG_L] = 339;
+ values[Ids.ID_OELIG_U] = 338;
+ values[Ids.ID_OGRAVE_L] = 242;
+ values[Ids.ID_OGRAVE_U] = 210;
+ values[Ids.ID_OLINE] = 8254;
+ values[Ids.ID_OMEGA_L] = 969;
+ values[Ids.ID_OMEGA_U] = 937;
+ values[Ids.ID_OMICRON_L] = 959;
+ values[Ids.ID_OMICRON_U] = 927;
+ values[Ids.ID_OPLUS] = 8853;
+ values[Ids.ID_OR] = 8744;
+ values[Ids.ID_ORDF] = 170;
+ values[Ids.ID_ORDM] = 186;
+ values[Ids.ID_OSLASH_L] = 248;
+ values[Ids.ID_OSLASH_U] = 216;
+ values[Ids.ID_OTILDE_L] = 245;
+ values[Ids.ID_OTILDE_U] = 213;
+ values[Ids.ID_OTIMES] = 8855;
+ values[Ids.ID_OUML_L] = 246;
+ values[Ids.ID_OUML_U] = 214;
+ values[Ids.ID_PARA] = 182;
+ values[Ids.ID_PART] = 8706;
+ values[Ids.ID_PERMIL] = 8240;
+ values[Ids.ID_PERP] = 8869;
+ values[Ids.ID_PHI_L] = 966;
+ values[Ids.ID_PHI_U] = 934;
+ values[Ids.ID_PIV] = 982;
+ values[Ids.ID_PI_L] = 960;
+ values[Ids.ID_PI_U] = 928;
+ values[Ids.ID_PLUSMN] = 177;
+ values[Ids.ID_POUND] = 163;
+ values[Ids.ID_PRIME_L] = 8242;
+ values[Ids.ID_PRIME_U] = 8243;
+ values[Ids.ID_PROD] = 8719;
+ values[Ids.ID_PROP] = 8733;
+ values[Ids.ID_PSI_L] = 968;
+ values[Ids.ID_PSI_U] = 936;
+ values[Ids.ID_QUOT] = 34;
+ values[Ids.ID_RADIC] = 8730;
+ values[Ids.ID_RANG] = 9002;
+ values[Ids.ID_RAQUO] = 187;
+ values[Ids.ID_RARR_L] = 8594;
+ values[Ids.ID_RARR_U] = 8658;
+ values[Ids.ID_RCEIL] = 8969;
+ values[Ids.ID_RDQUO] = 8221;
+ values[Ids.ID_REAL] = 8476;
+ values[Ids.ID_REG] = 174;
+ values[Ids.ID_RFLOOR] = 8971;
+ values[Ids.ID_RHO_L] = 961;
+ values[Ids.ID_RHO_U] = 929;
+ values[Ids.ID_RLM] = 8207;
+ values[Ids.ID_RSAQUO] = 8250;
+ values[Ids.ID_RSQUO] = 8217;
+ values[Ids.ID_SBQUO] = 8218;
+ values[Ids.ID_SCARON_L] = 353;
+ values[Ids.ID_SCARON_U] = 352;
+ values[Ids.ID_SDOT] = 8901;
+ values[Ids.ID_SECT] = 167;
+ values[Ids.ID_SHY] = 173;
+ values[Ids.ID_SIGMAF] = 962;
+ values[Ids.ID_SIGMA_L] = 963;
+ values[Ids.ID_SIGMA_U] = 931;
+ values[Ids.ID_SIM] = 8764;
+ values[Ids.ID_SPADES] = 9824;
+ values[Ids.ID_SUB] = 8834;
+ values[Ids.ID_SUBE] = 8838;
+ values[Ids.ID_SUM] = 8721;
+ values[Ids.ID_SUP] = 8835;
+ values[Ids.ID_SUP1] = 185;
+ values[Ids.ID_SUP2] = 178;
+ values[Ids.ID_SUP3] = 179;
+ values[Ids.ID_SUPE] = 8839;
+ values[Ids.ID_SZLIG] = 223;
+ values[Ids.ID_TAU_L] = 964;
+ values[Ids.ID_TAU_U] = 932;
+ values[Ids.ID_THERE4] = 8756;
+ values[Ids.ID_THETASYM] = 977;
+ values[Ids.ID_THETA_L] = 952;
+ values[Ids.ID_THETA_U] = 920;
+ values[Ids.ID_THINSP] = 8201;
+ values[Ids.ID_THORN_L] = 254;
+ values[Ids.ID_THORN_U] = 222;
+ values[Ids.ID_TILDE] = 732;
+ values[Ids.ID_TIMES] = 215;
+ values[Ids.ID_TRADE] = 8482;
+ values[Ids.ID_UACUTE_L] = 250;
+ values[Ids.ID_UACUTE_U] = 218;
+ values[Ids.ID_UARR_L] = 8593;
+ values[Ids.ID_UARR_U] = 8657;
+ values[Ids.ID_UCIRC_L] = 251;
+ values[Ids.ID_UCIRC_U] = 219;
+ values[Ids.ID_UGRAVE_L] = 249;
+ values[Ids.ID_UGRAVE_U] = 217;
+ values[Ids.ID_UML] = 168;
+ values[Ids.ID_UPSIH] = 978;
+ values[Ids.ID_UPSILON_L] = 965;
+ values[Ids.ID_UPSILON_U] = 933;
+ values[Ids.ID_UUML_L] = 252;
+ values[Ids.ID_UUML_U] = 220;
+ values[Ids.ID_WEIERP] = 8472;
+ values[Ids.ID_XI_L] = 958;
+ values[Ids.ID_XI_U] = 926;
+ values[Ids.ID_YACUTE_L] = 253;
+ values[Ids.ID_YACUTE_U] = 221;
+ values[Ids.ID_YEN] = 165;
+ values[Ids.ID_YUML_L] = 255;
+ values[Ids.ID_YUML_U] = 376;
+ values[Ids.ID_ZETA_L] = 950;
+ values[Ids.ID_ZETA_U] = 918;
+ values[Ids.ID_ZWJ] = 8205;
+ values[Ids.ID_ZWNJ] = 8204;
+ }
+
+ /**
+ */
+ public EntityCollection() {
+ super(names, STRICT_CASE);
+ }
+
+ /**
+ * Create an entity declaration.
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ * @param attrName java.lang.String
+ */
+ protected CMNode create(String entityName) {
+ int id = getID(entityName);
+ if (id == ID_UNKNOWN)
+ return null;
+
+ String value = String.valueOf(values[id]);
+ HTMLEntityDeclImpl dec = new HTMLEntityDeclImpl(entityName, value);
+
+ return dec;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLAttrDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLAttrDeclImpl.java
new file mode 100644
index 0000000000..d5aa9b5e66
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLAttrDeclImpl.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Implementation class of {@link <code>HTMLAttributeDeclaration</code>} interface.<br>
+ */
+class HTMLAttrDeclImpl extends CMNodeImpl implements HTMLAttributeDeclaration {
+
+ private HTMLCMDataTypeImpl type = null;
+ private int usage = 0;
+
+ /**
+ */
+ public HTMLAttrDeclImpl(String attrName, HTMLCMDataTypeImpl valueType, int valueUsage) {
+ super(attrName);
+ this.type = valueType;
+
+ switch (valueUsage) {
+ case OPTIONAL :
+ case REQUIRED :
+ case FIXED :
+ case PROHIBITED :
+ this.usage = valueUsage;
+ break;
+ default :
+ // should warn...
+ this.usage = OPTIONAL; // fall back
+ break;
+ }
+ }
+
+ /**
+ * getAttrName method
+ * @return java.lang.String
+ */
+ public String getAttrName() {
+ return getNodeName();
+ }
+
+ /**
+ * getAttrType method
+ * @return CMDataType
+ */
+ public CMDataType getAttrType() {
+ return type;
+ }
+
+ /**
+ * @deprecated in superclass
+ */
+ public String getDefaultValue() {
+ if (type.getImpliedValueKind() != CMDataType.IMPLIED_VALUE_DEFAULT)
+ return null;
+ return type.getImpliedValue();
+ }
+
+ /**
+ * @deprecated in superclass
+ */
+ public Enumeration getEnumAttr() {
+ Vector v = new Vector(Arrays.asList(type.getEnumeratedValues()));
+ return v.elements();
+ }
+
+ /**
+ * getNodeType method
+ * @return int
+ *
+ * Returns one of :
+ * ELEMENT_DECLARATION, ATTRIBUTE_DECLARATION, GROUP, ENTITY_DECLARATION.
+ */
+ public int getNodeType() {
+ return CMNode.ATTRIBUTE_DECLARATION;
+ }
+
+ /**
+ * @return int
+ */
+ public int getUsage() {
+ return usage;
+ }
+
+ /**
+ */
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE))
+ return true;
+ return super.supports(propertyName);
+ }
+
+ /**
+ */
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE))
+ return new Boolean(true);
+ return super.getProperty(propertyName);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMDataTypeImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMDataTypeImpl.java
new file mode 100644
index 0000000000..64931b6dbf
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMDataTypeImpl.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+
+
+/**
+ */
+class HTMLCMDataTypeImpl extends CMNodeImpl implements HTMLCMDataType {
+
+ private int impliedValueKind = IMPLIED_VALUE_NONE;
+ private String impliedValue = null;
+ private final static String[] emptyArray = new String[0];
+ private String[] enumValues = emptyArray;
+ private String instanceValue = null;
+
+ /**
+ * HTMLCMDataTypeImpl constructor comment.
+ * @param nm java.lang.String
+ */
+ public HTMLCMDataTypeImpl(String typeName) {
+ super(typeName);
+ }
+
+ /**
+ * HTMLCMDataTypeImpl constructor comment.
+ * @param nm java.lang.String
+ */
+ public HTMLCMDataTypeImpl(String typeName, String instanceValue) {
+ super(typeName);
+ this.instanceValue = instanceValue;
+ }
+
+ /**
+ * getTypeName method
+ * @return java.lang.String
+ *
+ * This method returns a suitable default value that can be used when an instance of the data type is created.
+ * This returns null of a suitable default is not available.
+ */
+ public String generateInstanceValue() {
+ return instanceValue;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMDataType
+ */
+ public String getDataTypeName() {
+ return getNodeName();
+ }
+
+ /**
+ * getTypeName method
+ * @return java.lang.String[]
+ *
+ */
+ public String[] getEnumeratedValues() {
+ return enumValues;
+ }
+
+ /**
+ * getTypeName method
+ * @return java.lang.String
+ *
+ * Returns the implied value or null if none exists.
+ */
+ public String getImpliedValue() {
+ return impliedValue;
+ }
+
+ /**
+ * getImpliedValueKind method
+ * @return int
+ *
+ * Returns one of :
+ * IMPLIED_VALUE_NONE, IMPLIED_VALUE_FIXED, IMPLIED_VALUE_DEFAULT.
+ */
+ public int getImpliedValueKind() {
+ return impliedValueKind;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ public int getNodeType() {
+ return CMNode.DATA_TYPE;
+ }
+
+ /**
+ */
+ void setEnumValues(String[] values) {
+ enumValues = new String[values.length];
+ for (int i = 0; i < values.length; i++) {
+ enumValues[i] = values[i];
+ }
+ }
+
+ /**
+ * package scope.
+ */
+ void setImpliedValue(int kind, String value) {
+ switch (kind) {
+ case IMPLIED_VALUE_FIXED :
+ case IMPLIED_VALUE_DEFAULT :
+ impliedValueKind = kind;
+ impliedValue = value;
+ break;
+ case IMPLIED_VALUE_NONE :
+ default :
+ impliedValueKind = IMPLIED_VALUE_NONE;
+ impliedValue = null; // maybe a null string?
+ break;
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMNode.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMNode.java
new file mode 100644
index 0000000000..a1e555acf9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLCMNode.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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;
+
+
+/**
+ * In HTML Documents, name and value of an attribute/element/entity
+ * should be treated ignoring theirs case. However, in XML documents,
+ * they should be distinguished with sensitiveness of their case.
+ * CMNode is basically designed to represent DTDs or Schemas for XML
+ * documents. So, it doesn't have interfaces to retrieve such information.
+ * However, declarations in the HTML CM should provide such information.
+ * This intermediate interface is intended to provide whether ignore cases
+ * or not.<br>
+ */
+interface HTMLCMNode extends org.eclipse.wst.xml.core.internal.contentmodel.CMNode {
+
+ /**
+ * Returns <code>true</code>, if declaration is for HTML attribute/element/entity.
+ * Otherwise, returns <code>false</code>.
+ * @return boolean
+ */
+ boolean shouldIgnoreCase();
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLElemDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLElemDeclImpl.java
new file mode 100644
index 0000000000..a75268b8cc
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLElemDeclImpl.java
@@ -0,0 +1,380 @@
+/*******************************************************************************
+ * 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.util.Iterator;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLPropertyDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * Base class for all Hed???? classes.
+ */
+abstract class HTMLElemDeclImpl extends CMContentImpl implements HTMLElementDeclaration, HTMLPropertyDeclaration {
+
+ // DTD
+ protected CMNamedNodeMapImpl attributes = null;
+ protected String typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMPTY;
+ /** Never access this field directly. Instead, use getComplexTypeDefinition method. */
+ private ComplexTypeDefinition typeDefinition = null;
+ protected CMGroupImpl inclusion = null;
+ protected CMGroupImpl exclusion = null;
+ // advanced information
+ protected CMNamedNodeMap prohibitedAncestors = null;
+ protected int correctionType = CORRECT_NONE;
+ protected int formatType = FORMAT_HTML;
+ protected int layoutType = LAYOUT_NONE;
+ protected int omitType = OMIT_NONE;
+ protected boolean keepSpaces = false;
+ protected boolean indentChild = false;
+ protected ElementCollection elementCollection = null;
+ protected AttributeCollection attributeCollection = null;
+ protected final static CMNamedNodeMap EMPTY_MAP = new CMNamedNodeMap() {
+ public int getLength() {
+ return 0;
+ }
+
+ public CMNode getNamedItem(String name) {
+ return null;
+ }
+
+ public CMNode item(int index) {
+ return null;
+ }
+
+ public Iterator iterator() {
+ return new Iterator() {
+ public boolean hasNext() {
+ return false;
+ }
+
+ public Object next() {
+ return null;
+ }
+
+ public void remove() {
+ }
+ };
+ }
+ };
+
+ /**
+ * HTMLElemDeclImpl constructor.
+ * In the HTML DTD, an element declaration has no specification
+ * for its occurrence. Occurrence is specifed in content model, like
+ * <code>(LI)+</code>. To avoid confusion (and complexity),
+ * occurrence of an element declaration is always 1 (it means, min = 1 and
+ * max = 1). Instead, occurrence of CMGroup represents actual occurrence
+ * of the content.
+ * <br>
+ * @param name java.lang.String
+ */
+ public HTMLElemDeclImpl(String elementName, ElementCollection collection) {
+ super(elementName, 1, 1);
+ elementCollection = collection;
+ attributeCollection = collection.getAttributeCollection();
+ }
+
+ /**
+ */
+ protected abstract void createAttributeDeclarations();
+
+ /**
+ *
+ * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ private ComplexTypeDefinition createComplexTypeDefinition() {
+ if (typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_CDATA) || typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_EMPTY) || typeDefinitionName.equals(ComplexTypeDefinitionFactory.CTYPE_PCDATA))
+ return null;
+
+ ComplexTypeDefinitionFactory factory = ComplexTypeDefinitionFactory.getInstance();
+ if (factory == null)
+ return null; // fatal error.
+
+ ComplexTypeDefinition def = factory.createTypeDefinition(typeDefinitionName, elementCollection);
+ return def;
+ }
+
+ /**
+ * Get an attribute declaration.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public HTMLAttributeDeclaration getAttributeDeclaration(String attrName) {
+ if (attributes == null) {
+ createAttributeDeclarations();
+ if (attributes == null)
+ return null; // fail to create
+ }
+
+ CMNode cmnode = attributes.getNamedItem(attrName);
+ if (cmnode == null) {
+ return null;
+ }
+ else {
+ return (HTMLAttributeDeclaration) cmnode; // already exists.
+ }
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public CMNamedNodeMap getAttributes() {
+ if (attributes == null)
+ createAttributeDeclarations(); // lazy eval.
+ return attributes;
+ }
+
+ /**
+ * Get an instance of complex type definition.
+ * @return com.ibm.sed.contentmodel.html.ComplexTypeDefinition
+ */
+ private ComplexTypeDefinition getComplexTypeDefinition() {
+ if (typeDefinition == null)
+ typeDefinition = createComplexTypeDefinition();
+ return typeDefinition;
+ }
+
+ /**
+ * Content.<br>
+ * Element declarations which type is EMPTY or CDATA (maybe PCDATA)
+ * <strong>MUST</strong> override this method and always return null.
+ * This default implementation always tries to create a complex type definition
+ * instance and access to it.
+ * <br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public CMContent getContent() {
+ ComplexTypeDefinition def = getComplexTypeDefinition(); // lazy eval.
+ return (def != null) ? def.getContent() : null;
+ }
+
+ /**
+ * Content type.<br>
+ * Element declarations which type is EMPTY or CDATA (maybe PCDATA)
+ * <strong>MUST</strong> override this method and return an appropriate type.
+ * This default implementation always tries to create a complex type definition
+ * instance and access to it.
+ * <br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public int getContentType() {
+ ComplexTypeDefinition def = getComplexTypeDefinition(); // lazy eval.
+ return (def != null) ? def.getContentType() : CMElementDeclaration.CDATA;
+ }
+
+ /**
+ * @see HTMLElementDeclaration#getCorrectionType
+ */
+ public int getCorrectionType() {
+ return correctionType;
+ }
+
+ /**
+ * HTML element doesn't have any data type. So, this method always
+ * returns <code>null</code>.<br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public CMDataType getDataType() {
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public String getElementName() {
+ return getNodeName();
+ }
+
+ /**
+ * Exclusion.
+ * Almost elements don't have a exclusion.
+ * Only classes those have exclusion should override this method.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ return null;
+ }
+
+ /**
+ * Default format type is <code>FORMAT_HTML</code>.<br>
+ */
+ public int getFormatType() {
+ return formatType;
+ }
+
+ /**
+ * Inclusion.
+ * Almost elements don't have a inclusion.
+ * Only classes those have inclusion should override this method.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getInclusion() {
+ return null;
+ }
+
+ /**
+ */
+ public int getLayoutType() {
+ return layoutType;
+ }
+
+ /**
+ * Line break hint is strongly related to layout type.
+ * Indeed, in the C++DOM, it is determined from layout type only.
+ * So, this implementation, as the default implementation for all declarations,
+ * also determines from layout type only.<br>
+ * @return int
+ */
+ public int getLineBreakHint() {
+ switch (getLayoutType()) {
+ case HTMLElementDeclaration.LAYOUT_BLOCK :
+ return HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END;
+ case HTMLElementDeclaration.LAYOUT_BREAK :
+ return HTMLElementDeclaration.BREAK_AFTER_START;
+ case HTMLElementDeclaration.LAYOUT_HIDDEN :
+ return HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END;
+ default :
+ return HTMLElementDeclaration.BREAK_NONE;
+ }
+ }
+
+ /**
+ * No HTML element has local elements. So, this method always
+ * returns an empty map.
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public CMNamedNodeMap getLocalElements() {
+ return EMPTY_MAP;
+ }
+
+ /**
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMNode
+ */
+ public int getNodeType() {
+ return CMNode.ELEMENT_DECLARATION;
+ }
+
+ /**
+ */
+ public int getOmitType() {
+ return omitType;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ return EMPTY_MAP;
+ }
+
+ /**
+ */
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) {
+ return true;
+ }
+ else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) {
+ ComplexTypeDefinition def = getComplexTypeDefinition();
+ return (def != null);
+ }
+ else {
+ PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName);
+ if (pp == null)
+ return false;
+ return pp.supports(this);
+ }
+
+ }
+
+ /**
+ */
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) {
+ return new Boolean(true);
+ }
+ else if (propertyName.equals(HTMLCMProperties.CONTENT_HINT)) {
+ ComplexTypeDefinition def = getComplexTypeDefinition();
+ return (def != null) ? def.getPrimaryCandidate() : null;
+ }
+ else {
+ PropertyProvider pp = PropertyProviderFactory.getProvider(propertyName);
+ if (pp == null)
+ return null;
+ return pp.get(this);
+ }
+ }
+
+ /**
+ * Return element names which terminates this element.<br>
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return null;
+ }
+
+ /**
+ * return true when the element is a JSP element.
+ */
+ public boolean isJSP() {
+ return false;
+ }
+
+ /**
+ * In some elements, such as APPLET, a source generator should indent child
+ * elements that their parents. That is, a source generator should generate
+ * source of APPLET and PARAMS like this:
+ * <PRE>
+ * &lt;APPLET ...&gt;
+ * &lt;PARAM ... &gt;
+ * &lt;PARAM ... &gt;
+ * &lt;/APPLET&gt;
+ * <PRE>
+ * @return boolean
+ */
+ public boolean shouldIndentChildSource() {
+ return indentChild;
+ }
+
+ /**
+ * Most of elements can compact spaces in their child text nodes.
+ * Some special elements should keep them in their source.
+ * @return boolean
+ */
+ public boolean shouldKeepSpaces() {
+ return keepSpaces;
+ }
+
+ /**
+ * @return boolean
+ */
+ public boolean shouldTerminateAt(HTMLElementDeclaration nextElement) {
+ Iterator i = getTerminators();
+ if (i == null)
+ return false;
+ String nextName = nextElement.getElementName();
+ while (i.hasNext()) {
+ if (nextName.equals(i.next()))
+ return true;
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLEntityDeclImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLEntityDeclImpl.java
new file mode 100644
index 0000000000..496e93a7c6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HTMLEntityDeclImpl.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLEntityDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+
+
+/**
+ */
+class HTMLEntityDeclImpl extends CMNodeImpl implements HTMLEntityDeclaration {
+
+ private java.lang.String value = null;
+
+ /**
+ * CMEntityDeclImpl constructor comment.
+ * @param entityName java.lang.String; Entity name.
+ * @param entityValue java.lang.String; Value string.
+ */
+ public HTMLEntityDeclImpl(String entityName, String entityValue) {
+ super(entityName);
+ value = entityValue;
+ }
+
+ /**
+ * getName method
+ * @return java.lang.String
+ */
+ public String getName() {
+ return getNodeName();
+ }
+
+ /**
+ * Get CMNode type.<br>
+ * @return int; Always return ENTITY_DECLARATION.
+ */
+ public int getNodeType() {
+ return CMNode.ENTITY_DECLARATION;
+ }
+
+ /**
+ * getValue method
+ * @return java.lang.String
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ */
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE))
+ return true;
+ return super.supports(propertyName);
+ }
+
+ /**
+ * Entities in HTML documents are always treated with ignoring cases.
+ * Because no special entities are defined in JSP 1.0, this method
+ * can always return <code>true</code>.<br>
+ */
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE))
+ return new Boolean(true);
+ return super.getProperty(propertyName);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedA.java
new file mode 100644
index 0000000000..1957ee951c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedA.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * A.
+ */
+final class HedA extends HedInlineContainer {
+
+ /**
+ */
+ public HedA(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.A, collection);
+ // CORRECT_EMPTY - GROUP_COMPACT
+ correctionType = CORRECT_EMPTY;
+ }
+
+ /**
+ * %attrs;
+ * (charset %Charset; #IMPLIED)
+ * (type %ContentType; #IMPLIED)
+ * (name CDATA #IMPLIED)
+ * (href %URI; #IMPLIED)
+ * (hreflang %LanguageCode; #IMPLIED)
+ * (target %FrameTarget; #IMPLIED)
+ * (rel %LinkTypes; #IMPLIED)
+ * (rev %LinkTypes; #IMPLIED)
+ * (accesskey %Character; #IMPLIED)
+ * (directkey %Character; #IMPLIED)
+ * (shape %Shape; rect)
+ * (coords %Coords; #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_HREF,};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * Exclusion.
+ * <code>A</code> has the exclusion.
+ * It is <code>A</code> itself.
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ CMNode a = elementCollection.getNamedItem(CHTMLNamespace.ElementName.A);
+ if (a != null)
+ exclusion.appendChild(a);
+
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.A,};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedADDRESS.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedADDRESS.java
new file mode 100644
index 0000000000..55579d8b87
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedADDRESS.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * ADDRESS.
+ */
+final class HedADDRESS extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedADDRESS(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.ADDRESS, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_ADDRESS;
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBASE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBASE.java
new file mode 100644
index 0000000000..ab2c8161be
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBASE.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+/**
+ * BASE.
+ */
+final class HedBASE extends HedEmpty {
+
+ /**
+ */
+ public HedBASE(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.BASE, collection);
+ // LAYOUT_HIDDEN.
+ // Because, BASE is GROUP_HIDDEN in the C++DOM/DTDParser.cpp.
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * BASE.
+ * (href %URI; #IMPLIED)
+ * (target %FrameTarget; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_HREF,};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBLOCKQUOTE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBLOCKQUOTE.java
new file mode 100644
index 0000000000..818156e29b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBLOCKQUOTE.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * BLOCKQUOTE.
+ */
+final class HedBLOCKQUOTE extends HedFlowContainer {
+
+ /**
+ */
+ public HedBLOCKQUOTE(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.BLOCKQUOTE, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ * (cite %URI; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBODY.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBODY.java
new file mode 100644
index 0000000000..992288f2cf
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBODY.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+import java.util.Iterator;
+
+/**
+ * BODY.
+ */
+final class HedBODY extends HedFlowContainer {
+
+ private static String[] terminators = {CHTMLNamespace.ElementName.HEAD, CHTMLNamespace.ElementName.BODY, CHTMLNamespace.ElementName.HTML};
+
+ /**
+ */
+ public HedBODY(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.BODY, collection);
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_BOTH;
+ }
+
+ /**
+ * %attrs;
+ * %bodycolors;
+ * (onload %Script; #IMPLIED)
+ * (onunload %Script; #IMPLIED)
+ * (background %URI; #IMPLIED)
+ * (marginwidth %Pixels; #IMPLIED) ... D205514
+ * (marginheight %Pixels; #IMPLIED) .. D205514
+ * (topmargin, CDATA, #IMPLIED) ...... D205514
+ * (bottommargin, CDATA, #IMPLIED) ... D205514
+ * (leftmargin, CDATA, #IMPLIED) ..... D205514
+ * (rightmargin, CDATA, #IMPLIED) .... D205514
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %bodycolors;
+ attributeCollection.getBodycolors(attributes);
+
+ }
+
+ /**
+ * BODY has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBR.java
new file mode 100644
index 0000000000..30ef48ba45
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedBR.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration;
+
+
+
+/**
+ * BR.
+ */
+final class HedBR extends HedEmpty {
+
+ /**
+ */
+ public HedBR(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.BR, collection);
+ // LAYOUT_BREAK.
+ // Because, BR is GROUP_BREAK in the C++DOM/DTDParser.cpp.
+ layoutType = LAYOUT_BREAK;
+ }
+
+ /**
+ * BR.
+ * %coreattrs;
+ * (clear (left | all | right | none) none)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %coreattrs;
+ attributeCollection.getCore(attributes);
+ // clear
+ HTMLAttributeDeclaration attr = attributeCollection.getDeclaration(CHTMLNamespace.ATTR_NAME_CLEAR);
+ if (attr != null)
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_CLEAR, attr);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedCENTER.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedCENTER.java
new file mode 100644
index 0000000000..c2c60d69ab
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedCENTER.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * CENTER.
+ */
+final class HedCENTER extends HedFlowContainer {
+
+ /**
+ */
+ public HedCENTER(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.CENTER, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDD.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDD.java
new file mode 100644
index 0000000000..a5da292dd3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDD.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+import java.util.Iterator;
+
+/**
+ * DD.
+ */
+final class HedDD extends HedFlowContainer {
+
+ private static String[] terminators = {CHTMLNamespace.ElementName.DT, CHTMLNamespace.ElementName.DD};
+
+ /**
+ */
+ public HedDD(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.DD, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END_DEFAULT;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ * DD has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDIV.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDIV.java
new file mode 100644
index 0000000000..adb56c2df7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDIV.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * DIV.
+ */
+final class HedDIV extends HedFlowContainer {
+
+ /**
+ */
+ public HedDIV(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.DIV, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ * %align;
+ * %reserved;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // %align;
+ HTMLAttrDeclImpl attr = AttributeCollection.createAlignForParagraph();
+ if (attr != null)
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr);
+ // %reserved; ... empty
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDL.java
new file mode 100644
index 0000000000..c09c9ac095
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDL.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * DL.
+ */
+final class HedDL extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedDL(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.DL, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_DEFINITION_LIST;
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ indentChild = true;
+ }
+
+ /**
+ * %arrays;
+ * (compact (compact) #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDT.java
new file mode 100644
index 0000000000..e12c4c4c07
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedDT.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+import java.util.Iterator;
+
+/**
+ * DT.
+ */
+final class HedDT extends HedInlineContainer {
+
+ private static String[] terminators = {CHTMLNamespace.ElementName.DT, CHTMLNamespace.ElementName.DD};
+
+ /**
+ */
+ public HedDT(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.DT, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END_DEFAULT;
+ }
+
+ /**
+ * %attrs;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ }
+
+ /**
+ * DT has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedEmpty.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedEmpty.java
new file mode 100644
index 0000000000..92c30da559
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedEmpty.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+
+/**
+ * Base class for EMPTY type element declarations.
+ */
+abstract class HedEmpty extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedEmpty(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_EMPTY;
+ // EMPTY type has no end tag.
+ omitType = OMIT_END_MUST;
+ }
+
+ /**
+ * Content.<br>
+ * EMPTY type always returns <code>null</code>.
+ * <br>
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent
+ */
+ public CMContent getContent() {
+ return null;
+ }
+
+ /**
+ * Content type.<br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public int getContentType() {
+ return CMElementDeclaration.EMPTY;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFORM.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFORM.java
new file mode 100644
index 0000000000..751acd8e0b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFORM.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * FORM.
+ */
+final class HedFORM extends HedFlowContainer {
+
+ /**
+ */
+ public HedFORM(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.FORM, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs;
+ * (action %URI; #REQUIRED)
+ * (method (GET|POST) GET)
+ * (enctype %ContentType; "application/x-www-form-urlencoded")
+ * (accept %ContentTypes; #IMPLIED)
+ * (name CDATA #IMPLIED)
+ * (onsubmit %Script; #IMPLIED)
+ * (onreset %Script; #IMPLIED)
+ * (target %FrameTarget; #IMPLIED)
+ * (accept-charset %Charsets; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_ACTION, CHTMLNamespace.ATTR_NAME_METHOD, CHTMLNamespace.ATTR_NAME_ENCTYPE, CHTMLNamespace.ATTR_NAME_NAME,};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * Exclusion.
+ * <code>FORM</code> has the exclusion.
+ * It is <code>FORM</code> itself.
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null; // fatal
+
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ CMNode form = elementCollection.getNamedItem(CHTMLNamespace.ElementName.FORM);
+ if (form != null)
+ exclusion.appendChild(form);
+
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.FORM, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFlowContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFlowContainer.java
new file mode 100644
index 0000000000..99f307b1d7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedFlowContainer.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * Base class for (%flow;)* containers.
+ */
+abstract class HedFlowContainer extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedFlowContainer(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_FLOW_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHEAD.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHEAD.java
new file mode 100644
index 0000000000..2366dce8d1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHEAD.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+import java.util.Iterator;
+
+/**
+ * HTML.
+ */
+final class HedHEAD extends HTMLElemDeclImpl {
+
+ private static String[] terminators = {CHTMLNamespace.ElementName.HEAD, CHTMLNamespace.ElementName.BODY, CHTMLNamespace.ElementName.HTML};
+
+ /**
+ */
+ public HedHEAD(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.HEAD, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_HEAD;
+ layoutType = LAYOUT_HIDDEN;
+ omitType = OMIT_BOTH;
+ }
+
+ /**
+ * Create all attribute declarations.
+ * This method is called once in the constructor of the super class.
+ * The <code>HEAD</code> element may have the following attributes:
+ * <table>
+ * <tbody>
+ * <tr>
+ * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th>
+ * </tr>
+ * <tr>
+ * <td>%i18n;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * <tr>
+ * <td>profile</td><td>URI</td><td>#IMPLIED</td><td>N/A</td><td>-</td>
+ * </tr>
+ * </tbody>
+ * </table>
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+ }
+
+ /**
+ * HEAD has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHR.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHR.java
new file mode 100644
index 0000000000..ed65ab335b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHR.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * HR.
+ */
+final class HedHR extends HedEmpty {
+
+ /**
+ */
+ public HedHR(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.HR, collection);
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * %attrs
+ * (align (left|center|right) #IMPLIED) ... should be defined locally.
+ * (noshade (noshade) #IMPLIED)
+ * (size %Pixels; #IMPLIED)
+ * (width %Length; #IMPLIED)
+ * (color %Color; #IMPLIED) ... D205514
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (align (left|center|right) #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {CHTMLNamespace.ATTR_VALUE_LEFT, CHTMLNamespace.ATTR_VALUE_CENTER, CHTMLNamespace.ATTR_VALUE_RIGHT};
+ atype.setEnumValues(values);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_ALIGN, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr);
+
+ // the rest.
+ String[] names = {CHTMLNamespace.ATTR_NAME_NOSHADE, CHTMLNamespace.ATTR_NAME_SIZE, CHTMLNamespace.ATTR_NAME_WIDTH,};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHTML.java
new file mode 100644
index 0000000000..f0d59262e9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHTML.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLAttributeDeclaration;
+
+
+/**
+ * HTML.
+ */
+final class HedHTML extends HTMLElemDeclImpl {
+
+ private static String[] terminators = {CHTMLNamespace.ElementName.HTML};
+
+ /**
+ */
+ public HedHTML(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.HTML, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_HTML;
+ layoutType = LAYOUT_HIDDEN;
+ omitType = OMIT_BOTH;
+ }
+
+ /**
+ * Create all attribute declarations.
+ * This method is called once in the constructor of the super class.
+ * The <code>HTML</code> element may have the following attributes:
+ * <table>
+ * <tbody>
+ * <tr>
+ * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th>
+ * </tr>
+ * <tr>
+ * <td><code>%i18n;</code></td><td>-</td><td>-</td><td>-</td>
+ * <td>{@link PDCMDocImpl#getAttrDeclarationsI18n}</td>
+ * </tr>
+ * <tr>
+ * <td>version</td><td>CDATA</td><td>#FIXED</td>
+ * <td>{@link HTML_VERSION_TRANSITIONAL}</td><td>deplecated in HTML4.01</td>
+ * </tr>
+ * </tbody>
+ * </table><br>
+ * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+ // version
+ HTMLAttributeDeclaration adec = attributeCollection.getDeclaration(CHTMLNamespace.ATTR_NAME_VERSION);
+ if (adec != null)
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_VERSION, adec);
+ }
+
+ /**
+ * HTML has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHeading.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHeading.java
new file mode 100644
index 0000000000..5a89a58c4d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedHeading.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * H[1-6].
+ */
+final class HedHeading extends HedInlineContainer {
+
+ /**
+ */
+ public HedHeading(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ }
+
+ /**
+ * Create all attribute declarations.
+ * This method is called once in the constructor of the super class.
+ * The <code>H1</code> element may have the following attributes:
+ * <table>
+ * <tbody>
+ * <tr>
+ * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th>
+ * </tr>
+ * <tr>
+ * <td>%attrs;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * <tr>
+ * <td>%align;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * </tbody>
+ * </table>
+ * <p><b>%align;</b> means <code>align (left|center|right|justify) #IMPLIED</code>.
+ * Unfortunately, this <code>align</code> is different from one in
+ * <code>IMG</code> or <code>TABLE</code>. So, the attribute declaration
+ * of <code>align</code> should be localy created and it shouldn't be registered
+ * in a <code>HCMDocImpl</code> instance.</p>
+ * <p>However, %align is used in sevaral times. I wouldn't write same code
+ * in many times. So, I add a new utility method into <code>CMUtil</code>
+ * to create the attribute declaration.</p>
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // align
+ HTMLAttrDeclImpl attr = AttributeCollection.createAlignForParagraph();
+ if (attr != null)
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedIMG.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedIMG.java
new file mode 100644
index 0000000000..f7f30c603f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedIMG.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * IMG.
+ */
+final class HedIMG extends HedEmpty {
+
+ /**
+ */
+ public HedIMG(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.IMG, collection);
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ * IMG.
+ * %attrs;
+ * (src %URI; #REQUIRED): should be defined locally.
+ * (alt %Text; #REQUIRED)
+ * (longdesc %URI; #IMPLIED)
+ * (name CDATA #IMPLIED)
+ * (height %Length; #IMPLIED)
+ * (width %Length; #IMPLIED)
+ * (usemap %URI; #IMPLIED)
+ * (ismap (ismap) #IMPLIED)
+ * (align %IAlign; #IMPLIED): should be defined locally.
+ * (border %Pixels; #IMPLIED)
+ * (hspace %Pixels; #IMPLIED)
+ * (vspace %Pixels; #IMPLIED)
+ * (mapfile %URI; #IMPLIED)
+ * @see com.ibm.sed.contentmodel.html.AbstractHTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (src %URI; #REQUIRED): should be defined locally.
+ HTMLCMDataTypeImpl atype = null;
+ HTMLAttrDeclImpl attr = null;
+ atype = new HTMLCMDataTypeImpl(CMDataType.URI);
+ attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_SRC, atype, CMAttributeDeclaration.REQUIRED);
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_SRC, attr);
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_ALT, CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_HEIGHT, CHTMLNamespace.ATTR_NAME_WIDTH, CHTMLNamespace.ATTR_NAME_BORDER, CHTMLNamespace.ATTR_NAME_HSPACE, CHTMLNamespace.ATTR_NAME_VSPACE,};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+
+ // align (local); should be defined locally.
+ attr = AttributeCollection.createAlignForImage();
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.PRE};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedINPUT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedINPUT.java
new file mode 100644
index 0000000000..bf0951ccce
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedINPUT.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * INPUT.
+ */
+final class HedINPUT extends HedEmpty {
+
+ /**
+ */
+ public HedINPUT(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.INPUT, collection);
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ * INPUT.
+ * %attrs;
+ * (type %InputType; TEXT) ... should be defined locally.
+ * (name CDATA #IMPLIED)
+ * (value CDATA #IMPLIED)
+ * (checked (checked) #IMPLIED)
+ * (disabled (disabled) #IMPLIED)
+ * (readonly (readonly) #IMPLIED)
+ * (size CDATA #IMPLIED) ... should be defined locally.
+ * (maxlength NUMBER #IMPLIED)
+ * (src %URI; #IMPLIED)
+ * (alt CDATA #IMPLIED) ... should be defined locally.
+ * (usemap %URI; #IMPLIED)
+ * (ismap (ismap) #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (accesskey %Character; #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ * (onselect %Script; #IMPLIED)
+ * (onchange %Script; #IMPLIED)
+ * (accept %ContentTypes; #IMPLIED)
+ * (align %IAlign; #IMPLIED) ... should be defined locally.
+ * (istyle CDATA #IMPLIED)
+ * <<D215684
+ * (width CDATA; #IMPLIED)
+ * (height CDATA; #IMPLIED)
+ * (border CDATA; #IMPLIED)
+ * D215684
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ HTMLCMDataTypeImpl atype = null;
+ HTMLAttrDeclImpl attr = null;
+ // (type %InputType; TEXT) ... should be defined locally.
+ // NOTE: %InputType is ENUM;
+ // (text | password | checkbox | radio | submit | reset |
+ // file | hidden | image | button)
+ atype = new HTMLCMDataTypeImpl(CMDataType.ENUM);
+ String[] values = {CHTMLNamespace.ATTR_VALUE_TEXT, CHTMLNamespace.ATTR_VALUE_PASSWORD, CHTMLNamespace.ATTR_VALUE_CHECKBOX, CHTMLNamespace.ATTR_VALUE_RADIO, CHTMLNamespace.ATTR_VALUE_SUBMIT, CHTMLNamespace.ATTR_VALUE_RESET, CHTMLNamespace.ATTR_VALUE_HIDDEN,};
+ atype.setEnumValues(values);
+ atype.setImpliedValue(CMDataType.IMPLIED_VALUE_DEFAULT, CHTMLNamespace.ATTR_VALUE_TEXT);
+ attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_TYPE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_TYPE, attr);
+
+ // (size CDATA #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_SIZE, attr);
+
+ // (alt CDATA #IMPLIED) ... should be defined locally.
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_ALT, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALT, attr);
+
+ // (align %IAlign; #IMPLIED) ... should be defined locally.
+ attr = AttributeCollection.createAlignForImage();
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, attr);
+
+ // the rest.
+ String[] names = {CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_VALUE, CHTMLNamespace.ATTR_NAME_CHECKED, CHTMLNamespace.ATTR_NAME_SIZE, CHTMLNamespace.ATTR_NAME_MAXLENGTH, CHTMLNamespace.ATTR_NAME_SRC, CHTMLNamespace.ATTR_NAME_ALT, CHTMLNamespace.ATTR_NAME_ALIGN, CHTMLNamespace.ATTR_NAME_ISTYLE,
+ //<<D215684
+ CHTMLNamespace.ATTR_NAME_WIDTH, CHTMLNamespace.ATTR_NAME_HEIGHT, CHTMLNamespace.ATTR_NAME_BORDER
+ //<D215684
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedInlineContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedInlineContainer.java
new file mode 100644
index 0000000000..99f14c90a6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedInlineContainer.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * Base class for (%inline;)* containers.
+ */
+abstract class HedInlineContainer extends HTMLElemDeclImpl {
+
+ /**
+ * HedInlineContainer.
+ * @param elementName java.lang.String
+ * @param collection ElementCollection
+ */
+ public HedInlineContainer(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_INLINE_CONTAINER;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedLI.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedLI.java
new file mode 100644
index 0000000000..6a3a344f4d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedLI.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+import java.util.Iterator;
+
+/**
+ * LI.
+ */
+final class HedLI extends HedFlowContainer {
+
+ private static String[] terminators = {CHTMLNamespace.ElementName.LI};
+
+ /**
+ */
+ public HedLI(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.LI, collection);
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END_DEFAULT;
+ }
+
+ /**
+ * %attrs;
+ * (type %LIStyle; #IMPLIED) ... should be defined locally.
+ * (value NUMBER #IMPLIED) ... should be defined locally.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ }
+
+ /**
+ * LI has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedListItemContainer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedListItemContainer.java
new file mode 100644
index 0000000000..9e457c7963
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedListItemContainer.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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;
+
+
+
+/**
+ * Base class for list item container declarations.
+ * - OL, UL, MENU, DIR.
+ */
+abstract class HedListItemContainer extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedListItemContainer(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_LI_CONTAINER;
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ indentChild = true;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMENU.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMENU.java
new file mode 100644
index 0000000000..50e020ff1e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMENU.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * MENU/DIR.
+ */
+final class HedMENU extends HedListItemContainer {
+
+ /**
+ */
+ public HedMENU(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ }
+
+ /**
+ * MENU/DIR.
+ * (compact (compact) #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ }
+
+ /**
+ * Exclusion.
+ * <code>MENU/DIR</code> has the exclusion.
+ * It is <code>%block;</code>.
+ * %block; is:
+ * P | %heading; | %list; | %preformatted; | DL | DIV | CENTER |
+ * NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR |
+ * TABLE | FIELDSET | ADDRESS.
+ * %heading; is: H1 | H2 | H3 | H4 | H5 | H6.
+ * %list; is : UL | OL | DIR | MENU.
+ * %preformatted; is PRE.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ // %block;
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ String[] names = {CHTMLNamespace.ElementName.P, CHTMLNamespace.ElementName.H1, CHTMLNamespace.ElementName.H2, CHTMLNamespace.ElementName.H3, CHTMLNamespace.ElementName.H4, CHTMLNamespace.ElementName.H5, CHTMLNamespace.ElementName.H6, CHTMLNamespace.ElementName.UL, CHTMLNamespace.ElementName.OL, CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU, CHTMLNamespace.ElementName.PRE, CHTMLNamespace.ElementName.DL, CHTMLNamespace.ElementName.DIV, CHTMLNamespace.ElementName.CENTER, CHTMLNamespace.ElementName.BLOCKQUOTE, CHTMLNamespace.ElementName.FORM, CHTMLNamespace.ElementName.HR, CHTMLNamespace.ElementName.ADDRESS};
+ elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator());
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMETA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMETA.java
new file mode 100644
index 0000000000..882eca9843
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedMETA.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * META.
+ */
+final class HedMETA extends HedEmpty {
+
+ /**
+ */
+ public HedMETA(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.META, collection);
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * META.
+ * %i18n;
+ * (http-equiv NAME #IMPLIED)
+ * (name NAME #IMPLIED) ... should be defined locally.
+ * (content CDATA #REQUIRED)
+ * (scheme CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+
+ // (name NAME #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(HTMLCMDataType.NAME);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_NAME, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_NAME, attr);
+
+ // 249493
+ atype = new HTMLCMDataTypeImpl(CMDataType.CDATA);
+ attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_CONTENT, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_CONTENT, attr);
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_HTTP_EQUIV,
+ // CHTMLNamespace.ATTR_NAME_CONTENT
+ };
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOL.java
new file mode 100644
index 0000000000..b2583d0a20
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOL.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * OL.
+ */
+final class HedOL extends HedListItemContainer {
+
+ /**
+ */
+ public HedOL(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.OL, collection);
+ }
+
+ /**
+ * OL.
+ * (type %OLStyle; #IMPLIED) ... should be defined locally.
+ * (compact (compact) #IMPLIED)
+ * (start NUMBER #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOPTION.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOPTION.java
new file mode 100644
index 0000000000..84a081d473
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedOPTION.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+import java.util.Iterator;
+
+/**
+ * OPTION.
+ */
+final class HedOPTION extends HedPcdata {
+
+ private static String[] terminators = {CHTMLNamespace.ElementName.OPTION};
+
+ /**
+ */
+ public HedOPTION(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.OPTION, collection);
+ layoutType = LAYOUT_HIDDEN;
+ omitType = OMIT_END;
+ }
+
+ /**
+ * OPTION.
+ * %attrs;
+ * (selected (selected) #IMPLIED)
+ * (disabled (disabled) #IMPLIED)
+ * (label %Text; #IMPLIED)
+ * (value CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_SELECTED, CHTMLNamespace.ATTR_NAME_VALUE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+
+ /**
+ * OPTION has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ return Arrays.asList(terminators).iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedP.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedP.java
new file mode 100644
index 0000000000..9619c28997
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedP.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * 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.util.Collection;
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * P.
+ */
+final class HedP extends HedInlineContainer {
+
+ private static Collection terminators = null;
+
+ /**
+ */
+ public HedP(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.P, collection);
+ correctionType = CORRECT_EMPTY;
+ layoutType = LAYOUT_BLOCK;
+ omitType = OMIT_END;
+ }
+
+ /**
+ * Create all attribute declarations.
+ * This method is called once in the constructor of the super class.
+ * The <code>P</code> element may have the following attributes:
+ * <table>
+ * <tbody>
+ * <tr>
+ * <th>NAME</th><th>TYPE</th><th>USAGE</th><th>DEFAULT (INITIAL) VALUE</th><th>MEMO</th>
+ * </tr>
+ * <tr>
+ * <td>%attrs;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * <tr>
+ * <td>%align;</td><td>-</td><td>-</td><td>-</td><td>-</td>
+ * </tr>
+ * </tbody>
+ * </table>
+ * <p><b>%align;</b> means <code>align (left|center|right|justify) #IMPLIED</code>.
+ * Unfortunately, this <code>align</code> is different from one in
+ * <code>IMG</code> or <code>TABLE</code>. So, the attribute declaration
+ * of <code>align</code> should be localy created and it shouldn't be registered
+ * in a <code>HCMDocImpl</code> instance.</p>
+ * <p>However, %align is used in sevaral times. I wouldn't write same code
+ * in many times. So, I add a new utility method into <code>CMUtil</code>
+ * to create the attribute declaration.</p>
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElemDeclImpl
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+ attributes = new CMNamedNodeMapImpl();
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // align
+ HTMLAttrDeclImpl adec = AttributeCollection.createAlignForParagraph();
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_ALIGN, adec);
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+ return prohibitedAncestors;
+ }
+
+ /**
+ * Return names of terminators.
+ * <code>P</code> has terminators.
+ * @return java.util.Iterator
+ */
+ protected Iterator getTerminators() {
+ if (terminators != null)
+ return terminators.iterator();
+ //<<D217982
+ terminators = new Vector();
+ terminators.addAll(elementCollection.getNamesOfBlock());
+ terminators.add(CHTMLNamespace.ElementName.LI);
+ terminators.add(CHTMLNamespace.ElementName.DT);
+ terminators.add(CHTMLNamespace.ElementName.DD);
+ //D217982
+ return terminators.iterator();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPRE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPRE.java
new file mode 100644
index 0000000000..649d1473d6
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPRE.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * PRE.
+ */
+final class HedPRE extends HedInlineContainer {
+
+ /**
+ * PRE element should keep spaces in its source.
+ */
+ public HedPRE(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.PRE, collection);
+ // CORRECT_EMPTY - GROUP_COMPACT
+ correctionType = CORRECT_EMPTY;
+
+ keepSpaces = true;
+ }
+
+ /**
+ * %attrs;
+ * (width NUMBER #IMPLIED) ... should be defined locally.
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+ // (width NUMBER #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_WIDTH, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_WIDTH, attr);
+ }
+
+ /**
+ * Exclusion.
+ * <code>PRE</code> has the exclusion.
+ * It is <code>%pre.exclusion;</code>.
+ * %pre.exclusion is:
+ * IMG | OBJECT | APPLET | BIG | SMALL | SUB | SUP | FONT | BASEFONT
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+ String[] names = {CHTMLNamespace.ElementName.IMG,};
+ elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator());
+
+ return exclusion;
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPcdata.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPcdata.java
new file mode 100644
index 0000000000..15b13c334e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedPcdata.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+
+/**
+ * Base class for PCDATA type element declarations.<br>
+ */
+abstract class HedPcdata extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedPcdata(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_PCDATA;
+ }
+
+ /**
+ * Content.<br>
+ * PCDATA type always returns <code>null</code>.
+ * <br>
+ * @return org.eclipse.wst.xml.core.internal.contentmodel.CMContent
+ */
+ public CMContent getContent() {
+ return null;
+ }
+
+ /**
+ * Content type.<br>
+ * @see org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration
+ */
+ public int getContentType() {
+ return CMElementDeclaration.PCDATA;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSELECT.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSELECT.java
new file mode 100644
index 0000000000..cbd0bb80a2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSELECT.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ * SELECT.
+ */
+final class HedSELECT extends HTMLElemDeclImpl {
+
+ /**
+ */
+ public HedSELECT(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.SELECT, collection);
+ typeDefinitionName = ComplexTypeDefinitionFactory.CTYPE_SELECT;
+ layoutType = LAYOUT_OBJECT;
+ indentChild = true;
+ }
+
+ /**
+ * %attrs;
+ * %reserved;
+ * (name CDATA #IMPLIED)
+ * (size NUMBER #IMPLIED) ... should be defined locally.
+ * (multiple (multiple) #IMPLIED)
+ * (disabled (disabled) #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ * (onchange %Script; #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ // (size NUMBER #IMPLIED) ... should be defined locally.
+ HTMLCMDataTypeImpl atype = new HTMLCMDataTypeImpl(CMDataType.NUMBER);
+ HTMLAttrDeclImpl attr = new HTMLAttrDeclImpl(CHTMLNamespace.ATTR_NAME_SIZE, atype, CMAttributeDeclaration.OPTIONAL);
+ attributes.putNamedItem(CHTMLNamespace.ATTR_NAME_SIZE, attr);
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_MULTIPLE,};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIBase.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIBase.java
new file mode 100644
index 0000000000..6ffdbe5940
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIBase.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+
+
+
+
+/**
+ * Base class for SSI declarations.
+ */
+abstract class HedSSIBase extends HedEmpty {
+
+ /**
+ */
+ public HedSSIBase(String elementName, ElementCollection collection) {
+ super(elementName, collection);
+ layoutType = LAYOUT_OBJECT;
+ }
+
+ /**
+ */
+ public int getFormatType() {
+ return HTMLElementDeclaration.FORMAT_SSI;
+ }
+
+ /**
+ */
+ public boolean supports(String propName) {
+ if (propName.equals(HTMLCMProperties.IS_SSI))
+ return true;
+ return super.supports(propName);
+ }
+
+ /*
+ */
+ public Object getProperty(String propName) {
+ if (propName.equals(HTMLCMProperties.IS_SSI))
+ return new Boolean(true);
+ return super.getProperty(propName);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIConfig.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIConfig.java
new file mode 100644
index 0000000000..d5e92e341d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIConfig.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+/**
+ * SSI:CONFIG.
+ */
+final class HedSSIConfig extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIConfig(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.SSI_CONFIG, collection);
+ }
+
+ /**
+ * SSI:CONFIG.
+ * (errmsg CDATA #IMPLIED)
+ * (sizefmt CDATA #IMPLIED)
+ * (timefmt CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_ERRMSG, CHTMLNamespace.ATTR_NAME_SIZEFMT, CHTMLNamespace.ATTR_NAME_TIMEFMT};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIEcho.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIEcho.java
new file mode 100644
index 0000000000..3cf3f7c2bf
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIEcho.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+/**
+ * SSI:ECHO.
+ */
+final class HedSSIEcho extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIEcho(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.SSI_ECHO, collection);
+ }
+
+ /**
+ * SSI:ECHO
+ * (var CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_VAR};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIExec.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIExec.java
new file mode 100644
index 0000000000..e97cb5d6b7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIExec.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+/**
+ * SSI:EXEC.
+ */
+final class HedSSIExec extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIExec(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.SSI_EXEC, collection);
+ }
+
+ /**
+ * SSI:EXEC
+ * (cgi %URI; #IMPLIED)
+ * (cmd CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_CGI, CHTMLNamespace.ATTR_NAME_CMD};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFlastmod.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFlastmod.java
new file mode 100644
index 0000000000..75eaf9d1c1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFlastmod.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+/**
+ * SSI:FLASTMOD.
+ */
+final class HedSSIFlastmod extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIFlastmod(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.SSI_FLASTMOD, collection);
+ }
+
+ /**
+ * SSI:FLASTMOD
+ * (file %URI; #IMPLIED)
+ * (virtual %URI #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_FILE, CHTMLNamespace.ATTR_NAME_VIRTUAL};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFsize.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFsize.java
new file mode 100644
index 0000000000..3fbf3c11fd
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIFsize.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+/**
+ * SSI:FSIZE.
+ */
+final class HedSSIFsize extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIFsize(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.SSI_FSIZE, collection);
+ }
+
+ /**
+ * SSI:FSIZE
+ * (file %URI; #IMPLIED)
+ * (virtual %URI #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_FILE, CHTMLNamespace.ATTR_NAME_VIRTUAL};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIInclude.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIInclude.java
new file mode 100644
index 0000000000..4788b5e161
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIInclude.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+/**
+ * SSI:INCLUDE.
+ */
+final class HedSSIInclude extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIInclude(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.SSI_INCLUDE, collection);
+ }
+
+ /**
+ * SSI:INCLUDE
+ * (file %URI; #IMPLIED)
+ * (virtual %URI #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_FILE, CHTMLNamespace.ATTR_NAME_VIRTUAL};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIPrintenv.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIPrintenv.java
new file mode 100644
index 0000000000..0064a4f0cd
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSIPrintenv.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * SSI:PRINTENV.
+ */
+final class HedSSIPrintenv extends HedSSIBase {
+
+ /**
+ */
+ public HedSSIPrintenv(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.SSI_PRINTENV, collection);
+ }
+
+ /**
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+ }
+
+ /**
+ * SSI:PRINTENV has no attributes. So, this method should
+ * always return <code>null</code>.
+ * Note: Since somebody doesn't expect null is returned, return the empty attribute
+ * like a custom tag which doesn't have attributes
+ */
+ public CMNamedNodeMap getAttributes() {
+ return super.getAttributes();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSISet.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSISet.java
new file mode 100644
index 0000000000..e1a8e1d627
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedSSISet.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+/**
+ * SSI:SET.
+ */
+final class HedSSISet extends HedSSIBase {
+
+ /**
+ */
+ public HedSSISet(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.SSI_SET, collection);
+ }
+
+ /**
+ * SSI:SET
+ * (var CDATA #IMPLIED)
+ * (value CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_VAR, CHTMLNamespace.ATTR_NAME_VALUE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTEXTAREA.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTEXTAREA.java
new file mode 100644
index 0000000000..bef9535cf1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTEXTAREA.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+/**
+ * TEXTAREA.
+ */
+final class HedTEXTAREA extends HedPcdata {
+
+ /**
+ * TEXTAREA should keep spaces in its source.
+ */
+ public HedTEXTAREA(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.TEXTAREA, collection);
+ layoutType = LAYOUT_OBJECT;
+
+ keepSpaces = true;
+ }
+
+ /**
+ * TEXTAREA.
+ * %attrs;
+ * %reserved; ... empty
+ * (name CDATA #IMPLIED)
+ * (rows NUMBER #REQUIRED)
+ * (cols NUMBER #REQUIRED)
+ * (disabled (disabled) #IMPLIED)
+ * (readonly (readonly) #IMPLIED)
+ * (tabindex NUMBER #IMPLIED)
+ * (accesskey %Character; #IMPLIED)
+ * (onfocus %Script; #IMPLIED)
+ * (onblur %Script; #IMPLIED)
+ * (onselect %Script; #IMPLIED)
+ * (onchange %Script; #IMPLIED)
+ * (istyle CDATA #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ String[] names = {CHTMLNamespace.ATTR_NAME_NAME, CHTMLNamespace.ATTR_NAME_ROWS, CHTMLNamespace.ATTR_NAME_COLS, CHTMLNamespace.ATTR_NAME_ISTYLE};
+ attributeCollection.getDeclarations(attributes, Arrays.asList(names).iterator());
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTITLE.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTITLE.java
new file mode 100644
index 0000000000..ad6a7429e4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedTITLE.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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.util.Arrays;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+
+/**
+ * TITLE.
+ */
+final class HedTITLE extends HedPcdata {
+
+ /**
+ */
+ public HedTITLE(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.TITLE, collection);
+ layoutType = LAYOUT_HIDDEN;
+ }
+
+ /**
+ * TITLE.
+ * %i18n;
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %i18n;
+ attributeCollection.getI18n(attributes);
+ }
+
+ /**
+ * Exclusion.
+ * <code>TITLE</code> has the exclusion.
+ * It is <code>%head.misc;</code>.
+ * %head.misc; is <code>SCRIPT|STYLE|META|LINK|OBJECT</code>.
+ * <br>
+ * @see com.ibm.sed.contentmodel.html.HTMLElementDeclaration
+ */
+ public CMContent getExclusion() {
+ if (exclusion != null)
+ return exclusion; // already created.
+ if (elementCollection == null)
+ return null;
+
+ // (SCRIPT|STYLE|META|LINK|OBJECT)
+ exclusion = new CMGroupImpl(CMGroup.CHOICE, 1, 1);
+
+ String[] names = {CHTMLNamespace.ElementName.META,};
+ elementCollection.getDeclarations(exclusion, Arrays.asList(names).iterator());
+ return exclusion;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedUL.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedUL.java
new file mode 100644
index 0000000000..15ddbc1451
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/HedUL.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * UL.
+ */
+final class HedUL extends HedListItemContainer {
+
+ /**
+ */
+ public HedUL(ElementCollection collection) {
+ super(CHTMLNamespace.ElementName.UL, collection);
+ }
+
+ /**
+ * UL.
+ * (type %ULStyle; #IMPLIED) ... should be defined locally.
+ * (compact (compact) #IMPLIED)
+ */
+ protected void createAttributeDeclarations() {
+ if (attributes != null)
+ return; // already created.
+ if (attributeCollection == null)
+ return; // fatal
+
+ attributes = new CMNamedNodeMapImpl();
+
+ // %attrs;
+ attributeCollection.getAttrs(attributes);
+
+ }
+
+ /**
+ */
+ public CMNamedNodeMap getProhibitedAncestors() {
+ if (prohibitedAncestors != null)
+ return prohibitedAncestors;
+
+ String[] names = {CHTMLNamespace.ElementName.DIR, CHTMLNamespace.ElementName.MENU};
+ prohibitedAncestors = elementCollection.getDeclarations(names);
+
+ return prohibitedAncestors;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProvider.java
new file mode 100644
index 0000000000..6ed567daaf
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProvider.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+
+
+
+/**
+ * PropertyProvider class.
+ * This class is intended to be used in HTMLElementDeclaration instances.
+ */
+interface PropertyProvider {
+
+ boolean supports(HTMLElementDeclaration edecl);
+
+ Object get(HTMLElementDeclaration edecl);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProviderFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProviderFactory.java
new file mode 100644
index 0000000000..847610309d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/chtml/PropertyProviderFactory.java
@@ -0,0 +1,363 @@
+/*******************************************************************************
+ * 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.util.Hashtable;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLPropertyDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.annotation.AnnotationMap;
+
+/**
+ * The factory object of PropertyProvider.
+ */
+final class PropertyProviderFactory {
+
+
+ /**
+ * DefaultProvider is intended to be used for unknown properties.
+ * It always returns null value for any properties.
+ */
+ class DefaultProvider implements PropertyProvider {
+ public DefaultProvider() {
+ super();
+ }
+
+ public boolean supports(HTMLElementDeclaration edecl) {
+ return false;
+ }
+
+ public Object get(HTMLElementDeclaration edecl) {
+ return null;
+ }
+ }
+
+ abstract class AbstractElementPropertyProvider implements PropertyProvider {
+ protected AbstractElementPropertyProvider() {
+ super();
+ }
+
+ public boolean supports(HTMLElementDeclaration edecl) {
+ return (edecl != null);
+ }
+
+ public Object get(HTMLElementDeclaration edecl) {
+ if (!(edecl instanceof HTMLPropertyDeclaration))
+ return null;
+ return getElementProperty((HTMLPropertyDeclaration)edecl);
+ }
+
+ abstract protected Object getElementProperty(HTMLPropertyDeclaration decl);
+ }
+
+ /*
+ * "tagInfo"
+ * gets documentation for the element
+ */
+ class PPTagInfo extends AbstractElementPropertyProvider {
+ private final static String htmlAnnotationLoc = "platform:/plugin/org.eclipse.wst.html.core/data/htmref.xml"; //$NON-NLS-1$
+ protected AnnotationMap fAnnotationMap = null;
+
+ public PPTagInfo() {
+ super();
+ }
+
+ /**
+ * Gets the annotationMap.
+ * @return Returns a AnnotationMap
+ */
+ protected AnnotationMap getAnnotationMap() {
+ if (fAnnotationMap == null) {
+ fAnnotationMap = new AnnotationMap();
+ try {
+ fAnnotationMap.load(htmlAnnotationLoc);
+ }
+ catch (Exception e) {
+ // no annotation available
+ }
+ }
+ return fAnnotationMap;
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ if (decl instanceof HTMLElementDeclaration) {
+ return getAnnotationMap().getProperty(((HTMLElementDeclaration)decl).getElementName(), "tagInfo"); //$NON-NLS-1$
+ } else {
+ return null;
+ }
+ }
+ }
+
+ /*
+ * "shouldKeepSpace"
+ */
+ class PPShouldKeepSpace extends AbstractElementPropertyProvider {
+ public PPShouldKeepSpace() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(decl.shouldKeepSpaces());
+ }
+ }
+
+ /*
+ * "shouldIndentChildSource"
+ */
+ class PPShouldIndentChildSource extends AbstractElementPropertyProvider {
+ public PPShouldIndentChildSource() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(decl.shouldIndentChildSource());
+ }
+ }
+
+ /*
+ * "terminators"
+ */
+ class PPTerminators extends AbstractElementPropertyProvider {
+ public PPTerminators() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ if (decl == null)
+ return null;
+ if (! (decl instanceof HTMLElemDeclImpl)) return null;
+ return ((HTMLElemDeclImpl)decl).getTerminators();
+ }
+ }
+
+ /*
+ * "prohibitedAncestors"
+ */
+ class PPProhibitedAncestors extends AbstractElementPropertyProvider {
+ public PPProhibitedAncestors() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return decl.getProhibitedAncestors();
+ }
+ }
+
+ /*
+ * "isJSP"
+ */
+ class PPIsJSP extends AbstractElementPropertyProvider {
+ public PPIsJSP() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(decl.isJSP());
+ }
+ }
+
+ /*
+ * "isXHTML"
+ * HTMLElementDeclaration itself never represent any XHTML element declaration.
+ * So, this property must be always false.
+ */
+ class PPIsXHTML extends AbstractElementPropertyProvider {
+ public PPIsXHTML() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(false);
+ }
+ }
+
+ /*
+ * "isSSI"
+ * Each declaration class for SSI elements must provide this property itself,
+ * and then return true. Other declaration must always return false.
+ */
+ class PPIsSSI extends AbstractElementPropertyProvider {
+ public PPIsSSI() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return new Boolean(false);
+ }
+ }
+
+ /*
+ * "lineBreakHint"
+ */
+ class PPLineBreakHint extends AbstractElementPropertyProvider {
+ public PPLineBreakHint() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ String hint = HTMLCMProperties.Values.BREAK_NONE;
+ switch (decl.getLineBreakHint()) {
+ case HTMLElementDeclaration.BREAK_AFTER_START :
+ hint = HTMLCMProperties.Values.BREAK_AFTER_START;
+ break;
+ case HTMLElementDeclaration.BREAK_BEFORE_START_AND_AFTER_END :
+ hint = HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END;
+ break;
+ case HTMLElementDeclaration.BREAK_NONE :
+ // nothing to do
+ default :
+ break;
+ }
+ return hint;
+ }
+ }
+
+ /*
+ * "layoutType"
+ */
+ class PPLayoutType extends AbstractElementPropertyProvider {
+ public PPLayoutType() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ String type = HTMLCMProperties.Values.LAYOUT_NONE;
+ switch (decl.getLayoutType()) {
+ case HTMLElementDeclaration.LAYOUT_BLOCK :
+ type = HTMLCMProperties.Values.LAYOUT_BLOCK;
+ break;
+ case HTMLElementDeclaration.LAYOUT_BREAK :
+ type = HTMLCMProperties.Values.LAYOUT_BREAK;
+ break;
+ case HTMLElementDeclaration.LAYOUT_HIDDEN :
+ type = HTMLCMProperties.Values.LAYOUT_HIDDEN;
+ break;
+ case HTMLElementDeclaration.LAYOUT_OBJECT :
+ type = HTMLCMProperties.Values.LAYOUT_OBJECT;
+ break;
+ case HTMLElementDeclaration.LAYOUT_WRAP :
+ type = HTMLCMProperties.Values.LAYOUT_WRAP;
+ break;
+ case HTMLElementDeclaration.LAYOUT_NONE :
+ // nothing to do.
+ default :
+ break;
+ }
+ return type;
+ }
+ }
+
+ /*
+ * "omitType"
+ */
+ class PPOmitType extends AbstractElementPropertyProvider {
+ public PPOmitType() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ String type = HTMLCMProperties.Values.OMIT_NONE;
+ switch (decl.getOmitType()) {
+ case HTMLElementDeclaration.OMIT_BOTH :
+ type = HTMLCMProperties.Values.OMIT_BOTH;
+ break;
+ case HTMLElementDeclaration.OMIT_END :
+ type = HTMLCMProperties.Values.OMIT_END;
+ break;
+ case HTMLElementDeclaration.OMIT_END_DEFAULT :
+ type = HTMLCMProperties.Values.OMIT_END_DEFAULT;
+ break;
+ case HTMLElementDeclaration.OMIT_END_MUST :
+ type = HTMLCMProperties.Values.OMIT_END_MUST;
+ break;
+ case HTMLElementDeclaration.OMIT_NONE :
+ // nothing to do.
+ default :
+ break;
+ }
+ return type;
+ }
+ }
+
+ /*
+ * "inclusion"
+ */
+ class PPInclusion extends AbstractElementPropertyProvider {
+ public PPInclusion() {
+ super();
+ }
+
+ protected Object getElementProperty(HTMLPropertyDeclaration decl) {
+ return decl.getInclusion();
+ }
+ }
+
+ public static PropertyProvider getProvider(String propName) {
+ PropertyProviderFactory factory = getInstance();
+ PropertyProvider pp = (PropertyProvider) factory.registry.get(propName);
+ if (pp != null)
+ return pp;
+
+ pp = factory.create(propName);
+ if (pp == null)
+ return factory.defaultProvider;
+
+ factory.registry.put(propName, pp);
+ return pp;
+ }
+
+ private static PropertyProviderFactory instance = null;
+
+ private synchronized static PropertyProviderFactory getInstance() {
+ if (instance != null)
+ return instance;
+ instance = new PropertyProviderFactory();
+ return instance;
+ }
+
+ private Hashtable registry = new Hashtable();
+ private PropertyProvider defaultProvider = new DefaultProvider();
+
+ private PropertyProviderFactory() {
+ super();
+ }
+
+ private PropertyProvider create(String propName) {
+ PropertyProvider pp = null;
+ if (propName.equals(HTMLCMProperties.IS_JSP))
+ pp = new PPIsJSP();
+ else if (propName.equals(HTMLCMProperties.IS_XHTML))
+ pp = new PPIsXHTML();
+ else if (propName.equals(HTMLCMProperties.IS_SSI))
+ pp = new PPIsSSI();
+ else if (propName.equals(HTMLCMProperties.LAYOUT_TYPE))
+ pp = new PPLayoutType();
+ else if (propName.equals(HTMLCMProperties.LINE_BREAK_HINT))
+ pp = new PPLineBreakHint();
+ else if (propName.equals(HTMLCMProperties.PROHIBITED_ANCESTORS))
+ pp = new PPProhibitedAncestors();
+ else if (propName.equals(HTMLCMProperties.SHOULD_KEEP_SPACE))
+ pp = new PPShouldKeepSpace();
+ else if (propName.equals(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE))
+ pp = new PPShouldIndentChildSource();
+ else if (propName.equals(HTMLCMProperties.TERMINATORS))
+ pp = new PPTerminators();
+ else if (propName.equals(HTMLCMProperties.TAGINFO))
+ pp = new PPTagInfo();
+ else if (propName.equals(HTMLCMProperties.OMIT_TYPE))
+ pp = new PPOmitType();
+ else if (propName.equals(HTMLCMProperties.INCLUSION))
+ pp = new PPInclusion();
+
+ return pp;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ssi/SSICMDocumentFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ssi/SSICMDocumentFactory.java
new file mode 100644
index 0000000000..7de746b01c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contentmodel/ssi/SSICMDocumentFactory.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * 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.ssi;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
+
+/**
+ * CMDocument factory for SSI documents.
+ */
+public final class SSICMDocumentFactory {
+
+ private final static String PREFIX = "SSI";//$NON-NLS-1$
+ private final static String DOC_TYPE_NAME = "SSI";//$NON-NLS-1$
+
+ static class CMNamespaceImpl implements CMNamespace {
+ public CMNamespaceImpl() {
+ super();
+ }
+
+ public String getPrefix() {
+ return PREFIX;
+ }
+
+ public String getURI() {
+ return ""; //$NON-NLS-1$
+ }
+
+ public String getNodeName() {
+ return DOC_TYPE_NAME;
+ }
+
+ public int getNodeType() {
+ return CMNode.NAME_SPACE;
+ }
+
+ public boolean supports(String propertyName) {
+ return false;
+ }
+
+ public Object getProperty(String propertyName) {
+ return null;
+ }
+
+ }
+
+ static class CMDocImpl implements CMDocument {
+ private static CMDocument hcm = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
+
+ static class Elements implements CMNamedNodeMap {
+ private static String[] names = {HTML40Namespace.ElementName.SSI_CONFIG, HTML40Namespace.ElementName.SSI_ECHO, HTML40Namespace.ElementName.SSI_EXEC, HTML40Namespace.ElementName.SSI_FSIZE, HTML40Namespace.ElementName.SSI_FLASTMOD, HTML40Namespace.ElementName.SSI_INCLUDE, HTML40Namespace.ElementName.SSI_PRINTENV, HTML40Namespace.ElementName.SSI_SET};
+ private Hashtable map = new Hashtable();
+
+ public Elements() {
+ CMNamedNodeMap elems = hcm.getElements();
+ for (int i = 0; i < names.length; i++) {
+ String name = names[i];
+ CMElementDeclaration dec = (CMElementDeclaration) elems.getNamedItem(name);
+ if (dec != null)
+ map.put(name, dec);
+ }
+ }
+
+ public int getLength() {
+ return map.size();
+ }
+
+ public CMNode getNamedItem(String name) {
+ String cooked = getCanonicalName(name);
+ if (!map.containsKey(cooked))
+ return null;
+ return (CMNode) map.get(cooked);
+ }
+
+ public CMNode item(int index) {
+ Iterator iter = iterator();
+ while (iter.hasNext()) {
+ Object node = iter.next();
+ if (--index < 0)
+ return (CMNode) node;
+ }
+ return null;
+ }
+
+ public Iterator iterator() {
+ return map.values().iterator();
+ }
+
+ private String getCanonicalName(String rawName) {
+ return rawName.toUpperCase();
+ }
+ }
+
+ static private Elements elements = new Elements();
+
+
+ public CMDocImpl() {
+ super();
+ }
+
+ public String getNodeName() {
+ return ""; //$NON-NLS-1$
+ }
+
+ public int getNodeType() {
+ return CMNode.DOCUMENT;
+ }
+
+ public CMNamedNodeMap getElements() {
+ return elements;
+ }
+
+ public CMNamedNodeMap getEntities() {
+ return null;
+ }
+
+ public CMNamespace getNamespace() {
+ return ssins;
+ }
+
+ public Object getProperty(String propertyName) {
+ return null;
+ }
+
+ public boolean supports(String propertyName) {
+ return false;
+ }
+ }
+
+ private static CMNamespace ssins = new CMNamespaceImpl();
+ private static CMDocument mycm = new CMDocImpl();
+
+ private SSICMDocumentFactory() {
+ super();
+ }
+
+ public static CMDocument getCMDocument() {
+ return mycm;
+ }
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DOMStyleModelImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DOMStyleModelImpl.java
new file mode 100644
index 0000000000..7dbc200de0
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DOMStyleModelImpl.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 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
+ *******************************************************************************/
+/*
+ * Created on Sep 2, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.wst.html.core.internal.document;
+
+import org.eclipse.wst.xml.core.internal.document.DOMModelImpl;
+import org.w3c.dom.Document;
+
+/**
+ * @author davidw
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class DOMStyleModelImpl extends DOMModelImpl {
+ public DOMStyleModelImpl() {
+ // remember, the document is created in super constructor,
+ // via internalCreateDocument
+ super();
+ }
+
+ public void releaseFromEdit() {
+ releaseStyleSheets();
+ super.releaseFromEdit();
+ }
+
+ /**
+ */
+ public void releaseFromRead() {
+ releaseStyleSheets();
+ super.releaseFromRead();
+ }
+
+ private void releaseStyleSheets() {
+ if (!isShared()) {
+ Document doc = getDocument();
+ if (doc instanceof DocumentStyleImpl) {
+ ((DocumentStyleImpl) doc).releaseStyleSheets();
+ }
+ }
+ }
+
+ /**
+ * createDocument method
+ * @return org.w3c.dom.Document
+ */
+ protected Document internalCreateDocument() {
+ DocumentStyleImpl document = new DocumentStyleImpl();
+ document.setModel(this);
+ return document;
+ }
+
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java
new file mode 100644
index 0000000000..e464beeb5a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/DocumentStyleImpl.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+/*
+ * Created on Sep 2, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.wst.html.core.internal.document;
+
+import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.xml.core.document.IDOMDocument;
+import org.eclipse.wst.xml.core.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.css.CSSStyleDeclaration;
+import org.w3c.dom.css.DocumentCSS;
+import org.w3c.dom.stylesheets.StyleSheetList;
+
+/**
+ * @author davidw
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class DocumentStyleImpl extends DocumentImpl implements IDOMDocument, DocumentCSS {
+ public DocumentStyleImpl() {
+ super();
+ }
+
+ protected DocumentStyleImpl(DocumentImpl that) {
+ super(that);
+ }
+
+ public CSSStyleDeclaration getOverrideStyle(Element element, String pseudoName) {
+ INodeAdapter adapter = getAdapterFor(IStyleSheetListAdapter.class);
+ if (adapter == null)
+ return null;
+ return ((IStyleSheetListAdapter) adapter).getOverrideStyle(element, pseudoName);
+ }
+
+ public StyleSheetList getStyleSheets() {
+ INodeAdapter adapter = getAdapterFor(IStyleSheetListAdapter.class);
+ if (adapter == null)
+ return null;
+ return ((IStyleSheetListAdapter) adapter).getStyleSheets();
+ }
+
+ protected void releaseStyleSheets() {
+ INodeAdapter adapter = getExistingAdapter(IStyleSheetListAdapter.class);
+ if (adapter == null)
+ return;
+ ((IStyleSheetListAdapter) adapter).releaseStyleSheets();
+ }
+
+ /**
+ * createElement method
+ * @return org.w3c.dom.Element
+ * @param tagName java.lang.String
+ */
+ public Element createElement(String tagName) throws DOMException {
+ checkTagNameValidity(tagName);
+
+ ElementStyleImpl element = new ElementStyleImpl();
+ element.setOwnerDocument(this);
+ element.setTagName(tagName);
+ return element;
+ }
+
+ /**
+ * cloneNode method
+ * @return org.w3c.dom.Node
+ * @param deep boolean
+ */
+ public Node cloneNode(boolean deep) {
+ DocumentStyleImpl cloned = new DocumentStyleImpl(this);
+ if (deep)
+ cloned.importChildNodes(this, true);
+ return cloned;
+ }
+
+ protected void setModel(IDOMModel model) {
+ super.setModel(model);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java
new file mode 100644
index 0000000000..2198b24145
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/ElementStyleImpl.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+/*
+ * Created on Sep 2, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.wst.html.core.internal.document;
+
+import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleDeclarationAdapter;
+import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.document.ElementImpl;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.css.CSSStyleDeclaration;
+import org.w3c.dom.css.ElementCSSInlineStyle;
+import org.w3c.dom.stylesheets.LinkStyle;
+import org.w3c.dom.stylesheets.StyleSheet;
+
+public class ElementStyleImpl extends ElementImpl implements IDOMElement, ElementCSSInlineStyle, LinkStyle {
+ public ElementStyleImpl() {
+ super();
+ }
+
+ public ElementStyleImpl(ElementImpl that) {
+ super(that);
+ }
+
+ public StyleSheet getSheet() {
+ INodeAdapter adapter = getAdapterFor(IStyleSheetAdapter.class);
+ if (adapter == null)
+ return null;
+ if (!(adapter instanceof IStyleSheetAdapter))
+ return null;
+ return ((IStyleSheetAdapter) adapter).getSheet();
+ }
+
+ public CSSStyleDeclaration getStyle() {
+ INodeAdapter adapter = getAdapterFor(IStyleDeclarationAdapter.class);
+ if (adapter == null)
+ return null;
+ if (!(adapter instanceof IStyleDeclarationAdapter))
+ return null;
+ return ((IStyleDeclarationAdapter) adapter).getStyle();
+ }
+
+ protected void setOwnerDocument(Document ownerDocument) {
+ super.setOwnerDocument(ownerDocument);
+ }
+
+ protected void setTagName(String tagName) {
+ super.setTagName(tagName);
+ }
+
+ public Node cloneNode(boolean deep) {
+ ElementImpl cloned = new ElementStyleImpl(this);
+ if (deep)
+ cloneChildNodes(cloned, deep);
+ return cloned;
+ }
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLConverter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLConverter.java
new file mode 100644
index 0000000000..9d9e9da409
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLConverter.java
@@ -0,0 +1,302 @@
+/*******************************************************************************
+ * 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.document;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.wst.html.core.internal.cleanup.HTMLCleanupProcessorImpl;
+import org.eclipse.wst.sse.core.IModelManager;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupPreferences;
+import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames;
+import org.eclipse.wst.sse.core.text.IStructuredDocument;
+import org.eclipse.wst.xml.core.document.IDOMDocument;
+import org.eclipse.wst.xml.core.document.IDOMDocumentType;
+import org.eclipse.wst.xml.core.document.IDOMModel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.Text;
+
+/**
+ */
+public class HTMLConverter {
+
+ /**
+ */
+ public HTMLConverter() {
+ super();
+
+ }
+
+ public void cleanupModel(IDOMModel model) {
+ if (model == null)
+ return;
+
+ HTMLCleanupProcessorImpl processor = new HTMLCleanupProcessorImpl();
+ IStructuredCleanupPreferences pref = processor.getCleanupPreferences();
+
+ // backup options
+ boolean compressEmptyElementTags = pref.getCompressEmptyElementTags();
+ boolean insertRequiredAttrs = pref.getInsertRequiredAttrs();
+ boolean insertMissingTags = pref.getInsertMissingTags();
+ boolean quoteAttrValues = pref.getQuoteAttrValues();
+ boolean formatSource = pref.getFormatSource();
+ int tagNameCase = pref.getTagNameCase();
+ int attrNameCase = pref.getAttrNameCase();
+
+ // setup options
+ pref.setCompressEmptyElementTags(true);
+ pref.setInsertRequiredAttrs(true);
+ pref.setInsertMissingTags(true);
+ pref.setQuoteAttrValues(true);
+ pref.setFormatSource(false);
+ if (model.getDocument().isXMLType()) { // XHTML
+ pref.setTagNameCase(CommonModelPreferenceNames.LOWER);
+ pref.setAttrNameCase(CommonModelPreferenceNames.LOWER);
+ }
+ else {
+ pref.setTagNameCase(CommonModelPreferenceNames.ASIS);
+ pref.setAttrNameCase(CommonModelPreferenceNames.ASIS);
+ }
+
+ processor.cleanupModel(model);
+
+ // set back options
+ pref.setCompressEmptyElementTags(compressEmptyElementTags);
+ pref.setInsertRequiredAttrs(insertRequiredAttrs);
+ pref.setInsertMissingTags(insertMissingTags);
+ pref.setQuoteAttrValues(quoteAttrValues);
+ pref.setFormatSource(formatSource);
+ pref.setTagNameCase(tagNameCase);
+ pref.setAttrNameCase(attrNameCase);
+ }
+
+ /**
+ * declaratoin: "data" for XML declaration, such as "version=\"1.0\""
+ * publicId: publicId for DOCTYPE declaration
+ */
+ public void convert(IDOMModel model, String declaration, String publicId) {
+ if (model == null)
+ return;
+ setDeclaration(model, declaration, publicId);
+ cleanupModel(model);
+ }
+
+ /**
+ * declaratoin: "data" for XML declaration, such as "version=\"1.0\""
+ * publicId: publicId for DOCTYPE declaration
+ */
+ public void convert(InputStream input, OutputStream output, String declaration, String publicId) throws UnsupportedEncodingException, IOException, CoreException {
+ IDOMModel model = readModel(input);
+ if (model == null)
+ return;
+ try {
+ convert(model, declaration, publicId);
+ writeModel(model, output);
+ }
+ finally {
+ if (model != null)
+ model.releaseFromEdit();
+ }
+ }
+
+ /**
+ * declaratoin: "data" for XML declaration, such as "version=\"1.0\""
+ * publicId: publicId for DOCTYPE declaration
+ */
+ public void convert(IFile file, String declaration, String publicId) throws IOException, CoreException {
+ IDOMModel model = readModel(file);
+ if (model == null)
+ return;
+ try {
+ convert(model, declaration, publicId);
+ writeModel(model, file);
+ }
+ finally {
+ if (model != null)
+ model.releaseFromEdit();
+ }
+ }
+
+ /**
+ */
+ private static void insertBreak(IDOMModel model, Node node) {
+ if (model == null || node == null)
+ return;
+ if (node.getNodeType() == Node.TEXT_NODE)
+ return;
+
+ // get delimiter string
+ IStructuredDocument structuredDocument = model.getStructuredDocument();
+ if (structuredDocument == null)
+ return;
+ String delim = structuredDocument.getLineDelimiter();
+ if (delim == null || delim.length() == 0)
+ return;
+
+ Node parent = node.getParentNode();
+ if (parent == null)
+ return;
+ Document document = node.getOwnerDocument();
+ if (document == null)
+ return;
+ Text text = document.createTextNode(delim);
+ parent.insertBefore(text, node);
+ }
+
+ /**
+ */
+ private IDOMModel readModel(InputStream input) throws IOException, UnsupportedEncodingException {
+ if (input == null)
+ return null;
+ // create temporary model
+ String id = input.toString() + ".html"; //$NON-NLS-1$
+ IModelManager manager = StructuredModelManager.getModelManager();
+ IStructuredModel model = manager.getModelForEdit(id, input, null);
+ if (!(model instanceof IDOMModel)) {
+ if (model == null)
+ model.releaseFromEdit();
+ return null;
+ }
+ return (IDOMModel) model;
+ }
+
+ /**
+ */
+ private IDOMModel readModel(IFile file) throws IOException, CoreException {
+ if (file == null)
+ return null;
+ IModelManager manager = StructuredModelManager.getModelManager();
+ IStructuredModel model = manager.getModelForEdit(file);
+ if (!(model instanceof IDOMModel)) {
+ if (model != null)
+ model.releaseFromEdit();
+ return null;
+ }
+ return (IDOMModel) model;
+ }
+
+ /**
+ */
+ public void setDeclaration(IDOMModel model, String declaration, String publicId) {
+ if (model == null)
+ return;
+ IDOMDocument document = model.getDocument();
+ if (document == null)
+ return;
+
+ try {
+ model.aboutToChangeModel();
+
+ ProcessingInstruction pi = null;
+ Node child = document.getFirstChild();
+ if (child != null && child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) {
+ String target = child.getNodeName();
+ if (target != null && target.equals("xml")) { //$NON-NLS-1$
+ pi = (ProcessingInstruction) child;
+ child = child.getNextSibling();
+ }
+ }
+ IDOMDocumentType docType = (IDOMDocumentType) document.getDoctype();
+
+ if (declaration != null) {
+ if (pi != null) {
+ pi.setData(declaration);
+ }
+ else {
+ pi = document.createProcessingInstruction("xml", declaration); //$NON-NLS-1$
+ document.insertBefore(pi, child);
+ insertBreak(model, child);
+ }
+ }
+
+ if (publicId != null) {
+ HTMLDocumentTypeEntry entry = HTMLDocumentTypeRegistry.getInstance().getEntry(publicId);
+ String name = (entry != null ? entry.getName() : null);
+ if (name == null || name.length() == 0)
+ name = "HTML"; // default //$NON-NLS-1$
+ if (docType != null) {
+ if (!name.equals(docType.getName())) { // replace
+ Node parent = docType.getParentNode();
+ child = docType;
+ docType = (IDOMDocumentType) document.createDoctype(name);
+ parent.insertBefore(docType, child);
+ parent.removeChild(child);
+ }
+ }
+ else {
+ docType = (IDOMDocumentType) document.createDoctype(name);
+ document.insertBefore(docType, child);
+ insertBreak(model, child);
+ }
+ docType.setPublicId(publicId);
+ if (entry != null) {
+ String systemId = entry.getSystemId();
+ if (systemId != null)
+ docType.setSystemId(systemId);
+ String namespaceURI = entry.getNamespaceURI();
+ if (namespaceURI != null) {
+ Element element = document.getDocumentElement();
+ if (element != null) {
+ element.setAttribute("xmlns", namespaceURI); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+ finally {
+ model.changedModel();
+ }
+ }
+
+ /**
+ */
+ private void writeModel(IDOMModel model, OutputStream output) throws UnsupportedEncodingException, IOException, CoreException {
+ if (model == null || output == null)
+ return;
+ model.save();
+ }
+
+ /**
+ */
+ private void writeModel(IDOMModel model, IFile file) throws IOException, CoreException {
+ if (model == null || file == null)
+ return;
+ IStructuredDocument structuredDocument = model.getStructuredDocument();
+ if (structuredDocument == null)
+ return;
+ //ByteArrayOutputStream output = null;
+ ByteArrayInputStream input = null;
+ try {
+ //output = new
+ // ByteArrayOutputStream(structuredDocument.getLength());
+ model.save();
+ //input = new ByteArrayInputStream(output.toByteArray());
+ //file.setContents(input, true, true, null);
+ }
+ finally {
+ // if (output != null)
+ // output.close();
+ if (input != null)
+ input.close();
+ }
+
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java
new file mode 100644
index 0000000000..49d80e53bd
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapter.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.ui.contentproperties.ContentSettings;
+import org.eclipse.wst.sse.ui.contentproperties.ContentSettingsChangeSubject;
+import org.eclipse.wst.sse.ui.contentproperties.IContentSettings;
+import org.eclipse.wst.sse.ui.contentproperties.IContentSettingsListener;
+import org.eclipse.wst.xml.core.document.IDOMDocument;
+import org.eclipse.wst.xml.core.document.IDOMDocumentType;
+import org.eclipse.wst.xml.core.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter;
+import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapterImpl;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Node;
+
+/**
+ */
+public class HTMLDocumentTypeAdapter extends DocumentTypeAdapterImpl implements IContentSettingsListener, HTMLDocumentTypeConstants {
+
+ private HTMLDocumentTypeAdapterFactory factory = null;
+ private HTMLDocumentTypeEntry entry = null;
+ private boolean isXMLType = false;
+ private final static String XML = "xml"; //$NON-NLS-1$
+ private final static String XHTML = "xhtml"; //$NON-NLS-1$
+ private final static String WML = "wml"; //$NON-NLS-1$
+
+
+ /**
+ */
+ protected HTMLDocumentTypeAdapter() {
+ super();
+ }
+
+ /**
+ */
+ protected HTMLDocumentTypeAdapter(IDOMDocument document, HTMLDocumentTypeAdapterFactory factory) {
+ super(document);
+
+ this.factory = factory;
+
+ // initialize
+ documentTypeChanged();
+
+ ContentSettingsChangeSubject.getSubject().addListener(this);
+ }
+
+ /**
+ */
+ public void contentSettingsChanged(IResource resource) {
+ if (resource == null)
+ return;
+ IDOMDocument document = getDocument();
+ if (document == null)
+ return;
+ IDOMModel model = document.getModel();
+ if (model == null)
+ return;
+ IFile file = getFile(model);
+ if (file == null)
+ return;
+ IProject project = file.getProject();
+ if (project == null)
+ return;
+ if (!project.equals(resource.getProject()))
+ return;
+ documentTypeChanged();
+ }
+
+ /**
+ */
+ private void documentTypeChanged() {
+ IDOMDocument document = getDocument();
+ if (document == null)
+ return; // error
+ IDOMModel model = document.getModel();
+ if (model == null)
+ return; // error
+
+ IFile file = getFile(model);
+
+ // find DOCTYPE delcaration and Public ID
+ String publicId = null;
+ DocumentType newDocumentType = findDocumentType(document);
+ if (newDocumentType != null) {
+ publicId = newDocumentType.getPublicId();
+ } else {
+ // lookup default set by contentsettings
+ publicId = getDefaultPublicId(file);
+ }
+
+ // lookup DOCTYPE registry
+ HTMLDocumentTypeEntry newEntry = null;
+ if (publicId != null) {
+ newEntry = HTMLDocumentTypeRegistry.getInstance().getEntry(publicId);
+ }
+
+ boolean newXMLType = (newEntry != null ? newEntry.isXMLType() : false);
+ boolean newWMLType = (newEntry != null ? newEntry.isWMLType() : false);
+
+ if (!newXMLType) {
+ // find XML declaration
+ if (findXMLNode(document) != null) {
+ newXMLType = true;
+ }
+
+ // check file extension
+ if (file != null) {
+ String ext = file.getFileExtension();
+ if (ext != null && ext.equalsIgnoreCase(XHTML)) {
+ newXMLType = true;
+ }
+
+ if (ext != null && ext.equalsIgnoreCase(WML)) {
+ newXMLType = true;
+ newWMLType = true;
+ }
+ }
+
+ }
+
+ if (newEntry == null) {
+ // lookup system default
+ if (newXMLType && newDocumentType == null) {
+ // use default XHTML, if it's XML and no document type
+ // declared
+ if (newWMLType)
+ newEntry = HTMLDocumentTypeRegistry.getInstance().getDefaultEntry(HTMLDocumentTypeRegistry.DEFAULT_WML);
+ else
+ newEntry = HTMLDocumentTypeRegistry.getInstance().getDefaultEntry(HTMLDocumentTypeRegistry.DEFAULT_XHTML);
+
+ } else {
+ newEntry = HTMLDocumentTypeRegistry.getInstance().getDefaultEntry(HTMLDocumentTypeRegistry.DEFAULT_HTML);
+ }
+ if (newEntry == null)
+ return; // error
+ }
+
+ if (newDocumentType == null) {
+ DocumentType oldDocumentType = getDocumentType();
+ if (oldDocumentType == null || oldDocumentType.getName() != newEntry.getName()) {
+ // create implicit DocumentType
+ DOMImplementation impl = document.getImplementation();
+ if (impl != null) {
+ String name = newEntry.getName();
+ publicId = newEntry.getPublicId();
+ String systemId = newEntry.getSystemId();
+ newDocumentType = impl.createDocumentType(name, publicId, systemId);
+ }
+ }
+ }
+
+ boolean notify = false;
+ if (this.entry != null) { // do not notify on initialization
+ notify = (newEntry != this.entry || newXMLType != this.isXMLType);
+ }
+
+ if (newDocumentType != null)
+ setDocumentType(newDocumentType);
+ this.entry = newEntry;
+ this.isXMLType = newXMLType;
+
+ if (notify)
+ notifyDocumentTypeChanged();
+ }
+
+ /**
+ */
+ private IDOMDocumentType findDocumentType(IDOMDocument document) {
+ IDOMDocumentType documentType = (IDOMDocumentType) document.getDoctype();
+ if (documentType != null && documentType.getExistingAdapter(DocumentTypeAdapter.class) == null) {
+ // watch future changes
+ documentType.addAdapter(this);
+ }
+ return documentType;
+ }
+
+ /**
+ */
+ private Node findXMLNode(Document document) {
+ for (Node child = document.getFirstChild(); child != null; child = child.getNextSibling()) {
+ if (child.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE)
+ continue;
+ String target = child.getNodeName();
+ if (target != null && target.equals(XML)) {
+ return child;
+ }
+ }
+ return null;
+ }
+
+ /**
+ */
+ public int getAttrNameCase() {
+ if (isXMLType())
+ return LOWER_CASE; // XHTML
+ return this.factory.getAttrNameCase();
+ }
+
+ /**
+ */
+ private String getDefaultPublicId(IFile file) {
+ if (file == null)
+ return null;
+ IProject project = file.getProject();
+ if (project == null)
+ return null;
+ IContentSettings settings = ContentSettings.getInstance();
+ if (settings == null)
+ return null;
+ String publicId = settings.getProperty(file, IContentSettings.HTML_DOCUMENT_TYPE);
+ if (publicId == null || publicId.length() == 0) {
+ // look up project default
+ publicId = settings.getProperty(project, IContentSettings.HTML_DOCUMENT_TYPE);
+ }
+ return publicId;
+ }
+
+ private IFile getFile(IStructuredModel model) {
+ IFile result = null;
+ String location = model.getBaseLocation();
+ if (location != null) {
+ IPath path = new Path(location);
+ if (!path.toFile().exists() && path.segmentCount() > 1) {
+ result = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+ }
+ }
+ return result;
+ }
+
+ /**
+ */
+ public int getTagNameCase() {
+ if (isXMLType())
+ return LOWER_CASE; // XHTML
+ return this.factory.getTagNameCase();
+ }
+
+ /**
+ */
+ public boolean hasFeature(String feature) {
+ if (feature == null)
+ return false;
+ if (feature.equals(HTML))
+ return true;
+ if (feature.equals(SSI))
+ return true;
+ if (feature.equals(FRAMESET)) {
+ if (this.entry == null)
+ return false;
+ return this.entry.hasFrameset();
+ }
+ return false;
+ }
+
+ /**
+ */
+ public boolean isXMLType() {
+ return this.isXMLType;
+ }
+
+ /**
+ */
+ public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
+ if (notifier == null)
+ return;
+ if (notifier instanceof IDOMDocument) {
+ if (eventType != INodeNotifier.STRUCTURE_CHANGED)
+ return;
+ } else {
+ if (eventType != INodeNotifier.CHANGE)
+ return;
+ }
+ documentTypeChanged();
+ }
+
+ /**
+ */
+ public void release() {
+ ContentSettingsChangeSubject.getSubject().removeListener(this);
+ super.release();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java
new file mode 100644
index 0000000000..0ad0c6bfca
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.sse.core.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames;
+import org.eclipse.wst.xml.core.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter;
+
+/**
+ */
+public class HTMLDocumentTypeAdapterFactory implements INodeAdapterFactory, Preferences.IPropertyChangeListener, CommonModelPreferenceNames {
+
+ private int tagNameCase = DocumentTypeAdapter.UPPER_CASE;
+ private int attrNameCase = DocumentTypeAdapter.LOWER_CASE;
+ private Preferences preferences = null;
+
+ // for removal later on release()
+ private DocumentTypeAdapter fAdapter = null;
+ private INodeNotifier fNotifier = null;
+
+ /**
+ */
+ public HTMLDocumentTypeAdapterFactory() {
+ super();
+ this.preferences = HTMLCorePlugin.getDefault().getPluginPreferences();
+ //this.store = CommonPreferencesPlugin.getDefault().getPreferenceStore(ContentTypeRegistry.HTML_ID);
+ if (this.preferences != null) {
+ updateCases(); // initialize
+ this.preferences.addPropertyChangeListener(this);
+ }
+ }
+
+ /**
+ * Method that returns the adapter associated with the given object.
+ * It may be a singleton or not ... depending on the needs of the INodeAdapter ...
+ * but in general it is recommended for an adapter to be stateless,
+ * so the efficiencies of a singleton can be gained.
+ *
+ * The implementation of this method should call addAdapter on the adapted
+ * object with the correct instance of the adapter.
+ */
+ public INodeAdapter adapt(INodeNotifier notifier) {
+ DocumentTypeAdapter adapter = (DocumentTypeAdapter)notifier.getExistingAdapter(DocumentTypeAdapter.class);
+ if (adapter != null)
+ return adapter;
+ if (!(notifier instanceof IDOMDocument))
+ return null;
+ adapter = new HTMLDocumentTypeAdapter((IDOMDocument) notifier, this);
+ notifier.addAdapter(adapter);
+
+ fAdapter = adapter;
+ fNotifier = notifier;
+
+ return adapter;
+ }
+
+ /**
+ */
+ public int getAttrNameCase() {
+ return this.attrNameCase;
+ }
+
+ /**
+ */
+ public int getTagNameCase() {
+ return this.tagNameCase;
+ }
+
+ /**
+ */
+ public boolean isFactoryForType(Object type) {
+ return (type == DocumentTypeAdapter.class);
+ }
+
+ /**
+ */
+ public void propertyChange(Preferences.PropertyChangeEvent event) {
+ if (event == null)
+ return;
+ String property = event.getProperty();
+ if (property == null)
+ return;
+
+ if (property.equals(TAG_NAME_CASE) || property.equals(ATTR_NAME_CASE)) {
+ updateCases();
+ }
+ }
+
+ /**
+ */
+ private void updateCases() {
+ this.tagNameCase = DocumentTypeAdapter.UPPER_CASE;
+ this.attrNameCase = DocumentTypeAdapter.LOWER_CASE;
+
+ if (this.preferences == null)
+ return;
+
+ if (this.preferences.getInt(TAG_NAME_CASE) == LOWER) {
+ this.tagNameCase = DocumentTypeAdapter.LOWER_CASE;
+ }
+ if (this.preferences.getInt(ATTR_NAME_CASE) == UPPER) {
+ this.attrNameCase = DocumentTypeAdapter.UPPER_CASE;
+ }
+ }
+
+ /**
+ */
+ public void release() {
+ if(fAdapter != null && fNotifier != null) {
+ fAdapter.release();
+ fNotifier.removeAdapter(fAdapter);
+ }
+ }
+
+ /**
+ * Overriding copy method
+ */
+ public INodeAdapterFactory copy() {
+ return new HTMLDocumentTypeAdapterFactory();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java
new file mode 100644
index 0000000000..abc328444d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeConstants.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.document;
+
+public interface HTMLDocumentTypeConstants {
+
+ public final static String HTML = "HTML"; //$NON-NLS-1$
+ public final static String FRAMESET = "FRAMESET"; //$NON-NLS-1$
+ public final static String SSI = "SSI"; //$NON-NLS-1$
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeEntry.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeEntry.java
new file mode 100644
index 0000000000..c8a51b3d5b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeEntry.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+/**
+ */
+public class HTMLDocumentTypeEntry {
+
+ private String name;
+ private String publicId;
+ private String systemId;
+ private String namespaceURI;
+ private boolean isXMLType;
+ private boolean isXHTMLType;
+ private boolean isWMLType;
+ private boolean hasFrameset;
+ private String displayName;
+ private boolean isDefaultXHTML;
+ private boolean isDefaultWML;
+ private static String XHTML_NAME = "html"; //$NON-NLS-1$
+ private static String HTML_NAME = "HTML"; //$NON-NLS-1$
+
+ /**
+ */
+ private HTMLDocumentTypeEntry() {
+ super();
+ }
+
+ /**
+ */
+ public HTMLDocumentTypeEntry(String name, String publicId, String systemId, String namespaceURI, boolean isXHTMLType, boolean hasFrameset, String displayName, boolean isDefaultXHTML, boolean isDefaultWML, boolean isWMLType) {
+ super();
+
+ if (name != null && name.length() > 0) {
+ this.name = name;
+ }
+ else {
+ if (isXMLType)
+ this.name = XHTML_NAME;// need code for wml?
+ else
+ this.name = HTML_NAME;
+ }
+ this.publicId = publicId;
+ this.systemId = systemId;
+ this.namespaceURI = namespaceURI;
+ this.isXMLType = isXHTMLType | isWMLType;
+ this.hasFrameset = hasFrameset;
+ this.displayName = displayName;
+ this.isDefaultXHTML = isDefaultXHTML;
+ this.isDefaultWML = isDefaultWML;
+ this.isXHTMLType = isXHTMLType;
+ this.isWMLType = isWMLType;
+ }
+
+ /**
+ */
+ public final String getName() {
+ return this.name;
+ }
+
+ /**
+ */
+ public final String getNamespaceURI() {
+ return this.namespaceURI;
+ }
+
+ /**
+ */
+ public final String getPublicId() {
+ return this.publicId;
+ }
+
+ /**
+ */
+ public final String getSystemId() {
+ return this.systemId;
+ }
+
+ /**
+ */
+ public final boolean isXMLType() {
+ return this.isXMLType;
+ }
+
+ /**
+ */
+ public final boolean hasFrameset() {
+ return this.hasFrameset;
+ }
+
+ /**
+ */
+ public final String getDisplayName() {
+ return this.displayName;
+ }
+
+ /**
+ */
+ public final boolean isDefaultXHTML() {
+ return this.isDefaultXHTML;
+ }
+
+ public final boolean isDefaultWML() {
+ return this.isDefaultWML;
+ }
+
+
+ public final boolean isXHTMLType() {
+ return isXHTMLType;
+ }
+
+ public final boolean isWMLType() {
+ return isWMLType;
+ }
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java
new file mode 100644
index 0000000000..6f9cd0cd4a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistry.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+/**
+ */
+public class HTMLDocumentTypeRegistry {
+
+ private static HTMLDocumentTypeRegistry instance = null;
+ private Hashtable entries = null;
+ private HTMLDocumentTypeEntry defaultEntry = null;
+ private HTMLDocumentTypeEntry defaultXHTMLEntry = null;
+ private HTMLDocumentTypeEntry defaultWMLEntry = null;
+ private HTMLDocumentTypeEntry defaultCHTMLEntry = null;
+
+ final static int DEFAULT_HTML = 0;
+ final static int DEFAULT_XHTML = 1;
+ final static int DEFAULT_WML = 2;
+ final static int DEFAULT_CHTML = 3;
+
+ public static final String CHTML_PUBLIC_ID = "-//W3C//DTD Compact HTML 1.0 Draft//EN";//$NON-NLS-1$
+
+ /**
+ */
+ private HTMLDocumentTypeRegistry() {
+ super();
+
+ this.entries = new Hashtable();
+ // HTML 4.01
+ String name = "HTML";//$NON-NLS-1$
+ String publicId = "-//W3C//DTD HTML 4.01 Transitional//EN";//$NON-NLS-1$
+ String displayName = "HTML 4.01 Transitional"; //$NON-NLS-1$
+ this.defaultEntry = new HTMLDocumentTypeEntry(name, publicId, null, null, false, false, displayName, false, false, false);
+ this.entries.put(publicId, this.defaultEntry);
+ publicId = "-//W3C//DTD HTML 4.01//EN";//$NON-NLS-1$
+ displayName = "HTML 4.01 Strict"; //$NON-NLS-1$
+ this.entries.put(publicId, new HTMLDocumentTypeEntry(name, publicId, null, null, false, false, displayName, false, false, false));
+ publicId = "-//W3C//DTD HTML 4.01 Frameset//EN";//$NON-NLS-1$
+ displayName = "HTML 4.01 Frameset"; //$NON-NLS-1$
+ this.entries.put(publicId, new HTMLDocumentTypeEntry(name, publicId, null, null, false, true, displayName, false, false, false));
+ // CHTML
+ name = "HTML";//$NON-NLS-1$
+ publicId = CHTML_PUBLIC_ID;
+ displayName = "Compact HTML 1.0 Draft"; //$NON-NLS-1$
+ this.defaultCHTMLEntry = new HTMLDocumentTypeEntry(name, publicId, null, null, false, false, displayName, false, false, false);
+ this.entries.put(publicId, this.defaultCHTMLEntry);
+
+ HTMLDocumentTypeRegistryReader reader = new HTMLDocumentTypeRegistryReader();
+ if (reader != null)
+ reader.readRegistry(this);
+ }
+
+ /**
+ */
+ void regist(String pid, HTMLDocumentTypeEntry doctype) {
+ if (pid == null || doctype == null)
+ return;
+ this.entries.put(pid, doctype);
+ if (this.defaultXHTMLEntry == null) {
+ if (doctype.isDefaultXHTML())
+ this.defaultXHTMLEntry = doctype;
+ }
+ if (this.defaultWMLEntry == null) {
+ if (doctype.isDefaultWML())
+ this.defaultWMLEntry = doctype;
+ }
+ }
+
+ /**
+ *
+ */
+ public HTMLDocumentTypeEntry getDefaultEntry(int type) {
+ HTMLDocumentTypeEntry entry = null;
+ switch (type) {
+ case DEFAULT_XHTML :
+ entry = this.defaultXHTMLEntry;
+ break;
+ case DEFAULT_WML :
+ entry = this.defaultWMLEntry;
+ break;
+ case DEFAULT_CHTML :
+ entry = this.defaultCHTMLEntry;
+ break;
+ case DEFAULT_HTML :
+ default :
+ entry = this.defaultEntry;
+ break;
+ }
+ return entry;
+ }
+
+ /**
+ *
+ */
+ public HTMLDocumentTypeEntry getDefaultEntry() {
+ return this.defaultEntry;
+ }
+
+ /**
+ */
+ public HTMLDocumentTypeEntry getXHTMLDefaultEntry() {
+ return this.defaultXHTMLEntry;
+ }
+
+ /**
+ */
+ public Enumeration getEntries() {
+ return this.entries.elements();
+ }
+
+ /**
+ */
+ public HTMLDocumentTypeEntry getEntry(String publicId) {
+ if (publicId == null)
+ return null;
+ return (HTMLDocumentTypeEntry) this.entries.get(publicId);
+ }
+
+ /**
+ */
+ public synchronized static HTMLDocumentTypeRegistry getInstance() {
+ if (instance == null)
+ instance = new HTMLDocumentTypeRegistry();
+ return instance;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistryReader.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistryReader.java
new file mode 100644
index 0000000000..2dbf6ed764
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeRegistryReader.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * 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.document;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ */
+class HTMLDocumentTypeRegistryReader {
+
+ //
+ private final static String PLUGIN_ID = "org.eclipse.wst.sse.core"; //$NON-NLS-1$
+ private final static String EXTENSION_POINT_ID = "documentTypes"; //$NON-NLS-1$
+ private final static String TAG_NAME = "documentType"; //$NON-NLS-1$
+ private final static String ATT_PID = "publicID"; //$NON-NLS-1$
+ private final static String ATT_SID = "systemID"; //$NON-NLS-1$
+ private final static String ATT_IS_XHTML = "isXHTML"; //$NON-NLS-1$
+ private final static String ATT_IS_WML = "isWML"; //$NON-NLS-1$
+ private final static String ATT_HAS_FRAMESET = "hasFrameset"; //$NON-NLS-1$
+ private final static String ATT_NSURI = "namespaceURI"; //$NON-NLS-1$
+ private final static String ATT_ENAME = "elementName"; //$NON-NLS-1$
+ private final static String ATT_DNAME = "displayName"; //$NON-NLS-1$
+ private final static String ATT_IS_DEFAULT_XHTML = "defaultXHTML"; //$NON-NLS-1$
+ private final static String ATT_IS_DEFAULT_WML = "defaultWML"; //$NON-NLS-1$
+ private final static String ATV_TRUE = "true"; //$NON-NLS-1$
+ private final static String ATV_NULL_STRING = ""; //$NON-NLS-1$
+
+ /**
+ */
+ HTMLDocumentTypeRegistryReader() {
+ super();
+ }
+
+ /**
+ */
+ void readRegistry(HTMLDocumentTypeRegistry reg) {
+ if (reg == null)
+ return;
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint point = registry.getExtensionPoint(PLUGIN_ID, EXTENSION_POINT_ID);
+ if (point != null) {
+ IConfigurationElement[] elements = point.getConfigurationElements();
+ for (int i = 0; i < elements.length; i++) {
+ HTMLDocumentTypeEntry doctype = readElement(elements[i]);
+ // null can be returned if there's an error reading the element
+ if (doctype != null) {
+ reg.regist(doctype.getPublicId(), doctype);
+ }
+ }
+ }
+ }
+
+ /**
+ */
+ private HTMLDocumentTypeEntry readElement(IConfigurationElement element) {
+ HTMLDocumentTypeEntry doctype = null;
+ String pid = null;
+ String sid = null;
+ String nsuri = null;
+ String root = null;
+ boolean xhtml = true;
+ boolean frameset = false;
+ String dname = null;
+ boolean defaultXhtml = false;
+ boolean defaultWML = false;
+ boolean isWML = false;
+
+ if (element.getName().equals(TAG_NAME)) {
+ pid = element.getAttribute(ATT_PID);
+ // publicID attribute is mandatory.
+ if (pid == null || pid.equals(ATV_NULL_STRING))
+ return null;
+
+ sid = element.getAttribute(ATT_SID);
+ nsuri = element.getAttribute(ATT_NSURI);
+ root = element.getAttribute(ATT_ENAME);
+ xhtml = getBoolean(element, ATT_IS_XHTML);
+ frameset = getBoolean(element, ATT_HAS_FRAMESET);
+ dname = element.getAttribute(ATT_DNAME);
+ defaultXhtml = getBoolean(element, ATT_IS_DEFAULT_XHTML);
+ defaultWML = getBoolean(element, ATT_IS_DEFAULT_WML);
+ isWML = getBoolean(element, ATT_IS_WML);
+ doctype = new HTMLDocumentTypeEntry(root, pid, sid, nsuri, xhtml, frameset, dname, defaultXhtml, defaultWML, isWML);
+ }
+ return doctype;
+ }
+
+ /**
+ */
+ private boolean getBoolean(IConfigurationElement element, String att) {
+ String value = element.getAttribute(att);
+ if (value != null && value.equals(ATV_TRUE))
+ return true;
+ return false;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java
new file mode 100644
index 0000000000..203fea0a87
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapter.java
@@ -0,0 +1,354 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLElementDeclaration;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.document.IDOMText;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+import org.eclipse.wst.xml.core.internal.document.CMNodeUtil;
+import org.eclipse.wst.xml.core.internal.document.ModelParserAdapter;
+import org.eclipse.wst.xml.core.internal.document.TagAdapter;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * HTMLDocumentImpl class
+ */
+public class HTMLModelParserAdapter implements ModelParserAdapter {
+ /**
+ * note: I made public, temparily, so could be used by JSPLoader
+ */
+ protected HTMLModelParserAdapter() {
+ super();
+ }
+
+ private boolean shouldTerminateAt(CMElementDeclaration parent, CMElementDeclaration child) {
+ if (!parent.supports(HTMLCMProperties.TERMINATORS))
+ return false;
+ java.util.Iterator i = (java.util.Iterator) parent.getProperty(HTMLCMProperties.TERMINATORS);
+ if (i == null)
+ return false;
+ String nextName = child.getElementName();
+ while (i.hasNext()) {
+ // NOTE: CMElementDeclaration of child is not always HTMLCMElementDeclaration.
+ // It might be one of based on DTD (for XHTML element). So, comparison must
+ // be performed ignoring case.
+ // -- 3/20/2002
+ String terminator = (String) i.next();
+ if (terminator == null)
+ continue;
+ if (nextName.equalsIgnoreCase(terminator))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ */
+ public boolean canContain(Element element, Node child) {
+ if (element == null || child == null)
+ return false;
+ IDOMElement impl = (IDOMElement) element;
+
+ if (child.getNodeType() == Node.ELEMENT_NODE) {
+ if (!impl.isGlobalTag())
+ return true; // non HTML tag
+ IDOMElement childElement = (IDOMElement) child;
+
+ CMElementDeclaration myDec = CMNodeUtil.getElementDeclaration(element);
+ if (myDec == null)
+ return true;
+ //if (!(myDec instanceof HTMLElementDeclaration)) return true;
+ if (myDec.getContentType() == CMElementDeclaration.EMPTY)
+ return false;
+
+ if (!childElement.isGlobalTag())
+ return true; // non HTML tag
+ CMElementDeclaration childDec = CMNodeUtil.getElementDeclaration(childElement);
+ if (childDec == null)
+ return true;
+ //if (!(childDec instanceof HTMLElementDeclaration)) return true;
+
+ if (myDec instanceof HTMLElementDeclaration) {
+ if (((Boolean) ((HTMLElementDeclaration) myDec).getProperty(HTMLCMProperties.IS_JSP)).booleanValue())
+ return true;
+ }
+ if (shouldTerminateAt(myDec, childDec) && !isValidChild(myDec, childDec)) {
+ return false;
+ }
+
+ String tagName = impl.getTagName();
+ if (tagName == null)
+ return true;
+ String childName = childElement.getTagName();
+ if (childName == null)
+ return true;
+ if (!impl.hasStartTag() && !impl.hasEndTag()) {
+ // implicit element
+ if (tagName.equalsIgnoreCase(childElement.getTagName()))
+ return false;
+ if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.HEAD)) {
+ if (!childName.equalsIgnoreCase(HTML40Namespace.ElementName.META) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.TITLE) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.LINK) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.STYLE) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.BASE) && !childName.equalsIgnoreCase(HTML40Namespace.ElementName.ISINDEX)) {
+ return false;
+ }
+ }
+
+ Node parent = element.getParentNode();
+ if (parent != null && parent.getNodeType() == Node.ELEMENT_NODE) {
+ IDOMElement parentElement = (IDOMElement) parent;
+ if (!parentElement.hasStartTag() && !parentElement.hasEndTag()) {
+ if (!canContain(parentElement, child))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // contexual termination for TABLE content tags
+ boolean isTableContent = false;
+ if (childName.equalsIgnoreCase(HTML40Namespace.ElementName.TBODY) || childName.equalsIgnoreCase(HTML40Namespace.ElementName.THEAD) || childName.equalsIgnoreCase(HTML40Namespace.ElementName.TFOOT)) {
+ if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TABLE))
+ return true;
+ isTableContent = true;
+ }
+ else if (childName.equalsIgnoreCase(HTML40Namespace.ElementName.TR)) {
+ if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TBODY) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.THEAD) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TFOOT) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TABLE))
+ return true;
+ isTableContent = true;
+ }
+ else if (childName.equalsIgnoreCase(HTML40Namespace.ElementName.TD) || childName.equalsIgnoreCase(HTML40Namespace.ElementName.TH)) {
+ if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TR) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TBODY) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.THEAD) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TFOOT) || tagName.equalsIgnoreCase(HTML40Namespace.ElementName.TABLE))
+ return true;
+ isTableContent = true;
+ }
+ if (isTableContent) {
+ // TABLE content tags should terminate non TABLE content tags,
+ // if in TABLE
+ for (Node parent = element.getParentNode(); parent != null; parent = parent.getParentNode()) {
+ if (parent.getNodeType() != Node.ELEMENT_NODE)
+ break;
+ IDOMElement parentElement = (IDOMElement) parent;
+ String parentName = parentElement.getTagName();
+ if (parentName == null)
+ continue;
+ if (parentName.equalsIgnoreCase(HTML40Namespace.ElementName.TABLE))
+ return false;
+ }
+ }
+ if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.EMBED)) {
+ if (!childName.equalsIgnoreCase(HTML40Namespace.ElementName.NOEMBED))
+ return false;
+ }
+ }
+ else if (child.getNodeType() == Node.TEXT_NODE) {
+ String tagName = impl.getTagName();
+ if (tagName != null && tagName.equalsIgnoreCase(HTML40Namespace.ElementName.EMBED)) {
+ IDOMText text = (IDOMText) child;
+ if (!text.isWhitespace())
+ return false;
+ }
+ }
+ else if (child.getNodeType() == Node.DOCUMENT_TYPE_NODE) {
+ if (impl.isImplicitTag())
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ */
+ public boolean canBeImplicitTag(Element element) {
+ return false;
+ }
+
+ /**
+ */
+ public boolean canBeImplicitTag(Element element, Node child) {
+ return false;
+ }
+
+ /**
+ */
+ public Element createCommentElement(Document document, String data, boolean isJSPTag) {
+ if (document == null || data == null || data.length() == 0)
+ return null;
+
+ return createMetaElement(document, data, isJSPTag);
+ }
+
+ /**
+ * This routine create an implicit Element for given parent and child,
+ * such as HTML, BODY, HEAD, and TBODY for HTML document.
+ */
+ public Element createImplicitElement(Document document, Node parent, Node child) {
+ return null;
+ }
+
+ /**
+ */
+ private Element createMetaElement(Document document, String data, boolean isJSPTag) {
+ if (data == null || data.length() == 0)
+ return null;
+
+ TagScanner scanner = new TagScanner(data, 0, true); // one line
+ String name = scanner.nextName();
+ if (name == null || !name.equalsIgnoreCase(MetaData.METADATA))
+ return null;
+
+ String type = null;
+ boolean isStartSpan = false;
+ boolean isEndSpan = false;
+ name = scanner.nextName();
+ while (name != null) {
+ String value = scanner.nextValue();
+ if (name.equalsIgnoreCase(MetaData.TYPE)) {
+ if (value == null)
+ return null;
+ if (value.equalsIgnoreCase(MetaData.DESIGNER_CONTROL)) {
+ type = MetaData.DESIGNER_CONTROL;
+ }
+ else if (value.equalsIgnoreCase(MetaData.DYNAMIC_DATA)) {
+ type = MetaData.DYNAMIC_DATA;
+ }
+ else if (value.equalsIgnoreCase(MetaData.AUTHOR_TIME_VISUAL)) {
+ type = MetaData.AUTHOR_TIME_VISUAL;
+ }
+ else if (value.equalsIgnoreCase(MetaData.ANNOTATION)) {
+ type = MetaData.ANNOTATION;
+ }
+ else {
+ return null;
+ }
+ }
+ else if (name.equalsIgnoreCase(MetaData.STARTSPAN)) {
+ isStartSpan = true;
+ }
+ else if (name.equalsIgnoreCase(MetaData.ENDSPAN)) {
+ if (!isStartSpan)
+ isEndSpan = true;
+ }
+ name = scanner.nextName();
+ }
+ if (type == null)
+ return null;
+ if (!isStartSpan && !isEndSpan)
+ return null;
+ String metaData = null;
+ int offset = scanner.getNextOffset(); // skip new line
+ if (offset < data.length())
+ metaData = data.substring(offset);
+ if (metaData == null)
+ metaData = new String();
+
+ IDOMElement element = (IDOMElement) document.createElement(MetaData.PREFIX + type);
+
+ MetaDataAdapter adapter = new MetaDataAdapter(type);
+ if (isStartSpan) {
+ if (metaData != null)
+ adapter.setData(metaData);
+ }
+ else {
+ if (metaData != null)
+ adapter.setEndData(metaData);
+ }
+ element.addAdapter(adapter);
+ adapter.setElement(element);
+ element.setJSPTag(isJSPTag);
+
+ return element;
+ }
+
+ /**
+ */
+ public String getFindRootName(String tagName) {
+ if (tagName == null)
+ return null;
+ // tag matching should not beyond TABLE tag except BODY tag
+ if (tagName.equalsIgnoreCase(HTML40Namespace.ElementName.BODY))
+ return null;
+ return HTML40Namespace.ElementName.TABLE;
+ }
+
+ /**
+ */
+ public boolean isAdapterForType(Object type) {
+ return (type == ModelParserAdapter.class);
+ }
+
+ /**
+ */
+ public boolean isEndTag(IDOMElement element) {
+ TagAdapter adapter = (TagAdapter) element.getExistingAdapter(TagAdapter.class);
+ if (adapter != null)
+ return adapter.isEndTag();
+ return element.isEndTag();
+ }
+
+ /**
+ */
+ public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
+ }
+
+ private static boolean isValidChild(CMElementDeclaration parent, CMElementDeclaration child) {
+ if (parent == null || child == null)
+ return false;
+ CMContent content = parent.getContent();
+ if (content == null)
+ return false;
+ return isChild(content, child);
+ }
+
+ /**
+ */
+ private static boolean isChild(CMContent content, CMElementDeclaration target) {
+ switch (content.getNodeType()) {
+ case CMNode.ELEMENT_DECLARATION :
+ return isSameDeclaration((CMElementDeclaration) content, target);
+ case CMNode.GROUP :
+ CMNodeList children = ((CMGroup) content).getChildNodes();
+ for (int i = 0; i < children.getLength(); i++) {
+ CMNode child = children.item(i);
+ switch (child.getNodeType()) {
+ case CMNode.ELEMENT_DECLARATION :
+ if (isSameDeclaration((CMElementDeclaration) child, target))
+ return true;
+ continue; // Go next child.
+ case CMNode.GROUP :
+ if (isChild((CMContent) child, target))
+ return true;
+ continue; // Go next child.
+ default :
+ continue; // Go next child.
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ */
+ private static boolean isSameDeclaration(CMElementDeclaration aDec, CMElementDeclaration otherDec) {
+ return aDec.getElementName() == otherDec.getElementName();
+ }
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapterFactory.java
new file mode 100644
index 0000000000..08f03f9f44
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLModelParserAdapterFactory.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+import org.eclipse.wst.sse.core.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.xml.core.internal.document.ModelParserAdapter;
+
+/**
+ */
+public class HTMLModelParserAdapterFactory implements INodeAdapterFactory {
+
+ private static HTMLModelParserAdapterFactory instance = null;
+
+ /**
+ */
+ private HTMLModelParserAdapterFactory() {
+ super();
+ }
+
+ /**
+ * Method that returns the adapter associated with the given object.
+ * It may be a singleton or not ... depending on the needs of the INodeAdapter ...
+ * but in general it is recommended for an adapter to be stateless,
+ * so the efficiencies of a singleton can be gained.
+ *
+ * The implementation of this method should call addAdapter on the adapted
+ * object with the correct instance of the adapter.
+ */
+ public INodeAdapter adapt(INodeNotifier notifier) {
+ return new HTMLModelParserAdapter();
+ }
+
+ /**
+ */
+ public synchronized static HTMLModelParserAdapterFactory getInstance() {
+ if (instance == null)
+ instance = new HTMLModelParserAdapterFactory();
+ return instance;
+ }
+
+ /**
+ */
+ public boolean isFactoryForType(Object type) {
+ return (type == ModelParserAdapter.class);
+ }
+
+ /**
+ */
+ public void release() {
+ }
+
+ /**
+ * Overriding copy method
+ */
+ public INodeAdapterFactory copy() {
+ return getInstance();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaData.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaData.java
new file mode 100644
index 0000000000..132e18b995
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaData.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+/**
+ */
+public interface MetaData {
+
+ static final String METADATA = "METADATA";//$NON-NLS-1$
+ static final String TYPE = "type";//$NON-NLS-1$
+ static final String STARTSPAN = "startspan";//$NON-NLS-1$
+ static final String ENDSPAN = "endspan";//$NON-NLS-1$
+ static final String DESIGNER_CONTROL = "DesignerControl";//$NON-NLS-1$
+ static final String DYNAMIC_DATA = "DynamicData";//$NON-NLS-1$
+ static final String AUTHOR_TIME_VISUAL = "AuthorTimeVisual";//$NON-NLS-1$
+ static final String ANNOTATION = "Annotation";//$NON-NLS-1$
+ static final String PREFIX = "METADATA:";//$NON-NLS-1$
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaDataAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaDataAdapter.java
new file mode 100644
index 0000000000..5fa2103f73
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/MetaDataAdapter.java
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+import java.util.Iterator;
+
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.text.ITextRegion;
+import org.eclipse.wst.sse.core.text.ITextRegionList;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.document.TagAdapter;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+
+/**
+ */
+public class MetaDataAdapter implements TagAdapter, MetaData {
+
+ private IDOMElement element = null;
+ private String type = null;
+ private String data = null;
+ private String endData = null;
+
+ /**
+ */
+ public MetaDataAdapter(String type) {
+ super();
+
+ if (type != null) {
+ if (type.equals(ANNOTATION)) {
+ this.type = ANNOTATION;
+ }
+ else if (type.equals(AUTHOR_TIME_VISUAL)) {
+ this.type = AUTHOR_TIME_VISUAL;
+ }
+ else {
+ this.type = type;
+ }
+ }
+ }
+
+ /**
+ */
+ private String getData(IStructuredDocumentRegion flatNode) {
+ if (flatNode == null)
+ return null;
+ ITextRegionList regions = flatNode.getRegions();
+ if (regions == null)
+ return null;
+
+ String data = null;
+ Iterator e = regions.iterator();
+ while (e.hasNext()) {
+ ITextRegion region = (ITextRegion) e.next();
+ String regionType = region.getType();
+ if (isCommentText(regionType)) {
+ data = flatNode.getText(region);
+ break;
+ }
+ }
+ if (data == null)
+ return null;
+ int length = data.length();
+ int offset = 0;
+ for (; offset < length; offset++) {
+ char c = data.charAt(offset);
+ if (c == '\r' || c == '\n') {
+ offset++;
+ break;
+ }
+ }
+ for (; offset < length; offset++) {
+ char c = data.charAt(offset);
+ if (c != '\r' && c != '\n') {
+ break;
+ }
+ }
+ return data.substring(offset);
+ }
+
+ private boolean isCommentText(String regionType) {
+ boolean result = false;
+ result = isDOMComment(regionType) || isNestedContentComment(regionType);
+ return result;
+ }
+
+ /**
+ * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+ * way for expedency. Should be evolved in future to depend on
+ * "nestedContext".
+ */
+
+ private boolean isNestedContentComment(String regionType) {
+ final String JSP_COMMENT_TEXT = "JSP_COMMENT_TEXT"; //$NON-NLS-1$
+ return regionType.equals(JSP_COMMENT_TEXT);
+ }
+
+ private boolean isDOMComment(String regionType) {
+ return regionType == DOMRegionContext.XML_COMMENT_TEXT;
+ }
+
+ public String getData() {
+ if (this.element == null)
+ return null;
+ IStructuredDocumentRegion flatNode = this.element.getStartStructuredDocumentRegion();
+ if (flatNode == null)
+ return null;
+ if (this.data != null)
+ return this.data;
+ return getData(flatNode);
+ }
+
+ /**
+ */
+ private String getDelimiter(IDOMModel model) {
+ String delim = null;
+ if (model != null) {
+ IStructuredDocument structuredDocument = model.getStructuredDocument();
+ if (structuredDocument != null)
+ delim = structuredDocument.getLineDelimiter();
+ }
+ if (delim == null)
+ delim = "\r\n";//$NON-NLS-1$
+ return delim;
+ }
+
+ /**
+ */
+ public String getEndData() {
+ if (this.element == null)
+ return null;
+ IStructuredDocumentRegion flatNode = this.element.getEndStructuredDocumentRegion();
+ if (flatNode == null)
+ return null;
+ if (this.endData != null)
+ return this.endData;
+ return getData(flatNode);
+ }
+
+ /**
+ */
+ public String getEndTag(IDOMElement element) {
+ StringBuffer buffer = new StringBuffer();
+ if (element.isJSPTag())
+ buffer.append("<%--");//$NON-NLS-1$
+ else
+ buffer.append("<!--");//$NON-NLS-1$
+ buffer.append(METADATA);
+ buffer.append(' ');
+ buffer.append(TYPE);
+ buffer.append("=\"");//$NON-NLS-1$
+ buffer.append(this.type);
+ buffer.append("\" ");//$NON-NLS-1$
+ buffer.append(MetaData.ENDSPAN);
+ String data = getEndData();
+ if (data != null && data.length() > 0) {
+ String delim = getDelimiter(element.getModel());
+ buffer.append(delim);
+ buffer.append(data);
+ buffer.append(delim);
+ }
+ if (element.isJSPTag())
+ buffer.append("--%>");//$NON-NLS-1$
+ else
+ buffer.append("-->");//$NON-NLS-1$
+
+ return buffer.toString();
+ }
+
+ /**
+ */
+ public String getStartTag(IDOMElement element) {
+ StringBuffer buffer = new StringBuffer();
+ if (element.isJSPTag())
+ buffer.append("<%--");//$NON-NLS-1$
+ else
+ buffer.append("<!--");//$NON-NLS-1$
+ buffer.append(METADATA);
+ buffer.append(' ');
+ buffer.append(TYPE);
+ buffer.append("=\"");//$NON-NLS-1$
+ buffer.append(this.type);
+ buffer.append("\" ");//$NON-NLS-1$
+ buffer.append(MetaData.STARTSPAN);
+ String data = getData();
+ if (data != null && data.length() > 0) {
+ String delim = getDelimiter(element.getModel());
+ buffer.append(delim);
+ buffer.append(data);
+ buffer.append(delim);
+ }
+ if (element.isJSPTag())
+ buffer.append("--%>");//$NON-NLS-1$
+ else
+ buffer.append("-->");//$NON-NLS-1$
+
+ return buffer.toString();
+ }
+
+ /**
+ */
+ public String getType() {
+ return this.type;
+ }
+
+ /**
+ */
+ public boolean isAdapterForType(Object type) {
+ return (type == TagAdapter.class || type == MetaDataAdapter.class);
+ }
+
+ /**
+ */
+ public boolean isEndTag() {
+ if (this.element == null)
+ return false;
+ if (this.element.hasStartTag())
+ return false;
+ if (this.element.hasEndTag())
+ return true;
+ if (this.data != null)
+ return false;
+ return (this.endData != null);
+ }
+
+ /**
+ */
+ public boolean isRuntimeContainer() {
+ return (this.type == ANNOTATION || this.type == AUTHOR_TIME_VISUAL);
+ }
+
+ /**
+ */
+ public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
+ }
+
+ /**
+ */
+ public void setData(String data) {
+ this.data = data;
+
+ if (this.element != null)
+ this.element.notifyStartTagChanged();
+ }
+
+ /**
+ */
+ public void setEndData(String data) {
+ this.endData = data;
+
+ if (this.element != null)
+ this.element.notifyEndTagChanged();
+ }
+
+ /**
+ */
+ public void setElement(IDOMElement element) {
+ this.element = element;
+
+ if (this.element != null) {
+ this.element.setCommentTag(true);
+ if (this.type != MetaData.ANNOTATION) {
+ this.element.setJSPTag(true);
+ }
+ }
+ }
+
+ /**
+ */
+ public void setRuntimeSource(String source) {
+ if (source == null)
+ return;
+ if (this.element == null)
+ return;
+ if (isRuntimeContainer())
+ return;
+
+ IDOMModel model = this.element.getModel();
+ if (model == null)
+ return;
+ IStructuredDocument structuredDocument = model.getStructuredDocument();
+ if (structuredDocument == null)
+ return;
+ int offset = this.element.getStartEndOffset();
+ int end = this.element.getEndStartOffset();
+ int length = end - offset;
+ structuredDocument.replaceText(model, offset, length, source);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/TagScanner.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/TagScanner.java
new file mode 100644
index 0000000000..17e0bb1436
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/TagScanner.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+/**
+ */
+class TagScanner {
+
+ private String tag = null;
+ private int offset = 0;
+ private int length = 0;
+ private boolean oneLine = false;
+
+ /**
+ */
+ TagScanner(String tag, int offset) {
+ super();
+
+ this.tag = tag;
+ this.offset = offset;
+ if (tag != null)
+ this.length = tag.length();
+ }
+
+ /**
+ */
+ TagScanner(String tag, int offset, boolean oneLine) {
+ this(tag, offset);
+
+ this.oneLine = oneLine;
+ }
+
+ /**
+ */
+ int getNextOffset() {
+ for (; this.offset < this.length; this.offset++) {
+ char c = this.tag.charAt(this.offset);
+ if (!isEnd(c))
+ break;
+ }
+ return this.offset;
+ }
+
+ /**
+ */
+ int getOffset() {
+ return this.offset;
+ }
+
+ /**
+ */
+ private final boolean isEnd(char c) {
+ return (this.oneLine && (c == '\r' || c == '\n'));
+ }
+
+ /**
+ */
+ private static boolean isEqual(char c) {
+ return (c == '=');
+ }
+
+ /**
+ */
+ private static boolean isQuote(char c) {
+ return (c == '"' || c == '\'');
+ }
+
+ /**
+ */
+ private static boolean isSpace(char c) {
+ return Character.isWhitespace(c);
+ }
+
+ /**
+ */
+ private char nextChar() {
+ for (; this.offset < this.length; this.offset++) {
+ char c = this.tag.charAt(this.offset);
+ if (isEnd(c))
+ break;
+ if (!isSpace(c))
+ return c;
+ }
+ return 0;
+ }
+
+ /**
+ */
+ String nextName() {
+ if (this.tag == null)
+ return null;
+ if (this.offset >= this.length)
+ return null;
+
+ if (nextChar() == 0)
+ return null;
+
+ int nameOffset = this.offset;
+ for (; this.offset < this.length; this.offset++) {
+ char c = this.tag.charAt(this.offset);
+ if (isEnd(c) || isSpace(c))
+ break;
+ if (isEqual(c) && this.offset > nameOffset)
+ break;
+ }
+ if (this.offset == nameOffset)
+ return null;
+
+ return this.tag.substring(nameOffset, this.offset);
+ }
+
+ /**
+ */
+ String nextValue() {
+ if (this.tag == null)
+ return null;
+ if (this.offset >= this.length)
+ return null;
+
+ char seperator = nextChar();
+ if (!isEqual(seperator))
+ return null;
+ this.offset++; // skip '='
+ char quote = nextChar();
+ if (quote == 0)
+ return null;
+ if (isQuote(quote))
+ this.offset++;
+ else
+ quote = 0;
+
+ int valueOffset = this.offset;
+ for (; this.offset < this.length; this.offset++) {
+ char c = this.tag.charAt(this.offset);
+ if (isEnd(c)) {
+ quote = 0;
+ break;
+ }
+ if (quote == 0) {
+ if (isSpace(c))
+ break;
+ }
+ else {
+ if (c == quote)
+ break;
+ }
+ }
+ int valueEnd = this.offset;
+ if (quote != 0 && this.offset < this.length)
+ this.offset++;
+ if (valueEnd == valueOffset)
+ return null;
+
+ return this.tag.substring(valueOffset, valueEnd);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/UnknownTagAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/UnknownTagAdapter.java
new file mode 100644
index 0000000000..94cd5e8030
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/UnknownTagAdapter.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * 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.document;
+
+
+
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.document.TagAdapter;
+
+/**
+ */
+public class UnknownTagAdapter implements TagAdapter {
+
+ private String startTag = null;
+ private String endTag = null;
+
+ /**
+ */
+ public UnknownTagAdapter() {
+ super();
+ }
+
+ /**
+ */
+ public String getEndTag(IDOMElement element) {
+ String tag = null;
+ if (this.endTag != null) {
+ tag = this.endTag;
+ this.endTag = null;
+ }
+ return tag;
+ }
+
+ /**
+ */
+ public String getStartTag(IDOMElement element) {
+ String tag = null;
+ if (this.startTag != null) {
+ tag = this.startTag;
+ this.startTag = null;
+ }
+ return tag;
+ }
+
+ /**
+ */
+ public boolean isAdapterForType(Object type) {
+ return (type == TagAdapter.class);
+ }
+
+ /**
+ */
+ public boolean isEndTag() {
+ return false;
+ }
+
+ /**
+ */
+ public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
+ }
+
+ /**
+ */
+ public void setEndTag(String endTag) {
+ this.endTag = endTag;
+ }
+
+ /**
+ */
+ public void setStartTag(String startTag) {
+ this.startTag = startTag;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentCharsetDetector.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentCharsetDetector.java
new file mode 100644
index 0000000000..a0242c9e3c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentCharsetDetector.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.encoding;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.wst.html.core.internal.contenttype.HTMLResourceEncodingDetector;
+import org.eclipse.wst.sse.core.internal.document.DocumentReader;
+import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector;
+
+/**
+ * This class parses beginning portion of HTML file to get the encoding value
+ * in a META tag. Example:
+ * <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ *
+ * Note: even though, technically, a META tag must come in a <HEAD>tag, we
+ * don't check for that, under the assumption that whatever, or whereever, the
+ * the first <META>tag is, it is the one intended to be used by the user, and
+ * they may just be trying to repair the error. The HTML validator will tell
+ * them if its in the wrong location.
+ *
+ */
+public class HTMLDocumentCharsetDetector extends HTMLResourceEncodingDetector implements IDocumentCharsetDetector {
+
+
+ public HTMLDocumentCharsetDetector() {
+ super();
+ }
+
+ public void set(IDocument document) {
+ set(new DocumentReader(document, 0));
+
+
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentLoader.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentLoader.java
new file mode 100644
index 0000000000..d6bc40e467
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLDocumentLoader.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * 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.encoding;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.wst.html.core.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.html.core.htmlcss.HTMLStyleSelectorAdapterFactory;
+import org.eclipse.wst.html.core.htmlcss.StyleAdapterFactory;
+import org.eclipse.wst.html.core.internal.contenttype.EncodingGuesser;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeAdapterFactory;
+import org.eclipse.wst.html.core.internal.document.HTMLModelParserAdapterFactory;
+import org.eclipse.wst.html.core.internal.modelquery.ModelQueryAdapterFactoryForHTML;
+import org.eclipse.wst.html.core.internal.text.StructuredTextPartitionerForHTML;
+import org.eclipse.wst.sse.core.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.core.document.IEncodedDocument;
+import org.eclipse.wst.sse.core.internal.PropagatingAdapter;
+import org.eclipse.wst.sse.core.internal.document.AbstractDocumentLoader;
+import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector;
+import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;
+import org.eclipse.wst.sse.core.internal.document.StructuredDocumentFactory;
+import org.eclipse.wst.sse.core.internal.encoding.ContentTypeEncodingPreferences;
+import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocument;
+import org.eclipse.wst.sse.core.parser.BlockMarker;
+import org.eclipse.wst.sse.core.parser.RegionParser;
+import org.eclipse.wst.sse.core.text.IStructuredDocument;
+import org.eclipse.wst.xml.core.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.parser.XMLSourceParser;
+import org.eclipse.wst.xml.core.internal.parser.XMLStructuredDocumentReParser;
+import org.eclipse.wst.xml.core.internal.propagate.PropagatingAdapterFactoryImpl;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+
+public class HTMLDocumentLoader extends AbstractDocumentLoader {
+
+ public HTMLDocumentLoader() {
+ super();
+ }
+
+ /**
+ * Convenience method to add tag names using BlockMarker object
+ */
+ protected void addHTMLishTag(XMLSourceParser parser, String tagname) {
+ BlockMarker bm = new BlockMarker(tagname, null, DOMRegionContext.BLOCK_TEXT, false);
+ parser.addBlockMarker(bm);
+ }
+
+ /**
+ * Default encoding. For HTML, there is no spec.
+ */
+ protected String getSpecDefaultEncoding() {
+ return null;
+ }
+
+ /**
+ * @return java.lang.String
+ * @param string
+ * byte[]
+ * @param length
+ * int
+ *
+ * Do automatic encoding detection by guess
+ */
+ protected String getEncodingNameByGuess(byte[] string, int length) {
+ final String ianaEnc = EncodingGuesser.guessEncoding(string, length);
+ return ianaEnc;
+ }
+
+ /*
+ * @see AbstractLoader#createNewStructuredDocument()
+ */
+ protected IEncodedDocument newEncodedDocument() {
+ IStructuredDocument structuredDocument = StructuredDocumentFactory.getNewStructuredDocumentInstance(getParser());
+ ((BasicStructuredDocument) structuredDocument).setReParser(new XMLStructuredDocumentReParser());
+
+ return structuredDocument;
+ }
+
+ /*
+ * @see IModelLoader#getParser()
+ */
+ public RegionParser getParser() {
+ XMLSourceParser parser = new XMLSourceParser();
+ // for the "static HTML" case, we need to initialize
+ // Blocktags here.
+ addHTMLishTag(parser, "script"); //$NON-NLS-1$
+ addHTMLishTag(parser, "style"); //$NON-NLS-1$
+ return parser;
+ }
+
+ /**
+ * This method must return those factories which must be attached to the
+ * structuredModel before content is applied.
+ */
+ public List getAdapterFactories() {
+ List result = new ArrayList();
+ INodeAdapterFactory factory = null;
+ factory = StyleAdapterFactory.getInstance();
+ result.add(factory);
+ factory = HTMLStyleSelectorAdapterFactory.getInstance();
+ result.add(factory);
+ factory = new HTMLDocumentTypeAdapterFactory();
+ result.add(factory);
+ factory = HTMLModelParserAdapterFactory.getInstance();
+ result.add(factory);
+ //
+ factory = new ModelQueryAdapterFactoryForHTML();
+ result.add(factory);
+
+ factory = new PropagatingAdapterFactoryImpl();
+ result.add(factory);
+
+
+ return result;
+ }
+
+ protected String getPreferredNewLineDelimiter() {
+ return ContentTypeEncodingPreferences.getPreferredNewLineDelimiter(ContentTypeIdForHTML.ContentTypeID_HTML);
+ }
+
+ public IDocumentCharsetDetector getDocumentEncodingDetector() {
+ if (fDocumentEncodingDetector == null) {
+ fDocumentEncodingDetector = new HTMLDocumentCharsetDetector();
+ }
+ return fDocumentEncodingDetector;
+ }
+
+ protected void preLoadAdapt(IStructuredModel structuredModel) {
+ // DMW: just added this preload on 8/16/2002
+ // I noticed the ProagatingAdapterFactory was being added,
+ // that that the ProagatingAdapterAdapter was not being
+ // preload adapted -- I'm assuing it ALWAYS has to be.
+ IDOMModel domModel = (IDOMModel) structuredModel;
+ // if there is a model in the adapter, this will adapt it to
+ // first node. After that the PropagatingAdater spreads over the
+ // children being
+ // created. Each time that happends, a side effect is to
+ // also "spread" sprecific registered adapters,
+ // they two can propigate is needed.
+ ((INodeNotifier) domModel.getDocument()).getAdapterFor(PropagatingAdapter.class);
+ }
+
+ public IDocumentPartitioner getDefaultDocumentPartitioner() {
+ return new StructuredTextPartitionerForHTML();
+ }
+
+ public IDocumentLoader newInstance() {
+ return new HTMLDocumentLoader();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLModelLoader.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLModelLoader.java
new file mode 100644
index 0000000000..708855402f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/encoding/HTMLModelLoader.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * 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.encoding;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.wst.html.core.htmlcss.HTMLStyleSelectorAdapterFactory;
+import org.eclipse.wst.html.core.htmlcss.StyleAdapterFactory;
+import org.eclipse.wst.html.core.internal.document.DOMStyleModelImpl;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeAdapterFactory;
+import org.eclipse.wst.html.core.internal.document.HTMLModelParserAdapterFactory;
+import org.eclipse.wst.html.core.internal.modelquery.ModelQueryAdapterFactoryForHTML;
+import org.eclipse.wst.sse.core.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.core.IModelLoader;
+import org.eclipse.wst.sse.core.internal.PropagatingAdapter;
+import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;
+import org.eclipse.wst.sse.core.internal.model.AbstractModelLoader;
+import org.eclipse.wst.sse.core.parser.BlockMarker;
+import org.eclipse.wst.sse.core.util.Debug;
+import org.eclipse.wst.xml.core.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.DebugAdapterFactory;
+import org.eclipse.wst.xml.core.internal.parser.XMLSourceParser;
+import org.eclipse.wst.xml.core.internal.propagate.PropagatingAdapterFactoryImpl;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+
+public class HTMLModelLoader extends AbstractModelLoader {
+
+
+ public HTMLModelLoader() {
+ super();
+ }
+
+ /**
+ * Convenience method to add tag names using BlockMarker object
+ */
+ protected void addHTMLishTag(XMLSourceParser parser, String tagname) {
+ BlockMarker bm = new BlockMarker(tagname, null, DOMRegionContext.BLOCK_TEXT, false);
+ parser.addBlockMarker(bm);
+ }
+
+ public IStructuredModel newModel() {
+ DOMStyleModelImpl model = new DOMStyleModelImpl();
+ return model;
+ }
+
+ /**
+ * This method must return those factories which must be attached to the
+ * structuredModel before content is applied.
+ */
+ public List getAdapterFactories() {
+ List result = new ArrayList();
+ INodeAdapterFactory factory = null;
+ factory = StyleAdapterFactory.getInstance();
+ result.add(factory);
+ factory = HTMLStyleSelectorAdapterFactory.getInstance();
+ result.add(factory);
+ factory = new HTMLDocumentTypeAdapterFactory();
+ result.add(factory);
+ factory = HTMLModelParserAdapterFactory.getInstance();
+ result.add(factory);
+ //
+ factory = new ModelQueryAdapterFactoryForHTML();
+ result.add(factory);
+
+ factory = new PropagatingAdapterFactoryImpl();
+ result.add(factory);
+
+
+ return result;
+ }
+
+ protected void preLoadAdapt(IStructuredModel structuredModel) {
+ super.preLoadAdapt(structuredModel);
+ // DMW: just added this preload on 8/16/2002
+ // I noticed the ProagatingAdapterFactory was being added,
+ // that that the ProagatingAdapterAdapter was not being
+ // preload adapted -- I'm assuing it ALWAYS has to be.
+ IDOMModel domModel = (IDOMModel) structuredModel;
+ // if there is a model in the adapter, this will adapt it to
+ // first node. After that the PropagatingAdater spreads over the
+ // children being
+ // created. Each time that happends, a side effect is to
+ // also "spread" sprecific registered adapters,
+ // they two can propigate is needed.
+ ((INodeNotifier) domModel.getDocument()).getAdapterFor(PropagatingAdapter.class);
+ if (Debug.debugNotificationAndEvents) {
+ PropagatingAdapter propagatingAdapter = (PropagatingAdapter) ((INodeNotifier) domModel.getDocument()).getAdapterFor(PropagatingAdapter.class);
+ propagatingAdapter.addAdaptOnCreateFactory(new DebugAdapterFactory());
+ } }
+
+ public IModelLoader newInstance() {
+ return new HTMLModelLoader();
+ }
+
+ public IDocumentLoader getDocumentLoader() {
+ if (documentLoaderInstance == null) {
+ documentLoaderInstance = new HTMLDocumentLoader();
+ }
+ return documentLoaderInstance;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/EmbeddedCSSFormatter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/EmbeddedCSSFormatter.java
new file mode 100644
index 0000000000..c7438f8d0c
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/EmbeddedCSSFormatter.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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.format;
+
+
+
+import org.eclipse.wst.css.core.internal.format.CSSSourceFormatter;
+import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter;
+import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
+import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
+import org.eclipse.wst.html.core.HTMLFormatContraints;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.document.IDOMText;
+
+// nakamori_TODO: check and remove
+
+public class EmbeddedCSSFormatter extends HTMLFormatter {
+
+ //private IAdapterFactory factory = new CSSSourceFormatterFactory(CSSSourceFormatter.class, true);
+ /**
+ */
+ protected EmbeddedCSSFormatter() {
+ super();
+ }
+
+ /**
+ */
+ protected void formatNode(IDOMNode node, HTMLFormatContraints contraints) {
+ if (node == null)
+ return;
+ IDOMText text = (IDOMText) node;
+
+ String source = getCSSContent(node);
+ if (source == null) { // fallback
+ source = text.getSource();
+ }
+
+ int offset = text.getStartOffset();
+ int length = text.getEndOffset() - offset;
+ replaceSource(text.getModel(), offset, length, source);
+ setWidth(contraints, source);
+ }
+
+ /**
+ */
+ private String getCSSContent(IDOMNode text) {
+ ICSSModel model = getCSSModel(text);
+ if (model == null)
+ return null;
+ ICSSNode document = model.getDocument();
+ if (document == null)
+ return null;
+ INodeNotifier notifier = (INodeNotifier) document;
+ INodeAdapter adapter = notifier.getAdapterFor(CSSSourceFormatter.class);
+ if (adapter == null)
+ return null;
+ CSSSourceFormatter formatter = (CSSSourceFormatter) adapter;
+ StringBuffer buffer = formatter.format(document);
+ if (buffer == null)
+ return null;
+ return buffer.toString();
+ }
+
+ /**
+ */
+ private ICSSModel getCSSModel(IDOMNode text) {
+ if (text == null)
+ return null;
+ INodeNotifier notifier = (INodeNotifier) text.getParentNode();
+ if (notifier == null)
+ return null;
+ INodeAdapter adapter = notifier.getAdapterFor(IStyleSheetAdapter.class);
+ if (adapter == null)
+ return null;
+ if (!(adapter instanceof IStyleSheetAdapter))
+ return null;
+ IStyleSheetAdapter styleAdapter = (IStyleSheetAdapter) adapter;
+ return styleAdapter.getModel();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLElementFormatter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLElementFormatter.java
new file mode 100644
index 0000000000..6667d85933
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLElementFormatter.java
@@ -0,0 +1,356 @@
+/*******************************************************************************
+ * 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.format;
+
+import java.util.Iterator;
+
+import org.eclipse.wst.css.core.internal.format.CSSSourceFormatter;
+import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleDeclarationAdapter;
+import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
+import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
+import org.eclipse.wst.html.core.HTMLFormatContraints;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.text.ITextRegion;
+import org.eclipse.wst.sse.core.text.ITextRegionList;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.provisional.format.IStructuredFormatPreferencesXML;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Attr;
+import org.w3c.dom.NamedNodeMap;
+
+// nakamori_TODO: check and remove CSS formatting
+
+public class HTMLElementFormatter extends HTMLFormatter {
+
+ /**
+ */
+ protected HTMLElementFormatter() {
+ super();
+ }
+
+ /**
+ */
+ private void compressTailingSpaces(IStructuredDocumentRegion flatNode, ITextRegion region) {
+ int offset = region.getTextEnd();
+ int count = region.getEnd() - offset;
+ if (count == 1) {
+ String source = flatNode.getFullText(region);
+ int start = region.getStart();
+ if (source != null && source.charAt(offset - start) == ' ') {
+ // nothing to do
+ return;
+ }
+ }
+ replaceSource(flatNode, offset, count, " ");//$NON-NLS-1$
+ }
+
+ /**
+ */
+ private void formatEndTag(IDOMElement element, HTMLFormatContraints contraints) {
+ IStructuredDocumentRegion endStructuredDocumentRegion = element.getEndStructuredDocumentRegion();
+ if (endStructuredDocumentRegion == null)
+ return;
+
+ if (element.isJSPTag() || element.isCommentTag()) {
+ String endTag = endStructuredDocumentRegion.getText();
+ if (endTag != null && endTag.length() > 0) {
+ setWidth(contraints, endTag);
+ }
+ return;
+ }
+
+ ITextRegion prevRegion = null;
+ ITextRegionList regions = endStructuredDocumentRegion.getRegions();
+ Iterator e = regions.iterator();
+ while (e.hasNext()) {
+ ITextRegion region = (ITextRegion) e.next();
+ if (region == null)
+ continue;
+ String regionType = region.getType();
+ if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTag(regionType)) {
+ if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_END_TAG_OPEN) {
+ removeTailingSpaces(endStructuredDocumentRegion, prevRegion);
+ }
+ }
+ else if (regionType == DOMRegionContext.XML_TAG_CLOSE) {
+ if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_NAME || isNestedRootTag(prevRegion.getType()))) {
+ removeTailingSpaces(endStructuredDocumentRegion, prevRegion);
+ }
+ }
+ prevRegion = region;
+ }
+ if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_NAME || isNestedRootTag(prevRegion.getType()))) {
+ removeTailingSpaces(endStructuredDocumentRegion, prevRegion);
+ }
+
+ String newEndTag = endStructuredDocumentRegion.getText();
+ if (newEndTag != null && newEndTag.length() > 0) {
+ setWidth(contraints, newEndTag);
+ }
+ }
+
+ /**
+ */
+ protected void formatNode(IDOMNode node, HTMLFormatContraints contraints) {
+ if (node == null)
+ return;
+ IDOMElement element = (IDOMElement) node;
+
+ formatStartTag(element, contraints);
+
+ formatChildNodes(element, contraints);
+
+ formatEndTag(element, contraints);
+ }
+
+ /**
+ */
+ private void formatStartTag(IDOMElement element, HTMLFormatContraints contraints) {
+ IStructuredDocumentRegion startStructuredDocumentRegion = element.getStartStructuredDocumentRegion();
+ if (startStructuredDocumentRegion == null)
+ return;
+
+ // We should format attributes in JSPTag?
+ // if (element.isJSPTag() || element.isCommentTag()) {
+ if (element.isCommentTag()) {
+ String startTag = startStructuredDocumentRegion.getText();
+ if (startTag != null && startTag.length() > 0) {
+ setWidth(contraints, startTag);
+ }
+ return;
+ }
+
+ // first process style attribute
+ if (element.isGlobalTag()) {
+ Attr attr = element.getAttributeNode("style");//$NON-NLS-1$
+ if (attr != null)
+ formatStyleAttr(attr);
+ }
+ boolean insertBreak = false;
+ insertBreak = ((IStructuredFormatPreferencesXML) getFormatPreferences()).getSplitMultiAttrs();
+
+ if (insertBreak) {
+ NamedNodeMap attributes = element.getAttributes();
+ if (attributes == null || attributes.getLength() < 2)
+ insertBreak = false;
+ }
+ String breakSpaces = getBreakSpaces(element);
+ String indent = getIndent();
+ if (indent != null && indent.length() > 0) {
+ breakSpaces += indent;
+ }
+ ITextRegion lastBreakRegion = null;
+
+ ITextRegion prevRegion = null;
+ ITextRegionList regions = startStructuredDocumentRegion.getRegions();
+ Iterator e = regions.iterator();
+ while (e.hasNext()) {
+ ITextRegion region = (ITextRegion) e.next();
+ if (region == null)
+ continue;
+
+ ITextRegion breakRegion = null;
+
+ String regionType = region.getType();
+ if (regionType == DOMRegionContext.XML_TAG_NAME || isNestedTag(regionType)) {
+ if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_TAG_OPEN) {
+ removeTailingSpaces(startStructuredDocumentRegion, prevRegion);
+ }
+ breakRegion = region;
+ }
+ else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+ if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS)) {
+ // attribute name without value
+ breakRegion = prevRegion;
+ }
+ }
+ else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+ if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
+ removeTailingSpaces(startStructuredDocumentRegion, prevRegion);
+ }
+ }
+ else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+ if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS) {
+ removeTailingSpaces(startStructuredDocumentRegion, prevRegion);
+ }
+ breakRegion = region;
+ }
+ else if (regionType == DOMRegionContext.XML_TAG_CLOSE || regionType == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
+ if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS)) {
+ // attribute name without value
+ breakRegion = prevRegion;
+ }
+ }
+
+ if (breakRegion != null) {
+ int end = breakRegion.getTextEnd();
+ if (lastBreakRegion != null) {
+ int offset = lastBreakRegion.getEnd();
+ int count = end - offset;
+ if (insertBreak || !isWidthAvailable(contraints, count + 1)) {
+ replaceTailingSpaces(startStructuredDocumentRegion, lastBreakRegion, breakSpaces);
+ setWidth(contraints, breakSpaces);
+ }
+ else {
+ compressTailingSpaces(startStructuredDocumentRegion, lastBreakRegion);
+ addWidth(contraints, 1);
+ }
+ addWidth(contraints, count);
+ }
+ else {
+ addWidth(contraints, end);
+ }
+ lastBreakRegion = breakRegion;
+ }
+
+ prevRegion = region;
+ }
+ if (prevRegion != null && (prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME || prevRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS)) {
+ // attribute name without value
+ int end = prevRegion.getTextEnd();
+ if (lastBreakRegion != null) {
+ int offset = lastBreakRegion.getEnd();
+ int count = end - offset;
+ if (insertBreak || !isWidthAvailable(contraints, count + 1)) {
+ replaceTailingSpaces(startStructuredDocumentRegion, lastBreakRegion, breakSpaces);
+ setWidth(contraints, breakSpaces);
+ }
+ else {
+ compressTailingSpaces(startStructuredDocumentRegion, lastBreakRegion);
+ addWidth(contraints, 1);
+ }
+ addWidth(contraints, count);
+ }
+ else {
+ addWidth(contraints, end);
+ }
+ lastBreakRegion = prevRegion;
+ }
+
+ if (lastBreakRegion != null) {
+ int offset = lastBreakRegion.getTextEnd();
+ int count = startStructuredDocumentRegion.getLength() - offset;
+ if (prevRegion != null && prevRegion.getType() == DOMRegionContext.XML_EMPTY_TAG_CLOSE) {
+ compressTailingSpaces(startStructuredDocumentRegion, lastBreakRegion);
+ count++;
+ }
+ else
+ removeTailingSpaces(startStructuredDocumentRegion, lastBreakRegion);
+ addWidth(contraints, count);
+ }
+ else {
+ addWidth(contraints, startStructuredDocumentRegion.getLength());
+ }
+ }
+
+ /**
+ * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+ * way for expedency. Should be evolved in future to depend on
+ * "nestedContext".
+ */
+ private boolean isNestedTag(String regionType) {
+ final String JSP_ROOT_TAG_NAME = "JSP_ROOT_TAG_NAME"; //$NON-NLS-1$
+ final String JSP_DIRECTIVE_NAME = "JSP_DIRECTIVE_NAME"; //$NON-NLS-1$
+ boolean result = regionType.equals(JSP_ROOT_TAG_NAME) || regionType.equals(JSP_DIRECTIVE_NAME);
+ return result;
+ }
+
+ /**
+ * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+ * way for expedency. Should be evolved in future to depend on
+ * "nestedContext".
+ */
+ private boolean isNestedRootTag(String regionType) {
+ final String JSP_ROOT_TAG_NAME = "JSP_ROOT_TAG_NAME"; //$NON-NLS-1$
+ boolean result = regionType.equals(JSP_ROOT_TAG_NAME);
+ return result;
+ }
+
+
+ /**
+ */
+ private void formatStyleAttr(Attr attr) {
+ if (attr == null)
+ return;
+ String value = getCSSValue(attr);
+ if (value == null)
+ return;
+ String oldValue = ((IDOMNode) attr).getValueSource();
+ if (oldValue != null && value.equals(oldValue))
+ return;
+ attr.setValue(value);
+ }
+
+ /**
+ */
+ private ICSSModel getCSSModel(Attr attr) {
+ if (attr == null)
+ return null;
+ INodeNotifier notifier = (INodeNotifier) attr.getOwnerElement();
+ if (notifier == null)
+ return null;
+ INodeAdapter adapter = notifier.getAdapterFor(IStyleDeclarationAdapter.class);
+ if (adapter == null)
+ return null;
+ if (!(adapter instanceof IStyleDeclarationAdapter))
+ return null;
+ IStyleDeclarationAdapter styleAdapter = (IStyleDeclarationAdapter) adapter;
+ return styleAdapter.getModel();
+ }
+
+ /**
+ */
+ private String getCSSValue(Attr attr) {
+ ICSSModel model = getCSSModel(attr);
+ if (model == null)
+ return null;
+ ICSSNode document = model.getDocument();
+ if (document == null)
+ return null;
+ INodeNotifier notifier = (INodeNotifier) document;
+ INodeAdapter adapter = notifier.getAdapterFor(CSSSourceFormatter.class);
+ if (adapter == null)
+ return null;
+ CSSSourceFormatter formatter = (CSSSourceFormatter) adapter;
+ StringBuffer buffer = formatter.format(document);
+ if (buffer == null)
+ return null;
+ return buffer.toString();
+ }
+
+ /**
+ */
+ private void removeTailingSpaces(IStructuredDocumentRegion flatNode, ITextRegion region) {
+ int offset = region.getTextEnd();
+ int count = region.getEnd() - offset;
+ if (count <= 0)
+ return;
+ replaceSource(flatNode, offset, count, null);
+ }
+
+ /**
+ */
+ private void replaceTailingSpaces(IStructuredDocumentRegion flatNode, ITextRegion region, String spaces) {
+ int offset = region.getTextEnd();
+ int count = region.getEnd() - offset;
+ if (count == spaces.length()) {
+ String source = flatNode.getFullText(region);
+ if (source != null && source.endsWith(spaces)) {
+ // nothing to do
+ return;
+ }
+ }
+ replaceSource(flatNode, offset, count, spaces);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatContraintsImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatContraintsImpl.java
new file mode 100644
index 0000000000..d0e4f46007
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatContraintsImpl.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.format;
+
+import org.eclipse.wst.html.core.HTMLFormatContraints;
+import org.eclipse.wst.sse.core.internal.format.StructuredFormatContraints;
+
+/**
+ * @deprecated
+ * Please un-deprecate this if Page Designer thinks they are needed.
+ */
+public class HTMLFormatContraintsImpl extends StructuredFormatContraints implements HTMLFormatContraints {
+ protected int fAvailableLineWidth;
+
+ /**
+ * @deprecated
+ * It's very hard to keep the available line width accurate.
+ * Sometimes a node wants to start on a new line, sometimes it doesn't.
+ * It's best for the node to figure out the available line width on the fly.
+ */
+ public int getAvailableLineWidth() {
+ return fAvailableLineWidth;
+ }
+
+ /**
+ * @deprecated
+ * It's very hard to keep the available line width accurate.
+ * Sometimes a node wants to start on a new line, sometimes it doesn't.
+ * It's best for the node to figure out the available line width on the fly.
+ */
+ public void setAvailableLineWidth(int availableLineWidth) {
+ fAvailableLineWidth = availableLineWidth;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatProcessorImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatProcessorImpl.java
new file mode 100644
index 0000000000..4bf8bebfe8
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatProcessorImpl.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * 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.format;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.sse.core.internal.SSECorePlugin;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatPreferences;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatter;
+import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames;
+import org.eclipse.wst.xml.core.internal.provisional.format.FormatProcessorXML;
+import org.eclipse.wst.xml.core.internal.provisional.format.IStructuredFormatPreferencesXML;
+import org.eclipse.wst.xml.core.internal.provisional.format.StructuredFormatPreferencesXML;
+import org.w3c.dom.Node;
+
+public class HTMLFormatProcessorImpl extends FormatProcessorXML {
+ protected String getFileExtension() {
+ return "html"; //$NON-NLS-1$
+ }
+
+ protected IStructuredFormatter getFormatter(Node node) {
+ IStructuredFormatter formatter = HTMLFormatterFactory.getInstance().createFormatter(node, getFormatPreferences());
+
+ return formatter;
+ }
+
+ public IStructuredFormatPreferences getFormatPreferences() {
+ if (fFormatPreferences == null) {
+ fFormatPreferences = new StructuredFormatPreferencesXML();
+
+ Preferences preferences = HTMLCorePlugin.getDefault().getPluginPreferences();
+ if (preferences != null) {
+ fFormatPreferences.setLineWidth(preferences.getInt(CommonModelPreferenceNames.LINE_WIDTH));
+ ((IStructuredFormatPreferencesXML) fFormatPreferences).setSplitMultiAttrs(preferences.getBoolean(CommonModelPreferenceNames.SPLIT_MULTI_ATTRS));
+ fFormatPreferences.setClearAllBlankLines(preferences.getBoolean(CommonModelPreferenceNames.CLEAR_ALL_BLANK_LINES));
+
+ if (preferences.getBoolean(CommonModelPreferenceNames.INDENT_USING_TABS))
+ fFormatPreferences.setIndent("\t"); //$NON-NLS-1$
+ else {
+ int tabWidth = SSECorePlugin.getDefault().getPluginPreferences().getInt(CommonModelPreferenceNames.TAB_WIDTH);
+ String indent = ""; //$NON-NLS-1$
+ for (int i = 0; i < tabWidth; i++) {
+ indent += " "; //$NON-NLS-1$
+ }
+ fFormatPreferences.setIndent(indent);
+ }
+ }
+ }
+
+ return fFormatPreferences;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java
new file mode 100644
index 0000000000..0ecca81ed7
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatter.java
@@ -0,0 +1,650 @@
+/*******************************************************************************
+ * 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.format;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.HTMLFormatContraints;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.sse.core.internal.SSECorePlugin;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatContraints;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatPreferences;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatter;
+import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames;
+import org.eclipse.wst.sse.core.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.document.IDOMModel;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xml.core.internal.provisional.format.IStructuredFormatPreferencesXML;
+import org.eclipse.wst.xml.core.internal.provisional.format.StructuredFormatPreferencesXML;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class HTMLFormatter implements IStructuredFormatter {
+
+ private static final String HTML_NAME = "html";//$NON-NLS-1$
+ private static final String BODY_NAME = "BODY";//$NON-NLS-1$
+
+ /**
+ */
+ protected void addWidth(HTMLFormatContraints contraints, int width) {
+ if (contraints == null)
+ return;
+ if (!splitLines() || getLineWidth() < 0)
+ return;
+
+ int availableWidth = contraints.getAvailableLineWidth() - width;
+ if (availableWidth < 0)
+ availableWidth = 0;
+ contraints.setAvailableLineWidth(availableWidth);
+ }
+
+ /**
+ */
+ protected boolean canFormatChild(Node node) {
+ while (node != null) {
+ if (node.getNodeType() != Node.ELEMENT_NODE)
+ return true;
+ CMElementDeclaration decl = getElementDeclaration((Element) node);
+ if (decl != null) {
+ if (decl.getContentType() == CMElementDeclaration.CDATA)
+ return false;
+ if (decl.supports(HTMLCMProperties.SHOULD_KEEP_SPACE)) {
+ boolean shouldKeepSpace = ((Boolean) decl.getProperty(HTMLCMProperties.SHOULD_KEEP_SPACE)).booleanValue();
+ if (shouldKeepSpace)
+ return false;
+ }
+ }
+ node = node.getParentNode();
+ }
+ return false;
+ }
+
+ /**
+ */
+ protected boolean canInsertBreakAfter(CMElementDeclaration decl) {
+ if (decl == null)
+ return false;
+ if (!decl.supports(HTMLCMProperties.LINE_BREAK_HINT))
+ return false;
+ String hint = (String) decl.getProperty(HTMLCMProperties.LINE_BREAK_HINT);
+ if (hint == null)
+ return false;
+ return (hint.equals(HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END) || hint.equals(HTMLCMProperties.Values.BREAK_AFTER_START));
+ }
+
+ /**
+ */
+ protected boolean canInsertBreakAfter(Node node) {
+ if (node == null)
+ return false;
+ Node parent = node.getParentNode();
+ if (parent == null)
+ return false;
+ Node next = node.getNextSibling();
+
+ if (parent.getNodeType() == Node.DOCUMENT_NODE) {
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ // do not insert break after unclosed tag
+ if (!((IDOMElement) node).isClosed())
+ return false;
+ }
+ return true;
+ }
+ else if (parent.getNodeType() == Node.ELEMENT_NODE) {
+ IDOMElement element = (IDOMElement) parent;
+ // do not insert break before missing end tag
+ if (next == null && element.getEndStructuredDocumentRegion() == null)
+ return false;
+
+ // insert line break under non-HTML elements including JSP elements
+ if (element.getPrefix() != null)
+ return true;
+
+ CMElementDeclaration decl = getElementDeclaration(element);
+ if (decl != null) {
+ if (decl.getContentType() == CMElementDeclaration.ELEMENT)
+ return true;
+ String tagName = element.getTagName();
+ // special for direct children under BODY
+ if (tagName != null && tagName.equalsIgnoreCase(BODY_NAME))
+ return true;
+ }
+ }
+
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ IDOMElement element = (IDOMElement) node;
+ CMElementDeclaration decl = getElementDeclaration(element);
+ if (canInsertBreakAfter(decl)) {
+ // spcial for BR
+ return canFormatChild(parent);
+ }
+ }
+ if (next != null && next.getNodeType() == Node.ELEMENT_NODE) {
+ CMElementDeclaration decl = getElementDeclaration((Element) next);
+ if (canInsertBreakBefore(decl))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ */
+ protected boolean canInsertBreakBefore(CMElementDeclaration decl) {
+ if (decl == null)
+ return false;
+ if (!decl.supports(HTMLCMProperties.LINE_BREAK_HINT))
+ return false;
+ String hint = (String) decl.getProperty(HTMLCMProperties.LINE_BREAK_HINT);
+ if (hint == null)
+ return false;
+ return hint.equals(HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END);
+ }
+
+ /**
+ */
+ protected boolean canInsertBreakBefore(Node node) {
+ if (node == null)
+ return false;
+ Node parent = node.getParentNode();
+ if (parent == null)
+ return false;
+ Node prev = node.getPreviousSibling();
+
+ if (parent.getNodeType() == Node.DOCUMENT_NODE) {
+ if (prev == null)
+ return false;
+ return true;
+ }
+ else if (parent.getNodeType() == Node.ELEMENT_NODE) {
+ IDOMElement element = (IDOMElement) parent;
+ // do not insert break after missing start tag
+ if (prev == null && element.getStartStructuredDocumentRegion() == null)
+ return false;
+
+ // insert line break under non-HTML elements including JSP elements
+ if (element.getPrefix() != null)
+ return true;
+
+ CMElementDeclaration decl = getElementDeclaration(element);
+ if (decl != null) {
+ if (decl.getContentType() == CMElementDeclaration.ELEMENT)
+ return true;
+ String tagName = element.getTagName();
+ // special for direct children under BODY
+ if (tagName != null && tagName.equalsIgnoreCase(BODY_NAME))
+ return true;
+ }
+ }
+
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ CMElementDeclaration decl = getElementDeclaration((Element) node);
+ if (canInsertBreakBefore(decl))
+ return true;
+ }
+ if (prev != null && prev.getNodeType() == Node.ELEMENT_NODE) {
+ CMElementDeclaration decl = getElementDeclaration((Element) prev);
+ if (canInsertBreakAfter(decl)) {
+ // spcial for BR
+ return canFormatChild(parent);
+ }
+ }
+ return false;
+ }
+
+ /**
+ */
+ public void format(Node node) {
+ format(node, getFormatContraints());
+ }
+
+ /**
+ */
+ public void format(Node node, IStructuredFormatContraints contraints) {
+ if (node instanceof IDOMNode && contraints instanceof HTMLFormatContraints)
+ format((IDOMNode) node, (HTMLFormatContraints) contraints);
+ }
+
+ public void format(IDOMNode node, HTMLFormatContraints contraints) {
+ if (node == null)
+ return;
+ if (node.getParentNode() == null)
+ return; // do not format removed node
+
+ setWidth(contraints, node);
+
+ if (canInsertBreakBefore(node))
+ insertBreakBefore(node, contraints);
+
+ formatNode(node, contraints);
+
+ if (canInsertBreakAfter(node))
+ insertBreakAfter(node, contraints);
+ }
+
+ /**
+ */
+ protected void formatChildNodes(IDOMNode node, HTMLFormatContraints contraints) {
+ if (node == null)
+ return;
+ if (!node.hasChildNodes())
+ return;
+
+ // concat adjacent texts
+ node.normalize();
+
+ // disable sibling indent during formatting all the children
+ boolean indent = false;
+ if (contraints != null) {
+ indent = contraints.getFormatWithSiblingIndent();
+ contraints.setFormatWithSiblingIndent(false);
+ }
+
+ boolean insertBreak = true;
+ IDOMNode child = (IDOMNode) node.getFirstChild();
+ while (child != null) {
+ if (child.getParentNode() != node)
+ break;
+ IDOMNode next = (IDOMNode) child.getNextSibling();
+
+ if (insertBreak && canInsertBreakBefore(child)) {
+ insertBreakBefore(child, contraints);
+ }
+
+ IStructuredFormatter formatter = HTMLFormatterFactory.getInstance().createFormatter(child, getFormatPreferences());
+ if (formatter != null) {
+ if (formatter instanceof HTMLFormatter) {
+ HTMLFormatter htmlFormatter = (HTMLFormatter) formatter;
+ htmlFormatter.formatNode(child, contraints);
+ }
+ else {
+ formatter.format(child);
+ }
+ }
+
+ if (canInsertBreakAfter(child)) {
+ insertBreakAfter(child, contraints);
+ insertBreak = false; // not to insert twice
+ }
+ else {
+ insertBreak = true;
+ }
+
+ child = next;
+ }
+
+ if (contraints != null)
+ contraints.setFormatWithSiblingIndent(indent);
+ }
+
+ /**
+ */
+ protected void formatNode(IDOMNode node, HTMLFormatContraints contraints) {
+ if (node == null)
+ return;
+
+ if (node.hasChildNodes()) { // container
+ formatChildNodes(node, contraints);
+ }
+ else { // leaf
+ IStructuredDocumentRegion flatNode = node.getStartStructuredDocumentRegion();
+ if (flatNode != null) {
+ String source = flatNode.getText();
+ if (source != null && source.length() > 0) {
+ setWidth(contraints, source);
+ }
+ }
+ }
+ }
+
+ /**
+ */
+ protected String getBreakSpaces(Node node) {
+ if (node == null)
+ return null;
+ StringBuffer buffer = new StringBuffer();
+
+ String delim = ((IDOMNode) node).getModel().getStructuredDocument().getLineDelimiter();
+ if (delim != null && delim.length() > 0)
+ buffer.append(delim);
+
+ String indent = getIndent();
+ if (indent != null && indent.length() > 0) {
+ for (Node parent = node.getParentNode(); parent != null; parent = parent.getParentNode()) {
+ if (parent.getNodeType() != Node.ELEMENT_NODE)
+ break;
+ // ignore omitted tag
+ if (((IDOMNode) parent).getStartStructuredDocumentRegion() == null)
+ continue;
+
+ IDOMElement element = (IDOMElement) parent;
+ if (element.getPrefix() != null) {
+ String localName = element.getLocalName();
+ // special for html:html
+ if (localName != null && !localName.equals(HTML_NAME)) {
+ buffer.append(indent);
+ }
+ continue;
+ }
+
+ CMElementDeclaration decl = getElementDeclaration(element);
+ if (decl != null && decl.supports(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE)) {
+ boolean shouldIndent = ((Boolean) decl.getProperty(HTMLCMProperties.SHOULD_INDENT_CHILD_SOURCE)).booleanValue();
+ if (shouldIndent)
+ buffer.append(indent);
+ }
+
+ }
+ }
+
+ return buffer.toString();
+ }
+
+ /**
+ */
+ protected String getIndent() {
+ return getFormatPreferences().getIndent();
+ }
+
+ /**
+ */
+ protected int getLineWidth() {
+ return getFormatPreferences().getLineWidth();
+ }
+
+ /**
+ */
+ protected CMElementDeclaration getElementDeclaration(Element element) {
+ if (element == null)
+ return null;
+ Document document = element.getOwnerDocument();
+ if (document == null)
+ return null;
+ ModelQuery modelQuery = ModelQueryUtil.getModelQuery(document);
+ if (modelQuery == null)
+ return null;
+ return modelQuery.getCMElementDeclaration(element);
+ }
+
+ /**
+ */
+ protected void insertBreakAfter(IDOMNode node, HTMLFormatContraints contraints) {
+ if (node == null)
+ return;
+ if (node.getNodeType() == Node.TEXT_NODE)
+ return;
+ Node parent = node.getParentNode();
+ if (parent == null)
+ return;
+ Node next = node.getNextSibling();
+
+ String spaces = null;
+ if (next == null) { // last spaces
+ // use parent indent for the end tag
+ spaces = getBreakSpaces(parent);
+ }
+ else if (next.getNodeType() == Node.TEXT_NODE) {
+ if (contraints != null && contraints.getFormatWithSiblingIndent()) {
+ IDOMNode text = (IDOMNode) next;
+ IStructuredFormatter formatter = HTMLFormatterFactory.getInstance().createFormatter(text, getFormatPreferences());
+ if (formatter instanceof HTMLTextFormatter) {
+ HTMLTextFormatter textFormatter = (HTMLTextFormatter) formatter;
+ textFormatter.formatText(text, contraints, HTMLTextFormatter.FORMAT_HEAD);
+ }
+ }
+ return;
+ }
+ else {
+ spaces = getBreakSpaces(node);
+ }
+ if (spaces == null || spaces.length() == 0)
+ return;
+
+ replaceSource(node.getModel(), node.getEndOffset(), 0, spaces);
+ setWidth(contraints, spaces);
+ }
+
+ /**
+ */
+ protected void insertBreakBefore(IDOMNode node, HTMLFormatContraints contraints) {
+ if (node == null)
+ return;
+ if (node.getNodeType() == Node.TEXT_NODE)
+ return;
+ Node parent = node.getParentNode();
+ if (parent == null)
+ return;
+ Node prev = node.getPreviousSibling();
+
+ String spaces = null;
+ if (prev != null && prev.getNodeType() == Node.TEXT_NODE) {
+ if (contraints != null && contraints.getFormatWithSiblingIndent()) {
+ IDOMNode text = (IDOMNode) prev;
+ IStructuredFormatter formatter = HTMLFormatterFactory.getInstance().createFormatter(text, getFormatPreferences());
+ if (formatter instanceof HTMLTextFormatter) {
+ HTMLTextFormatter textFormatter = (HTMLTextFormatter) formatter;
+ textFormatter.formatText(text, contraints, HTMLTextFormatter.FORMAT_TAIL);
+ }
+ }
+ return;
+ }
+ else {
+ spaces = getBreakSpaces(node);
+ }
+ if (spaces == null || spaces.length() == 0)
+ return;
+
+ replaceSource(node.getModel(), node.getStartOffset(), 0, spaces);
+ setWidth(contraints, spaces);
+ }
+
+ /**
+ */
+ protected boolean isWidthAvailable(HTMLFormatContraints contraints, int width) {
+ if (contraints == null)
+ return true;
+ if (!splitLines() || getLineWidth() < 0)
+ return true;
+ return (contraints.getAvailableLineWidth() >= width);
+ }
+
+ /**
+ */
+ protected boolean keepBlankLines(HTMLFormatContraints contraints) {
+ if (contraints == null)
+ return true;
+ return (!contraints.getClearAllBlankLines());
+ }
+
+ /**
+ */
+ protected void replaceSource(IStructuredDocumentRegion flatNode, int offset, int length, String source) {
+ if (flatNode == null)
+ return;
+ IStructuredDocument structuredDocument = flatNode.getParentDocument();
+ if (structuredDocument == null)
+ return;
+ if (source == null)
+ source = new String();
+ int startOffset = flatNode.getStartOffset();
+ if (structuredDocument.containsReadOnly(startOffset + offset, length))
+ return;
+ // We use 'structuredDocument' as the requester object just so this and the other
+ // format-related 'repalceText' (in replaceSource) can use the same requester.
+ // Otherwise, if requester is not identical,
+ // the undo group gets "broken" into multiple pieces based
+ // on the requesters being different. Technically, any unique, common
+ // requester object would work.
+ structuredDocument.replaceText(structuredDocument, startOffset + offset, length, source);
+ }
+
+ /**
+ */
+ protected void replaceSource(IDOMModel model, int offset, int length, String source) {
+ if (model == null)
+ return;
+ IStructuredDocument structuredDocument = model.getStructuredDocument();
+ if (structuredDocument == null)
+ return;
+ if (source == null)
+ source = new String();
+ if (structuredDocument.containsReadOnly(offset, length))
+ return;
+ // We use 'structuredDocument' as the requester object just so this and the other
+ // format-related 'repalceText' (in replaceSource) can use the same requester.
+ // Otherwise, if requester is not identical,
+ // the undo group gets "broken" into multiple pieces based
+ // on the requesters being different. Technically, any unique, common
+ // requester object would work.
+ structuredDocument.replaceText(structuredDocument, offset, length, source);
+ }
+
+ /**
+ */
+ protected void setWidth(HTMLFormatContraints contraints, String source) {
+ if (contraints == null)
+ return;
+ if (source == null)
+ return;
+ int length = source.length();
+ if (length == 0)
+ return;
+
+ if (!splitLines())
+ return;
+ int lineWidth = getLineWidth();
+ if (lineWidth < 0)
+ return;
+
+ int offset = source.lastIndexOf('\n');
+ int offset2 = source.lastIndexOf('\r');
+ if (offset2 > offset)
+ offset = offset2;
+ if (offset >= 0)
+ offset++;
+
+ int availableWidth = 0;
+ if (offset >= 0) {
+ availableWidth = lineWidth - (length - offset);
+ }
+ else {
+ availableWidth = contraints.getAvailableLineWidth() - length;
+ }
+ if (availableWidth < 0)
+ availableWidth = 0;
+ contraints.setAvailableLineWidth(availableWidth);
+ }
+
+ /**
+ */
+ protected void setWidth(HTMLFormatContraints contraints, Node node) {
+ if (contraints == null)
+ return;
+ if (node == null)
+ return;
+ IStructuredDocument structuredDocument = ((IDOMNode) node).getStructuredDocument();
+ if (structuredDocument == null)
+ return; // error
+
+ if (!splitLines())
+ return;
+ int lineWidth = getLineWidth();
+ if (lineWidth < 0)
+ return;
+
+ int offset = ((IDOMNode) node).getStartOffset();
+ int line = structuredDocument.getLineOfOffset(offset);
+ int lineOffset = 0;
+ try {
+ lineOffset = structuredDocument.getLineOffset(line);
+ }
+ catch (BadLocationException ex) {
+ return; // error
+ }
+ if (lineOffset > offset)
+ return; // error
+
+ int availableWidth = lineWidth - (offset - lineOffset);
+ if (availableWidth < 0)
+ availableWidth = 0;
+
+ contraints.setAvailableLineWidth(availableWidth);
+ }
+
+ /**
+ */
+ protected boolean splitLines() {
+ return true;//getFormatPreferences().getSplitLines();
+ }
+
+ protected IStructuredFormatPreferences fFormatPreferences = null;
+ protected HTMLFormatContraints fFormatContraints = null;
+ protected IProgressMonitor fProgressMonitor = null;
+
+ //public void format(XMLNode node, FormatContraints formatContraints) {
+ // if (formatContraints.getFormatWithSiblingIndent())
+ // formatContraints.setCurrentIndent(getSiblingIndent(node));
+ //
+ // formatNode(node, formatContraints);
+ //}
+
+ public void setFormatPreferences(IStructuredFormatPreferences formatPreferences) {
+ fFormatPreferences = formatPreferences;
+ }
+
+ public IStructuredFormatPreferences getFormatPreferences() {
+ if (fFormatPreferences == null) {
+ fFormatPreferences = new StructuredFormatPreferencesXML();
+
+ Preferences preferences = HTMLCorePlugin.getDefault().getPluginPreferences();
+ if (preferences != null) {
+ fFormatPreferences.setLineWidth(preferences.getInt(CommonModelPreferenceNames.LINE_WIDTH));
+ ((IStructuredFormatPreferencesXML) fFormatPreferences).setSplitMultiAttrs(preferences.getBoolean(CommonModelPreferenceNames.SPLIT_MULTI_ATTRS));
+ fFormatPreferences.setClearAllBlankLines(preferences.getBoolean(CommonModelPreferenceNames.CLEAR_ALL_BLANK_LINES));
+
+ if (preferences.getBoolean(CommonModelPreferenceNames.INDENT_USING_TABS))
+ fFormatPreferences.setIndent("\t"); //$NON-NLS-1$
+ else {
+ int tabWidth = SSECorePlugin.getDefault().getPluginPreferences().getInt(CommonModelPreferenceNames.TAB_WIDTH);
+ String indent = ""; //$NON-NLS-1$
+ for (int i = 0; i < tabWidth; i++) {
+ indent += " "; //$NON-NLS-1$
+ }
+ fFormatPreferences.setIndent(indent);
+ }
+ }
+ }
+
+ return fFormatPreferences;
+ }
+
+ public IStructuredFormatContraints getFormatContraints() {
+ if (fFormatContraints == null) {
+ fFormatContraints = new HTMLFormatContraintsImpl();
+
+ fFormatContraints.setAvailableLineWidth(getFormatPreferences().getLineWidth());
+ fFormatContraints.setClearAllBlankLines(getFormatPreferences().getClearAllBlankLines());
+ }
+
+ return fFormatContraints;
+ }
+
+ public void setProgressMonitor(IProgressMonitor progressMonitor) {
+ fProgressMonitor = progressMonitor;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatterFactory.java
new file mode 100644
index 0000000000..b4146dffb4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLFormatterFactory.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * 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.format;
+
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.sse.core.internal.SSECorePlugin;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatPreferences;
+import org.eclipse.wst.sse.core.internal.format.IStructuredFormatter;
+import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames;
+import org.eclipse.wst.xml.core.internal.provisional.format.IStructuredFormatPreferencesXML;
+import org.eclipse.wst.xml.core.internal.provisional.format.StructuredFormatPreferencesXML;
+import org.w3c.dom.Node;
+
+// nakamori_TODO: check and remove CSS formatting
+
+class HTMLFormatterFactory {
+ private static HTMLFormatterFactory fInstance = null;
+ protected IStructuredFormatPreferencesXML fFormatPreferences = null;
+
+ static synchronized HTMLFormatterFactory getInstance() {
+ if (fInstance == null) {
+ fInstance = new HTMLFormatterFactory();
+ }
+ return fInstance;
+ }
+
+ protected IStructuredFormatter createFormatter(Node node, IStructuredFormatPreferences formatPreferences) {
+ IStructuredFormatter formatter = null;
+
+ switch (node.getNodeType()) {
+ case Node.ELEMENT_NODE :
+ formatter = new HTMLElementFormatter();
+ break;
+ case Node.TEXT_NODE :
+ if (isEmbeddedCSS(node)) {
+ formatter = new EmbeddedCSSFormatter();
+ }
+ else {
+ formatter = new HTMLTextFormatter();
+ }
+ break;
+ default :
+ formatter = new HTMLFormatter();
+ break;
+ }
+
+ // init FormatPreferences
+ formatter.setFormatPreferences(formatPreferences);
+
+ return formatter;
+ }
+
+ /**
+ */
+ private boolean isEmbeddedCSS(Node node) {
+ if (node == null)
+ return false;
+ Node parent = node.getParentNode();
+ if (parent == null)
+ return false;
+ if (parent.getNodeType() != Node.ELEMENT_NODE)
+ return false;
+ String name = parent.getNodeName();
+ if (name == null)
+ return false;
+ return name.equalsIgnoreCase("STYLE");//$NON-NLS-1$
+ }
+
+
+ private HTMLFormatterFactory() {
+ super();
+ }
+
+ protected IStructuredFormatPreferencesXML getFormatPreferences() {
+ if (fFormatPreferences == null) {
+ fFormatPreferences = new StructuredFormatPreferencesXML();
+
+ Preferences preferences = HTMLCorePlugin.getDefault().getPluginPreferences();
+ if (preferences != null) {
+ fFormatPreferences.setLineWidth(preferences.getInt(CommonModelPreferenceNames.LINE_WIDTH));
+ fFormatPreferences.setSplitMultiAttrs(preferences.getBoolean(CommonModelPreferenceNames.SPLIT_MULTI_ATTRS));
+ fFormatPreferences.setClearAllBlankLines(preferences.getBoolean(CommonModelPreferenceNames.CLEAR_ALL_BLANK_LINES));
+
+ if (preferences.getBoolean(CommonModelPreferenceNames.INDENT_USING_TABS))
+ fFormatPreferences.setIndent("\t"); //$NON-NLS-1$
+ else {
+ int tabWidth = SSECorePlugin.getDefault().getPluginPreferences().getInt(CommonModelPreferenceNames.TAB_WIDTH);
+ String indent = ""; //$NON-NLS-1$
+ for (int i = 0; i < tabWidth; i++) {
+ indent += " "; //$NON-NLS-1$
+ }
+ fFormatPreferences.setIndent(indent);
+ }
+ }
+ }
+
+ return fFormatPreferences;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLTextFormatter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLTextFormatter.java
new file mode 100644
index 0000000000..2d9fbd2464
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/HTMLTextFormatter.java
@@ -0,0 +1,298 @@
+/*******************************************************************************
+ * 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.format;
+
+
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.HTMLFormatContraints;
+import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.document.IDOMText;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class HTMLTextFormatter extends HTMLFormatter {
+
+ public static int FORMAT_ALL = 0;
+ public static int FORMAT_HEAD = 1;
+ public static int FORMAT_TAIL = 2;
+
+ /**
+ */
+ protected HTMLTextFormatter() {
+ super();
+ }
+
+ /**
+ */
+ private boolean canFormatText(IDOMText text) {
+ if (text == null)
+ return false;
+
+ IStructuredDocumentRegion flatNode = text.getFirstStructuredDocumentRegion();
+ if (flatNode != null) {
+ String type = flatNode.getType();
+ if (isUnparsedRegion(type))
+ return false;
+ }
+
+ Node parent = text.getParentNode();
+ if (parent != null && parent.getNodeType() == Node.ELEMENT_NODE) {
+ IDOMElement element = (IDOMElement) parent;
+ if (!element.isGlobalTag() && !text.isWhitespace())
+ return false;
+ }
+
+ return canFormatChild(parent);
+ }
+
+ private boolean isUnparsedRegion(String type) {
+ boolean result = isNestedScannedRegion(type) || isBlockScannedRegion(type);
+ return result;
+ }
+
+ private boolean isBlockScannedRegion(String type) {
+ return type == DOMRegionContext.BLOCK_TEXT;
+ }
+
+ /**
+ * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+ * way for expedency. Should be evolved in future to depend on "nestedContext".
+ */
+ private boolean isNestedScannedRegion(String type) {
+ final String JSP_CONTENT = "JSP_CONTENT"; //$NON-NLS-1$
+ return type.equals(JSP_CONTENT);
+ }
+
+ /**
+ */
+ private boolean canRemoveHeadingSpaces(IDOMNode node) {
+ if (node == null)
+ return false;
+ if (node.getPreviousSibling() != null)
+ return false;
+ Node parent = node.getParentNode();
+ if (parent == null || parent.getNodeType() != Node.ELEMENT_NODE)
+ return false;
+
+ CMElementDeclaration decl = getElementDeclaration((Element) parent);
+ if (decl == null || (!decl.supports(HTMLCMProperties.LINE_BREAK_HINT)))
+ return false;
+ String hint = (String) decl.getProperty(HTMLCMProperties.LINE_BREAK_HINT);
+ return hint.equals(HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END);
+ }
+
+ /**
+ */
+ private boolean canRemoveTailingSpaces(IDOMNode node) {
+ if (node == null)
+ return false;
+ if (node.getNextSibling() != null)
+ return false;
+ Node parent = node.getParentNode();
+ if (parent == null || parent.getNodeType() != Node.ELEMENT_NODE)
+ return false;
+
+ CMElementDeclaration decl = getElementDeclaration((Element) parent);
+ if (decl == null || (!decl.supports(HTMLCMProperties.LINE_BREAK_HINT)))
+ return false;
+ String hint = (String) decl.getProperty(HTMLCMProperties.LINE_BREAK_HINT);
+ return hint.equals(HTMLCMProperties.Values.BREAK_BEFORE_START_AND_AFTER_END);
+ }
+
+ /**
+ */
+ protected void formatNode(IDOMNode node, HTMLFormatContraints contraints) {
+ formatText(node, contraints, FORMAT_ALL); // full format
+ }
+
+ /**
+ */
+ protected void formatText(IDOMNode node, HTMLFormatContraints contraints, int mode) {
+ if (node == null)
+ return;
+ Node parent = node.getParentNode();
+ if (parent == null)
+ return;
+
+ IDOMText text = (IDOMText) node;
+ String source = text.getSource();
+
+ if (!canFormatText(text)) {
+ setWidth(contraints, source);
+ return;
+ }
+
+ int offset = text.getStartOffset();
+ int length = text.getEndOffset() - offset;
+
+ // format adjacent text at once
+ if (mode == FORMAT_HEAD) {
+ Node next = node.getNextSibling();
+ while (next != null && next.getNodeType() == Node.TEXT_NODE) {
+ IDOMText nextText = (IDOMText) next;
+ length += (nextText.getEndOffset() - nextText.getStartOffset());
+ String nextSource = nextText.getSource();
+ if (nextSource != null && nextSource.length() > 0) {
+ if (source == null)
+ source = nextSource;
+ else
+ source += nextSource;
+ }
+ next = next.getNextSibling();
+ }
+ }
+ else if (mode == FORMAT_TAIL) {
+ Node prev = node.getPreviousSibling();
+ while (prev != null && prev.getNodeType() == Node.TEXT_NODE) {
+ IDOMText prevText = (IDOMText) prev;
+ offset = prevText.getStartOffset();
+ length += (prevText.getEndOffset() - offset);
+ String prevSource = prevText.getSource();
+ if (prevSource != null && prevSource.length() > 0) {
+ if (source == null)
+ source = prevSource;
+ else
+ source = prevSource + source;
+ }
+ prev = prev.getPreviousSibling();
+ }
+ }
+
+ SpaceConverter converter = new SpaceConverter(source, keepBlankLines(contraints));
+
+ int wordLength = converter.nextWord();
+ if (wordLength == 0) { // only spaces
+ if (!converter.hasSpaces())
+ return; // empty
+ boolean removeSpaces = false;
+ if (parent.getNodeType() == Node.ELEMENT_NODE) {
+ // check if tags are omitted
+ IDOMNode element = (IDOMNode) parent;
+ if (node.getPreviousSibling() == null && element.getStartStructuredDocumentRegion() == null) {
+ removeSpaces = true;
+ }
+ else if (node.getNextSibling() == null && element.getEndStructuredDocumentRegion() == null) {
+ removeSpaces = true;
+ }
+ }
+ if (removeSpaces) {
+ converter.replaceSpaces(null);
+ }
+ else if (!isWidthAvailable(contraints, 2) || canInsertBreakAfter(node) || canInsertBreakBefore(node)) {
+ String spaces = null;
+ if (node.getNextSibling() == null) { // last spaces
+ // use parent indent for the end tag
+ spaces = getBreakSpaces(parent);
+ }
+ else {
+ spaces = getBreakSpaces(node);
+ }
+ converter.replaceSpaces(spaces);
+ setWidth(contraints, spaces);
+ }
+ else if (canRemoveHeadingSpaces(node) || canRemoveTailingSpaces(node)) {
+ converter.replaceSpaces(null);
+ }
+ else {
+ converter.compressSpaces();
+ addWidth(contraints, 1);
+ }
+ }
+ else {
+ String breakSpaces = null;
+
+ // format heading spaces
+ boolean hasSpaces = converter.hasSpaces();
+ if (mode == FORMAT_TAIL) {
+ // keep spaces as is
+ addWidth(contraints, converter.getSpaceCount());
+ }
+ else if ((hasSpaces && !isWidthAvailable(contraints, wordLength + 1)) || canInsertBreakBefore(node)) {
+ breakSpaces = getBreakSpaces(node);
+ converter.replaceSpaces(breakSpaces);
+ setWidth(contraints, breakSpaces);
+ }
+ else {
+ if (hasSpaces) {
+ if (canRemoveHeadingSpaces(node)) {
+ converter.replaceSpaces(null);
+ }
+ else {
+ converter.compressSpaces();
+ addWidth(contraints, 1);
+ }
+ }
+ }
+ addWidth(contraints, wordLength);
+
+ // format middle
+ wordLength = converter.nextWord();
+ while (wordLength > 0) {
+ if (mode != FORMAT_ALL) {
+ // keep spaces as is
+ addWidth(contraints, converter.getSpaceCount());
+ }
+ else if (!isWidthAvailable(contraints, wordLength + 1)) {
+ if (breakSpaces == null)
+ breakSpaces = getBreakSpaces(node);
+ converter.replaceSpaces(breakSpaces);
+ setWidth(contraints, breakSpaces);
+ }
+ else {
+ converter.compressSpaces();
+ addWidth(contraints, 1);
+ }
+ addWidth(contraints, wordLength);
+ wordLength = converter.nextWord();
+ }
+
+ // format tailing spaces
+ hasSpaces = converter.hasSpaces();
+ if (mode == FORMAT_HEAD) {
+ // keep spaces as is
+ addWidth(contraints, converter.getSpaceCount());
+ }
+ else if ((hasSpaces && !isWidthAvailable(contraints, 2)) || canInsertBreakAfter(node)) {
+ if (node.getNextSibling() == null) { // last test
+ // use parent indent for the end tag
+ breakSpaces = getBreakSpaces(parent);
+ }
+ else {
+ if (breakSpaces == null)
+ breakSpaces = getBreakSpaces(node);
+ }
+ converter.replaceSpaces(breakSpaces);
+ setWidth(contraints, breakSpaces);
+ }
+ else {
+ if (hasSpaces) {
+ if (canRemoveTailingSpaces(node)) {
+ converter.replaceSpaces(null);
+ }
+ else {
+ converter.compressSpaces();
+ addWidth(contraints, 1);
+ }
+ }
+ }
+ }
+
+ if (converter.isModified()) {
+ source = converter.getSource();
+ replaceSource(text.getModel(), offset, length, source);
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/SpaceConverter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/SpaceConverter.java
new file mode 100644
index 0000000000..a7b6f66bf9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/format/SpaceConverter.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * 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.format;
+
+
+
+final class SpaceConverter {
+
+ private String source = null;
+ private int length = 0;
+ private int startOffset = 0;
+ private int endOffset = 0;
+ private int spaceCount = 0;
+ private int wordCount = 0;
+ private StringBuffer buffer = null;
+ private int lastOffset = 0;
+ private boolean keepBlankLines = false;
+
+ /**
+ */
+ public SpaceConverter(String source) {
+ super();
+
+ if (source == null) {
+ this.source = new String();
+ }
+ else {
+ this.source = source;
+ this.length = source.length();
+ }
+ }
+
+ /**
+ */
+ public SpaceConverter(String source, boolean keepBlankLines) {
+ super();
+
+ if (source == null) {
+ this.source = new String();
+ }
+ else {
+ this.source = source;
+ this.length = source.length();
+ }
+ this.keepBlankLines = keepBlankLines;
+ }
+
+ /**
+ */
+ public void compressSpaces() {
+ if (this.spaceCount == 0)
+ return;
+ if (this.spaceCount == 1 && this.source.charAt(this.startOffset) == ' ')
+ return;
+
+ if (this.buffer == null)
+ this.buffer = new StringBuffer();
+ if (this.startOffset > this.lastOffset) {
+ this.buffer.append(this.source.substring(this.lastOffset, this.startOffset));
+ }
+
+ this.buffer.append(' ');
+
+ this.lastOffset = this.startOffset + this.spaceCount;
+ }
+
+ /**
+ */
+ public String getSource() {
+ if (this.buffer == null)
+ this.buffer = new StringBuffer();
+ if (this.length > this.lastOffset) {
+ this.buffer.append(this.source.substring(this.lastOffset, this.length));
+ }
+ return this.buffer.toString();
+ }
+
+ /**
+ */
+ public int getSpaceCount() {
+ return this.spaceCount;
+ }
+
+ /**
+ */
+ public boolean hasSpaces() {
+ return (this.spaceCount > 0);
+ }
+
+ /**
+ */
+ public boolean isModified() {
+ return (this.buffer != null);
+ }
+
+ /**
+ * Add number of the old blank lines to new space string
+ */
+ private static String mergeBlankLines(String newSpaces, String oldSpaces) {
+ if (newSpaces == null || newSpaces.length() == 0)
+ return newSpaces;
+ if (oldSpaces == null)
+ return newSpaces;
+
+ // count old new lines
+ int newLineCount = 0;
+ int oldLength = oldSpaces.length();
+ for (int i = 0; i < oldLength; i++) {
+ char c = oldSpaces.charAt(i);
+ if (c == '\r') {
+ newLineCount++;
+ if (i + 1 < oldLength) {
+ c = oldSpaces.charAt(i + 1);
+ if (c == '\n')
+ i++;
+ }
+ }
+ else {
+ if (c == '\n')
+ newLineCount++;
+ }
+ }
+ if (newLineCount < 2)
+ return newSpaces; // no blank line
+
+ // here assuming newSpaces starts with a new line if any
+ String delim = null;
+ char d = newSpaces.charAt(0);
+ if (d == '\r') {
+ if (newSpaces.length() > 1 && newSpaces.charAt(1) == '\n')
+ delim = "\r\n";//$NON-NLS-1$
+ else
+ delim = "\r";//$NON-NLS-1$
+ }
+ else {
+ if (d == '\n')
+ delim = "\n";//$NON-NLS-1$
+ else
+ return newSpaces; // no new line
+ }
+
+ newLineCount--;
+ StringBuffer buffer = new StringBuffer(newSpaces.length() + newLineCount * 2);
+ while (newLineCount > 0) {
+ buffer.append(delim);
+ newLineCount--;
+ }
+ buffer.append(newSpaces);
+ return buffer.toString();
+ }
+
+ /**
+ */
+ public int nextWord() {
+ if (this.endOffset == this.length) {
+ this.startOffset = this.endOffset;
+ this.spaceCount = 0;
+ this.wordCount = 0;
+ return 0;
+ }
+
+ this.startOffset = this.endOffset;
+ int i = this.startOffset;
+ for (; i < this.length; i++) {
+ if (!Character.isWhitespace(this.source.charAt(i)))
+ break;
+ }
+ this.spaceCount = i - this.startOffset;
+
+ int wordOffset = i;
+ for (; i < this.length; i++) {
+ if (Character.isWhitespace(this.source.charAt(i)))
+ break;
+ }
+ this.wordCount = i - wordOffset;
+ this.endOffset = i;
+
+ return this.wordCount;
+ }
+
+ /**
+ */
+ public void replaceSpaces(String spaces) {
+ int spaceLength = (spaces != null ? spaces.length() : 0);
+ String oldSpaces = null;
+ if (spaceLength == this.spaceCount) {
+ if (spaceLength == 0)
+ return;
+ if (this.startOffset == 0) {
+ if (this.source.startsWith(spaces))
+ return;
+ }
+ else if (this.endOffset == this.length) {
+ if (this.source.endsWith(spaces))
+ return;
+ }
+ else {
+ int textOffset = this.startOffset + this.spaceCount;
+ oldSpaces = this.source.substring(this.startOffset, textOffset);
+ if (oldSpaces.equals(spaces))
+ return;
+ }
+ }
+ if (this.keepBlankLines && this.spaceCount > 0) {
+ if (oldSpaces == null) {
+ int textOffset = this.startOffset + this.spaceCount;
+ oldSpaces = this.source.substring(this.startOffset, textOffset);
+ }
+ if (oldSpaces != null) {
+ spaces = mergeBlankLines(spaces, oldSpaces);
+ }
+ }
+
+ if (this.buffer == null)
+ this.buffer = new StringBuffer();
+ if (this.startOffset > this.lastOffset) {
+ this.buffer.append(this.source.substring(this.lastOffset, this.startOffset));
+ }
+
+ if (spaceLength > 0)
+ this.buffer.append(spaces);
+
+ this.lastOffset = this.startOffset + this.spaceCount;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java
new file mode 100644
index 0000000000..2125e74b59
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/EmbeddedHTML.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * 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.modelhandler;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSelectorAdapter;
+import org.eclipse.wst.html.core.htmlcss.HTMLStyleSelectorAdapterFactory;
+import org.eclipse.wst.html.core.htmlcss.StyleAdapterFactory;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeAdapterFactory;
+import org.eclipse.wst.html.core.internal.document.HTMLModelParserAdapterFactory;
+import org.eclipse.wst.html.core.internal.modelquery.ModelQueryAdapterFactoryForEmbeddedHTML;
+import org.eclipse.wst.sse.core.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
+import org.eclipse.wst.sse.core.modelhandler.EmbeddedTypeHandler;
+import org.eclipse.wst.sse.core.parser.BlockMarker;
+import org.eclipse.wst.sse.core.parser.BlockTagParser;
+import org.eclipse.wst.sse.core.parser.JSPCapableParser;
+import org.eclipse.wst.sse.core.util.Assert;
+import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter;
+import org.eclipse.wst.xml.core.internal.document.ModelParserAdapter;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+
+public class EmbeddedHTML implements EmbeddedTypeHandler {
+ public String ContentTypeID_EmbeddedHTML = "org.eclipse.wst.html.core.internal.contenttype.EmbeddedHTML"; //$NON-NLS-1$
+
+ // saved for removal later
+ private HashSet fLocalFactories = new HashSet();
+
+ private List supportedMimeTypes;
+
+ /**
+ * Constructor for EmbeddedHTML.
+ */
+ public EmbeddedHTML() {
+ super();
+ }
+
+ /**
+ * Convenience method to add tag names using BlockMarker object
+ */
+ protected void addHTMLishTag(BlockTagParser parser, String tagname) {
+ BlockMarker bm = new BlockMarker(tagname, null, DOMRegionContext.BLOCK_TEXT, false);
+ parser.addBlockMarker(bm);
+ }
+
+ /**
+ * @see EmbeddedContentType#getFamilyId()
+ */
+ public String getFamilyId() {
+ return ModelHandlerForHTML.AssociatedContentTypeID;
+ }
+
+ /*
+ * Only "model side" embedded factories can be added here.
+ */
+ public List getAdapterFactories() {
+ List factories = new ArrayList();
+ factories.add(new ModelQueryAdapterFactoryForEmbeddedHTML());
+ // factories.addAll(PluginContributedFactoryReader.getInstance().getFactories(this));
+ return factories;
+ }
+
+ /*
+ * @see EmbeddedContentType#initializeParser(RegionParser)
+ */
+ public void initializeParser(JSPCapableParser parser) {
+ addHTMLishTag(parser, "script"); //$NON-NLS-1$
+ addHTMLishTag(parser, "style"); //$NON-NLS-1$
+ }
+
+ public List getSupportedMimeTypes() {
+ if (supportedMimeTypes == null) {
+ supportedMimeTypes = new ArrayList();
+ supportedMimeTypes.add("text/html"); //$NON-NLS-1$
+ supportedMimeTypes.add("text/xhtml"); //$NON-NLS-1$
+ supportedMimeTypes.add("application/xhtml+xml"); //$NON-NLS-1$
+ supportedMimeTypes.add("application/xml"); //$NON-NLS-1$
+ supportedMimeTypes.add("text/vnd.wap.wml"); //$NON-NLS-1$
+ }
+ return supportedMimeTypes;
+ }
+
+ public void initializeFactoryRegistry(FactoryRegistry registry) {
+ Assert.isNotNull(registry);
+
+ INodeAdapterFactory factory = null;
+ if (!registry.contains(DocumentTypeAdapter.class)) {
+ factory = new HTMLDocumentTypeAdapterFactory();
+ registry.addFactory(factory);
+ fLocalFactories.add(factory);
+ }
+ if (!registry.contains(ModelParserAdapter.class)) {
+ factory = HTMLModelParserAdapterFactory.getInstance();
+ registry.addFactory(factory);
+ factory = StyleAdapterFactory.getInstance();
+ }
+ if (!registry.contains(IStyleSelectorAdapter.class)) {
+ registry.addFactory(factory);
+ factory = HTMLStyleSelectorAdapterFactory.getInstance();
+ registry.addFactory(factory);
+ }
+ }
+
+ public void uninitializeFactoryRegistry(FactoryRegistry registry) {
+ Assert.isNotNull(registry);
+
+ if (!fLocalFactories.isEmpty()) {
+ Iterator it = fLocalFactories.iterator();
+ while (it.hasNext()) {
+ INodeAdapterFactory af = (INodeAdapterFactory) it.next();
+ af.release();
+ registry.removeFactory(af);
+ }
+ }
+ fLocalFactories.clear();
+// // note this BIG assumption about factory singletons!
+// // for this particular list, they are, but may not
+// // be in future.
+//
+// IAdapterFactory factory = new HTMLDocumentTypeAdapterFactory();
+// factory.release();
+// registry.removeFactory(factory);
+//
+// factory = HTMLModelParserAdapterFactory.getInstance();
+// factory.release();
+// registry.removeFactory(factory);
+//
+// factory = StyleAdapterFactory.getInstance();
+// factory.release();
+// registry.removeFactory(factory);
+//
+// factory = HTMLStyleSelectorAdapterFactory.getInstance();
+// factory.release();
+// registry.removeFactory(factory);
+ }
+
+ public void uninitializeParser(JSPCapableParser parser) {
+ // I'm assuming block markers are unique based on name only
+ // we add these as full BlockMarkers, but remove based on name alone.
+ parser.removeBlockMarker("script"); //$NON-NLS-1$
+ parser.removeBlockMarker("script"); //$NON-NLS-1$
+ }
+
+ public EmbeddedTypeHandler newInstance() {
+ return new EmbeddedHTML();
+ }
+
+ /**
+ * will someday be controlled via extension point
+ */
+ public boolean isDefault() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/ModelHandlerForHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/ModelHandlerForHTML.java
new file mode 100644
index 0000000000..2a88f14129
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelhandler/ModelHandlerForHTML.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.modelhandler;
+
+import org.eclipse.wst.html.core.internal.encoding.HTMLDocumentCharsetDetector;
+import org.eclipse.wst.html.core.internal.encoding.HTMLDocumentLoader;
+import org.eclipse.wst.html.core.internal.encoding.HTMLModelLoader;
+import org.eclipse.wst.sse.core.IModelLoader;
+import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector;
+import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;
+import org.eclipse.wst.sse.core.modelhandler.AbstractModelHandler;
+import org.eclipse.wst.sse.core.modelhandler.IModelHandler;
+
+public class ModelHandlerForHTML extends AbstractModelHandler implements IModelHandler {
+ /**
+ * Needs to match what's in plugin registry.
+ * In fact, can be overwritten at run time with
+ * what's in registry! (so should never be 'final')
+ */
+ static String AssociatedContentTypeID = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$
+ /**
+ * Needs to match what's in plugin registry.
+ * In fact, can be overwritten at run time with
+ * what's in registry! (so should never be 'final')
+ */
+ private static String ModelHandlerID_HTML = "org.eclipse.wst.html.core.modelhandler"; //$NON-NLS-1$
+
+
+ public ModelHandlerForHTML() {
+ super();
+ setId(ModelHandlerID_HTML);
+ setAssociatedContentTypeId(AssociatedContentTypeID);
+ }
+
+ public IModelLoader getModelLoader() {
+ return new HTMLModelLoader();
+ }
+
+ public IDocumentCharsetDetector getEncodingDetector() {
+ return new HTMLDocumentCharsetDetector();
+ }
+
+ public IDocumentLoader getDocumentLoader() {
+ return new HTMLDocumentLoader();
+ }
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMAttributeDeclarationBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMAttributeDeclarationBuddySystem.java
new file mode 100644
index 0000000000..ae41f91851
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMAttributeDeclarationBuddySystem.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+import java.util.Enumeration;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+
+/**
+ */
+class CMAttributeDeclarationBuddySystem extends CMNodeBuddySystem implements CMAttributeDeclaration {
+
+
+ public CMAttributeDeclarationBuddySystem(CMAttributeDeclaration self, CMAttributeDeclaration buddy, boolean isXHTML) {
+ super(self, buddy, isXHTML);
+ }
+
+ /*
+ * @see CMAttributeDeclaration#getAttrName()
+ */
+ public String getAttrName() {
+ return getSelf().getAttrName();
+ }
+
+ /*
+ * @see CMAttributeDeclaration#getAttrType()
+ */
+ public CMDataType getAttrType() {
+ return getSelf().getAttrType();
+ }
+
+ /*
+ * @see CMAttributeDeclaration#getDefaultValue()
+ * @deprecated in superclass
+ */
+ public String getDefaultValue() {
+ return getSelf().getDefaultValue();
+ }
+
+ /*
+ * @see CMAttributeDeclaration#getEnumAttr()
+ * @deprecated in superclass
+ */
+ public Enumeration getEnumAttr() {
+ return getSelf().getEnumAttr();
+ }
+
+ /*
+ * @see CMAttributeDeclaration#getUsage()
+ */
+ public int getUsage() {
+ return getSelf().getUsage();
+ }
+
+ private CMAttributeDeclaration getSelf() {
+ return (CMAttributeDeclaration) self;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMDocumentForBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMDocumentForBuddySystem.java
new file mode 100644
index 0000000000..0f8f13e8b4
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMDocumentForBuddySystem.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
+import org.eclipse.wst.html.core.internal.contentmodel.ssi.SSICMDocumentFactory;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
+
+/**
+ */
+class CMDocumentForBuddySystem extends CMNodeBuddySystem implements CMDocument {
+
+
+ private static CMDocument getHTMLCMDocument() {
+ return HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
+ }
+
+ class Elements extends CMNamedNodeMapForBuddySystem {
+ public Elements(CMNamedNodeMap elements, boolean isXHTML) {
+ super(isXHTML);
+ makeBuddySystem(elements);
+ addSSIDecls();
+ }
+
+ protected String getKeyName(CMNode original) {
+ CMElementDeclaration edecl = getDecl(original);
+ if (edecl == null)
+ return null;
+ return edecl.getElementName();
+ }
+
+ protected CMNode createBuddySystem(CMNode original) {
+ CMElementDeclaration edecl = getDecl(original);
+ return new CMElementDeclarationBuddySystem(edecl, isXHTML());
+ }
+
+ private CMElementDeclaration getDecl(CMNode cmnode) {
+ if (cmnode == null)
+ return null;
+ if (cmnode.getNodeType() != CMNode.ELEMENT_DECLARATION)
+ return null;
+ return (CMElementDeclaration) cmnode;
+ }
+
+ private void addSSIDecls() {
+ CMDocument ssi = SSICMDocumentFactory.getCMDocument();
+ if (ssi == null)
+ return;
+ CMNamedNodeMap elements = ssi.getElements();
+ Iterator i = elements.iterator();
+ while (i.hasNext()) {
+ CMElementDeclaration decl = (CMElementDeclaration) i.next();
+ if (decl == null)
+ continue;
+ put(decl.getElementName(), decl);
+ }
+ }
+ }
+
+ private Elements elements = null;
+
+ public CMDocumentForBuddySystem(CMDocument self, boolean isXHTML) {
+ super(self, getHTMLCMDocument(), isXHTML);
+ }
+
+ /*
+ * @see CMDocument#getElements()
+ */
+ public CMNamedNodeMap getElements() {
+ if (elements != null)
+ return elements;
+ CMDocument cmdoc = getSelf();
+ if (cmdoc == null)
+ return null;
+ elements = new Elements(cmdoc.getElements(), isXHTML);
+ return elements;
+ }
+
+ /*
+ * @see CMDocument#getEntities()
+ */
+ public CMNamedNodeMap getEntities() {
+ CMDocument cmdoc = getSelf();
+ if (cmdoc == null)
+ return null;
+ return cmdoc.getEntities();
+ }
+
+ /*
+ * @see CMDocument#getNamespace()
+ */
+ public CMNamespace getNamespace() {
+ CMDocument cmdoc = getSelf();
+ if (cmdoc == null)
+ return null;
+ return cmdoc.getNamespace();
+ }
+
+ private CMDocument getSelf() {
+ if (self.getNodeType() != CMNode.DOCUMENT)
+ return null;
+ return (CMDocument) self;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMElementDeclarationBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMElementDeclarationBuddySystem.java
new file mode 100644
index 0000000000..5e70f549b8
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMElementDeclarationBuddySystem.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
+
+/**
+ */
+class CMElementDeclarationBuddySystem extends CMNodeBuddySystem implements CMElementDeclaration {
+
+
+ private static CMDocument htmlcm = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
+
+ private static CMElementDeclaration getHTMLCMElemDecl(CMElementDeclaration original) {
+ CMElementDeclaration buddy = null;
+ if (htmlcm != null) {
+ CMNamedNodeMap elems = htmlcm.getElements();
+ if (elems != null) {
+ buddy = (CMElementDeclaration) elems.getNamedItem(original.getElementName());
+ }
+ }
+ return buddy;
+ }
+
+ private class Attrs extends CMNamedNodeMapForBuddySystem {
+ private CMNamedNodeMap buddyAttrs = null;
+
+ public Attrs(CMNamedNodeMap attrs, CMNamedNodeMap buddyAttrs, boolean isXHTML) {
+ super(isXHTML);
+ this.buddyAttrs = buddyAttrs;
+ makeBuddySystem(attrs);
+ }
+
+ protected String getKeyName(CMNode original) {
+ CMAttributeDeclaration adecl = getDecl(original);
+ if (adecl == null)
+ return null;
+ return adecl.getAttrName();
+ }
+
+ protected CMNode createBuddySystem(CMNode original) {
+ CMAttributeDeclaration adecl = getDecl(original);
+ if (adecl == null)
+ return null;
+ CMAttributeDeclaration buddy = null;
+ if (buddyAttrs != null) {
+ buddy = (CMAttributeDeclaration) buddyAttrs.getNamedItem(adecl.getAttrName());
+ }
+ return new CMAttributeDeclarationBuddySystem(adecl, buddy, isXHTML());
+ }
+
+ private CMAttributeDeclaration getDecl(CMNode cmnode) {
+ if (cmnode == null)
+ return null;
+ if (cmnode.getNodeType() != CMNode.ATTRIBUTE_DECLARATION)
+ return null;
+ return (CMAttributeDeclaration) cmnode;
+ }
+ }
+
+ private Attrs attributes = null;
+
+ public CMElementDeclarationBuddySystem(CMElementDeclaration self, boolean isXHTML) {
+ super(self, getHTMLCMElemDecl(self), isXHTML);
+ }
+
+ /*
+ * @see CMElementDeclaration#getAttributes()
+ */
+ public CMNamedNodeMap getAttributes() {
+ if (attributes != null)
+ return attributes;
+ CMElementDeclaration edecl = getSelf();
+ if (edecl == null)
+ return null;
+ CMElementDeclaration htmlDecl = getBuddy();
+ CMNamedNodeMap htmlAttrs = (htmlDecl == null) ? null : htmlDecl.getAttributes();
+ attributes = new Attrs(edecl.getAttributes(), htmlAttrs, isXHTML);
+ return attributes;
+ }
+
+ /*
+ * @see CMElementDeclaration#getContent()
+ */
+ public CMContent getContent() {
+ CMElementDeclaration edecl = getSelf();
+ if (edecl == null)
+ return null;
+ return edecl.getContent();
+ }
+
+ /*
+ * @see CMElementDeclaration#getContentType()
+ */
+ public int getContentType() {
+ CMElementDeclaration edecl = getSelf();
+ if (edecl == null)
+ return CMElementDeclaration.ANY;
+ return edecl.getContentType();
+ }
+
+ /*
+ * @see CMElementDeclaration#getElementName()
+ */
+ public String getElementName() {
+ CMElementDeclaration edecl = getSelf();
+ if (edecl == null)
+ return null;
+ return edecl.getElementName();
+ }
+
+ /*
+ * @see CMElementDeclaration#getDataType()
+ */
+ public CMDataType getDataType() {
+ CMElementDeclaration edecl = getSelf();
+ if (edecl == null)
+ return null;
+ return edecl.getDataType();
+ }
+
+ /*
+ * @see CMElementDeclaration#getLocalElements()
+ */
+ public CMNamedNodeMap getLocalElements() {
+ CMElementDeclaration edecl = getSelf();
+ if (edecl == null)
+ return null;
+ return edecl.getLocalElements();
+ }
+
+ /*
+ * @see CMContent#getMaxOccur()
+ */
+ public int getMaxOccur() {
+ CMElementDeclaration edecl = getSelf();
+ if (edecl == null)
+ return -1;
+ return edecl.getMaxOccur();
+ }
+
+ /*
+ * @see CMContent#getMinOccur()
+ */
+ public int getMinOccur() {
+ CMElementDeclaration edecl = getSelf();
+ if (edecl == null)
+ return -1;
+ return edecl.getMinOccur();
+ }
+
+ /*
+ * @see CMNode#supports(String)
+ */
+ public boolean supports(String propertyName) {
+ if (isXHTML && propertyName.equals(HTMLCMProperties.OMIT_TYPE))
+ return true;
+ return super.supports(propertyName);
+ }
+
+ /*
+ * @see CMNode#getProperty(String)
+ */
+ public Object getProperty(String propertyName) {
+ if (isXHTML && propertyName.equals(HTMLCMProperties.OMIT_TYPE))
+ return HTMLCMProperties.Values.OMIT_NONE;
+ return super.getProperty(propertyName);
+ }
+
+ private CMElementDeclaration getSelf() {
+ if (self.getNodeType() != CMNode.ELEMENT_DECLARATION)
+ return null;
+ return (CMElementDeclaration) self;
+ }
+
+ private CMElementDeclaration getBuddy() {
+ if (buddy == null)
+ return null;
+ if (buddy.getNodeType() != CMNode.ELEMENT_DECLARATION)
+ return null;
+ return (CMElementDeclaration) buddy;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java
new file mode 100644
index 0000000000..643daa65ee
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ */
+abstract class CMNamedNodeMapForBuddySystem implements CMNamedNodeMap {
+
+
+ private boolean isXHTML = false;
+ private Hashtable map = new Hashtable();
+
+ /**
+ * Constructor of CMNamedNodeMapForBuddySystem.
+ * CAUTION: Each derived class must call 'makeBuddySystem' method in its
+ * constructor to build up its contents.
+ */
+ public CMNamedNodeMapForBuddySystem(boolean isXHTML) {
+ super();
+ this.isXHTML = isXHTML;
+ }
+
+ /*
+ * @see CMNamedNodeMap#getLength()
+ */
+ public int getLength() {
+ return map.size();
+ }
+
+ /*
+ * @see CMNamedNodeMap#getNamedItem(String)
+ */
+ public CMNode getNamedItem(String name) {
+ String key = canonicalName(name);
+ if (!map.containsKey(key))
+ return null;
+ return (CMNode) map.get(key);
+ }
+
+ /*
+ * @see CMNamedNodeMap#item(int)
+ */
+ public CMNode item(int index) {
+ Iterator iter = iterator();
+ while (iter.hasNext()) {
+ Object node = iter.next();
+ if (--index < 0)
+ return (CMNode) node;
+ }
+ return null;
+ }
+
+ /*
+ * @see CMNamedNodeMap#iterator()
+ */
+ public Iterator iterator() {
+ return map.values().iterator();
+ }
+
+ /* package scope. */
+ void put(String name, CMNode cmnode) {
+ if (name == null || cmnode == null)
+ return;
+ map.put(canonicalName(name), cmnode);
+ }
+
+ abstract protected String getKeyName(CMNode original);
+
+ abstract protected CMNode createBuddySystem(CMNode original);
+
+ protected boolean isXHTML() {
+ return isXHTML;
+ }
+
+ /**
+ * Each derived class must call this method in its constructor
+ * to build up its contents.
+ */
+ protected void makeBuddySystem(CMNamedNodeMap original) {
+ Iterator i = original.iterator();
+ if (i == null)
+ return;
+ while (i.hasNext()) {
+ CMNode org = (CMNode) i.next();
+ String key = getKeyName(org);
+ CMNode newNode = createBuddySystem(org);
+ put(key, newNode);
+ }
+ }
+
+ private String canonicalName(String name) {
+ return name.toUpperCase();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNodeBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNodeBuddySystem.java
new file mode 100644
index 0000000000..3e508733cd
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNodeBuddySystem.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ */
+class CMNodeBuddySystem implements CMNode {
+
+
+ protected boolean isXHTML = false;
+ protected CMNode self = null;
+ protected CMNode buddy = null;
+
+ public CMNodeBuddySystem(CMNode self, CMNode buddy, boolean isXHTML) {
+ super();
+ this.self = self;
+ this.buddy = buddy;
+ this.isXHTML = isXHTML;
+ }
+
+ /*
+ * @see CMNode#getNodeName()
+ */
+ public String getNodeName() {
+ return self.getNodeName();
+ }
+
+ /*
+ * @see CMNode#getNodeType()
+ */
+ public int getNodeType() {
+ return self.getNodeType();
+ }
+
+ /*
+ * @see CMNode#supports(String)
+ */
+ public boolean supports(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE))
+ return true;
+ if (propertyName.equals(HTMLCMProperties.IS_XHTML))
+ return true;
+ if (buddy == null)
+ return false;
+ return buddy.supports(propertyName);
+ }
+
+ /*
+ * @see CMNode#getProperty(String)
+ */
+ public Object getProperty(String propertyName) {
+ if (propertyName.equals(HTMLCMProperties.SHOULD_IGNORE_CASE)) {
+ return new Boolean(!isXHTML);
+ }
+ if (propertyName.equals(HTMLCMProperties.IS_XHTML)) {
+ return new Boolean(isXHTML);
+ }
+
+ if (buddy == null || (!buddy.supports(propertyName)))
+ return null;
+ return buddy.getProperty(propertyName);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/DocumentQuery.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/DocumentQuery.java
new file mode 100644
index 0000000000..e72c2632c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/DocumentQuery.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.ranges.Range;
+
+/**
+ */
+public interface DocumentQuery {
+
+ /**
+ * isRenderRoot() returns true if - node is BODY element (both explicit
+ * and implicit) - node is portalhtml:body element - node is Document node
+ * and the document is treated as fragment (with BODY context) Note that
+ * in editing a fragment file, Document node should be treated as a
+ * substitute of BODY element.
+ */
+ boolean isRenderRoot(Node node);
+
+ /**
+ * isHeadCorrespondent() returns true if - node is HEAD element (both
+ * explicit and implicit) - node is portalhtml:head element - node is
+ * Document node and the document is treated as fragment (with HEAD
+ * context) Note that in editing a fragment file (with HEAD context),
+ * Document node should be treated as a substitute of HEAD element.
+ */
+ boolean isHeadCorrespondent(Node node);
+
+ /**
+ * Implicit BODY element will be gone in V6 SED model. So page designer
+ * provides an API to get a range whose content nodes are rendered in
+ * design view. getRenderRootRange() returns - a range from BODY's first
+ * to its last (if the document has BODY element) - a range form
+ * Document's first to its last (if the document is fragment with BODY
+ * context) - null (if the document is fragment with HEAD context) [The
+ * following cases will be supported since V6] - a range from a custom
+ * tag's first to its last (if the document has a custom tag which
+ * generates BODY element at runtime) - a range from Document's
+ * appropirate offset to its last (if the document does not have explicit
+ * BODY/HTML) - a range from HTML element's appropriate offset to its last
+ * (if the document does not have explicit BODY but have explicit HTML)
+ *
+ * @param doc
+ * @return
+ */
+ Range getRenderRootRange(Document doc);
+
+ /**
+ * Implicit HEAD element will be gone in V6 SED model. So page designer
+ * provides an API to get a range whose content nodes are treated as HEAD
+ * element's child. getHeadCorrespondentRange() returns - a range from
+ * HEAD's first to its last (if the document has HEAD element) - a range
+ * form Document's first to its last (if the document is fragment with
+ * HEAD context) - null (if the document is fragment with BODY context)
+ * [The following cases will be supported since V6] - a range from a
+ * custom tag's first to its last (if the document has a custom tag which
+ * generates HEAD element at runtime) - a range from Document's first to
+ * appropirate offset (if the document does not have explicit HEAD/HTML) -
+ * a range from HTML element's first to appropriate offset (if the
+ * document does not have explicit HEAD but have explicit HTML)
+ *
+ * @param doc
+ * @return
+ */
+ Range getHeadCorrespondentRange(Document doc);
+
+ /**
+ * getRenderRootNode() with [create=false] returns - BODY element if this
+ * document is not fragment and has BODY element - null if this document
+ * is not fragment and does not have BODY element - Document node if this
+ * document is fragment with BODY context - null if this document is
+ * fragment with HEAD context [The following cases will be supported since
+ * V6] - a custom tag which generates BODY tag at runtime - Document node
+ * or HTML element if this document is not fragment but does not have
+ * explicit BODY element getRenderRootNode() with [create=true] returns -
+ * BODY element if this document is not fragment and has BODY element (no
+ * modifictation) - newly created BODY element if this document is not
+ * fragment but does not have BODY element - Document node if this
+ * document is fragment with BODY context (no modifictation) [The
+ * following cases will be supported since V6] - a custom tag which
+ * generates BODY tag at runtime (no modifictation) - newly created BODY
+ * element if this document is not fragment but does not have explicit
+ * BODY element getRenderRootNode() throws HTMLCommandException (since V6)
+ * if - this document is fragment with HEAD context and - "create"
+ * parameter is true Note that in editing a fragment file, Document node
+ * should be treated as a substitute of BODY element.
+ *
+ * @param childOrDocument
+ * @param create
+ * @return
+ */
+ Node getRenderRootNode(Node childOrDocument, boolean create);
+
+ /**
+ * getHeadCorrespondentNode() with [create=false] returns - HEAD element
+ * if this document is not fragment and has HEAD element - null if this
+ * document is not fragment and does not have HEAD element - Document node
+ * if this document is fragment with HEAD context - null if this document
+ * is fragment with BODY context [The following cases will be supported
+ * since V6] - a custom tag which generates HEAD tag at runtime - Document
+ * node or HTML element if this document is not fragment but does not have
+ * explicit HEAD element getHeadCorrespondentNode() with [create=true]
+ * returns - HEAD element if this document is not fragment and has HEAD
+ * element (no modifictation) - newly created HEAD element if this
+ * document is not fragment but does not have HEAD element - Document node
+ * if this document is fragment with HEAD context (no modifictation) [The
+ * following cases will be supported since V6] - a custom tag which
+ * generates HEAD tag at runtime (no modifictation) - newly created HEAD
+ * element if this document is not fragment but does not have explicit
+ * HEAD element getHeadCorrespondentNode() throws HTMLCommandException
+ * (since V6) if - this document is fragment with BODY context and -
+ * "create" parameter is true Note that in editing a fragment file,
+ * Document node should be treated as a substitute of HEAD element.
+ *
+ * @param childOrDocument
+ * @param create
+ * @return
+ */
+ Node getHeadCorrespondentNode(Node childOrDocument, boolean create);
+
+ /**
+ * getHtmlCorrespondentNode() throws HTMLCommandException (since V6) if -
+ * this document is fragment and "create" parameter is true
+ *
+ * @param childOrDocument
+ * @param create
+ * @return
+ */
+ Node getHtmlCorrespondentNode(Node childOrDocument, boolean create);
+
+ /**
+ * This inner class is intended for insertion target. please use this like
+ * the following : DocumentQuery.InsertionTarget ins;
+ * ins.getParent().insertBefore(youInsertionNode, ins.getRef());
+ */
+ public class InsertionTarget {
+ private final Node parent;
+ private final Node ref;
+
+ public InsertionTarget(Node parent, Node ref) {
+ this.parent = parent;
+ this.ref = ref;
+ }
+
+ public Node getParent() {
+ return parent;
+ }
+
+ public Node getRef() {
+ return ref;
+ }
+ }
+
+ /**
+ * getHeadInsertionTarget() returns appropriate insetion target location
+ * for HEAD child tags such as <script>, <style>, <meta>etc. Basically
+ * this function returns <HEAD>tag's the last position. Note that this
+ * would not create actual <HEAD>tag when the document does not have it.
+ * <HEAD>is omittable tag so this function returns appropriate position
+ * to which implicit <HEAD>can be inserted, if the document has no
+ * <HEAD>.
+ *
+ * @param doc
+ * @return
+ */
+ InsertionTarget getHeadInsertionTarget(Document doc);
+
+ /**
+ * getPageInsertionTarget() returns appropriate insetion target location
+ * for page-level markups, such as JSP directives, usebean tags or <html>
+ * tag. Basically this function returns just before <HTML>tag. Note that
+ * this would not create actual <HTML>tag when the document does not have
+ * it. In such case, this function returns a position just before the
+ * meaningful tags such as HTML/JSP elements.
+ *
+ * @param doc
+ * @return
+ */
+ InsertionTarget getPageInsertionTarget(Document doc);
+
+ /**
+ * isFragment() returns whether the document is fragment or complete
+ * document
+ *
+ * @param doc
+ * @return
+ */
+ boolean isFragment(Document doc);
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapter.java
new file mode 100644
index 0000000000..8ca043c68d
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapter.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+
+/**
+ */
+public interface ElementDeclarationAdapter extends INodeAdapter {
+
+ /**
+ */
+ CMElementDeclaration getDeclaration();
+
+ /**
+ */
+ void setDeclaration(CMElementDeclaration declaration);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapterFactory.java
new file mode 100644
index 0000000000..46d3abf7b9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ElementDeclarationAdapterFactory.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+
+import org.eclipse.wst.sse.core.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+
+/**
+ */
+public class ElementDeclarationAdapterFactory implements INodeAdapterFactory {
+
+ private static ElementDeclarationAdapterFactory instance = null;
+
+ /**
+ */
+ private ElementDeclarationAdapterFactory() {
+ super();
+ }
+
+ /**
+ */
+ public INodeAdapter adapt(INodeNotifier notifier) {
+ if (notifier == null)
+ return null;
+ INodeAdapter adapter = notifier.getExistingAdapter(ElementDeclarationAdapter.class);
+ if (adapter != null)
+ return adapter;
+ adapter = new HTMLElementDeclarationAdapter();
+ notifier.addAdapter(adapter);
+ return adapter;
+ }
+
+ /**
+ */
+ public synchronized static ElementDeclarationAdapterFactory getInstance() {
+ if (instance == null)
+ instance = new ElementDeclarationAdapterFactory();
+ return instance;
+ }
+
+ /**
+ */
+ public boolean isFactoryForType(Object type) {
+ return (type == ElementDeclarationAdapter.class);
+ }
+
+ public void release() {
+ // default is to do nothing
+ }
+
+ /**
+ * Overriding copy method
+ */
+ public INodeAdapterFactory copy() {
+ return getInstance();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HMQUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HMQUtil.java
new file mode 100644
index 0000000000..b8dea12ead
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HMQUtil.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public final class HMQUtil {
+
+ private final static Vector nullVector = new Vector();
+
+ /* HMQUtil class must not instantiate. */
+ private HMQUtil() {
+ super();
+ }
+
+ /* gather all element declarations in inclusion of each parent of the target.
+ * the inclusion of the target is also gathered. */
+ public static Collection getInclusions(Element target) {
+ if (target == null)
+ return nullVector;
+ Collection inclusions = gatherInclusions(getAncestorDeclarations(target));
+
+ Hashtable availables = new Hashtable();
+ Iterator iter = inclusions.iterator();
+ while (iter.hasNext()) {
+ CMContent inclusion = (CMContent) iter.next();
+ switch (inclusion.getNodeType()) {
+ case CMNode.GROUP :
+ extractDeclarations(availables, (CMGroup) inclusion);
+ break;
+ case CMNode.ELEMENT_DECLARATION :
+ addInclusion(availables, (CMElementDeclaration) inclusion);
+ break;
+ }
+ }
+
+ return availables.values();
+ }
+
+ private static Collection getAncestorDeclarations(Element target) {
+ Vector ancestors = new Vector();
+
+ Document doc = target.getOwnerDocument();
+ ModelQuery query = ModelQueryUtil.getModelQuery(doc);
+ CMElementDeclaration decl = query.getCMElementDeclaration(target);
+ ancestors.add(decl);
+
+ Element parent = getParent(target);
+ while (parent != null) {
+ decl = query.getCMElementDeclaration(parent);
+ if (decl != null)
+ ancestors.add(decl);
+ parent = getParent(parent);
+ }
+ return ancestors;
+ }
+
+ private static void addInclusion(Hashtable availables, CMElementDeclaration decl) {
+ String name = decl.getElementName();
+ if (availables.containsKey(name))
+ return;
+ availables.put(name, decl);
+ }
+
+ private static Collection gatherInclusions(Collection ancestors) {
+ Vector inclusions = new Vector();
+ Iterator iter = ancestors.iterator();
+ while (iter.hasNext()) {
+ CMElementDeclaration decl = (CMElementDeclaration) iter.next();
+ if (decl.supports(HTMLCMProperties.INCLUSION)) {
+ CMContent inclusion = (CMContent) decl.getProperty(HTMLCMProperties.INCLUSION);
+ if (inclusion != null)
+ inclusions.add(inclusion);
+ }
+ }
+ return inclusions;
+ }
+
+ private static Element getParent(Node target) {
+ Node parent = target.getParentNode();
+ while (parent != null) {
+ if (parent.getNodeType() == Node.ELEMENT_NODE)
+ return (Element) parent;
+ parent = parent.getParentNode();
+ }
+ return null;
+ }
+
+ private static void extractDeclarations(Hashtable availables, CMGroup group) {
+ CMNodeList content = group.getChildNodes();
+ for (int i = 0; i < content.getLength(); i++) {
+ CMNode cmn = content.item(i);
+ if (cmn == null || cmn.getNodeType() != CMNode.ELEMENT_DECLARATION)
+ continue;
+ addInclusion(availables, (CMElementDeclaration) cmn);
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLElementDeclarationAdapter.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLElementDeclarationAdapter.java
new file mode 100644
index 0000000000..856d5d6d7e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLElementDeclarationAdapter.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+
+/**
+ */
+public class HTMLElementDeclarationAdapter implements ElementDeclarationAdapter {
+
+ private CMElementDeclaration declaration = null;
+
+ /**
+ */
+ public HTMLElementDeclarationAdapter() {
+ super();
+ }
+
+ /**
+ */
+ public CMElementDeclaration getDeclaration() {
+ return this.declaration;
+ }
+
+ /**
+ * Allowing the INodeAdapter to compare itself against the type
+ * allows it to return true in more than one case.
+ */
+ public boolean isAdapterForType(Object type) {
+ return (type == ElementDeclarationAdapter.class);
+ }
+
+ /**
+ */
+ public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
+ }
+
+ /**
+ */
+ public void setDeclaration(CMElementDeclaration declaration) {
+ this.declaration = declaration;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryAssociationProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryAssociationProvider.java
new file mode 100644
index 0000000000..97627d02e1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryAssociationProvider.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.SimpleAssociationProvider;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.uriresolver.util.IdResolver;
+
+/**
+ */
+public class HTMLModelQueryAssociationProvider extends SimpleAssociationProvider {
+
+ /**
+ * @param modelQueryCMProvider org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryCMProvider
+ */
+ public HTMLModelQueryAssociationProvider(CMDocumentCache cache, IdResolver idResolver) {
+ super(new HTMLModelQueryCMProvider(cache, idResolver));
+ }
+
+ // MIWA: We cannot cache a CMElementDeclaration any more. Because, when the DOCTYPE
+ // was changed, CMDocument would be changed. Then, a cached CMElementDeclaration
+ // would be invalid. If some performance problems occurs, we consider a smarter
+ // cache mechanism.
+ //
+ // public CMElementDeclaration getCMElementDeclaration(Element element) {
+ // // check if element declaration is cached
+ // INodeNotifier notifier = (INodeNotifier) element;
+ // ElementDeclarationAdapter adapter = (ElementDeclarationAdapter) notifier.getExistingAdapter(ElementDeclarationAdapter.class);
+ // if (adapter != null)
+ // return adapter.getDeclaration();
+ //
+ // CMElementDeclaration decl = super.getCMElementDeclaration(element);
+ //
+ // // cache HTML element declaration only
+ // if (decl != null && decl instanceof HTMLElementDeclaration) {
+ // IAdapterFactory factory = ElementDeclarationAdapterFactory.getInstance();
+ // adapter = (ElementDeclarationAdapter) factory.adapt(notifier);
+ // if (adapter != null)
+ // adapter.setDeclaration(decl);
+ // }
+ //
+ // return decl;
+ // }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java
new file mode 100644
index 0000000000..97792ffc13
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+import java.util.Hashtable;
+
+import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeEntry;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeRegistry;
+import org.eclipse.wst.xml.core.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQueryCMProvider;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
+import org.eclipse.wst.xml.uriresolver.util.IdResolver;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Node;
+
+/**
+ * CMDocument provider for HTML and XHTML documents.
+ */
+public class HTMLModelQueryCMProvider implements ModelQueryCMProvider {
+
+
+ private static CMDocument staticHTML = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
+ private static CMDocument staticCHTML = HTMLCMDocumentFactory.getCMDocument(CMDocType.CHTML_DOC_TYPE);
+ private static HTMLDocumentTypeRegistry doctypeRegistry = HTMLDocumentTypeRegistry.getInstance();
+ private static Hashtable buddyCache = new Hashtable();
+
+ private XHTMLAssociationProvider xhtmlassoc = null;
+
+ public HTMLModelQueryCMProvider(CMDocumentCache cache, IdResolver idResolver) {
+ super();
+ xhtmlassoc = new XHTMLAssociationProvider(cache, idResolver);
+ }
+
+ /**
+ * Returns the CMDocument that corresponds to the DOM Node.
+ * or null if no CMDocument is appropriate for the DOM Node.
+ */
+ public CMDocument getCorrespondingCMDocument(Node node) {
+ IDOMDocument owner = getOwnerXMLDocument(node);
+ if (owner == null)
+ return null;
+
+ String pid = getPublicId(owner);
+ if (pid == null)
+ return staticHTML;
+
+ HTMLDocumentTypeEntry entry = doctypeRegistry.getEntry(pid);
+ if (entry == null)
+ return staticHTML;
+
+ pid = entry.getPublicId();
+ CMDocument dtdcm = xhtmlassoc.getXHTMLCMDocument(pid, entry.getSystemId());
+ if (dtdcm == null) {
+ if (pid != null && pid.equals(HTMLDocumentTypeRegistry.CHTML_PUBLIC_ID)) {
+ return staticCHTML;
+ }
+ return staticHTML;
+ }
+
+ CMDocument buddycm = (CMDocument) buddyCache.get(pid);
+ if (buddycm != null)
+ return buddycm;
+
+ buddycm = new CMDocumentForBuddySystem(dtdcm, entry.isXMLType());
+ buddyCache.put(pid, buddycm);
+ return buddycm;
+ }
+
+ // private methods
+ private IDOMDocument getOwnerXMLDocument(Node node) {
+ if (node == null)
+ return null;
+ Document owner = (node.getNodeType() == Node.DOCUMENT_NODE) ? (Document) node : node.getOwnerDocument();
+ if (owner == null)
+ return null;
+ if (!(owner instanceof IDOMDocument))
+ return null;
+ return (IDOMDocument) owner;
+ }
+
+ private String getPublicId(IDOMDocument doc) {
+ if (doc == null)
+ return null;
+ DocumentType doctype = doc.getDoctype();
+ return (doctype != null) ? doctype.getPublicId() : doc.getDocumentTypeId();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java
new file mode 100644
index 0000000000..14f94e003e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ModelQueryImpl;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.core.internal.ssemodelquery.MovableModelQuery;
+import org.eclipse.wst.xml.uriresolver.util.IdResolver;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class HTMLModelQueryImpl extends ModelQueryImpl implements MovableModelQuery {
+
+ protected CMDocumentCache fCache = null;
+
+ public HTMLModelQueryImpl(CMDocumentCache cache, IdResolver idResolver) {
+ super(new HTMLModelQueryAssociationProvider(cache, idResolver));
+ fCache = cache;
+ }
+
+ public List getAvailableContent(Element element, CMElementDeclaration ed, int includeOptions) {
+ List originalCandidates = super.getAvailableContent(element, ed, includeOptions);
+ if ((includeOptions & INCLUDE_CHILD_NODES) == 0)
+ return originalCandidates;
+ // When the target document is XHTML, it is waste to find inclusions,
+ // since inclusion is available in HTML only.
+ if (!ed.supports(HTMLCMProperties.IS_XHTML))
+ return originalCandidates;
+
+ Boolean isXhtml = Boolean.FALSE;
+ isXhtml = (Boolean) ed.getProperty(HTMLCMProperties.IS_XHTML);
+ if (isXhtml != null && isXhtml.booleanValue())
+ return originalCandidates;
+
+ // OK, the target is surely a HTML element, so it may have inclusion.
+ // Try to find it.
+ Vector candidates = new Vector(originalCandidates);
+
+ switch (ed.getContentType()) {
+ case CMElementDeclaration.ANY :
+ case CMElementDeclaration.ELEMENT :
+ case CMElementDeclaration.MIXED :
+ // do enumerate inclusions.
+ candidates.addAll(HMQUtil.getInclusions(element));
+ break;
+ case CMElementDeclaration.EMPTY :
+ case CMElementDeclaration.PCDATA :
+ case CMElementDeclaration.CDATA :
+ default :
+ // should not add any inclusions.
+ // so, nothing to do here.
+ break;
+ }
+ // If the current element does not available, it is impossible
+ // to filter out exclusion.
+ if (element == null)
+ return candidates;
+
+ // Now, the time to check exclusion.
+ Vector content = new Vector(candidates.size());
+ for (int i = 0; i < candidates.size(); i++) {
+ CMElementDeclaration candidate = (CMElementDeclaration) candidates.elementAt(i);
+ if (candidate == null)
+ continue;
+ if (isExcluded(candidate, element))
+ continue;
+ content.add(candidate);
+ }
+
+ return content;
+ }
+
+ /**
+ * @see MovableModelQuery#setIdResolver(IdResolver)
+ */
+ public void setIdResolver(IdResolver newIdResolver) {
+ modelQueryAssociationProvider = new HTMLModelQueryAssociationProvider(fCache, newIdResolver);
+ }
+
+ // utilities
+ private static boolean isExcluded(CMElementDeclaration candidate, Element target) {
+ CMNamedNodeMap prohibited = getProhibitedAncestors(candidate);
+ if (prohibited == null)
+ return false;
+ Element parent = target;
+ while (parent != null) {
+ CMNode pdec = prohibited.getNamedItem(parent.getNodeName());
+ if (pdec != null)
+ return true;
+ parent = getExplicitParentElement(parent);
+ }
+ return false;
+ }
+
+ private static CMNamedNodeMap getProhibitedAncestors(CMElementDeclaration dec) {
+ if (!dec.supports(HTMLCMProperties.PROHIBITED_ANCESTORS))
+ return null;
+ return (CMNamedNodeMap) dec.getProperty(HTMLCMProperties.PROHIBITED_ANCESTORS);
+ }
+
+ /* get an ancestor element ignoring implicit ones. */
+ private static Element getExplicitParentElement(Node child) {
+ if (child == null)
+ return null;
+
+ Node p = child.getParentNode();
+ while (p != null) {
+ if (p.getNodeType() == Node.ELEMENT_NODE) {
+ if (p instanceof IDOMElement) {
+ if (((IDOMElement) p).isImplicitTag()) {
+ p = p.getParentNode();
+ continue;
+ }
+ }
+ return (Element) p;
+ }
+ p = p.getParentNode();
+ }
+ return null;
+ }
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForEmbeddedHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForEmbeddedHTML.java
new file mode 100644
index 0000000000..be38bcb988
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForEmbeddedHTML.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
+
+public class ModelQueryAdapterFactoryForEmbeddedHTML extends ModelQueryAdapterFactoryForHTML {
+
+
+ /**
+ * Constructor for ModelQueryAdapterFactoryForEmbeddedHTML.
+ */
+ public ModelQueryAdapterFactoryForEmbeddedHTML() {
+ this(ModelQueryAdapter.class, false);
+ }
+
+ /**
+ * Constructor for ModelQueryAdapterFactoryForEmbeddedHTML.
+ * @param adapterKey
+ * @param registerAdapters
+ */
+ protected ModelQueryAdapterFactoryForEmbeddedHTML(Object adapterKey, boolean registerAdapters) {
+ super(adapterKey, registerAdapters);
+ }
+
+ /**
+ * @see org.eclipse.wst.sse.core.INodeAdapterFactory#adapt(INodeNotifier)
+ */
+ public INodeAdapter adapt(INodeNotifier object) {
+ if (object == null)
+ return null;
+ return adaptNew(object);
+ }
+
+ public Object clone() throws CloneNotSupportedException {
+
+ return new ModelQueryAdapterFactoryForEmbeddedHTML(this.adapterKey, this.shouldRegisterAdapter);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForHTML.java
new file mode 100644
index 0000000000..90df589860
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/ModelQueryAdapterFactoryForHTML.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+
+import java.io.File;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.sse.core.AbstractAdapterFactory;
+import org.eclipse.wst.sse.core.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.IModelStateListener;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.core.util.Debug;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.core.internal.modelquery.XMLCatalogIdResolver;
+import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
+import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapterImpl;
+import org.eclipse.wst.xml.uriresolver.util.IdResolver;
+
+/**
+ * Creates a ModelQueryAdapter for HTML models
+ */
+public class ModelQueryAdapterFactoryForHTML extends AbstractAdapterFactory implements IModelStateListener {
+
+ protected ModelQueryAdapterImpl modelQueryAdapterImpl;
+ protected IStructuredModel stateNotifier = null;
+
+ /**
+ * ModelQueryAdapterFactoryForHTML constructor comment.
+ */
+ public ModelQueryAdapterFactoryForHTML() {
+ this(ModelQueryAdapter.class, true);
+ }
+
+ /**
+ * ModelQueryAdapterFactoryForHTML constructor comment.
+ *
+ * @param adapterKey
+ * java.lang.Object
+ * @param registerAdapters
+ * boolean
+ */
+ public ModelQueryAdapterFactoryForHTML(Object adapterKey, boolean registerAdapters) {
+ super(adapterKey, registerAdapters);
+ }
+
+ /**
+ * createAdapter method comment.
+ */
+ protected INodeAdapter createAdapter(INodeNotifier target) {
+
+ if (Debug.displayInfo)
+ System.out.println("-----------------------ModelQueryAdapterFactoryForHTML.createAdapter" + target); //$NON-NLS-1$
+ if (modelQueryAdapterImpl == null) {
+ if (target instanceof IDOMNode) {
+ IDOMNode xmlNode = (IDOMNode) target;
+ IStructuredModel model = stateNotifier = xmlNode.getModel();
+ stateNotifier.addModelStateListener(this);
+ String baseLocation = null;
+ String modelsBaseLocation = model.getBaseLocation();
+ if (modelsBaseLocation != null) {
+ File file = new Path(modelsBaseLocation).toFile();
+ if (file.exists()) {
+ baseLocation = file.getAbsolutePath();
+ }
+ else {
+ IPath basePath = new Path(model.getBaseLocation());
+ IPath derivedPath = null;
+ if (basePath.segmentCount() > 1)
+ derivedPath = ResourcesPlugin.getWorkspace().getRoot().getFile(basePath).getLocation();
+ else
+ derivedPath = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(basePath);
+ if (derivedPath != null) {
+ baseLocation = derivedPath.toString();
+ }
+ }
+ }
+ if (Debug.displayInfo)
+ System.out.println("----------------ModelQueryAdapterFactoryForHTML... baseLocation : " + baseLocation); //$NON-NLS-1$
+
+ CMDocumentCache cmDocumentCache = new CMDocumentCache();
+ IdResolver idResolver = new XMLCatalogIdResolver(baseLocation, model.getResolver());
+ ModelQuery modelQuery = new HTMLModelQueryImpl(cmDocumentCache, idResolver);
+ modelQuery.setEditMode(ModelQuery.EDIT_MODE_UNCONSTRAINED);
+ modelQueryAdapterImpl = new ModelQueryAdapterImpl(cmDocumentCache, modelQuery, idResolver);
+ }
+ }
+ return modelQueryAdapterImpl;
+ }
+
+ protected void updateResolver(IStructuredModel model) {
+ String baseLocation = model.getBaseLocation();
+ IFile baseFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(model.getBaseLocation()));
+ if (baseFile != null) {
+ baseLocation = baseFile.getLocation().toString();
+ }
+ modelQueryAdapterImpl.setIdResolver(new XMLCatalogIdResolver(baseLocation, model.getResolver()));
+ }
+
+ /**
+ * @see IModelStateListener#modelAboutToBeChanged(IStructuredModel)
+ */
+ public void modelAboutToBeChanged(IStructuredModel model) {
+ }
+
+ /**
+ * @see IModelStateListener#modelChanged(IStructuredModel)
+ */
+ public void modelChanged(IStructuredModel model) {
+ }
+
+ /**
+ * @see IModelStateListener#modelDirtyStateChanged(IStructuredModel,
+ * boolean)
+ */
+ public void modelDirtyStateChanged(IStructuredModel model, boolean isDirty) {
+ }
+
+ /**
+ * @see IModelStateListener#modelResourceDeleted(IStructuredModel)
+ */
+ public void modelResourceDeleted(IStructuredModel model) {
+ }
+
+ /**
+ * @see IModelStateListener#modelResourceMoved(IStructuredModel,
+ * IStructuredModel)
+ */
+ public void modelResourceMoved(IStructuredModel oldModel, IStructuredModel newModel) {
+ stateNotifier.removeModelStateListener(this);
+ stateNotifier = newModel;
+ updateResolver(stateNotifier);
+ stateNotifier.addModelStateListener(this);
+ }
+
+ public void release() {
+ super.release();
+ if (stateNotifier != null)
+ stateNotifier.removeModelStateListener(this);
+ stateNotifier = null;
+ if (modelQueryAdapterImpl != null)
+ modelQueryAdapterImpl.release();
+ }
+
+ public INodeAdapterFactory copy() {
+
+ return new ModelQueryAdapterFactoryForHTML(this.adapterKey, this.shouldRegisterAdapter);
+ }
+
+ public void modelAboutToBeReinitialized(IStructuredModel structuredModel) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void modelReinitialized(IStructuredModel structuredModel) {
+ // TODO Auto-generated method stub
+
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java
new file mode 100644
index 0000000000..9aac42d15a
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * 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.modelquery;
+
+
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.XMLAssociationProvider;
+import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.uriresolver.util.IdResolver;
+import org.w3c.dom.Document;
+
+/**
+ * A Class to provide an association between XHTML documents and DTDs for
+ * XHTML. This class is intended to be used only in HTMLModelQueryCMProvider.
+ */
+/*
+ * This class closely resemble XMLModelQueryAssociationProvider.
+ */
+class XHTMLAssociationProvider extends XMLAssociationProvider {
+
+ protected IdResolver idResolver = null;
+ private String fCachedGrammerURI;
+ private String fCachedPublicID;
+ private String fCachedSystemID;
+ private static final boolean USE_QUICK_CACHE = true;
+
+ public XHTMLAssociationProvider(CMDocumentCache cache, IdResolver idResolver) {
+ super(cache);
+ this.idResolver = idResolver;
+ }
+
+ /**
+ *
+ * @param publicId
+ * @param systemId
+ * @return
+ */
+ public CMDocument getXHTMLCMDocument(String publicId, String systemId) {
+ String grammerURI = null;
+ if (USE_QUICK_CACHE) {
+ // In parsing a document, we get many identiical requests to this
+ // method, so instead of looking up (resolving) grammerURI each
+ // time,
+ // we'll just return previously cached one. Probably not worth
+ // have a
+ // more complex cache than that.
+ if (fCachedGrammerURI != null && fCachedPublicID.equals(publicId) && fCachedSystemID.equals(systemId)) {
+ grammerURI = fCachedGrammerURI;
+ }
+ else {
+ grammerURI = idResolver.resolveId(publicId, systemId);
+ fCachedGrammerURI = grammerURI;
+ fCachedPublicID = publicId;
+ fCachedSystemID = systemId;
+ }
+ }
+ else {
+ grammerURI = idResolver.resolveId(publicId, systemId);
+ }
+
+ if (grammerURI == null)
+ return null;
+ CMDocument cmDocument = documentManager.getCMDocument(publicId, grammerURI);
+ return cmDocument;
+ }
+
+ /**
+ */
+ protected String resolveGrammarURI(Document document, String publicId, String systemId) {
+ return idResolver.resolveId(publicId, systemId);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java
index cea0c8f221..f33525a4a9 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/text/StructuredTextPartitionerForHTML.java
@@ -24,8 +24,8 @@ import org.eclipse.wst.sse.core.text.ITextRegion;
import org.eclipse.wst.sse.core.text.ITextRegionList;
import org.eclipse.wst.sse.core.util.ScriptLanguageKeys;
import org.eclipse.wst.sse.core.util.StringUtils;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
import org.eclipse.wst.xml.core.internal.text.rules.StructuredTextPartitionerForXML;
-import org.eclipse.wst.xml.core.parser.XMLRegionContext;
/**
* Document partitioner for HTML. Client-side scripts of type JavaScript are
@@ -76,16 +76,16 @@ public class StructuredTextPartitionerForHTML extends StructuredTextPartitionerF
}
ITextRegionList regions = node.getRegions();
- if (regions.size() > 4 && regions.get(1).getType() == XMLRegionContext.XML_TAG_NAME) {
+ if (regions.size() > 4 && regions.get(1).getType() == DOMRegionContext.XML_TAG_NAME) {
ITextRegion potentialLanguageRegion = regions.get(1);
String potentialLanguageString = node.getText(potentialLanguageRegion);
if (potentialLanguageString.equalsIgnoreCase(HTML40Namespace.ElementName.SCRIPT)) {
for (int i = 0; i < regions.size(); i++) {
ITextRegion region = regions.get(i);
String regionType = region.getType();
- if (regionType == XMLRegionContext.XML_TAG_ATTRIBUTE_NAME)
+ if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME)
attrNameRegion = region;
- else if (regionType == XMLRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
+ else if (regionType == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
String attrName = node.getText(attrNameRegion);
if (attrName.equalsIgnoreCase(HTML40Namespace.ATTR_NAME_LANGUAGE))
language = StringUtils.strip(node.getText(region));
@@ -106,7 +106,7 @@ public class StructuredTextPartitionerForHTML extends StructuredTextPartitionerF
}
private boolean isValidScriptingRegionType(String type) {
- return type == XMLRegionContext.BLOCK_TEXT || type == XMLRegionContext.XML_CDATA_OPEN || type == XMLRegionContext.XML_CDATA_TEXT || type == XMLRegionContext.XML_CDATA_CLOSE;
+ return type == DOMRegionContext.BLOCK_TEXT || type == DOMRegionContext.XML_CDATA_OPEN || type == DOMRegionContext.XML_CDATA_TEXT || type == DOMRegionContext.XML_CDATA_CLOSE;
}
protected void initLegalContentTypes() {
@@ -129,9 +129,9 @@ public class StructuredTextPartitionerForHTML extends StructuredTextPartitionerF
public String getPartitionType(ITextRegion region, int offset) {
String result = null;
- if (region.getType() == XMLRegionContext.XML_COMMENT_TEXT || region.getType() == XMLRegionContext.XML_COMMENT_OPEN)
+ if (region.getType() == DOMRegionContext.XML_COMMENT_TEXT || region.getType() == DOMRegionContext.XML_COMMENT_OPEN)
result = IHTMLPartitionTypes.HTML_COMMENT;
- else if (region.getType() == XMLRegionContext.XML_DOCTYPE_DECLARATION || region.getType() == XMLRegionContext.XML_DECLARATION_OPEN)
+ else if (region.getType() == DOMRegionContext.XML_DOCTYPE_DECLARATION || region.getType() == DOMRegionContext.XML_DECLARATION_OPEN)
result = IHTMLPartitionTypes.HTML_DECLARATION;
else
result = super.getPartitionType(region, offset);
@@ -145,14 +145,14 @@ public class StructuredTextPartitionerForHTML extends StructuredTextPartitionerF
ITextRegion[] regions = previousNode.getRegions().toArray();
for (int i = 0; i < regions.length; i++) {
- if(regions[i].getType() == XMLRegionContext.XML_TAG_NAME) {
+ if(regions[i].getType() == DOMRegionContext.XML_TAG_NAME) {
previousStartTagNameRegion = regions[i];
break;
}
}
regions = nextNode.getRegions().toArray();
for (int i = 0; i < regions.length; i++) {
- if(regions[i].getType() == XMLRegionContext.XML_TAG_NAME) {
+ if(regions[i].getType() == DOMRegionContext.XML_TAG_NAME) {
nextEndTagNameRegion = regions[i];
break;
}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/AbstractErrorInfo.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/AbstractErrorInfo.java
new file mode 100644
index 0000000000..b9b4d93d19
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/AbstractErrorInfo.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * 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.validate;
+
+abstract class AbstractErrorInfo implements ErrorInfo, ErrorState {
+
+
+ private int state = NONE_ERROR;
+ private Segment seg = null;
+
+ public AbstractErrorInfo(int state, Segment seg) {
+ super();
+ this.state = state;
+ this.seg = seg;
+ }
+
+ abstract public String getHint();
+
+ abstract public short getTargetType();
+
+ public int getLength() {
+ return (seg == null) ? 0 : seg.getLength();
+ }
+
+ public int getOffset() {
+ return (seg == null) ? 0 : seg.getOffset();
+ }
+
+ public int getState() {
+ return this.state;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java
new file mode 100644
index 0000000000..e84216dfce
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CMUtil.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.html.core.internal.modelquery.HMQUtil;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;
+import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+final class CMUtil {
+
+ /**
+ * Never instantiate!
+ */
+ private CMUtil() {
+ super();
+ }
+
+ /**
+ * You cannot always retrieve HTMLElementDeclaration via an Element instance.
+ * Because, it occasionally a JSP custom tag. -- 9/7/2001
+ */
+ public static CMElementDeclaration getDeclaration(Element target) {
+ Document doc = target.getOwnerDocument();
+ ModelQuery query = ModelQueryUtil.getModelQuery(doc);
+ return query.getCMElementDeclaration(target);
+ }
+
+ /**
+ */
+ public static boolean isCaseSensitive(CMElementDeclaration decl) {
+ if (decl == null || (!decl.supports(HTMLCMProperties.SHOULD_IGNORE_CASE)))
+ return false;
+ return !((Boolean) decl.getProperty(HTMLCMProperties.SHOULD_IGNORE_CASE)).booleanValue();
+ }
+
+ /**
+ */
+ private static boolean isChild(CMContent content, CMElementDeclaration target) {
+ switch (content.getNodeType()) {
+ case CMNode.ELEMENT_DECLARATION :
+ if (isWholeTagOmissible((CMElementDeclaration) content))
+ if (isChild(((CMElementDeclaration) content).getContent(), target))
+ return true;
+ return isSameDeclaration((CMElementDeclaration) content, target);
+ case CMNode.GROUP :
+ CMNodeList children = ((CMGroup) content).getChildNodes();
+ for (int i = 0; i < children.getLength(); i++) {
+ CMNode child = children.item(i);
+ switch (child.getNodeType()) {
+ case CMNode.ELEMENT_DECLARATION :
+ if (isWholeTagOmissible((CMElementDeclaration) child))
+ if (isChild(((CMElementDeclaration) child).getContent(), target))
+ return true;
+ if (isSameDeclaration((CMElementDeclaration) child, target))
+ return true;
+ continue; // Go next child.
+ case CMNode.GROUP :
+ if (isChild((CMContent) child, target))
+ return true;
+ continue; // Go next child.
+ default :
+ continue; // Go next child.
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ */
+ public static boolean isEndTagOmissible(CMElementDeclaration decl) {
+ if (!(decl.supports(HTMLCMProperties.OMIT_TYPE)))
+ return false;
+ String omitType = (String) decl.getProperty(HTMLCMProperties.OMIT_TYPE);
+ return !omitType.equals(HTMLCMProperties.Values.OMIT_NONE);
+ }
+
+ /**
+ */
+ public static boolean isWholeTagOmissible(CMElementDeclaration decl) {
+ if (!(decl.supports(HTMLCMProperties.OMIT_TYPE)))
+ return false;
+ String omitType = (String) decl.getProperty(HTMLCMProperties.OMIT_TYPE);
+ return omitType.equals(HTMLCMProperties.Values.OMIT_BOTH);
+ }
+
+ /**
+ */
+ public static boolean isJSP(CMElementDeclaration decl) {
+ if (!decl.supports(HTMLCMProperties.IS_JSP))
+ return false;
+ return ((Boolean) decl.getProperty(HTMLCMProperties.IS_JSP)).booleanValue();
+ }
+
+ /**
+ */
+ public static boolean isXHTML(CMElementDeclaration decl) {
+ if (!decl.supports(HTMLCMProperties.IS_XHTML))
+ return false;
+ return ((Boolean) decl.getProperty(HTMLCMProperties.IS_XHTML)).booleanValue();
+ }
+
+ /**
+ * The method to distinguish HTML and XHTML from other mark up.
+ * This method returns true if the target is,
+ * (1) not JSP,
+ * (2) not SSI.
+ */
+ public static boolean isHTML(CMElementDeclaration decl) {
+ return (!isJSP(decl)) && (!isSSI(decl));
+ }
+
+ /**
+ */
+ private static boolean isSameDeclaration(CMElementDeclaration aDec, CMElementDeclaration otherDec) {
+ return aDec.getElementName() == otherDec.getElementName();
+ }
+
+ /**
+ */
+ public static boolean isSSI(CMElementDeclaration edec) {
+ if (edec == null)
+ return false;
+ if (!edec.supports(HTMLCMProperties.IS_SSI))
+ return false;
+ return ((Boolean) edec.getProperty(HTMLCMProperties.IS_SSI)).booleanValue();
+ }
+
+ /**
+ * Call this method only when the parent content type is one of
+ * the following: ANY, ELEMENT, or MIXED.
+ */
+ public static boolean isValidChild(CMElementDeclaration parent, CMElementDeclaration child) {
+ if (parent == null || child == null)
+ return false;
+ if (isHTML(parent) && (!isHTML(child)))
+ return true;
+ CMContent content = parent.getContent();
+ if (content == null)
+ return false;
+ return isChild(content, child);
+ }
+
+ public static boolean isForeign(Element target) {
+ if (!(target instanceof IDOMElement))
+ return true;
+ IDOMElement element = (IDOMElement) target;
+ return !element.isGlobalTag();
+ }
+
+ /**
+ * This method returns true if all of the following conditions are met:
+ * (1) value type is ENUM,
+ * (2) only one value is defined in the enumeration,
+ * (3) the value has same name to the attribute name.
+ */
+ public static boolean isBooleanAttr(CMAttributeDeclaration adec) {
+ CMDataType attrtype = adec.getAttrType();
+ if (attrtype == null)
+ return false;
+ if (attrtype.getDataTypeName() != CMDataType.ENUM)
+ return false;
+ String[] values = attrtype.getEnumeratedValues();
+ if (values.length != 1)
+ return false;
+ return values[0].equals(adec.getAttrName());
+ }
+
+ public static boolean isValidInclusion(CMElementDeclaration decl, Element parent) {
+ Iterator iter = HMQUtil.getInclusions(parent).iterator();
+ while (iter.hasNext()) {
+ CMElementDeclaration inclusion = (CMElementDeclaration) iter.next();
+ if (isSameDeclaration(decl, inclusion))
+ return true;
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CompositeValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CompositeValidator.java
new file mode 100644
index 0000000000..0dbc052f1b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/CompositeValidator.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * 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.validate;
+
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.sse.core.validate.ValidationAdapter;
+import org.eclipse.wst.sse.core.validate.ValidationReporter;
+import org.eclipse.wst.xml.core.internal.validate.ValidationComponent;
+
+abstract class CompositeValidator extends ValidationComponent {
+
+ protected Vector components = new Vector();
+
+ /**
+ * CompositeValidator constructor comment.
+ */
+ public CompositeValidator() {
+ super();
+ }
+
+ /**
+ */
+ public void setReporter(ValidationReporter reporter) {
+ super.setReporter(reporter);
+
+ Iterator i = components.iterator();
+ while (i.hasNext()) {
+ ValidationAdapter component = (ValidationAdapter) i.next();
+ if (component == null)
+ continue;
+ component.setReporter(reporter);
+ }
+ }
+
+ /**
+ */
+ public void validate(IndexedRegion node) {
+ Iterator i = components.iterator();
+ while (i.hasNext()) {
+ ValidationComponent component = (ValidationComponent) i.next();
+ if (component == null)
+ continue;
+ component.validate(node);
+ }
+ }
+
+ /**
+ */
+ void add(ValidationComponent validator) {
+ components.add(validator);
+ }
+
+ /**
+ * This method registers all components in 'validators'.
+ * Each derivative must call this methid in its constructor.
+ */
+ protected void register(ValidationComponent[] validators) {
+ for (int i = 0; i < validators.length; i++) {
+ if (validators[i] != null)
+ add(validators[i]);
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/DocumentPropagatingValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/DocumentPropagatingValidator.java
new file mode 100644
index 0000000000..2fab110fae
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/DocumentPropagatingValidator.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.sse.core.validate.ValidationAdapter;
+import org.eclipse.wst.sse.core.validate.ValidationReporter;
+import org.eclipse.wst.xml.core.internal.validate.AbstractPropagatingValidator;
+import org.eclipse.wst.xml.core.internal.validate.ValidationComponent;
+
+class DocumentPropagatingValidator extends AbstractPropagatingValidator {
+
+
+ private ValidationComponent validator = new HTMLSimpleDocumentValidator();
+ private ElementPropagatingValidator propagatee = new ElementPropagatingValidator();
+
+ public DocumentPropagatingValidator() {
+ super();
+ }
+
+ public void validate(IndexedRegion node) {
+ getPropagatee().setReporter(this.reporter);
+ super.validate(node);
+ }
+
+ public boolean isAdapterForType(Object type) {
+ return (type == DocumentPropagatingValidator.class || super.isAdapterForType(type));
+ }
+
+ public void setReporter(ValidationReporter reporter) {
+ super.setReporter(reporter);
+ validator.setReporter(reporter);
+ propagatee.setReporter(reporter);
+ }
+
+ /**
+ * @see com.ibm.sed.validate.html.AbstractPropagatingValidator#getPropagatee()
+ */
+ protected final ValidationComponent getPropagatee() {
+ return propagatee;
+ }
+
+ /**
+ * @see com.ibm.sed.validate.html.AbstractPropagatingValidator#getValidator()
+ */
+ protected final ValidationAdapter getValidator() {
+ return validator;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ElementPropagatingValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ElementPropagatingValidator.java
new file mode 100644
index 0000000000..140d90f9ae
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ElementPropagatingValidator.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+import org.eclipse.wst.sse.core.validate.ValidationAdapter;
+import org.eclipse.wst.sse.core.validate.ValidationReporter;
+import org.eclipse.wst.xml.core.internal.validate.AbstractPropagatingValidator;
+import org.eclipse.wst.xml.core.internal.validate.ValidationComponent;
+
+class ElementPropagatingValidator extends AbstractPropagatingValidator {
+
+
+ private ValidationComponent validator = new HTMLSimpleValidator();
+
+ public ElementPropagatingValidator() {
+ super();
+ }
+
+ public boolean isAdapterForType(Object type) {
+ return (type == ElementPropagatingValidator.class || super.isAdapterForType(type));
+ }
+
+ public void setReporter(ValidationReporter reporter) {
+ super.setReporter(reporter);
+ validator.setReporter(reporter);
+ }
+
+ /**
+ * @see com.ibm.sed.validate.html.AbstractPropagatingValidator#getPropagatee()
+ */
+ protected ValidationComponent getPropagatee() {
+ return this;
+ }
+
+ /**
+ * @see com.ibm.sed.validate.html.AbstractPropagatingValidator#getValidator()
+ */
+ protected ValidationAdapter getValidator() {
+ return validator;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfo.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfo.java
new file mode 100644
index 0000000000..34b430e71b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfo.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+
+interface ErrorInfo {
+
+ public String getHint();
+
+ public int getLength();
+
+ public int getOffset();
+
+ public int getState();
+
+ public short getTargetType();
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java
new file mode 100644
index 0000000000..6026c2c4c9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorInfoImpl.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+final class ErrorInfoImpl extends AbstractErrorInfo {
+
+ private Node target = null;
+
+ // private Segment seg = null;
+ /**
+ */
+ public ErrorInfoImpl(int state, Segment errorSeg, Node target) {
+ super(state, errorSeg);
+ this.target = target;
+ }
+
+ /**
+ */
+ public String getHint() {
+ switch (target.getNodeType()) {
+ case Node.ATTRIBUTE_NODE :
+ switch (getState()) {
+ case UNDEFINED_VALUE_ERROR :
+ case MISMATCHED_VALUE_ERROR :
+ case UNCLOSED_ATTR_VALUE :
+ //D210422
+ return ((Attr) target).getValue();
+ default :
+ return target.getNodeName();
+ }
+ case Node.TEXT_NODE :
+ return ((Text) target).getData();
+ case Node.ELEMENT_NODE :
+ default :
+ return target.getNodeName();
+ }
+ }
+
+ public short getTargetType() {
+ return target.getNodeType();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java
new file mode 100644
index 0000000000..f7259400e9
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/ErrorState.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+
+interface ErrorState {
+ static final int NONE_ERROR = 0;
+ // generic error
+ static final int UNDEFINED_NAME_ERROR = 11;
+ static final int UNDEFINED_VALUE_ERROR = 12;
+ static final int MISMATCHED_VALUE_ERROR = 13;
+ // format error
+ static final int FORMAT_ERROR_LEVEL = 100;
+ static final int INVALID_NAME_ERROR = 101;
+ static final int INVALID_CHAR_ERROR = 102;
+ static final int MISMATCHED_ERROR = 103;
+ static final int MISMATCHED_END_TAG_ERROR = 104;
+ static final int MISSING_START_TAG_ERROR = 105;
+ static final int MISSING_END_TAG_ERROR = 106;
+ static final int UNNECESSARY_END_TAG_ERROR = 107;
+ static final int INVALID_ATTR_ERROR = 108;
+ static final int INVALID_DIRECTIVE_ERROR = 109;
+ static final int UNCLOSED_TAG_ERROR = 110;
+ static final int UNCLOSED_END_TAG_ERROR = 111;
+ static final int INVALID_EMPTY_ELEMENT_TAG = 112;
+ static final int UNCLOSED_ATTR_VALUE = 113; //D210422
+ // layout error
+ static final int LAYOUT_ERROR_LEVEL = 1000;
+ static final int INVALID_CONTENT_ERROR = 1001;
+ static final int DUPLICATE_ERROR = 1002;
+ static final int COEXISTENCE_ERROR = 1003;
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java
new file mode 100644
index 0000000000..960199def1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/FMUtil.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+
+import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+
+final class FMUtil {
+
+ public final static int SEG_NONE = 0;
+ public final static int SEG_WHOLE_TAG = 1;
+ public final static int SEG_START_TAG = 2;
+ public final static int SEG_END_TAG = 3;
+
+ /**
+ */
+ private FMUtil() {
+ super();
+ }
+
+ /**
+ */
+ public final static Segment getSegment(IDOMNode target, int segType) {
+ if (target == null)
+ return new Segment(0, 0);
+ Segment seg = null;
+ IStructuredDocumentRegion startTag = null;
+ IStructuredDocumentRegion endTag = null;
+ switch (segType) {
+ case SEG_WHOLE_TAG :
+ startTag = target.getFirstStructuredDocumentRegion();
+ if (startTag != null) {
+ endTag = target.getLastStructuredDocumentRegion();
+ seg = new Segment(startTag, endTag);
+ }
+ else {
+ int startOffset = target.getStartOffset();
+ int endOffset = target.getEndOffset();
+ seg = new Segment(startOffset, endOffset - startOffset);
+ }
+ break;
+ case SEG_START_TAG :
+ startTag = target.getStartStructuredDocumentRegion();
+ if (startTag != null) {
+ seg = new Segment(startTag);
+ }
+ else {
+ seg = new Segment(target.getStartOffset(), 0);
+ }
+ break;
+ case SEG_END_TAG :
+ endTag = target.getEndStructuredDocumentRegion();
+ if (endTag != null) {
+ seg = new Segment(endTag);
+ }
+ else {
+ seg = new Segment(target.getEndOffset(), 0);
+ }
+ break;
+ case SEG_NONE :
+ default :
+ return new Segment(0, 0);
+ }
+ return seg;
+ }
+
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java
new file mode 100644
index 0000000000..c80856ce31
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+
+import java.util.Iterator;
+
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.sse.core.text.ITextRegion;
+import org.eclipse.wst.sse.core.text.ITextRegionContainer;
+import org.eclipse.wst.sse.core.text.ITextRegionList;
+import org.eclipse.wst.xml.core.document.IDOMAttr;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+
+public class HTMLAttributeValidator extends PrimeValidator {
+
+ private static final int REGION_NAME = 1;
+ private static final int REGION_VALUE = 2;
+ // <<D210422
+ private static final char SINGLE_QUOTE = '\'';
+ private static final char DOUBLE_QUOTE = '\"';
+
+ // D210422
+ /**
+ * HTMLAttributeValidator constructor comment.
+ */
+ public HTMLAttributeValidator() {
+ super();
+ }
+
+ /**
+ */
+ private Segment getErrorSegment(IDOMNode errorNode, int regionType) {
+ ITextRegion rgn = null;
+ switch (regionType) {
+ case REGION_NAME :
+ rgn = errorNode.getNameRegion();
+ break;
+ case REGION_VALUE :
+ rgn = errorNode.getValueRegion();
+ break;
+ default :
+ // nothing to do.
+ break;
+ }
+ if (rgn != null) {
+ if (errorNode instanceof IDOMAttr) {
+ IDOMElement ownerElement = (IDOMElement) ((IDOMAttr) errorNode).getOwnerElement();
+ if (ownerElement != null) {
+ int regionStartOffset = ownerElement.getFirstStructuredDocumentRegion().getStartOffset(rgn);
+ int regionLength = rgn.getLength();
+ return new Segment(regionStartOffset, regionLength);
+ }
+ }
+ }
+ return new Segment(errorNode.getStartOffset(), 0);
+ }
+
+ /**
+ * Allowing the INodeAdapter to compare itself against the type allows it
+ * to return true in more than one case.
+ */
+ public boolean isAdapterForType(Object type) {
+ return ((type == HTMLAttributeValidator.class) || super.isAdapterForType(type));
+ }
+
+ /**
+ */
+ public void validate(IndexedRegion node) {
+ Element target = (Element) node;
+ if (CMUtil.isForeign(target))
+ return;
+ CMElementDeclaration edec = CMUtil.getDeclaration(target);
+ if (edec == null)
+ return;
+ CMNamedNodeMap declarations = edec.getAttributes();
+
+ NamedNodeMap attrs = target.getAttributes();
+ for (int i = 0; i < attrs.getLength(); i++) {
+ int rgnType = REGION_NAME;
+ int state = ErrorState.NONE_ERROR;
+ Attr a = (Attr) attrs.item(i);
+ // D203637; If the target attr has prefix, the validator should
+ // not
+ // warn about it. That is, just ignore. It is able to check
+ // whether
+ // an attr has prefix or not by calling XMLAttr#isGlobalAttr().
+ // When a attr has prefix (not global), it returns false.
+ boolean isXMLAttr = a instanceof IDOMAttr;
+ if (isXMLAttr) {
+ IDOMAttr xmlattr = (IDOMAttr) a;
+ if (!xmlattr.isGlobalAttr())
+ continue; // skip futher validation and begin next loop.
+ }
+
+ CMAttributeDeclaration adec = (CMAttributeDeclaration) declarations.getNamedItem(a.getName());
+ if (adec == null) {
+ // No attr declaration was found. That is, the attr name is
+ // undefined.
+ // but not regard it as undefined name if it includes JSP
+ if (hasJSPRegion(((IDOMNode) a).getNameRegion())) {
+ rgnType = REGION_NAME;
+ state = ErrorState.UNDEFINED_NAME_ERROR;
+ }
+ }
+ else {
+ // The attr declaration was found.
+ // At 1st, the name should be checked.
+ if (CMUtil.isHTML(edec) && (!CMUtil.isXHTML(edec))) {
+ // If the target element is pure HTML (not XHTML), some
+ // attributes
+ // might be written in boolean format. It should be check
+ // specifically.
+ if (CMUtil.isBooleanAttr(adec) && ((IDOMAttr) a).hasNameOnly())
+ continue; // OK, keep going. No more check is needed
+ // against this attr.
+ }
+ else {
+ // If the target is other than pure HTML (JSP or XHTML),
+ // the name
+ // must be checked exactly (ie in case sensitive way).
+ String actual = a.getName();
+ String desired = adec.getAttrName();
+ if (!actual.equals(desired)) { // case mismatch
+ rgnType = REGION_NAME;
+ state = ErrorState.MISMATCHED_ERROR;
+ }
+ }
+ // Then, the value must be checked.
+ if (state == ErrorState.NONE_ERROR) { // Need more check.
+ // Now, the value should be checked, if the type is ENUM.
+ CMDataType attrType = adec.getAttrType();
+ String actualValue = a.getValue();
+ if (attrType.getImpliedValueKind() == CMDataType.IMPLIED_VALUE_FIXED) {
+ // Check FIXED value.
+ String validValue = attrType.getImpliedValue();
+ if (!actualValue.equals(validValue)) {
+ rgnType = REGION_VALUE;
+ state = ErrorState.UNDEFINED_VALUE_ERROR;
+ }
+ }
+ else {
+ String[] candidates = attrType.getEnumeratedValues();
+ if (candidates != null && candidates.length > 0) {
+ // several candidates are found.
+ boolean found = false;
+ for (int index = 0; index < candidates.length; index++) {
+ String candidate = candidates[index];
+ // At 1st, compare ignoring case.
+ if (actualValue.equalsIgnoreCase(candidate)) {
+ found = true;
+ if (CMUtil.isCaseSensitive(edec) && (!actualValue.equals(candidate))) {
+ rgnType = REGION_VALUE;
+ state = ErrorState.MISMATCHED_VALUE_ERROR;
+ }
+ break; // exit the loop.
+ }
+ }
+ if (!found) {
+ // No candidate was found. That is,
+ // actualValue is invalid.
+ // but not regard it as undefined value if it
+ // includes JSP.
+ if (hasJSPRegion(((IDOMNode) a).getValueRegion())) {
+ rgnType = REGION_VALUE;
+ state = ErrorState.UNDEFINED_VALUE_ERROR;
+ }
+ }
+ }
+ }
+ }
+ // <<D210422
+ if (state == ErrorState.NONE_ERROR) { // Need more check.
+ if (isXMLAttr) {
+ String source = ((IDOMAttr) a).getValueRegionText();
+ if (source != null) {
+ char firstChar = source.charAt(0);
+ char lastChar = source.charAt(source.length() - 1);
+ if (isQuote(firstChar) || isQuote(lastChar)) {
+ if (lastChar != firstChar) {
+ rgnType = REGION_VALUE;
+ state = ErrorState.UNCLOSED_ATTR_VALUE;
+ }
+ }
+ }
+ }
+ }
+ // D210422
+ }
+ if (state != ErrorState.NONE_ERROR) {
+ Segment seg = getErrorSegment((IDOMNode) a, rgnType);
+ if (seg != null)
+ reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(state, seg, a)));
+ }
+ }
+ }
+
+ /**
+ */
+ private boolean hasJSPRegion(ITextRegion container) {
+ if (!(container instanceof ITextRegionContainer))
+ return false;
+ ITextRegionList regions = ((ITextRegionContainer) container).getRegions();
+ if (regions == null)
+ return false;
+ Iterator e = regions.iterator();
+ while (e.hasNext()) {
+ ITextRegion region = (ITextRegion) e.next();
+ if (region == null)
+ continue;
+ String regionType = region.getType();
+ if (regionType == DOMRegionContext.XML_TAG_OPEN || (isNextedTagName(regionType)))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * ISSUE: this is a bit of hidden JSP knowledge that was implemented this
+ * way for expedency. Should be evolved in future to depend on "nestedContext".
+ */
+ private boolean isNextedTagName(String regionType) {
+ final String JSP_SCRIPTLET_OPEN = "JSP_SCRIPTLET_OPEN"; //$NON-NLS-1$
+ final String JSP_EXPRESSION_OPEN = "JSP_EXPRESSION_OPEN"; //$NON-NLS-1$
+ final String JSP_DECLARATION_OPEN = "JSP_DECLARATION_OPEN"; //$NON-NLS-1$
+ final String JSP_DIRECTIVE_OPEN = "JSP_DIRECTIVE_OPEN"; //$NON-NLS-1$
+
+ boolean result = regionType.equals(JSP_SCRIPTLET_OPEN) || regionType.equals(JSP_EXPRESSION_OPEN) || regionType.equals(JSP_DECLARATION_OPEN) || regionType.equals(JSP_DIRECTIVE_OPEN);
+ return result;
+ }
+
+ // <<D214022
+ private boolean isQuote(char c) {
+ return (c == SINGLE_QUOTE) || (c == DOUBLE_QUOTE);
+ }
+ // D210422
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLDocumentContentValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLDocumentContentValidator.java
new file mode 100644
index 0000000000..cf1f24db81
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLDocumentContentValidator.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.wst.html.core.HTML40Namespace;
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.xml.core.document.IDOMDocument;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.document.IDOMText;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class HTMLDocumentContentValidator extends PrimeValidator {
+
+
+ private final static class Division {
+ private Vector explicitHtmls = new Vector();
+ private Vector rest = new Vector();
+
+ public Division(Document document, NodeList children) {
+ String rootTagName = getRootTagName(document);
+ for (int i = 0; i < children.getLength(); i++) {
+ Node child = children.item(i);
+ if (isHtmlTag(child, rootTagName)) {
+ explicitHtmls.add(child);
+ }
+ else {
+ rest.add(child);
+ }
+ }
+ }
+
+ public boolean hasExplicitHtmls() {
+ return explicitHtmls.size() > 0;
+ }
+
+ public List getExplicitHtmls() {
+ return explicitHtmls;
+ }
+
+ public Iterator getRestNodes() {
+ return rest.iterator();
+ }
+
+ /* utilities */
+ private static boolean isHtmlTag(Node node, String tagName) {
+ if (node.getNodeType() != Node.ELEMENT_NODE)
+ return false;
+ return ((Element) node).getTagName().equalsIgnoreCase(tagName);
+ }
+
+ private static String getRootTagName(Document document) {
+ DocumentTypeAdapter adapter = (DocumentTypeAdapter) ((IDOMDocument) document).getAdapterFor(DocumentTypeAdapter.class);
+ if (adapter != null) {
+ DocumentType docType = adapter.getDocumentType();
+ if (docType != null) {
+ return docType.getName();
+ }
+ }
+
+ return HTML40Namespace.ElementName.HTML;
+ }
+ }
+
+ /**
+ * HTMLDocumentContentValidator constructor comment.
+ */
+ public HTMLDocumentContentValidator() {
+ super();
+ }
+
+ /**
+ * Allowing the INodeAdapter to compare itself against the type
+ * allows it to return true in more than one case.
+ */
+ public boolean isAdapterForType(Object type) {
+ return ((type == HTMLDocumentContentValidator.class) || super.isAdapterForType(type));
+ }
+
+ /**
+ */
+ public void validate(IndexedRegion node) {
+ // isFragment check should be more intelligent.
+ boolean isFragment = true;
+
+ Document target = (Document) node;
+ NodeList children = target.getChildNodes();
+ if (children == null)
+ return;
+
+ Division division = new Division(target, children);
+ if (division.hasExplicitHtmls()) {
+ isFragment = false;
+
+ List explicits = division.getExplicitHtmls();
+ if (explicits.size() > 1) {
+ for (int i = 1; i < explicits.size(); i++) {
+ Element html = (Element) explicits.get(i);
+ // report error (duplicate)
+ Segment errorSeg = FMUtil.getSegment((IDOMNode) html, FMUtil.SEG_START_TAG);
+ if (errorSeg != null)
+ reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(ErrorState.DUPLICATE_ERROR, errorSeg, html)));
+ }
+ }
+ }
+ validateContent(division.getRestNodes(), isFragment);
+ }
+
+ /*
+ * This methods validate nodes other than HTML elements.
+ */
+ private void validateContent(Iterator children, boolean isFragment) {
+ boolean foundDoctype = false;
+ while (children.hasNext()) {
+ IDOMNode child = (IDOMNode) children.next();
+
+ int error = ErrorState.NONE_ERROR;
+ int segType = FMUtil.SEG_WHOLE_TAG;
+
+ switch (child.getNodeType()) {
+ case Node.ELEMENT_NODE :
+ if (! isFragment) {
+ Element childElem = (Element) child;
+ CMElementDeclaration ced = CMUtil.getDeclaration(childElem);
+ // Undefined element is valid.
+ if (ced == null)
+ continue;
+ // JSP (includes custom tags) and SSI are valid.
+ if (CMUtil.isForeign(childElem) || CMUtil.isSSI(ced))
+ continue; // Defect 186774
+
+ // report error (invalid content)
+ error = ErrorState.INVALID_CONTENT_ERROR;
+ // mark the whole start tag as error.
+ segType = FMUtil.SEG_START_TAG;
+ }
+ break;
+ case Node.TEXT_NODE :
+ if (! isFragment) {
+ // TEXT node is valid when it contains white space characters only.
+ // Otherwise, it is invalid content.
+ if (((IDOMText) child).isWhitespace())
+ continue;
+ error = ErrorState.INVALID_CONTENT_ERROR;
+ segType = FMUtil.SEG_WHOLE_TAG;
+ }
+ break;
+ case Node.DOCUMENT_TYPE_NODE :
+ // DOCTYPE is also valid when it appears once and only once.
+ if (!foundDoctype) {
+ foundDoctype = true;
+ continue;
+ }
+ error = ErrorState.DUPLICATE_ERROR;
+ segType = FMUtil.SEG_WHOLE_TAG;
+ break;
+ case Node.COMMENT_NODE :
+ // always valid.
+ case Node.PROCESSING_INSTRUCTION_NODE :
+ continue;
+ default :
+ if (! isFragment) {
+ error = ErrorState.INVALID_CONTENT_ERROR;
+ segType = FMUtil.SEG_WHOLE_TAG;
+ }
+ break;
+ }
+ if (error != ErrorState.NONE_ERROR) {
+ Segment errorSeg = FMUtil.getSegment(child, segType);
+ if (errorSeg != null)
+ reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(error, errorSeg, child)));
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementAncestorValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementAncestorValidator.java
new file mode 100644
index 0000000000..725314a2b3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementAncestorValidator.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+
+import org.eclipse.wst.html.core.HTMLCMProperties;
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.w3c.dom.Element;
+
+public class HTMLElementAncestorValidator extends PrimeValidator {
+
+ /**
+ * HTMLElementAncestorValidator constructor comment.
+ */
+ public HTMLElementAncestorValidator() {
+ super();
+ }
+
+ /**
+ * Allowing the INodeAdapter to compare itself against the type
+ * allows it to return true in more than one case.
+ */
+ public boolean isAdapterForType(Object type) {
+ return ((type == HTMLElementAncestorValidator.class) || super.isAdapterForType(type));
+ }
+
+ /**
+ * Check exclusion which is defined in only HTML DTD (SGML).
+ */
+ public void validate(IndexedRegion node) {
+ Element target = (Element) node;
+ if (CMUtil.isForeign(target))
+ return;
+ CMElementDeclaration dec = CMUtil.getDeclaration(target);
+ if (dec == null)
+ return; // cannot validate.
+ if (!CMUtil.isHTML(dec))
+ return; // no need to validate
+ if (!dec.supports(HTMLCMProperties.PROHIBITED_ANCESTORS))
+ return; // cannot validate.
+ CMNamedNodeMap prohibited = (CMNamedNodeMap) dec.getProperty(HTMLCMProperties.PROHIBITED_ANCESTORS);
+ if (prohibited.getLength() <= 0)
+ return; // no prohibited ancestors.
+
+ Element parent = SMUtil.getParentElement(target);
+ while (parent != null) {
+ CMNode pdec = prohibited.getNamedItem(parent.getNodeName());
+ if (pdec != null) { // prohibited element is found in ancestors.
+ Segment errorSeg = FMUtil.getSegment((IDOMNode) node, FMUtil.SEG_START_TAG);
+ if (errorSeg != null)
+ reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(ErrorState.INVALID_CONTENT_ERROR, errorSeg, target)));
+ break; // If one prohibited ancestor is found, it's enough.
+ }
+ parent = SMUtil.getParentElement(parent);
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java
new file mode 100644
index 0000000000..828ffb1f1e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLElementContentValidator.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * 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.validate;
+
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.document.IDOMText;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class HTMLElementContentValidator extends PrimeValidator {
+
+ /**
+ * HTMLElementContentValidator constructor comment.
+ */
+ public HTMLElementContentValidator() {
+ super();
+ }
+
+ /**
+ * Allowing the INodeAdapter to compare itself against the type
+ * allows it to return true in more than one case.
+ */
+ public boolean isAdapterForType(Object type) {
+ return ((type == HTMLElementContentValidator.class) || super.isAdapterForType(type));
+ }
+
+ /**
+ */
+ public void validate(IndexedRegion node) {
+ Element target = (Element) node;
+ if (CMUtil.isForeign(target))
+ return;
+
+ validateContent(target, target.getChildNodes());
+ }
+
+ private void validateContent(Element parent, NodeList children) {
+ for (int i = 0; i < children.getLength(); i++) {
+ Node child = children.item(i);
+ if (child == null)
+ continue;
+
+ // perform actual validation
+ validateNode(parent, child);
+ }
+ }
+
+// private int countExplicitSiblings(Element parent, String tagName) {
+// NodeList children = parent.getChildNodes();
+// int count = 0;
+// for (int i = 0; i < children.getLength(); i++) {
+// Node child = children.item(i);
+// if (child.getNodeType() != Node.ELEMENT_NODE)
+// continue;
+// if (tagName.equalsIgnoreCase(((Element) child).getTagName())) {
+// count++;
+// }
+// }
+// return count;
+// }
+
+ /* The implementation of the following method is practical but accurate.
+ * The accurate maximum occurence should be retreive from the content model.
+ * However, it is useful enough, since almost implicit elements are HTML,
+ * HEAD, or BODY.
+ */
+// private int getMaxOccur(Element parent, String childTag) {
+// return 1;
+// }
+
+ private void validateNode(Element target, Node child) {
+ // NOTE: If the target element is 'UNKNOWN', that is, it has no
+ // element declaration, the content type of the element should be
+ // regarded as 'ANY'. -- 9/10/2001
+ int contentType = CMElementDeclaration.ANY;
+ CMElementDeclaration edec = CMUtil.getDeclaration(target);
+ if (edec != null)
+ contentType = edec.getContentType();
+
+ int error = ErrorState.NONE_ERROR;
+ int segType = FMUtil.SEG_WHOLE_TAG;
+
+ switch (child.getNodeType()) {
+ case Node.ELEMENT_NODE :
+ Element childElem = (Element) child;
+ // Defect 200321:
+ // This validator cares only HTML/XHTML elements. If a child is
+ // an element of foreign markup languages, just ignore it.
+ if (CMUtil.isForeign(childElem))
+ return;
+
+ CMElementDeclaration ced = CMUtil.getDeclaration((Element) child);
+ // Defect 186774: If a child is not one of HTML elements,
+ // it should be regarded as a valid child regardless the
+ // type of the parent content model. -- 10/12/2001
+ if (ced == null || CMUtil.isSSI(ced) || (!CMUtil.isHTML(ced)))
+ return;
+
+ switch (contentType) {
+ case CMElementDeclaration.ANY :
+ // Keep going.
+ return;
+ case CMElementDeclaration.ELEMENT :
+ case CMElementDeclaration.MIXED :
+ if (ced == null)
+ return;
+ if (CMUtil.isValidChild(edec, ced))
+ return;
+ // Now, it is the time to check inclusion, unless the target
+ // document is not a XHTML.
+ if (!CMUtil.isXHTML(edec)) {
+ // pure HTML
+ if (CMUtil.isValidInclusion(ced, target))
+ return;
+ }
+ error = ErrorState.INVALID_CONTENT_ERROR;
+ break;
+ default :
+ error = ErrorState.INVALID_CONTENT_ERROR;
+ break;
+ }
+ // Mark the whole START tag as an error segment.
+ segType = FMUtil.SEG_START_TAG;
+ break;
+ case Node.TEXT_NODE :
+ switch (contentType) {
+ case CMElementDeclaration.ANY :
+ case CMElementDeclaration.MIXED :
+ case CMElementDeclaration.PCDATA :
+ case CMElementDeclaration.CDATA :
+ // D184339
+ // Keep going.
+ return;
+ case CMElementDeclaration.ELEMENT :
+ case CMElementDeclaration.EMPTY :
+ if (((IDOMText) child).isWhitespace())
+ return;
+ error = ErrorState.INVALID_CONTENT_ERROR;
+ break;
+ default :
+ error = ErrorState.INVALID_CONTENT_ERROR;
+ break;
+ }
+ // Mark the whole node as an error segment.
+ segType = FMUtil.SEG_WHOLE_TAG;
+ break;
+ case Node.COMMENT_NODE :
+ case Node.PROCESSING_INSTRUCTION_NODE :
+ if (contentType != CMElementDeclaration.EMPTY)
+ return;
+ error = ErrorState.INVALID_CONTENT_ERROR;
+ // Mark the whole node as an error segment.
+ segType = FMUtil.SEG_WHOLE_TAG;
+ break;
+ default :
+ error = ErrorState.INVALID_CONTENT_ERROR;
+ // Mark the whole node as an error segment.
+ segType = FMUtil.SEG_WHOLE_TAG;
+ break;
+ }
+ if (error != ErrorState.NONE_ERROR) {
+ Segment errorSeg = FMUtil.getSegment((IDOMNode) child, segType);
+ if (errorSeg != null)
+ reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(error, errorSeg, child)));
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleDocumentValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleDocumentValidator.java
new file mode 100644
index 0000000000..f9a93924d2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleDocumentValidator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+import org.eclipse.wst.xml.core.internal.validate.ValidationComponent;
+
+class HTMLSimpleDocumentValidator extends CompositeValidator {
+
+ /**
+ * HTMLSimpleDocumentValidator constructor comment.
+ */
+ public HTMLSimpleDocumentValidator() {
+ super();
+
+ ValidationComponent[] validators = new ValidationComponent[2];
+
+ validators[0] = new HTMLDocumentContentValidator();
+ validators[1] = new SyntaxValidator();
+
+ register(validators);
+ }
+
+ /**
+ * Allowing the INodeAdapter to compare itself against the type
+ * allows it to return true in more than one case.
+ */
+ public boolean isAdapterForType(Object type) {
+ return ((type == HTMLSimpleDocumentValidator.class) || super.isAdapterForType(type));
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleValidator.java
new file mode 100644
index 0000000000..ff2a5e188f
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLSimpleValidator.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+import org.eclipse.wst.xml.core.internal.validate.ValidationComponent;
+
+class HTMLSimpleValidator extends CompositeValidator {
+
+ /**
+ * HTMLSimpleValidator constructor comment.
+ */
+ public HTMLSimpleValidator() {
+ super();
+
+ ValidationComponent[] validators = new ValidationComponent[5];
+
+ validators[0] = new HTMLAttributeValidator();
+ validators[1] = new HTMLElementContentValidator();
+ validators[2] = new SyntaxValidator();
+ validators[3] = new HTMLElementAncestorValidator();
+ validators[4] = new NamespaceValidator();
+
+ register(validators);
+ }
+
+ /**
+ * Allowing the INodeAdapter to compare itself against the type
+ * allows it to return true in more than one case.
+ */
+ public boolean isAdapterForType(Object type) {
+ return ((type == HTMLSimpleValidator.class) || super.isAdapterForType(type));
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java
new file mode 100644
index 0000000000..88cdc39d72
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+
+import org.eclipse.wst.sse.core.AbstractAdapterFactory;
+import org.eclipse.wst.sse.core.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.validate.ValidationAdapter;
+import org.w3c.dom.Node;
+
+public class HTMLValidationAdapterFactory extends AbstractAdapterFactory {
+
+ private static HTMLValidationAdapterFactory instance = null;
+
+ /**
+ * HTMLValidationAdapterFactory constructor comment.
+ */
+ public HTMLValidationAdapterFactory() {
+ super(ValidationAdapter.class, true);
+ }
+
+ /**
+ * HTMLValidationAdapterFactory constructor comment.
+ * @param adapterKey java.lang.Object
+ * @param registerAdapters boolean
+ */
+ public HTMLValidationAdapterFactory(Object adapterKey, boolean registerAdapters) {
+ super(adapterKey, registerAdapters);
+ }
+
+ /**
+ */
+ protected INodeAdapter createAdapter(INodeNotifier target) {
+ Node node = (Node) target;
+ switch (node.getNodeType()) {
+ case Node.DOCUMENT_NODE :
+ return new DocumentPropagatingValidator();
+ case Node.ELEMENT_NODE :
+ return new ElementPropagatingValidator();
+ default :
+ return new NullValidator();
+ }
+ }
+
+ /**
+ */
+ public synchronized static HTMLValidationAdapterFactory getInstance() {
+ if (instance != null)
+ return instance;
+ instance = new HTMLValidationAdapterFactory();
+ return instance;
+ }
+
+ /**
+ * Overriding Object's clone() method
+ * This is used in IModelManager's IStructuredModel copying.
+ */
+ public INodeAdapterFactory copy() {
+ return getInstance();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java
new file mode 100644
index 0000000000..fb9b91bc5b
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/MessageFactory.java
@@ -0,0 +1,254 @@
+/*******************************************************************************
+ * 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.validate;
+
+import java.text.MessageFormat;
+import java.util.Hashtable;
+
+import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
+import org.eclipse.wst.html.core.internal.Logger;
+import org.eclipse.wst.sse.core.validate.ValidationMessage;
+import org.w3c.dom.Node;
+
+class MessageFactory implements ErrorState {
+
+
+ private static class ErrorTable {
+ private class Packet {
+ public Packet(String msg, int severity) {
+ this.msg = msg;
+ this.severity = severity;
+ }
+
+ public String getMessage() {
+ return msg;
+ }
+
+ public int getSeverity() {
+ return severity;
+ }
+
+ private String msg = null;
+ private int severity = -1;
+ }
+
+ public ErrorTable() {
+ }
+
+ public void put(int state, String msg, int severity) {
+ Packet packet = new Packet(msg, severity);
+ map.put(new Integer(state), packet);
+ }
+
+ public String getMessage(int state) {
+ return getPacket(state).getMessage();
+ }
+
+ public int getSeverity(int state) {
+ return getPacket(state).getSeverity();
+ }
+
+ private Packet getPacket(int state) {
+ return (Packet) map.get(new Integer(state));
+ }
+
+ private Hashtable map = new Hashtable();
+ }
+
+ private static interface NodeType {
+ static final int ATTRIBUTE = 0;
+ static final int ELEMENT = 1;
+ static final int DOCUMENT_TYPE = 2;
+ static final int TEXT = 3;
+ static final int COMMENT = 4;
+ static final int CDATA_SECTION = 5;
+ static final int PROCESSING_INSTRUCTION = 6;
+ static final int ENTITY_REFERENCE = 7;
+
+ static final int MAX_TYPE = 8;
+ }
+
+ // error messages
+ private static final String MSG_NO_ERROR = HTMLCorePlugin.getResourceString("%No_error._UI_"); //$NON-NLS-1$ = "No error."
+ private static final String MSG_UNDEFINED_ATTR_ERROR = HTMLCorePlugin.getResourceString("%Undefined_attribute_name_(_ERROR_"); //$NON-NLS-1$ = "Undefined attribute name ({0})."
+ private static final String MSG_UNDEFINED_VALUE_ERROR = HTMLCorePlugin.getResourceString("%Undefined_attribute_value__ERROR_"); //$NON-NLS-1$ = "Undefined attribute value ({0})."
+ private static final String MSG_DUPLICATE_ATTR_ERROR = HTMLCorePlugin.getResourceString("%Multiple_values_specified__ERROR_"); //$NON-NLS-1$ = "Multiple values specified for an attribute ({0})."
+ private static final String MSG_MISMATCHED_ATTR_ERROR = HTMLCorePlugin.getResourceString("%Attribute_name_({0})_uses__ERROR_"); //$NON-NLS-1$ = "Attribute name ({0}) uses wrong case character."
+ private static final String MSG_INVALID_ATTR_ERROR = HTMLCorePlugin.getResourceString("%Invalid_attribute_name_({0_ERROR_"); //$NON-NLS-1$ = "Invalid attribute name ({0})."
+ private static final String MSG_ATTR_NO_VALUE_ERROR = HTMLCorePlugin.getResourceString("%Invalid_attribute_({0})._ERROR_"); //$NON-NLS-1$ = "Invalid attribute ({0})."
+ private static final String MSG_INVALID_CONTENT_ERROR = HTMLCorePlugin.getResourceString("%Invalid_location_of_tag_({_ERROR_"); //$NON-NLS-1$ = "Invalid location of tag ({0})."
+ private static final String MSG_DUPLICATE_TAG_ERROR = HTMLCorePlugin.getResourceString("%Duplicate_tag_({0})._ERROR_"); //$NON-NLS-1$ = "Duplicate tag ({0})."
+ private static final String MSG_MISSING_START_TAG_ERROR = HTMLCorePlugin.getResourceString("%No_start_tag_(<{0}>)._ERROR_"); //$NON-NLS-1$ = "No start tag (<{0}>)."
+ private static final String MSG_MISSING_END_TAG_ERROR = HTMLCorePlugin.getResourceString("%No_end_tag_(</{0}>)._ERROR_"); //$NON-NLS-1$ = "No end tag (</{0}>)."
+ private static final String MSG_UNNECESSARY_END_TAG_ERROR = HTMLCorePlugin.getResourceString("%End_tag_(</{0}>)_not_neede_ERROR_"); //$NON-NLS-1$ = "End tag (</{0}>) not needed."
+ private static final String MSG_UNDEFINED_TAG_ERROR = HTMLCorePlugin.getResourceString("%Unknown_tag_({0})._ERROR_"); //$NON-NLS-1$ = "Unknown tag ({0})."
+ private static final String MSG_MISMATCHED_TAG_ERROR = HTMLCorePlugin.getResourceString("%Tag_name_({0})_uses_wrong__ERROR_"); //$NON-NLS-1$ = "Tag name ({0}) uses wrong case character."
+ private static final String MSG_INVALID_TAG_ERROR = HTMLCorePlugin.getResourceString("%Invalid_tag_name_({0})._ERROR_"); //$NON-NLS-1$ = "Invalid tag name ({0})."
+ private static final String MSG_INVALID_DIRECTIVE_ERROR = HTMLCorePlugin.getResourceString("%Invalid_JSP_directive_({0}_ERROR_"); //$NON-NLS-1$ = "Invalid JSP directive ({0})."
+ private static final String MSG_INVALID_TEXT_ERROR = HTMLCorePlugin.getResourceString("%Invalid_text_string_({0})._ERROR_"); //$NON-NLS-1$ = "Invalid text string ({0})."
+ private static final String MSG_INVALID_CHAR_ERROR = HTMLCorePlugin.getResourceString("%Invalid_character_used_in__ERROR_"); //$NON-NLS-1$ = "Invalid character used in text string ({0})."
+ private static final String MSG_UNKNOWN_ERROR = HTMLCorePlugin.getResourceString("%Unknown_error._ERROR_"); //$NON-NLS-1$ = "Unknown error."
+ private static final String MSG_UNCLOSED_START_TAG_ERROR = HTMLCorePlugin.getResourceString("%Start_tag_(<{0}>)_not_clos_ERROR_"); //$NON-NLS-1$ = "Start tag (<{0}>) not closed."
+ private static final String MSG_UNCLOSED_END_TAG_ERROR = HTMLCorePlugin.getResourceString("%End_tag_(</{0}>)_not_close_ERROR_"); //$NON-NLS-1$ = "End tag (</{0}>) not closed."
+ //private static final String MSG_UNCLOSED_TAG_ERROR = HTMLCorePlugin.getResourceString("%Tag_({0})_not_closed._ERROR_"); //$NON-NLS-1$ = "Tag ({0}) not closed."
+ private static final String MSG_MISMATCHED_ATTR_VALUE_ERROR = HTMLCorePlugin.getResourceString("%Attribute_value_({0})_uses_ERROR_"); //$NON-NLS-1$ = "Attribute value ({0}) uses wrong case character."
+ private static final String MSG_UNCLOSED_COMMENT_ERROR = HTMLCorePlugin.getResourceString("%Comment_not_closed._ERROR_"); //$NON-NLS-1$ = "Comment not closed."
+ private static final String MSG_UNCLOSED_DOCTYPE_ERROR = HTMLCorePlugin.getResourceString("%DOCTYPE_declaration_not_cl_ERROR_"); //$NON-NLS-1$ = "DOCTYPE declaration not closed."
+ private static final String MSG_UNCLOSED_PI_ERROR = HTMLCorePlugin.getResourceString("%Processing_instruction_not_ERROR_"); //$NON-NLS-1$ = "Processing instruction not closed."
+ private static final String MSG_UNCLOSED_CDATA_SECTION_ERROR = HTMLCorePlugin.getResourceString("%CDATA_section_not_closed._ERROR_"); //$NON-NLS-1$ = "CDATA section not closed."
+ private static final String MSG_INVALID_EMPTY_ELEMENT_TAG = HTMLCorePlugin.getResourceString("%_ERROR_Tag_({0})_should_be_an_empty-element_tag_1"); //$NON-NLS-1$ = "Tag ({0}) should be an empty-element tag."
+ private static final String MSG_UNCLOSED_ATTR_VALUE_ERROR = HTMLCorePlugin.getResourceString("%_ERROR_Attribute_value_({0})_not_closed._1"); //$NON-NLS-1$ ="Attribute value ({0}) not closed."
+ private static ErrorTable[] errTables = new ErrorTable[NodeType.MAX_TYPE];
+
+ static {
+ for (int i = 0; i < NodeType.MAX_TYPE; i++) {
+ errTables[i] = new ErrorTable();
+ }
+ // NOTE: The severities are just stub. They must be reviewed.
+ // -- 8/30/2001
+
+ // attribute error map
+ ErrorTable attrTable = errTables[NodeType.ATTRIBUTE];// short hand
+ attrTable.put(NONE_ERROR, MSG_NO_ERROR, 0);
+ attrTable.put(UNDEFINED_NAME_ERROR, MSG_UNDEFINED_ATTR_ERROR, ValidationMessage.WARNING);
+ attrTable.put(UNDEFINED_VALUE_ERROR, MSG_UNDEFINED_VALUE_ERROR, ValidationMessage.WARNING);
+ attrTable.put(MISMATCHED_ERROR, MSG_MISMATCHED_ATTR_ERROR, ValidationMessage.WARNING);
+ attrTable.put(INVALID_NAME_ERROR, MSG_INVALID_ATTR_ERROR, ValidationMessage.WARNING);
+ attrTable.put(INVALID_ATTR_ERROR, MSG_ATTR_NO_VALUE_ERROR, ValidationMessage.WARNING);
+ attrTable.put(DUPLICATE_ERROR, MSG_DUPLICATE_ATTR_ERROR, ValidationMessage.WARNING);
+ attrTable.put(MISMATCHED_VALUE_ERROR, MSG_MISMATCHED_ATTR_VALUE_ERROR, ValidationMessage.ERROR);
+ //<<D210422
+ attrTable.put(UNCLOSED_ATTR_VALUE, MSG_UNCLOSED_ATTR_VALUE_ERROR, ValidationMessage.WARNING);
+ //D210422
+ // element error map
+ ErrorTable elemTable = errTables[NodeType.ELEMENT];// short hand
+ elemTable.put(NONE_ERROR, MSG_NO_ERROR, 0);
+ elemTable.put(UNDEFINED_NAME_ERROR, MSG_UNDEFINED_TAG_ERROR, ValidationMessage.WARNING);
+ elemTable.put(INVALID_NAME_ERROR, MSG_INVALID_TAG_ERROR, ValidationMessage.ERROR);
+ elemTable.put(MISMATCHED_ERROR, MSG_MISMATCHED_TAG_ERROR, ValidationMessage.WARNING);
+ elemTable.put(MISMATCHED_END_TAG_ERROR, MSG_MISMATCHED_TAG_ERROR, ValidationMessage.ERROR);
+ elemTable.put(MISSING_START_TAG_ERROR, MSG_MISSING_START_TAG_ERROR, ValidationMessage.ERROR);
+ elemTable.put(MISSING_END_TAG_ERROR, MSG_MISSING_END_TAG_ERROR, ValidationMessage.WARNING);
+ elemTable.put(UNNECESSARY_END_TAG_ERROR, MSG_UNNECESSARY_END_TAG_ERROR, ValidationMessage.WARNING);
+ elemTable.put(INVALID_DIRECTIVE_ERROR, MSG_INVALID_DIRECTIVE_ERROR, ValidationMessage.ERROR);
+ elemTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING);
+ elemTable.put(DUPLICATE_ERROR, MSG_DUPLICATE_TAG_ERROR, ValidationMessage.WARNING);
+ elemTable.put(COEXISTENCE_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING);
+ elemTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_START_TAG_ERROR, ValidationMessage.ERROR);
+ elemTable.put(UNCLOSED_END_TAG_ERROR, MSG_UNCLOSED_END_TAG_ERROR, ValidationMessage.ERROR);
+ elemTable.put(INVALID_EMPTY_ELEMENT_TAG, MSG_INVALID_EMPTY_ELEMENT_TAG, ValidationMessage.WARNING);
+
+ // document type error map
+ ErrorTable docTable = errTables[NodeType.DOCUMENT_TYPE];// short hand
+ docTable.put(NONE_ERROR, MSG_NO_ERROR, 0);
+ docTable.put(DUPLICATE_ERROR, MSG_DUPLICATE_TAG_ERROR, ValidationMessage.ERROR);
+ docTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING);
+ docTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_DOCTYPE_ERROR, ValidationMessage.ERROR);
+
+ // text error map
+ ErrorTable textTable = errTables[NodeType.TEXT];
+ textTable.put(NONE_ERROR, MSG_NO_ERROR, 0);
+ textTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_TEXT_ERROR, ValidationMessage.WARNING);
+ textTable.put(INVALID_CHAR_ERROR, MSG_INVALID_CHAR_ERROR, ValidationMessage.WARNING);
+
+ // comment error map
+ ErrorTable commTable = errTables[NodeType.COMMENT];
+ commTable.put(NONE_ERROR, MSG_NO_ERROR, 0);
+ commTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING);
+ commTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_COMMENT_ERROR, ValidationMessage.ERROR);
+
+ // cdata section error map
+ ErrorTable cdatTable = errTables[NodeType.CDATA_SECTION];
+ cdatTable.put(NONE_ERROR, MSG_NO_ERROR, 0);
+ cdatTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING);
+ cdatTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_CDATA_SECTION_ERROR, ValidationMessage.ERROR);
+
+ // processing instruction error map
+ ErrorTable piTable = errTables[NodeType.PROCESSING_INSTRUCTION];
+ piTable.put(NONE_ERROR, MSG_NO_ERROR, 0);
+ piTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING);
+ piTable.put(UNCLOSED_TAG_ERROR, MSG_UNCLOSED_PI_ERROR, ValidationMessage.ERROR);
+
+ // entity reference error map
+ ErrorTable erTable = errTables[NodeType.ENTITY_REFERENCE];
+ erTable.put(NONE_ERROR, MSG_NO_ERROR, 0);
+ erTable.put(UNDEFINED_NAME_ERROR, MSG_UNDEFINED_TAG_ERROR, ValidationMessage.WARNING);
+ erTable.put(INVALID_CONTENT_ERROR, MSG_INVALID_CONTENT_ERROR, ValidationMessage.WARNING);
+ }
+
+ /**
+ */
+ public static ValidationMessage createMessage(ErrorInfo info) {
+ String errorMsg = getErrorMessage(info);
+ int errorSeverity = getErrorSeverity(info);
+ return new ValidationMessage(errorMsg, info.getOffset(), info.getLength(), errorSeverity);
+ }
+
+ private static String getErrorMessage(ErrorInfo info) {
+ ErrorTable tab = getErrorTable(info.getTargetType());
+ if (tab == null)
+ return MSG_UNKNOWN_ERROR;
+
+ String template = tab.getMessage(info.getState());
+ Object[] arguments = {info.getHint()};
+ String s = null;
+ try {
+ s = MessageFormat.format(template, arguments);
+ }
+ catch (IllegalArgumentException e) {
+ Logger.logException(e);
+ s = template + ":" + arguments.toString(); //$NON-NLS-1$
+ }
+ return s;
+ }
+
+ /**
+ */
+ private static int getErrorSeverity(ErrorInfo info) {
+ ErrorTable tab = getErrorTable(info.getTargetType());
+ if (tab == null)
+ return 0;
+ return tab.getSeverity(info.getState());
+ }
+
+ private static ErrorTable getErrorTable(short nodetype) {
+ ErrorTable tab = null;
+ switch (nodetype) {
+ case Node.ATTRIBUTE_NODE :
+ tab = errTables[NodeType.ATTRIBUTE];
+ break;
+ case Node.ELEMENT_NODE :
+ tab = errTables[NodeType.ELEMENT];
+ break;
+ case Node.DOCUMENT_TYPE_NODE :
+ tab = errTables[NodeType.DOCUMENT_TYPE];
+ break;
+ case Node.TEXT_NODE :
+ tab = errTables[NodeType.TEXT];
+ break;
+ case Node.COMMENT_NODE :
+ tab = errTables[NodeType.COMMENT];
+ break;
+ case Node.CDATA_SECTION_NODE :
+ tab = errTables[NodeType.CDATA_SECTION];
+ break;
+ case Node.PROCESSING_INSTRUCTION_NODE :
+ tab = errTables[NodeType.PROCESSING_INSTRUCTION];
+ break;
+ case Node.ENTITY_REFERENCE_NODE :
+ tab = errTables[NodeType.ENTITY_REFERENCE];
+ break;
+ default :
+ return null;
+ }
+ return tab;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java
new file mode 100644
index 0000000000..d82487f91e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NamespaceValidator.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * 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.validate;
+
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.sse.core.text.ITextRegion;
+import org.eclipse.wst.xml.core.document.IDOMAttr;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+public class NamespaceValidator extends PrimeValidator implements ErrorState {
+
+ private final static String XMLNS_PREFIX = "xmlns";//$NON-NLS-1$
+ private final static String NS_SEPARATOR = ":";//$NON-NLS-1$
+
+ public NamespaceValidator() {
+ super();
+ }
+
+ public boolean isAdapterForType(Object type) {
+ return ((type == NamespaceValidator.class) || super.isAdapterForType(type));
+ }
+
+ public void validate(IndexedRegion node) {
+ Element target = (Element) node;
+ if (isXMLElement(target) && hasUnknownPrefix(target)) {
+ IDOMElement e = (IDOMElement) target;
+ if (!isValidPrefix(e.getPrefix(), target) && !e.isCommentTag()) {
+ // report unknown tag error.
+ Segment errorSeg = FMUtil.getSegment(e, FMUtil.SEG_START_TAG);
+ if (errorSeg != null)
+ reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(UNDEFINED_NAME_ERROR, errorSeg, e)));
+ }
+ }
+ // (2) check prefix of each attr
+ NamedNodeMap attrs = target.getAttributes();
+ for (int i = 0; i < attrs.getLength(); i++) {
+ Node n = attrs.item(i);
+ if (!(n instanceof IDOMAttr))
+ continue;
+ IDOMAttr a = (IDOMAttr) n;
+ String prefix = a.getPrefix();
+ if ((prefix != null) && isUnknownAttr(a, target)) {
+ // The attr has unknown prefix. So, check it.
+ if (!isValidPrefix(prefix, target)) {
+ // report unknown attr error.
+ ITextRegion r = a.getNameRegion();
+ if (r == null)
+ continue;
+ int a_offset = a.getNameRegionStartOffset();
+ int a_length = a.getNameRegion().getLength();
+ reporter.report(MessageFactory.createMessage(new ErrorInfoImpl(UNDEFINED_NAME_ERROR, new Segment(a_offset, a_length), a)));
+ }
+ }
+ }
+ }
+
+ // private methods
+ private boolean isXMLElement(Element target) {
+ return target instanceof IDOMElement;
+ }
+
+ private boolean hasUnknownPrefix(Element target) {
+ return isUnknownElement(target) && CMUtil.isForeign(target);
+ }
+
+ private boolean isUnknownElement(Element target) {
+ CMElementDeclaration dec = CMUtil.getDeclaration(target);
+ return dec == null;
+ }
+
+ private boolean isUnknownAttr(IDOMAttr attr, Element target) {
+ CMElementDeclaration dec = CMUtil.getDeclaration(target);
+ if (dec == null)
+ return true; // unknown.
+ CMNamedNodeMap adecls = dec.getAttributes();
+ CMAttributeDeclaration adec = (CMAttributeDeclaration) adecls.getNamedItem(attr.getName());
+ return adec == null;
+ }
+
+ private boolean isValidPrefix(String prefix, Element e) {
+ if (prefix.equals(XMLNS_PREFIX))
+ return true; // "xmlns:foo" attr is always valid.
+
+ // (1) check the element has the namespace definition or not.
+ if (isValidPrefixWithinElement(prefix, e))
+ return true;
+
+ // (2) check ancestors of the element have the namespace definition or not.
+ Element parent = SMUtil.getParentElement(e);
+ while (parent != null) {
+ if (isValidPrefixWithinElement(prefix, parent))
+ return true;
+ parent = SMUtil.getParentElement(parent);
+ }
+ return false;
+ }
+
+ private boolean isValidPrefixWithinElement(String prefix, Element e) {
+ String ns = XMLNS_PREFIX + NS_SEPARATOR + prefix;
+ NamedNodeMap attrs = e.getAttributes();
+ for (int i = 0; i < attrs.getLength(); i++) {
+ Node n = attrs.item(i);
+ if (n == null)
+ continue;
+ if (n.getNodeType() != Node.ATTRIBUTE_NODE)
+ continue;
+ if (ns.equals(((Attr) n).getName()))
+ return true;
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NullValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NullValidator.java
new file mode 100644
index 0000000000..28cd512ca1
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/NullValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.validate;
+
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.sse.core.validate.ValidationReporter;
+import org.eclipse.wst.xml.core.internal.validate.ValidationComponent;
+
+/**
+ * NullValidator class is intended to be a replacement of null
+ * for ValidationComponent type.
+ */
+final class NullValidator extends ValidationComponent {
+
+ public NullValidator() {
+ super();
+ }
+
+ public void validate(IndexedRegion node) {
+ return;
+ }
+
+ public void setReporter(ValidationReporter reporter) {
+ return;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/PrimeValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/PrimeValidator.java
new file mode 100644
index 0000000000..b44f258b87
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/PrimeValidator.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+
+import org.eclipse.wst.xml.core.internal.validate.ValidationComponent;
+
+abstract class PrimeValidator extends ValidationComponent {
+
+ /**
+ * PrimeValidator constructor comment.
+ */
+ public PrimeValidator() {
+ super();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SMUtil.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SMUtil.java
new file mode 100644
index 0000000000..6bf6fede41
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SMUtil.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.validate;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+final class SMUtil {
+
+ private SMUtil() {
+ super();
+ }
+
+ /* get an ancestor element ignoring implicit ones. */
+ public static Element getParentElement(Node child) {
+ if (child == null)
+ return null;
+
+ Node p = child.getParentNode();
+ while (p != null) {
+ if (p.getNodeType() == Node.ELEMENT_NODE) {
+ return (Element) p;
+ }
+ p = p.getParentNode();
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/Segment.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/Segment.java
new file mode 100644
index 0000000000..109ce0088e
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/Segment.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * 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.validate;
+
+
+
+import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
+
+public class Segment {
+
+ private int offset = 0;
+ private int length = 0;
+
+ /**
+ */
+ public Segment(int offset, int length) {
+ super();
+ this.offset = offset;
+ this.length = length;
+ }
+
+ public Segment(IStructuredDocumentRegion region) {
+ super();
+ this.offset = region.getStartOffset();
+ this.length = region.getLength();
+ }
+
+ /**
+ * NOTE: 'start' and 'end' must be the start and end of the contiguous regions.
+ * Otherwise, this class cannot work correctly.
+ */
+ public Segment(IStructuredDocumentRegion start, IStructuredDocumentRegion end) {
+ super();
+ this.offset = start.getStartOffset();
+ int endOffset = (end == null) ? start.getEndOffset() : end.getEndOffset();
+ this.length = endOffset - this.offset;
+ }
+
+ //public Segment(ITextRegion start, ITextRegion end) {
+ // super();
+ // this.offset = start.getStartOffset();
+ // int endOffset = (end == null) ? start.getEndOffset() : end.getEndOffset();
+ // this.length = endOffset - this.offset;
+ //}
+ /**
+ */
+ public int getLength() {
+ return this.length;
+ }
+
+ /**
+ */
+ public int getOffset() {
+ return this.offset;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java
new file mode 100644
index 0000000000..26437db6b2
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/SyntaxValidator.java
@@ -0,0 +1,345 @@
+/*******************************************************************************
+ * 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.validate;
+
+import java.util.Iterator;
+
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeEntry;
+import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeRegistry;
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
+import org.eclipse.wst.sse.core.text.ITextRegion;
+import org.eclipse.wst.sse.core.text.ITextRegionList;
+import org.eclipse.wst.xml.core.document.IDOMDocument;
+import org.eclipse.wst.xml.core.document.IDOMElement;
+import org.eclipse.wst.xml.core.document.IDOMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.document.InvalidCharacterException;
+import org.eclipse.wst.xml.core.internal.document.SourceValidator;
+import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+class SyntaxValidator extends PrimeValidator implements ErrorState {
+
+
+ static private boolean isValidRegion(ITextRegion rgn) {
+ String type = rgn.getType();
+ if (type == null)
+ return false; // no type is invalid.
+ if (type == DOMRegionContext.XML_END_TAG_OPEN || type == DOMRegionContext.XML_TAG_NAME || type == DOMRegionContext.XML_TAG_CLOSE) {
+ return true;
+ }
+ return false;
+ }
+
+ static private String getTagName(IStructuredDocumentRegion tag) {
+ ITextRegionList regions = tag.getRegions();
+ Iterator iter = regions.iterator();
+ while (iter.hasNext()) {
+ ITextRegion rgn = (ITextRegion) iter.next();
+ if (rgn.getType() == DOMRegionContext.XML_TAG_NAME)
+ return tag.getText(rgn);
+ }
+ return "";//$NON-NLS-1$
+ }
+
+ static private boolean isEmptyContent(CMElementDeclaration decl) {
+ return (decl != null) && (decl.getContentType() == CMElementDeclaration.EMPTY);
+ }
+
+ public SyntaxValidator() {
+ super();
+ }
+
+ public boolean isAdapterForType(Object type) {
+ return ((type == SyntaxValidator.class) || super.isAdapterForType(type));
+ }
+
+ class ElementInfo {
+ public ElementInfo() {
+ super();
+ }
+
+ public IDOMElement target = null;
+ public CMElementDeclaration decl = null;
+ public IStructuredDocumentRegion startTag = null;
+ public IStructuredDocumentRegion endTag = null;
+ public boolean hasStartTag = false;
+ public boolean hasEndTag = false;
+ public boolean isXHTML = false;
+ }
+
+ public void validate(IndexedRegion indexedNode) {
+ Node node = (Node) indexedNode;
+ validateChildren(node);
+
+ if (node.getNodeType() != Node.ELEMENT_NODE)
+ return;
+ if (!(node instanceof IDOMElement))
+ return;
+
+ ElementInfo info = new ElementInfo();
+ info.target = (IDOMElement) node;
+
+ // gather information to validate from target at once.
+ getInfo(info);
+
+ if (info.target.isGlobalTag()) {
+ validateTags(info);
+ validateNames(info);
+ if (info.decl != null && info.isXHTML) {
+ validateTagCase(info);
+ }
+ }
+ }
+
+ private void getInfo(ElementInfo info) {
+ info.decl = CMUtil.getDeclaration(info.target);
+ info.startTag = info.target.getStartStructuredDocumentRegion();
+ info.endTag = info.target.getEndStructuredDocumentRegion();
+
+ info.hasStartTag = (info.startTag != null);
+ info.hasEndTag = (info.endTag != null);
+
+ Document doc = info.target.getOwnerDocument();
+ if (!(doc instanceof IDOMDocument))
+ return;
+ String typeid = ((IDOMDocument) doc).getDocumentTypeId();
+ if (typeid != null) {
+ HTMLDocumentTypeEntry entry = HTMLDocumentTypeRegistry.getInstance().getEntry(typeid);
+ info.isXHTML = (entry != null && entry.isXMLType());
+ }
+ }
+
+ class TagErrorInfoImpl extends AbstractErrorInfo {
+ private String hint = null;
+
+ public TagErrorInfoImpl(int state, IStructuredDocumentRegion tag, String hint) {
+ super(state, new Segment(tag));
+ this.hint = hint;
+ }
+
+ public String getHint() {
+ return hint;
+ }
+
+ public short getTargetType() {
+ return Node.ELEMENT_NODE;
+ }
+ }
+
+ private boolean isEndTagCorrupted(ElementInfo info) {
+ ITextRegionList regions = info.endTag.getRegions();
+ if (regions == null || regions.isEmpty())
+ return false;
+ Iterator iter = regions.iterator();
+ while (iter.hasNext()) {
+ ITextRegion rgn = (ITextRegion) iter.next();
+ if (!isValidRegion(rgn))
+ return true; // found invalid region type.
+ }
+ return false; // all regions are valid.
+ }
+
+ private String getEndTagFullText(ElementInfo info) {
+ String hint = "";//$NON-NLS-1$
+ ITextRegionList regions = info.endTag.getRegions();
+ Iterator iter = regions.iterator();
+ while (iter.hasNext()) {
+ ITextRegion rgn = (ITextRegion) iter.next();
+ String type = rgn.getType();
+ if (type == null)
+ continue;
+ if (type == DOMRegionContext.XML_END_TAG_OPEN || type == DOMRegionContext.XML_TAG_CLOSE)
+ continue;
+ hint += info.endTag.getFullText(rgn);
+ }
+ return hint;
+ }
+
+ private void reportCorruptedEndTagError(ElementInfo info) {
+ String hint = getEndTagFullText(info);
+ TagErrorInfoImpl error = new TagErrorInfoImpl(UNDEFINED_NAME_ERROR, info.endTag, hint);
+ this.reporter.report(MessageFactory.createMessage(error));
+ }
+
+ private void validateTags(ElementInfo info) {
+ if (info.hasStartTag) {
+ if (!info.target.isStartTagClosed()) {
+ // Mark the whole START tag as an error segment.
+ Segment errorSeg = new Segment(info.startTag);
+ report(UNCLOSED_TAG_ERROR, errorSeg, info.target);
+ }
+ }
+ else {
+ if (info.hasEndTag) {
+ if (info.decl != null) {
+ if (CMUtil.isHTML(info.decl) && !info.target.hasChildNodes()) {
+ if (info.target.isContainer()) {
+ // Set the error mark to the start of the element.
+ Segment errorSeg = new Segment(info.target.getStartOffset(), 0);
+ report(MISSING_START_TAG_ERROR, errorSeg, info.target);
+ }
+ else {
+ // Mark the whole END tag as an error segment.
+ Segment errorSeg = new Segment(info.endTag);
+ report(UNNECESSARY_END_TAG_ERROR, errorSeg, info.target);
+ }
+ }
+ else if (info.isXHTML) {
+ Segment errorSeg = new Segment(info.target.getStartOffset(), 0);
+ report(MISSING_START_TAG_ERROR, errorSeg, info.target);
+ }
+ }
+ }
+ }
+
+ if (info.hasEndTag) {
+ if (!info.target.isClosed()) {
+ // Set the whole END tag as error segment.
+ Segment errorSeg = new Segment(info.endTag);
+ report(UNCLOSED_END_TAG_ERROR, errorSeg, info.target);
+ }
+ }
+ else {
+ if (info.isXHTML) { // XHTML
+ if (!info.target.isEmptyTag()) {
+ if (isEmptyContent(info.decl)) {
+ // EMPTY element should be written in <.../> form.
+ Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_START_TAG);
+ report(INVALID_EMPTY_ELEMENT_TAG, errorSeg, info.target);
+ }
+ else {
+ // end tag is required.
+ Segment errorSeg = new Segment(info.target.getEndOffset(), 0);
+ report(MISSING_END_TAG_ERROR, errorSeg, info.target);
+ }
+ }
+ }
+ else { // HTML
+ if (info.hasStartTag) {
+ if (info.decl != null && CMUtil.isHTML(info.decl) && !info.target.isEmptyTag() && !CMUtil.isEndTagOmissible(info.decl)) {
+ // Set the error mark to the end of the element.
+ Segment errorSeg = new Segment(info.target.getEndOffset(), 0);
+ report(MISSING_END_TAG_ERROR, errorSeg, info.target);
+ }
+ }
+ }
+ }
+ }
+
+ /* perform validation about tag name definition. */
+ private void validateNames(ElementInfo info) {
+ boolean corrupted = info.hasEndTag && isEndTagCorrupted(info);
+ if (info.decl == null) {
+ // If no declaration is retrieved, the target is really
+ // unknown element.
+ if (!info.hasStartTag && corrupted) {
+ reportCorruptedEndTagError(info);
+ }
+ else {
+ Segment errorSeg = FMUtil.getSegment(info.target, FMUtil.SEG_START_TAG);
+ report(UNDEFINED_NAME_ERROR, errorSeg, info.target);
+ }
+ }
+ else {
+ // Even if a declaration could be retrieved, if the end
+ // tag is corrupted, it should be reported as undefined
+ // name. (D202493)
+ if (corrupted) {
+ reportCorruptedEndTagError(info);
+ }
+ }
+ }
+
+ /* perform validation tag case only for XHTML document */
+ private void validateTagCase(ElementInfo info) {
+ String declared = info.decl.getElementName();
+ String startTagName = "";//$NON-NLS-1$
+ String endTagName = "";//$NON-NLS-1$
+ if (declared == null)
+ return;
+
+ // start tag
+ if (info.hasStartTag) {
+ startTagName = getTagName(info.startTag);
+ if (!declared.equals(startTagName)) {
+ TagErrorInfoImpl error = new TagErrorInfoImpl(MISMATCHED_ERROR, info.startTag, startTagName);
+ this.reporter.report(MessageFactory.createMessage(error));
+ }
+ }
+ // end tag
+ if (info.hasEndTag) {
+ endTagName = getTagName(info.endTag);
+ if (!info.hasStartTag || (!endTagName.equals(startTagName))) {
+ if (!declared.equals(endTagName)) {
+ TagErrorInfoImpl error = new TagErrorInfoImpl(MISMATCHED_ERROR, info.endTag, endTagName);
+ this.reporter.report(MessageFactory.createMessage(error));
+ }
+ }
+ }
+ }
+
+ private void validateChildren(Node target) {
+ if ((target.getNodeType() == Node.ELEMENT_NODE) && CMUtil.isForeign((Element) target))
+ return;
+
+ for (Node child = target.getFirstChild(); child != null; child = child.getNextSibling()) {
+ switch (child.getNodeType()) {
+ case Node.TEXT_NODE :
+ {
+ IDOMNode text = (IDOMNode) child;
+ int charOffset = validateTextSource(text);
+ if (charOffset >= 0) {
+ charOffset += text.getStartOffset();
+ Segment errorSeg = new Segment(charOffset, 1);
+ if (errorSeg != null)
+ report(INVALID_CHAR_ERROR, errorSeg, text);
+ }
+ break;
+ }
+ case Node.COMMENT_NODE :
+ case Node.DOCUMENT_TYPE_NODE :
+ case Node.PROCESSING_INSTRUCTION_NODE :
+ case Node.CDATA_SECTION_NODE :
+ {
+ IDOMNode tag = (IDOMNode) child;
+ if (!tag.isClosed()) {
+ Segment errorSeg = FMUtil.getSegment(tag, FMUtil.SEG_WHOLE_TAG);
+ if (errorSeg != null)
+ report(UNCLOSED_TAG_ERROR, errorSeg, tag);
+ }
+ break;
+ }
+ default :
+ break;
+ }
+ }
+ }
+
+ private int validateTextSource(IDOMNode text) {
+ try {
+ SourceValidator validator = new SourceValidator(text);
+ validator.validateSource(text.getSource());
+ }
+ catch (InvalidCharacterException ex) {
+ return ex.getOffset();
+ }
+ return -1;
+ }
+
+ private void report(int state, Segment errorSeg, Node node) {
+ ErrorInfo info = new ErrorInfoImpl(state, errorSeg, node);
+ reporter.report(MessageFactory.createMessage(info));
+ }
+} \ No newline at end of file

Back to the top