/*
	$Workfile: CDXConstants.h $
	$Revision: 1.1.1.1 $
	$Date: 2004/01/24 17:15:47 $
	Copyright:	 1986-2001 CambridgeSoft Corp., all rights reserved.
	
	Description:	Constants defined by the CDX file format Specification
*/

#ifndef _H_CDXConstants
#define _H_CDXConstants

#include "CDXBasicTypes.h"

// An ANSI replacement for four-byte character constants.
#ifdef _X86_
// littleEndian
#define QUADCONST(a, b, c, d)                                                  \
    (((long)((d)&0xff) << 24) | ((long)((c)&0xff) << 16) |                     \
     ((long)((b)&0xff) << 8) | ((long)((a)&0xff)))

#else // _X86_
#define QUADCONST(a, b, c, d)                                                  \
    (((long)((a)&0xff) << 24) | ((long)((b)&0xff) << 16) |                     \
     ((long)((c)&0xff) << 8) | ((long)((d)&0xff)))

#endif // _X86_

typedef UINT16 CDXTag;
typedef INT32 CDXObjectID; // signed for now, due to mac compiler bug?

#define kCDX_HeaderString "VjCD0100"
#define kCDX_Signature QUADCONST('V', 'j', 'C', 'D')
#define kCDX_HeaderLength 28

#define kCDXML_HeaderString                                                    \
    "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"                            \
    "<!DOCTYPE CDXML SYSTEM \"http://www.camsoft.com/xml/cdxml.dtd\" >\n"

const UINT16 kCDXTag_Object = 0x8000;
const UINT16 kCDXTag_UserDefined = 0x4000;

enum CDXDatumID {
    // General properties.
    kCDXProp_EndObject,        // 0x0000 Marks end of object.
    kCDXProp_CreationUserName, // 0x0001 The name of the creator (program user's
                               // name) of the document. (CDXString)
    kCDXProp_CreationDate,     // 0x0002 The time of object creation. (CDXDate)
    kCDXProp_CreationProgram,  // 0x0003 The name of the program, including
                               // version and platform, that created the
                               // associated CDX object. ChemDraw 4.0 uses
                               // ChemDraw 4.0 as the value of CreationProgram.
                               // (CDXString)
    kCDXProp_ModificationUserName, // 0x0004 The name of the last modifier
                                   // (program user's name) of the document.
                                   // (CDXString)
    kCDXProp_ModificationDate,     // 0x0005 Time of the last modification.
                                   // (CDXDate)
    kCDXProp_ModificationProgram,  // 0x0006 The name of the program, including
                                   // version and platform, of the last program
                                   // to perform a modification. ChemDraw 4.0
                                   // uses ChemDraw 4.0 as the value of
                                   // CreationProgram. (CDXString)
    kCDXProp_Unused1,              // 0x0007 Table of contents. (obsolete)
    kCDXProp_Name,                 // 0x0008 Name of an object. (CDXString)
    kCDXProp_Comment, // 0x0009 An arbitrary string intended to be meaningful to
                      // a user. (CDXString)
    kCDXProp_ZOrder,  // 0x000A Back-to-front ordering index in 2D drawing.
                      // (INT16)
    kCDXProp_RegistryNumber,    // 0x000B A registry or catalog number of a
                                // molecule object. (CDXString)
    kCDXProp_RegistryAuthority, // 0x000C A string that specifies the authority
                                // which issued a registry or catalog number.
                                // Some examples of registry authorities are
                                // CAS, Beilstein, Aldrich, and Merck.
                                // (CDXString)
    kCDXProp_Unused2, // 0x000D Indicates that this object (the reference
                      // object) is an alias to an object elsewhere in the
                      // document (the target object). The attributes and
                      // contained objects should be taken from the target
                      // object. (obsolete)
    kCDXProp_RepresentsProperty, // 0x000E Indicates that this object represents
                                 // some property in some other object.
                                 // (CDXRepresentsProperty)
    kCDXProp_IgnoreWarnings,     // 0x000F Signifies whether chemical warnings
                                 // should be suppressed on this object.
                                 // (CDXBooleanImplied)
    kCDXProp_ChemicalWarning, // 0x0010 A warning concerning possible chemical
                              // problems with this object. (CDXString)
    kCDXProp_Visible, // 0x0011 The object is visible if non-zero. (CDXBoolean)

    // Fonts.
    kCDXProp_FontTable =
        0x0100, // 0x0100 A list of fonts used in the document. (CDXFontTable)

    // Coordinates.
    kCDXProp_2DPosition =
        0x0200,          // 0x0200 The 2D location (in the order of vertical and
                         // horizontal locations) of an object. (CDXPoint2D)
    kCDXProp_3DPosition, // 0x0201 The 3D location (in the order of X-, Y-, and
                         // Z-locations in right-handed coordinate system) of an
                         // object in CDX coordinate units. The precise meaning
                         // of this attribute varies depending on the type of
                         // object. (CDXPoint3D)
    kCDXProp_2DExtent,   // 0x0202 The width and height of an object in CDX
                         // coordinate units. The precise meaning of this
                         // attribute varies depending on the type of object.
                         // (CDXPoint2D)
    kCDXProp_3DExtent,   // 0x0203 The width, height, and depth of an object in
                       // CDX coordinate units (right-handed coordinate system).
                       // The precise meaning of this attribute varies depending
                       // on the type of object. (CDXPoint3D)
    kCDXProp_BoundingBox,   // 0x0204 The smallest rectangle that encloses the
                            // graphical representation of the object.
                            // (CDXRectangle)
    kCDXProp_RotationAngle, // 0x0205 The angular orientation of an object in
                            // degrees * 65536. (INT32)

    // Colors.
    kCDXProp_ColorTable = 0x0300, // 0x0300 The color palette used throughout
                                  // the document. (CDXColorTable)
    kCDXProp_ForegroundColor,     // 0x0301 The foreground color of an object
                                  // represented as the two-based index into the
                                  // object's color table. (UINT16)
    kCDXProp_BackgroundColor,     // 0x0302 The background color of an object
                                  // represented as the two-based index into the
                                  // object's color table. (INT16)

    // Atom properties.
    kCDXProp_Node_Type = 0x0400, // 0x0400 The type of a node object. (INT16)
    kCDXProp_Node_LabelDisplay,  // 0x0401 The characteristics of node label
                                 // display. (INT8)
    kCDXProp_Node_Element, // 0x0402 The atomic number of the atom representing
                           // this node. (INT16)
    kCDXProp_Atom_ElementList, // 0x0403 A list of atomic numbers.
                               // (CDXElementList)
    kCDXProp_Atom_Formula, // 0x0404 The composition of a node representing a
                           // fragment whose composition is known, but whose
                           // connectivity is not. For example,
                           // C<sub>4</sub>H<sub>9</sub> represents a mixture of
                           // the 4 butyl isomers. (CDXFormula)
    kCDXProp_Atom_Isotope =
        0x0420,           // 0x0420 The absolute isotopic mass of an atom (2 for
                          // deuterium, 14 for carbon-14). (INT16)
    kCDXProp_Atom_Charge, // 0x0421 The atomic charge of an atom. (INT8)
    kCDXProp_Atom_Radical, // 0x0422 The atomic radical attribute of an atom.
                           // (UINT8)
    kCDXProp_Atom_RestrictFreeSites, // 0x0423 Indicates that up to the
                                     // specified number of additional
                                     // substituents are permitted on this atom.
                                     // (UINT8)
    kCDXProp_Atom_RestrictImplicitHydrogens, // 0x0424 Signifies that implicit
                                             // hydrogens are not allowed on
                                             // this atom. (CDXBooleanImplied)
    kCDXProp_Atom_RestrictRingBondCount,     // 0x0425 The number of ring bonds
                                             // attached to an atom. (INT8)
    kCDXProp_Atom_RestrictUnsaturatedBonds,  // 0x0426 Indicates whether
                                            // unsaturation should be present or
                                            // absent. (INT8)
    kCDXProp_Atom_RestrictRxnChange, // 0x0427 If present, signifies that the
                                     // reaction change of an atom must be as
                                     // specified. (CDXBooleanImplied)
    kCDXProp_Atom_RestrictRxnStereo, // 0x0428 The change of stereochemistry of
                                     // an atom during a reaction. (INT8)
    kCDXProp_Atom_AbnormalValence, // 0x0429 Signifies that an abnormal valence
                                   // for an atom is permitted.
                                   // (CDXBooleanImplied)
    kCDXProp_Unused3,              // 0x042A
    kCDXProp_Atom_NumHydrogens, // 0x042B The number of (explicit) hydrogens in
                                // a labeled atom consisting of one heavy atom
                                // and (optionally) the symbol H (e.g.,
                                // CH<sub>3</sub>). (UINT16)
    kCDXProp_Unused4,           // 0x042C
    kCDXProp_Unused5,           // 0x042D
    kCDXProp_Atom_HDot, // 0x042E Signifies the presence of an implicit hydrogen
                        // with stereochemistry specified equivalent to an
                        // explicit H atom with a wedged bond.
                        // (CDXBooleanImplied)
    kCDXProp_Atom_HDash, // 0x042F Signifies the presence of an implicit
                         // hydrogen with stereochemistry specified equivalent
                         // to an explicit H atom with a hashed bond.
                         // (CDXBooleanImplied)
    kCDXProp_Atom_Geometry, // 0x0430 The geometry of the bonds about this atom.
                            // (INT8)
    kCDXProp_Atom_BondOrdering, // 0x0431 An ordering of the bonds to this node,
                                // used for stereocenters, fragments, and named
                                // alternative groups with more than one
                                // attachment. (CDXObjectIDArray)
    kCDXProp_Node_Attachments,  // 0x0432 For multicenter attachment nodes or
                                // variable attachment nodes, a list of IDs of
                                // the nodes which are multiply or variably
                                // attached to this node.
                                // (CDXObjectIDArrayWithCounts)
    kCDXProp_Atom_GenericNickname, // 0x0433 The name of the generic nickname.
                                   // (CDXString)
    kCDXProp_Atom_AltGroupID, // 0x0434 The ID of the alternative group object
                              // that describes this node. (CDXObjectID)
    kCDXProp_Atom_RestrictSubstituentsUpTo, // 0x0435 Indicates that
                                            // substitution is restricted to no
                                            // more than the specified value.
                                            // (UINT8)
    kCDXProp_Atom_RestrictSubstituentsExactly, // 0x0436 Indicates that exactly
                                               // the specified number of
                                               // substituents must be present.
                                               // (UINT8)
    kCDXProp_Atom_CIPStereochemistry,          // 0x0437 The node's absolute
                                      // stereochemistry according to the
                                      // Cahn-Ingold-Prelog system. (INT8)
    kCDXProp_Atom_Translation, // 0x0438 Provides for restrictions on whether a
                               // given node may match other more- or
                               // less-general nodes. (INT8)
    kCDXProp_Atom_AtomNumber,  // 0x0439 Atom number, as text. (CDXString)
    kCDXProp_Atom_ShowQuery,   // 0x043A Show the query indicator if non-zero.
                               // (CDXBoolean)
    kCDXProp_Atom_ShowStereo,  // 0x043B Show the stereochemistry indicator if
                               // non-zero. (CDXBoolean)
    kCDXProp_Atom_ShowAtomNumber, // 0x043C Show the atom number if non-zero.
                                  // (CDXBoolean)
    kCDXProp_Atom_LinkCountLow,   // 0x043D Low end of repeat count for link
                                  // nodes. (INT16)
    kCDXProp_Atom_LinkCountHigh,  // 0x043E High end of repeat count for link
                                  // nodes. (INT16)

    // Molecule properties.
    kCDXProp_Mole_Racemic = 0x0500, // 0x0500 Indicates that the molecule is a
                                    // racemic mixture. (CDXBoolean)
    kCDXProp_Mole_Absolute, // 0x0501 Indicates that the molecule has known
                            // absolute configuration. (CDXBoolean)
    kCDXProp_Mole_Relative, // 0x0502 Indicates that the molecule has known
                            // relative stereochemistry, but unknown absolute
                            // configuration. (CDXBoolean)
    kCDXProp_Mole_Formula,  // 0x0503 The molecular formula representation of a
                            // molecule object. (CDXFormula)
    kCDXProp_Mole_Weight,   // 0x0504 The average molecular weight of a molecule
                            // object. (FLOAT64)
    kCDXProp_Frag_ConnectionOrder, // 0x0505 An ordered list of attachment
                                   // points within a fragment.
                                   // (CDXObjectIDArray)

    // Bond properties.
    kCDXProp_Bond_Order = 0x0600, // 0x0600 The order of a bond object. (INT16)
    kCDXProp_Bond_Display,  // 0x0601 The display type of a bond object. (INT16)
    kCDXProp_Bond_Display2, // 0x0602 The display type for the second line of a
                            // double bond. (INT16)
    kCDXProp_Bond_DoublePosition, // 0x0603 The position of the second line of a
                                  // double bond. (INT16)
    kCDXProp_Bond_Begin, // 0x0604 The ID of the CDX node object at the first
                         // end of a bond. (CDXObjectID)
    kCDXProp_Bond_End, // 0x0605 The ID of the CDX node object at the second end
                       // of a bond. (CDXObjectID)
    kCDXProp_Bond_RestrictTopology, // 0x0606 Indicates the desired topology of
                                    // a bond in a query. (INT8)
    kCDXProp_Bond_RestrictRxnParticipation, // 0x0607 Specifies that a bond is
                                            // affected by a reaction. (INT8)
    kCDXProp_Bond_BeginAttach, // 0x0608 Indicates where within the Bond_Begin
                               // node a bond is attached. (UINT8)
    kCDXProp_Bond_EndAttach, // 0x0609 Indicates where within the Bond_End node
                             // a bond is attached. (UINT8)
    kCDXProp_Bond_CIPStereochemistry, // 0x060A The bond's absolute
                                      // stereochemistry according to the
                                      // Cahn-Ingold-Prelog system. (INT8)
    kCDXProp_Bond_BondOrdering, // 0x060B Ordered list of attached bond IDs.
                                // (CDXObjectIDArray)
    kCDXProp_Bond_ShowQuery,    // 0x060C Show the query indicator if non-zero.
                                // (CDXBoolean)
    kCDXProp_Bond_ShowStereo,   // 0x060D Show the stereochemistry indicator if
                                // non-zero. (CDXBoolean)

    // Text properties.
    kCDXProp_Text = 0x0700, // 0x0700 The text of a text object. (CDXString)
    kCDXProp_Justification, // 0x0701 The horizontal justification of a text
                            // object. (INT8)
    kCDXProp_LineHeight,    // 0x0702 The line height of a text object. (UINT16)
    kCDXProp_WordWrapWidth, // 0x0703 The word-wrap width of a text object.
                            // (INT16)
    kCDXProp_LineStarts, // 0x0704 The number of lines of a text object followed
                         // by that many values indicating the zero-based text
                         // position of each line start. (INT16ListWithCounts)
    kCDXProp_LabelAlignment, // 0x0705 The alignment of the text with respect to
                             // the node position. (INT8)
    kCDXProp_LabelLineHeight, // 0x0706 Text line height for atom labels (INT16)
    kCDXProp_CaptionLineHeight, // 0x0707 Text line height for non-atomlabel
                                // text objects (INT16)

    // Document properties.
    kCDXProp_MacPrintInfo =
        0x0800, // 0x0800 The 120 byte Macintosh TPrint data associated with the
                // CDX document object. Refer to Macintosh Toolbox manual for
                // detailed description. (Unformatted)
    kCDXProp_WinPrintInfo, // 0x0801 The Windows DEVMODE structure associated
                           // with the CDX document object. (Unformatted)
    kCDXProp_PrintMargins, // 0x0802 The outer margins of the Document.
                           // (CDXRectangle)
    kCDXProp_ChainAngle,  // 0x0803 The default chain angle setting in degrees *
                          // 65536. (INT32)
    kCDXProp_BondSpacing, // 0x0804 The spacing between segments of a multiple
                          // bond, measured relative to bond length. (INT16)
    kCDXProp_BondLength,  // 0x0805 The default bond length. (CDXCoordinate)
    kCDXProp_BoldWidth,   // 0x0806 The default bold bond width. (CDXCoordinate)
    kCDXProp_LineWidth,   // 0x0807 The default line width. (CDXCoordinate)
    kCDXProp_MarginWidth, // 0x0808 The default amount of space surrounding atom
                          // labels. (CDXCoordinate)
    kCDXProp_HashSpacing, // 0x0809 The default spacing between hashed lines
                          // used in wedged hashed bonds. (CDXCoordinate)
    kCDXProp_LabelStyle,  // 0x080A The default style for atom labels..
                          // (CDXFontStyle)
    kCDXProp_CaptionStyle, // 0x080B The default style for non-atomlabel text
                           // objects.. (CDXFontStyle)
    kCDXProp_CaptionJustification, // 0x080C The horizontal justification of a
                                   // caption (non-atomlabel text object) (INT8)
    kCDXProp_FractionalWidths,     // 0x080D Signifies whether to use fractional
                                   // width information when drawing text.
                                   // (CDXBooleanImplied)
    kCDXProp_Magnification, // 0x080E The view magnification factor (INT16)
    kCDXProp_WidthPages,  // 0x080F The width of the document in pages. (INT16)
    kCDXProp_HeightPages, // 0x0810 The height of the document in pages. (INT16)
    kCDXProp_DrawingSpaceType, // 0x0811 The type of drawing space used for this
                               // document. (INT8)
    kCDXProp_DrawingSpaceWidth,  // 0x0812 The width of the document.
                                 // (CDXCoordinate)
    kCDXProp_DrawingSpaceHeight, // 0x0813 The height of the document.
                                 // (CDXCoordinate)
    kCDXProp_PageOverlap, // 0x0814 The amount of overlap of pages when a poster
                          // is tiled. (CDXCoordinate)
    kCDXProp_Header,      // 0x0815 The text of the header. (CDXString)
    kCDXProp_HeaderPosition, // 0x0816 The vertical offset of the header
                             // baseline from the top of the page.
                             // (CDXCoordinate)
    kCDXProp_Footer,         // 0x0817 The text of the footer. (CDXString)
    kCDXProp_FooterPosition, // 0x0818 The vertical offset of the footer
                             // baseline from the bottom of the page.
                             // (CDXCoordinate)
    kCDXProp_PrintTrimMarks, // 0x0819 If present, trim marks are to printed in
                             // the margins. (CDXBooleanImplied)
    kCDXProp_LabelStyleFont, // 0x081A The default font family for atom labels.
                             // (INT16)
    kCDXProp_CaptionStyleFont, // 0x081B The default font style for captions
                               // (non-atom-label text objects). (INT16)
    kCDXProp_LabelStyleSize,   // 0x081C The default font size for atom labels.
                               // (INT16)
    kCDXProp_CaptionStyleSize, // 0x081D The default font size for captions
                               // (non-atom-label text objects). (INT16)
    kCDXProp_LabelStyleFace,   // 0x081E The default font style for atom labels.
                               // (INT16)
    kCDXProp_CaptionStyleFace, // 0x081F The default font face for captions
                               // (non-atom-label text objects). (INT16)
    kCDXProp_LabelStyleColor,  // 0x0820 The default color for atom labels
                               // (INT16)
    kCDXProp_CaptionStyleColor, // 0x0821 The default color for captions
                                // (non-atom-label text objects). (INT16)
    kCDXProp_BondSpacingAbs, // 0x0822 The absolute distance between segments of
                             // a multiple bond. (CDXCoordinate)
    kCDXProp_LabelJustification, // 0x0823 The default justification for atom
                                 // labels. (INT8)

    // Window properties.
    kCDXProp_Window_IsZoomed =
        0x0900, // 0x0900 Signifies whether the main viewing window is zoomed
                // (maximized). (CDXBooleanImplied)
    kCDXProp_Window_Position, // 0x0901 The top-left position of the main
                              // viewing window. (CDXPoint2D)
    kCDXProp_Window_Size,     // 0x0902 Height and width of the document window.
                              // (CDXPoint2D)

    // Graphic object properties.
    kCDXProp_Graphic_Type =
        0x0A00,          // 0x0A00 The type of graphical object. (INT16)
    kCDXProp_Line_Type,  // 0x0A01 The type of a line object. (INT16)
    kCDXProp_Arrow_Type, // 0x0A02 The type of arrow object, which represents
                         // line, arrow, arc, rectangle, or orbital. (INT16)
    kCDXProp_Rectangle_Type, // 0x0A03 The type of a rectangle object. (INT16)
    kCDXProp_Oval_Type, // 0x0A04 The type of an arrow object that represents a
                        // circle or ellipse. (INT16)
    kCDXProp_Orbital_Type, // 0x0A05 The type of orbital object. (INT16)
    kCDXProp_Bracket_Type, // 0x0A06 The type of symbol object. (INT16)
    kCDXProp_Symbol_Type,  // 0x0A07 The type of symbol object. (INT16)
    kCDXProp_Curve_Type,   // 0x0A08 The type of curve object. (INT16)
    kCDXProp_Arrow_HeadSize =
        0x0A20,               // 0x0A20 The size of the arrow's head. (INT16)
    kCDXProp_Arc_AngularSize, // 0x0A21 The size of an arc (in degrees * 10, so
                              // 90 degrees = 900). (INT16)
    kCDXProp_Bracket_LipSize, // 0x0A22 The size of a bracket. (INT16)
    kCDXProp_Curve_Points,    // 0x0A23 The B&eacute;zier curve's control point
                              // locations. (CDXCurvePoints)

    // Embedded pictures.
    kCDXProp_Picture_Edition =
        0x0A60, // 0x0A60 The section information (SectionHandle) of the
                // Macintosh Publish & Subscribe edition embedded in the CDX
                // picture object. (Unformatted)
    kCDXProp_Picture_EditionAlias, // 0x0A61 The alias information of the
                                   // Macintosh Publish & Subscribe edition
                                   // embedded in the CDX picture object.
                                   // (Unformatted)
    kCDXProp_MacPICT, // 0x0A62 A Macintosh PICT data object. (Unformatted)
    kCDXProp_WindowsMetafile, // 0x0A63 A Microsoft Windows Metafile object.
                              // (Unformatted)
    kCDXProp_OLEObject,       // 0x0A64 An OLE object. (Unformatted)

    // Spectrum properties
    kCDXProp_Spectrum_XSpacing =
        0x0A80, // 0x0A80 The spacing in logical units (ppm, Hz, wavenumbers)
                // between points along the X-axis of an evenly-spaced grid.
                // (FLOAT64)
    kCDXProp_Spectrum_XLow,  // 0x0A81 The first data point for the X-axis of an
                             // evenly-spaced grid. (FLOAT64)
    kCDXProp_Spectrum_XType, // 0x0A82 The type of units the X-axis represents.
                             // (INT16)
    kCDXProp_Spectrum_YType, // 0x0A83 The type of units the Y-axis represents.
                             // (INT16)
    kCDXProp_Spectrum_XAxisLabel, // 0x0A84 A label for the X-axis. (CDXString)
    kCDXProp_Spectrum_YAxisLabel, // 0x0A85 A label for the Y-axis. (CDXString)
    kCDXProp_Spectrum_DataPoint,  // 0x0A86 The Y-axis values for the spectrum.
                                  // It is an array of double values
                                  // corresponding to X-axis values. (FLOAT64)
    kCDXProp_Spectrum_Class, // 0x0A87 The type of spectrum represented. (INT16)
    kCDXProp_Spectrum_YLow,  // 0x0A88 Y value to be used to offset data when
                             // storing XML. (FLOAT64)
    kCDXProp_Spectrum_YScale, // 0x0A89 Y scaling used to scale data when
                              // storing XML. (FLOAT64)

    // Alternate Group properties
    kCDXProp_NamedAlternativeGroup_TextFrame =
        0x0B00, // 0x0B00 The bounding box of upper portion of the Named
                // Alternative Group, containing the name of the group.
                // (CDXRectangle)
    kCDXProp_NamedAlternativeGroup_GroupFrame, // 0x0B01 The bounding box of the
                                               // lower portion of the Named
                                               // Alternative Group, containing
                                               // the definition of the group.
                                               // (CDXRectangle)
    kCDXProp_NamedAlternativeGroup_Valence, // 0x0B02 The number of attachment
                                            // points in each alternative in a
                                            // named alternative group. (INT16)

    // Reaction properties
    kCDXProp_ReactionStep_Atom_Map =
        0x0C00, // 0x0C00 Represents pairs of mapped atom IDs; each pair is a
                // reactant atom mapped to to a product atom. (CDXObjectIDArray)
    kCDXProp_ReactionStep_Reactants, // 0x0C01 An order list of reactants
                                     // present in the Reaction Step.
                                     // (CDXObjectIDArray)
    kCDXProp_ReactionStep_Products,  // 0x0C02 An order list of products present
                                     // in the Reaction Step. (CDXObjectIDArray)
    kCDXProp_ReactionStep_Plusses,   // 0x0C03 An ordered list of pluses used to
                                   // separate components of the Reaction Step.
                                   // (CDXObjectIDArray)
    kCDXProp_ReactionStep_Arrows, // 0x0C04 An ordered list of arrows used to
                                  // separate components of the Reaction Step.
                                  // (CDXObjectIDArray)

    // CDObjectTag properties
    kCDXProp_ObjectTag_Type = 0x0D00, // 0x0D00 The tag's data type. (INT16)
    kCDXProp_Unused6,                 // 0x0D01 obsolete (obsolete)
    kCDXProp_Unused7,                 // 0x0D02 obsolete (obsolete)
    kCDXProp_ObjectTag_Tracking, // 0x0D03 The tag will participate in tracking
                                 // if non-zero. (CDXBoolean)
    kCDXProp_ObjectTag_Persistent, // 0x0D04 The tag will be resaved to a CDX
                                   // file if non-zero. (CDXBoolean)
    kCDXProp_ObjectTag_Value,      // 0x0D05 The value is a INT32, FLOAT64 or
                              // unformatted string depending on the value of
                              // ObjectTag_Type. (varies)
    kCDXProp_Positioning, // 0x0D06 How the indicator should be positioned with
                          // respect to its containing object. (INT8)
    kCDXProp_PositioningAngle,  // 0x0D07 Angular positioning, in radians *
                                // 65536. (INT32)
    kCDXProp_PositioningOffset, // 0x0D08 Offset positioning. (CDXPoint2D)

    // CDSequence properties
    kCDXProp_Sequence_Identifier =
        0x0E00, // 0x0E00 A unique (but otherwise random) identifier for a given
                // Sequence object. (CDXString)

    // CDCrossReference properties
    kCDXProp_CrossReference_Container =
        0x0F00, // 0x0F00 An external object containing (as an embedded object)
                // the document containing the Sequence object being referenced.
                // (CDXString)
    kCDXProp_CrossReference_Document, // 0x0F01 An external document containing
                                      // the Sequence object being referenced.
                                      // (CDXString)
    kCDXProp_CrossReference_Identifier, // 0x0F02 A unique (but otherwise
                                        // random) identifier for a given
                                        // Cross-Reference object. (CDXString)
    kCDXProp_CrossReference_Sequence,   // 0x0F03 A value matching the
                                        // SequenceIdentifier of the Sequence
                                        // object to be referenced. (CDXString)

    // Miscellaneous properties.
    kCDXProp_Template_PaneHeight =
        0x1000, // 0x1000 The height of the viewing window of a template grid.
                // (CDXCoordinate)
    kCDXProp_Template_NumRows,    // 0x1001 The number of rows of the CDX
                                  // TemplateGrid object. (INT16)
    kCDXProp_Template_NumColumns, // 0x1002 The number of columns of the CDX
                                  // TemplateGrid object. (INT16)

    kCDXProp_SplitterPositions =
        0x1ff0, // 0x1FF0 An array of vertical positions that subdivide a page
                // into regions. (CDXObjectIDArray)

    // User defined properties
    // First 1024 tags are reserved for temporary tags used only during the
    // runtime.
    kCDXUser_TemporaryBegin = kCDXTag_UserDefined,
    kCDXUser_TemporaryEnd = kCDXTag_UserDefined + 0x0400,

    // Objects.
    kCDXObj_Document = kCDXTag_Object, // 0x8000
    kCDXObj_Page,                      // 0x8001
    kCDXObj_Group,                     // 0x8002
    kCDXObj_Fragment,                  // 0x8003
    kCDXObj_Node,                      // 0x8004
    kCDXObj_Bond,                      // 0x8005
    kCDXObj_Text,                      // 0x8006
    kCDXObj_Graphic,                   // 0x8007
    kCDXObj_Curve,                     // 0x8008
    kCDXObj_EmbeddedObject,            // 0x8009
    kCDXObj_NamedAlternativeGroup,     // 0x800a
    kCDXObj_TemplateGrid,              // 0x800b
    kCDXObj_RegistryNumber,            // 0x800c
    kCDXObj_ReactionScheme,            // 0x800d
    kCDXObj_ReactionStep,              // 0x800e
    kCDXObj_ObjectDefinition,          // 0x800f
    kCDXObj_Spectrum,                  // 0x8010
    kCDXObj_ObjectTag,                 // 0x8011
    kCDXObj_OleClientItem,             // 0x8012	// obsolete
    kCDXObj_Sequence,                  // 0x8013
    kCDXObj_CrossReference             // 0x8014
};

enum CDXNodeType {
    kCDXNodeType_Unspecified,
    kCDXNodeType_Element,
    kCDXNodeType_ElementList,
    kCDXNodeType_ElementListNickname,
    kCDXNodeType_Nickname,
    kCDXNodeType_Fragment,
    kCDXNodeType_Formula,
    kCDXNodeType_GenericNickname,
    kCDXNodeType_AnonymousAlternativeGroup,
    kCDXNodeType_NamedAlternativeGroup,
    kCDXNodeType_MultiAttachment,
    kCDXNodeType_VariableAttachment,
    kCDXNodeType_ExternalConnectionPoint,
    kCDXNodeType_LinkNode
};

enum CDXLabelDisplay {
    kCDXLabelDisplay_Auto,
    kCDXLabelDisplay_Left,
    kCDXLabelDisplay_Center,
    kCDXLabelDisplay_Right,
    kCDXLabelDisplay_Above,
    kCDXLabelDisplay_Below,
    kCDXLabelDisplay_BestInitial
};

enum CDXRadical { // Same as MDL codes
    kCDXRadical_None = 0,
    kCDXRadical_Singlet = 1, // diradical singlet  (two dots)
    kCDXRadical_Doublet = 2, // monoradical		  (one dot)
    kCDXRadical_Triplet = 3  // diradical triplet  (two dots)
};

enum CDXIsotope { kCDXIsotope_Natural = 0 };

enum CDXRingBondCount {
    kCDXRingBondCount_Unspecified = -1,
    kCDXRingBondCount_NoRingBonds = 0,
    kCDXRingBondCount_AsDrawn = 1,
    kCDXRingBondCount_SimpleRing = 2,
    kCDXRingBondCount_Fusion = 3,
    kCDXRingBondCount_SpiroOrHigher = 4
};

enum CDXUnsaturation {
    kCDXUnsaturation_Unspecified = 0,
    kCDXUnsaturation_MustBeAbsent = 1,
    kCDXUnsaturation_MustBePresent = 2,
    kCDXUnsaturationLastEnum
};

enum CDXReactionStereo {
    kCDXReactionStereo_Unspecified = 0,
    kCDXReactionStereo_Inversion = 1,
    kCDXReactionStereo_Retention = 2
};

enum CDXTranslation {
    kCDXTranslation_Equal = 0,
    kCDXTranslation_Broad = 1,
    kCDXTranslation_Narrow = 2,
    kCDXTranslation_Any = 3
};

enum CDXAtomGeometry {
    kCDXAtomGeometry_Unknown = 0,
    kCDXAtomGeometry_1Ligand = 1,
    kCDXAtomGeometry_Linear = 2,
    kCDXAtomGeometry_Bent = 3,
    kCDXAtomGeometry_TrigonalPlanar = 4,
    kCDXAtomGeometry_TrigonalPyramidal = 5,
    kCDXAtomGeometry_SquarePlanar = 6,
    kCDXAtomGeometry_Tetrahedral = 7,
    kCDXAtomGeometry_TrigonalBipyramidal = 8,
    kCDXAtomGeometry_SquarePyramidal = 9,
    kCDXAtomGeometry_5Ligand = 10,
    kCDXAtomGeometry_Octahedral = 11,
    kCDXAtomGeometry_6Ligand = 12,
    kCDXAtomGeometry_7Ligand = 13,
    kCDXAtomGeometry_8Ligand = 14,
    kCDXAtomGeometry_9Ligand = 15,
    kCDXAtomGeometry_10Ligand = 16
};

enum CDXBondOrder {
    kCDXBondOrder_Single = 0x0001,
    kCDXBondOrder_Double = 0x0002,
    kCDXBondOrder_Triple = 0x0004,
    kCDXBondOrder_Quadruple = 0x0008,
    kCDXBondOrder_Quintuple = 0x0010,
    kCDXBondOrder_Sextuple = 0x0020,
    kCDXBondOrder_Half = 0x0040,
    kCDXBondOrder_OneHalf = 0x0080,
    kCDXBondOrder_TwoHalf = 0x0100,
    kCDXBondOrder_ThreeHalf = 0x0200,
    kCDXBondOrder_FourHalf = 0x0400,
    kCDXBondOrder_FiveHalf = 0x0800,
    kCDXBondOrder_Dative = 0x1000,
    kCDXBondOrder_Ionic = 0x2000,
    kCDXBondOrder_Hydrogen = 0x4000,
    kCDXBondOrder_ThreeCenter = 0x8000,
    kCDXBondOrder_SingleOrDouble = kCDXBondOrder_Single | kCDXBondOrder_Double,
    kCDXBondOrder_SingleOrAromatic =
        kCDXBondOrder_Single | kCDXBondOrder_OneHalf,
    kCDXBondOrder_DoubleOrAromatic =
        kCDXBondOrder_Double | kCDXBondOrder_OneHalf,
    kCDXBondOrder_Any = -1
};
// Permit combination of CDXBondOrder values
inline CDXBondOrder &operator|=(CDXBondOrder &lhs, const CDXBondOrder &rhs) {
    return lhs = CDXBondOrder(UINT32(lhs) | UINT32(rhs));
}

enum CDXBondDisplay {
    kCDXBondDisplay_Solid = 0,
    kCDXBondDisplay_Dash = 1,
    kCDXBondDisplay_Hash = 2,
    kCDXBondDisplay_WedgedHashBegin = 3,
    kCDXBondDisplay_WedgedHashEnd = 4,
    kCDXBondDisplay_Bold = 5,
    kCDXBondDisplay_WedgeBegin = 6,
    kCDXBondDisplay_WedgeEnd = 7,
    kCDXBondDisplay_Wavy = 8,
    kCDXBondDisplay_HollowWedgeBegin = 9,
    kCDXBondDisplay_HollowWedgeEnd = 10,
    kCDXBondDisplay_WavyWedgeBegin = 11,
    kCDXBondDisplay_WavyWedgeEnd = 12,
    kCDXBondDisplay_Dot = 13,
    kCDXBondDisplay_DashDot = 14
};

enum CDXBondDoublePosition {
    kCDXBondDoublePosition_AutoCenter = 0x0000,
    kCDXBondDoublePosition_AutoRight = 0x0001,
    kCDXBondDoublePosition_AutoLeft = 0x0002,
    kCDXBondDoublePosition_UserCenter = 0x0100,
    kCDXBondDoublePosition_UserRight = 0x0101,
    kCDXBondDoublePosition_UserLeft = 0x0102
};

enum CDXBondTopology {
    kCDXBondTopology_Unspecified = 0,
    kCDXBondTopology_Ring = 1,
    kCDXBondTopology_Chain = 2,
    kCDXBondTopology_RingOrChain = 3
};

enum CDXBondReactionParticipation {
    kCDXBondReactionParticipation_Unspecified = 0,
    kCDXBondReactionParticipation_ReactionCenter = 1,
    kCDXBondReactionParticipation_MakeOrBreak = 2,
    kCDXBondReactionParticipation_ChangeType = 3,
    kCDXBondReactionParticipation_MakeAndChange = 4,
    kCDXBondReactionParticipation_NotReactionCenter = 5,
    kCDXBondReactionParticipation_NoChange = 6,
    kCDXBondReactionParticipation_Unmapped = 7
};

enum CDXTextJustification {
    kCDXTextJustification_Right = -1,
    kCDXTextJustification_Left,
    kCDXTextJustification_Center,
    kCDXTextJustification_Full,
    kCDXTextJustification_Above,
    kCDXTextJustification_Below,
    kCDXTextJustification_Auto
};

#define kCDXTagType_Unknown "unknown"
#define kCDXTagType_Query "query"
#define kCDXTagType_Stereo "stereo"
#define kCDXTagType_Number "number"

enum CDXPositioningType {
    kCDXPositioningType_Auto = 0,
    kCDXPositioningType_Angle,
    kCDXPositioningType_Offset
};

#define kCDXLineHeight_Variable 0
#define kCDXLineHeight_Automatic 1

enum CDXGraphicType {
    kCDXGraphicType_Undefined = 0,
    kCDXGraphicType_Line,
    kCDXGraphicType_Arc,
    kCDXGraphicType_Rectangle,
    kCDXGraphicType_Oval,
    kCDXGraphicType_Orbital,
    kCDXGraphicType_Bracket,
    kCDXGraphicType_Symbol
};

enum CDXBracketType {
    kCDXBracketType_RoundPair,
    kCDXBracketType_SquarePair,
    kCDXBracketType_CurlyPair,
    kCDXBracketType_Square,
    kCDXBracketType_Curly
};

enum CDXRectangleType {
    kCDXRectangleType_Plain = 0x0000,
    kCDXRectangleType_RoundEdge = 0x0001,
    kCDXRectangleType_Shadow = 0x0002,
    kCDXRectangleType_Shaded = 0x0004,
    kCDXRectangleType_Filled = 0x0008,
    kCDXRectangleType_Dashed = 0x0010,
    kCDXRectangleType_Bold = 0x0020
};

enum CDXOvalType {
    kCDXOvalType_Circle = 0x0001,
    kCDXOvalType_Shaded = 0x0002,
    kCDXOvalType_Filled = 0x0004,
    kCDXOvalType_Dashed = 0x0008,
    kCDXOvalType_Bold = 0x0010
};

enum CDXSymbolType {
    kCDXSymbolType_LonePair,
    kCDXSymbolType_Electron,
    kCDXSymbolType_RadicalCation,
    kCDXSymbolType_RadicalAnion,
    kCDXSymbolType_CirclePlus,
    kCDXSymbolType_CircleMinus,
    kCDXSymbolType_Dagger,
    kCDXSymbolType_DoubleDagger,
    kCDXSymbolType_Plus,
    kCDXSymbolType_Minus,
    kCDXSymbolType_Racemic,
    kCDXSymbolType_Absolute,
    kCDXSymbolType_Relative
};

enum CDXLineType {
    kCDXLineType_Solid = 0x0000,
    kCDXLineType_Dashed = 0x0001,
    kCDXLineType_Bold = 0x0002
};

enum CDXArrowType {
    kCDXArrowType_NoHead = 0,
    kCDXArrowType_HalfHead = 1,
    kCDXArrowType_FullHead = 2,
    kCDXArrowType_Resonance = 4,
    kCDXArrowType_Equilibrium = 8,
    kCDXArrowType_Hollow = 16,
    kCDXArrowType_RetroSynthetic = 32
};

enum CDXOrbitalType {
    kCDXOrbitalType_s,           // s orbital
    kCDXOrbitalType_oval,        // Oval-shaped sigma or pi orbital
    kCDXOrbitalType_lobe,        // One lobe of a p orbital
    kCDXOrbitalType_p,           // Complete p orbital
    kCDXOrbitalType_hybridPlus,  // hydrid orbital
    kCDXOrbitalType_hybridMinus, // hydrid orbital (opposite shading)
    kCDXOrbitalType_dz2Plus,     // dz2 orbital
    kCDXOrbitalType_dz2Minus,    // dz2 orbital (opposite shading)
    kCDXOrbitalType_dxy,         // dxy orbital

    kCDXOrbitalType_sShaded = 0x0100, // shaded s orbital
    kCDXOrbitalType_ovalShaded,       // shaded Oval-shaped sigma or pi orbital
    kCDXOrbitalType_lobeShaded,       // shaded single lobe of a p orbital
    kCDXOrbitalType_pShaded,          // shaded Complete p orbital

    kCDXOrbitalType_sFilled = 0x0200,  // filled s orbital
    kCDXOrbitalType_ovalFilled,        // filled Oval-shaped sigma or pi orbital
    kCDXOrbitalType_lobeFilled,        // filled single lobe of a p orbital
    kCDXOrbitalType_pFilled,           // filled Complete p orbital
    kCDXOrbitalType_hybridPlusFilled,  // filled hydrid orbital
    kCDXOrbitalType_hybridMinusFilled, // filled hydrid orbital (opposite
                                       // shading)
    kCDXOrbitalType_dz2PlusFilled,     // filled dz2 orbital
    kCDXOrbitalType_dz2MinusFilled,    // filled dz2 orbital (opposite shading)
    kCDXOrbitalType_dxyFilled          // filled dxy orbital

};

enum CDXSpectrumYType {
    kCDXSpectrumYType_Unknown,
    kCDXSpectrumYType_Absorbance,
    kCDXSpectrumYType_Transmittance,
    kCDXSpectrumYType_PercentTransmittance,
    kCDXSpectrumYType_Other,
    kCDXSpectrumYType_ArbitraryUnits
};

enum CDXSpectrumXType {
    kCDXSpectrumXType_Unknown,
    kCDXSpectrumXType_Wavenumbers,
    kCDXSpectrumXType_Microns,
    kCDXSpectrumXType_Hertz,
    kCDXSpectrumXType_MassUnits,
    kCDXSpectrumXType_PartsPerMillion,
    kCDXSpectrumXType_Other
};

enum CDXSpectrumClass {
    kCDXSpectrumClass_Unknown,
    kCDXSpectrumClass_Chromatogram,
    kCDXSpectrumClass_Infrared,
    kCDXSpectrumClass_UVVis,
    kCDXSpectrumClass_XRayDiffraction,
    kCDXSpectrumClass_MassSpectrum,
    kCDXSpectrumClass_NMR,
    kCDXSpectrumClass_Raman,
    kCDXSpectrumClass_Fluorescence,
    kCDXSpectrumClass_Atomic
};

enum CDXDrawingSpaceType { kCDXDrawingSpace_Pages, kCDXDrawingSpace_Poster };

enum CDXAtomCIPType {
    kCDXCIPAtom_Undetermined = 0,
    kCDXCIPAtom_None,
    kCDXCIPAtom_R,
    kCDXCIPAtom_S,
    kCDXCIPAtom_r,
    kCDXCIPAtom_s,
    kCDXCIPAtom_Unspecified // No hash/wedge, but if there were one, it would
                            // have stereochemistry.
};

enum CDXBondCIPType {
    kCDXCIPBond_Undetermined = 0,
    kCDXCIPBond_None,
    kCDXCIPBond_E,
    kCDXCIPBond_Z
};

enum CDXObjectTagType {
    kCDXObjectTagType_Undefined = 0,
    kCDXObjectTagType_Double,
    kCDXObjectTagType_Long,
    kCDXObjectTagType_String
};

enum CDXCharSet {
    kCDXCharSetUnknown = 0,
    kCDXCharSetEBCDICOEM = 37,
    kCDXCharSetMSDOSUS = 437,
    kCDXCharSetEBCDIC500V1 = 500,
    kCDXCharSetArabicASMO708 = 708,
    kCDXCharSetArabicASMO449P,
    kCDXCharSetArabicTransparent,
    kCDXCharSetArabicTransparentASMO = 720,
    kCDXCharSetGreek437G = 737,
    kCDXCharSetBalticOEM = 775,
    kCDXCharSetMSDOSLatin1 = 850,
    kCDXCharSetMSDOSLatin2 = 852,
    kCDXCharSetIBMCyrillic = 855,
    kCDXCharSetIBMTurkish = 857,
    kCDXCharSetMSDOSPortuguese = 860,
    kCDXCharSetMSDOSIcelandic,
    kCDXCharSetHebrewOEM,
    kCDXCharSetMSDOSCanadianFrench,
    kCDXCharSetArabicOEM,
    kCDXCharSetMSDOSNordic,
    kCDXCharSetMSDOSRussian,
    kCDXCharSetIBMModernGreek = 869,
    kCDXCharSetThai = 874,
    kCDXCharSetEBCDIC,
    kCDXCharSetJapanese = 932,
    kCDXCharSetChineseSimplified = 936, // PRC, Singapore
    kCDXCharSetKorean = 949,
    kCDXCharSetChineseTraditional = 950, // Taiwan, Hong Kong
    kCDXCharSetUnicodeISO10646 = 1200,
    kCDXCharSetWin31EasternEuropean = 1250,
    kCDXCharSetWin31Cyrillic,
    kCDXCharSetWin31Latin1,
    kCDXCharSetWin31Greek,
    kCDXCharSetWin31Turkish,
    kCDXCharSetHebrew,
    kCDXCharSetArabic,
    kCDXCharSetBaltic,
    kCDXCharSetVietnamese,
    kCDXCharSetKoreanJohab = 1361,
    kCDXCharSetMacRoman = 10000,
    kCDXCharSetMacJapanese,
    kCDXCharSetMacTradChinese,
    kCDXCharSetMacKorean,
    kCDXCharSetMacArabic,
    kCDXCharSetMacHebrew,
    kCDXCharSetMacGreek,
    kCDXCharSetMacCyrillic,
    kCDXCharSetMacReserved,
    kCDXCharSetMacDevanagari,
    kCDXCharSetMacGurmukhi,
    kCDXCharSetMacGujarati,
    kCDXCharSetMacOriya,
    kCDXCharSetMacBengali,
    kCDXCharSetMacTamil,
    kCDXCharSetMacTelugu,
    kCDXCharSetMacKannada,
    kCDXCharSetMacMalayalam,
    kCDXCharSetMacSinhalese,
    kCDXCharSetMacBurmese,
    kCDXCharSetMacKhmer,
    kCDXCharSetMacThai,
    kCDXCharSetMacLao,
    kCDXCharSetMacGeorgian,
    kCDXCharSetMacArmenian,
    kCDXCharSetMacSimpChinese,
    kCDXCharSetMacTibetan,
    kCDXCharSetMacMongolian,
    kCDXCharSetMacEthiopic,
    kCDXCharSetMacCentralEuroRoman,
    kCDXCharSetMacVietnamese,
    kCDXCharSetMacExtArabic,
    kCDXCharSetMacUninterpreted,
    kCDXCharSetMacIcelandic = 10079,
    kCDXCharSetMacTurkish = 10081
};

#endif // _H_CDXConstants
