html.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:49k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: html.hpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 19:15:12  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.75
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef HTML___HTML__HPP
  10. #define HTML___HTML__HPP
  11. /*  $Id: html.hpp,v 1000.5 2004/06/01 19:15:12 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Lewis Geer
  37.  *
  38.  */
  39. /// @file html.hpp 
  40. /// HTML classes.
  41. ///
  42. /// Defines classes to generate HTML code.
  43. #include <corelib/ncbiobj.hpp>
  44. #include <html/node.hpp>
  45. #include <html/jsmenu.hpp>
  46. #include <html/htmlhelper.hpp>
  47. /** @addtogroup HTMLcomp
  48.  *
  49.  * @{
  50.  */
  51. BEGIN_NCBI_SCOPE
  52. /// Macro for declare html elements.
  53. #define CHTML_NAME(Tag) NCBI_NAME2(CHTML_, Tag)
  54. #define DECLARE_HTML_ELEMENT_CONSTRUCTORS(Tag, Parent) 
  55.     CHTML_NAME(Tag)(void) 
  56.         : CParent(sm_TagName) 
  57.         { } 
  58.     CHTML_NAME(Tag)(const char* text) 
  59.         : CParent(sm_TagName, text) 
  60.         { } 
  61.     CHTML_NAME(Tag)(const string& text) 
  62.         : CParent(sm_TagName, text) 
  63.         { } 
  64.     CHTML_NAME(Tag)(CNCBINode* node) 
  65.         : CParent(sm_TagName, node) 
  66.         { } 
  67.     ~CHTML_NAME(Tag)(void)
  68. #define DECLARE_HTML_ELEMENT_CONSTRUCTORS_WITH_INIT(Tag, Parent) 
  69.     CHTML_NAME(Tag)(void) 
  70.         : CParent(sm_TagName) 
  71.         { Init(); } 
  72.     CHTML_NAME(Tag)(const char* text) 
  73.         : CParent(sm_TagName, text) 
  74.         { Init(); } 
  75.     CHTML_NAME(Tag)(const string& text) 
  76.         : CParent(sm_TagName, text) 
  77.         { Init(); } 
  78.     CHTML_NAME(Tag)(CNCBINode* node) 
  79.         : CParent(sm_TagName, node) 
  80.         { Init(); } 
  81.     ~CHTML_NAME(Tag)(void)
  82. #define DECLARE_HTML_ELEMENT_TYPES(Parent) 
  83.     typedef Parent CParent; 
  84.     static const char sm_TagName[]
  85. #define DECLARE_HTML_ELEMENT_COMMON(Tag, Parent) 
  86.     DECLARE_HTML_ELEMENT_TYPES(Parent); 
  87. public: 
  88.     DECLARE_HTML_ELEMENT_CONSTRUCTORS(Tag, Parent)
  89. #define DECLARE_HTML_ELEMENT_COMMON_WITH_INIT(Tag, Parent) 
  90.     DECLARE_HTML_ELEMENT_TYPES(Parent); 
  91. public: 
  92.     DECLARE_HTML_ELEMENT_CONSTRUCTORS_WITH_INIT(Tag, Parent)
  93. #define DECLARE_HTML_ELEMENT(Tag, Parent) 
  94. class NCBI_XHTML_EXPORT CHTML_NAME(Tag) : public Parent 
  95.     DECLARE_HTML_ELEMENT_COMMON(Tag, Parent); 
  96. }
  97. // Macro for declare special chars.
  98. #define DECLARE_HTML_SPECIAL_CHAR(Tag, plain) 
  99. class NCBI_XHTML_EXPORT CHTML_NAME(Tag) : public CHTMLSpecialChar 
  100.     typedef CHTMLSpecialChar CParent; 
  101. public: 
  102.     CHTML_NAME(Tag)(int count = 1) 
  103.         : CParent(#Tag, plain, count) 
  104.         { } 
  105.     ~CHTML_NAME(Tag)(void) { }; 
  106. }
  107. // Event tag handler type.
  108. //
  109. // NOTE: Availability of realization event-handlers for some tags
  110. //       stand on from browser's type! Set of event-handlers for tags can 
  111. //       fluctuate in different browsers.
  112. enum EHTML_EH_Attribute {
  113.     //                    work with next HTML-tags (tag's group):
  114.     eHTML_EH_Blur,        //   select, text, textarea
  115.     eHTML_EH_Change,      //   select, text, textarea 
  116.     eHTML_EH_Click,       //   button, checkbox, radio, link, reset, submit
  117.     eHTML_EH_DblClick,    //   
  118.     eHTML_EH_Focus,       //   select, text, textarea  
  119.     eHTML_EH_Load,        //   body, frameset
  120.     eHTML_EH_Unload,      //   body, frameset
  121.     eHTML_EH_MouseDown,   //
  122.     eHTML_EH_MouseUp,     //
  123.     eHTML_EH_MouseMove,   //
  124.     eHTML_EH_MouseOver,   //
  125.     eHTML_EH_MouseOut,    //
  126.     eHTML_EH_Select,      //   text, textarea
  127.     eHTML_EH_Submit,      //   form  
  128.     eHTML_EH_KeyDown,     //
  129.     eHTML_EH_KeyPress,    //
  130.     eHTML_EH_KeyUp        //
  131. };
  132. // Base class for html node.
  133. class NCBI_XHTML_EXPORT CHTMLNode : public CNCBINode
  134. {
  135.     typedef CNCBINode CParent;
  136. public:
  137.     CHTMLNode(void)
  138.     { }
  139.     CHTMLNode(const char* tagname)
  140.         : CParent(tagname)
  141.     { }
  142.     CHTMLNode(const char* tagname, const char* text)
  143.         : CParent(tagname)
  144.     {
  145.         AppendPlainText(text);
  146.     }
  147.     CHTMLNode(const char* tagname, const string& text)
  148.         : CParent(tagname)
  149.     {
  150.         AppendPlainText(text);
  151.     }
  152.     CHTMLNode(const char* tagname, CNCBINode* node)
  153.         : CParent(tagname)
  154.     {
  155.         AppendChild(node);
  156.     }
  157.     CHTMLNode(const string& tagname)
  158.         : CParent(tagname)
  159.     { }
  160.     CHTMLNode(const string& tagname, const char* text)
  161.         : CParent(tagname)
  162.     {
  163.         AppendPlainText(text);
  164.     }
  165.     CHTMLNode(const string& tagname, const string& text)
  166.         : CParent(tagname)
  167.     {
  168.         AppendPlainText(text);
  169.     }
  170.     CHTMLNode(const string& tagname, CNCBINode* node)
  171.         : CParent(tagname)
  172.     {
  173.         AppendChild(node);
  174.     }
  175.     ~CHTMLNode(void);
  176.     // Convenient way to set some common attributes.
  177.     CHTMLNode* SetClass(const string& class_name);
  178.     CHTMLNode* SetStyle(const string& style);
  179.     CHTMLNode* SetId(const string& id);
  180.     CHTMLNode* SetWidth(int width);
  181.     CHTMLNode* SetWidth(const string& width);
  182.     CHTMLNode* SetHeight(int height);
  183.     CHTMLNode* SetHeight(const string& width);
  184.     CHTMLNode* SetSize(int size);
  185.     CHTMLNode* SetAlign(const string& align);
  186.     CHTMLNode* SetVAlign(const string& align);
  187.     CHTMLNode* SetBgColor(const string& color);
  188.     CHTMLNode* SetColor(const string& color);
  189.     CHTMLNode* SetNameAttribute(const string& name);
  190.     const string& GetNameAttribute(void) const;
  191.     CHTMLNode* SetTitle(const string& title);
  192.     CHTMLNode* SetAccessKey(char key);
  193.     // Convenient way to add CHTMLPlainText or CHTMLText.
  194.     void AppendPlainText(const char* text, bool noEncode = false);
  195.     void AppendPlainText(const string& text, bool noEncode = false);
  196.     void AppendHTMLText (const char* text);
  197.     void AppendHTMLText (const string& text);
  198.     // Get event handler name.
  199.     string GetEventHandlerName(const EHTML_EH_Attribute event) const;
  200.     // Set tag event handler.
  201.     void SetEventHandler(const EHTML_EH_Attribute event, const string& value);
  202.     // Attach the specified popup menu to HTML node.
  203.     // Popup menu will be shown when the "event" occurs.
  204.     // NOTES:
  205.     //   2) For eKurdin menu type the parameter "event" cannot be an
  206.     //      eHTML_EH_MouseOut, because it is used to hide the menu.
  207.     //   3) For eKurdinSide menu type the event parameters are not used.
  208.     void AttachPopupMenu(const CHTMLPopupMenu*  menu,
  209.                          EHTML_EH_Attribute     event = eHTML_EH_MouseOver);
  210. };
  211. // <@XXX@> mapping node.
  212. class NCBI_XHTML_EXPORT CHTMLTagNode : public CNCBINode
  213. {
  214.     typedef CNCBINode CParent;
  215. public:
  216.     CHTMLTagNode(const char* tag);
  217.     CHTMLTagNode(const string& tag);
  218.     ~CHTMLTagNode(void);
  219.     virtual CNcbiOstream& PrintChildren(CNcbiOstream& out, TMode mode);
  220. };
  221. // Dual print node.
  222. class NCBI_XHTML_EXPORT CHTMLDualNode : public CNCBINode
  223. {
  224.     typedef CNCBINode CParent;
  225. public:
  226.     CHTMLDualNode(const char* html, const char* plain);
  227.     CHTMLDualNode(CNCBINode* child, const char* plain);
  228.     ~CHTMLDualNode(void);
  229.     virtual CNcbiOstream& PrintChildren(CNcbiOstream& out, TMode mode);
  230. protected:
  231.     string m_Plain;
  232. };
  233. // A text node that contains plain text.
  234. class NCBI_XHTML_EXPORT CHTMLPlainText : public CNCBINode
  235. {
  236.     typedef CNCBINode CParent;
  237. public:
  238.     CHTMLPlainText(const char* text, bool noEncode = false);
  239.     CHTMLPlainText(const string& text, bool noEncode = false);
  240.     ~CHTMLPlainText(void);
  241.     
  242.     const string& GetText(void) const;
  243.     void SetText(const string& text);
  244.     bool NoEncode(void) const
  245.     {
  246.         return m_NoEncode;
  247.     }
  248.     void SetNoEncode(bool noEncode = true)
  249.     {
  250.         m_NoEncode = noEncode;
  251.     }
  252.     virtual CNcbiOstream& PrintBegin(CNcbiOstream& out, TMode mode);
  253. private:
  254.     bool   m_NoEncode;
  255.     string m_Text;
  256. };
  257. // A text node that contains html text with tags and possibly <@TAG@>.
  258. class NCBI_XHTML_EXPORT CHTMLText : public CNCBINode
  259. {
  260.     typedef CNCBINode CParent;
  261. public:
  262.     CHTMLText(const char* text);
  263.     CHTMLText(const string& text);
  264.     ~CHTMLText(void);
  265.     
  266.     const string& GetText(void) const;
  267.     void SetText(const string& text);
  268.     virtual CNcbiOstream& PrintBegin(CNcbiOstream& out, TMode mode);
  269. private:
  270.     CNcbiOstream& x_PrintBegin(CNcbiOstream& out, TMode mode,
  271.                                const string& s) const;
  272. private:
  273.     string m_Text;
  274. };
  275. // HTML tag base class.
  276. class NCBI_XHTML_EXPORT CHTMLOpenElement: public CHTMLNode
  277. {
  278.     typedef CHTMLNode CParent;
  279. public:
  280.     CHTMLOpenElement(const char* tagname)
  281.         : CParent(tagname), m_NoWrap(false)
  282.     { }
  283.     CHTMLOpenElement(const char* tagname, const char* text)
  284.         : CParent(tagname, text), m_NoWrap(false)
  285.     { }
  286.     CHTMLOpenElement(const char* tagname, const string& text)
  287.         : CParent(tagname, text), m_NoWrap(false)
  288.     { }
  289.     CHTMLOpenElement(const char* tagname, CNCBINode* node)
  290.         : CParent(tagname, node), m_NoWrap(false)
  291.     { }
  292.     CHTMLOpenElement(const string& tagname)
  293.         : CParent(tagname), m_NoWrap(false)
  294.     { }
  295.     CHTMLOpenElement(const string& tagname, const char* text)
  296.         : CParent(tagname, text), m_NoWrap(false)
  297.     { }
  298.     CHTMLOpenElement(const string& tagname, const string& text)
  299.         : CParent(tagname, text), m_NoWrap(false)
  300.     { }
  301.     CHTMLOpenElement(const string& tagname, CNCBINode* node)
  302.         : CParent(tagname, node), m_NoWrap(false)
  303.     { }
  304.     ~CHTMLOpenElement(void);
  305.     // Print tag itself.
  306.     virtual CNcbiOstream& PrintBegin(CNcbiOstream &, TMode mode);
  307.     // Set NOWRAP attribute (NOTE: it is depricated in HTML 4.0)
  308.     virtual void SetNoWrap(bool noWrap = true)
  309.         { m_NoWrap = noWrap; }
  310. protected:
  311.     bool m_NoWrap;
  312. };
  313. // HTML inline tag
  314. class NCBI_XHTML_EXPORT CHTMLInlineElement: public CHTMLOpenElement
  315. {
  316.     typedef CHTMLOpenElement CParent;
  317. public:
  318.     CHTMLInlineElement(const char* tagname)
  319.         : CParent(tagname)
  320.     { }
  321.     CHTMLInlineElement(const char* tagname, const char* text)
  322.         : CParent(tagname, text)
  323.     { }
  324.     CHTMLInlineElement(const char* tagname, const string& text)
  325.         : CParent(tagname, text)
  326.     { }
  327.     CHTMLInlineElement(const char* tagname, CNCBINode* node)
  328.         : CParent(tagname, node)
  329.     { }
  330.     CHTMLInlineElement(const string& tagname)
  331.         : CParent(tagname)
  332.     { }
  333.     CHTMLInlineElement(const string& tagname, const char* text)
  334.         : CParent(tagname, text)
  335.     { }
  336.     CHTMLInlineElement(const string& tagname, const string& text)
  337.         : CParent(tagname, text)
  338.     { }
  339.     CHTMLInlineElement(const string& tagname, CNCBINode* node)
  340.         : CParent(tagname, node)
  341.     { }
  342.     ~CHTMLInlineElement(void);
  343.     // Print tag close.
  344.     virtual CNcbiOstream& PrintEnd(CNcbiOstream &, TMode mode);   
  345. };
  346. // HTML tag
  347. class NCBI_XHTML_EXPORT CHTMLElement: public CHTMLInlineElement
  348. {
  349.     typedef CHTMLInlineElement CParent;
  350. public:
  351.     CHTMLElement(const char* tagname)
  352.         : CParent(tagname)
  353.     { }
  354.     CHTMLElement(const char* tagname, const char* text)
  355.         : CParent(tagname, text)
  356.     { }
  357.     CHTMLElement(const char* tagname, const string& text)
  358.         : CParent(tagname, text)
  359.     { }
  360.     CHTMLElement(const char* tagname, CNCBINode* node)
  361.         : CParent(tagname, node)
  362.     { }
  363.     CHTMLElement(const string& tagname)
  364.         : CParent(tagname)
  365.     { }
  366.     CHTMLElement(const string& tagname, const char* text)
  367.         : CParent(tagname, text)
  368.     { }
  369.     CHTMLElement(const string& tagname, const string& text)
  370.         : CParent(tagname, text)
  371.     { }
  372.     CHTMLElement(const string& tagname, CNCBINode* node)
  373.         : CParent(tagname, node)
  374.     { }
  375.     ~CHTMLElement(void);
  376.     // Print tag close.
  377.     virtual CNcbiOstream& PrintEnd(CNcbiOstream &, TMode mode);   
  378. };
  379. // HTML block element.
  380. class NCBI_XHTML_EXPORT CHTMLBlockElement: public CHTMLElement
  381. {
  382.     typedef CHTMLElement CParent;
  383. public:
  384.     CHTMLBlockElement(const char* tagname)
  385.         : CParent(tagname)
  386.     { }
  387.     CHTMLBlockElement(const char* tagname, const char* text)
  388.         : CParent(tagname, text)
  389.     { }
  390.     CHTMLBlockElement(const char* tagname, const string& text)
  391.         : CParent(tagname, text)
  392.     { }
  393.     CHTMLBlockElement(const char* tagname, CNCBINode* node)
  394.         : CParent(tagname, node)
  395.     { }
  396.     CHTMLBlockElement(const string& tagname)
  397.         : CParent(tagname)
  398.     { }
  399.     CHTMLBlockElement(const string& tagname, const char* text)
  400.         : CParent(tagname, text)
  401.     { }
  402.     CHTMLBlockElement(const string& tagname, const string& text)
  403.         : CParent(tagname, text)
  404.     { }
  405.     CHTMLBlockElement(const string& tagname, CNCBINode* node)
  406.         : CParent(tagname, node)
  407.     { }
  408.     ~CHTMLBlockElement(void);
  409.     // Close tag.
  410.     virtual CNcbiOstream& PrintEnd(CNcbiOstream &, TMode mode);   
  411. };
  412. // HTML comment.
  413. class NCBI_XHTML_EXPORT CHTMLComment : public CHTMLNode
  414. {
  415.     typedef CHTMLNode CParent;
  416.     static const char sm_TagName[];
  417. public:
  418.     CHTMLComment(void)
  419.         : CParent(sm_TagName)
  420.     { }
  421.     CHTMLComment(const char* text)
  422.         : CParent(sm_TagName)
  423.     {
  424.         AppendPlainText(text);
  425.     }
  426.     CHTMLComment(const string& text)
  427.         : CParent(sm_TagName)
  428.     {
  429.         AppendPlainText(text);
  430.     }
  431.     CHTMLComment(CNCBINode* node)
  432.         : CParent(sm_TagName)
  433.     {
  434.         AppendChild(node);
  435.     }
  436.     ~CHTMLComment(void);
  437.     virtual CNcbiOstream& Print(CNcbiOstream& out, TMode mode = eHTML);
  438.     virtual CNcbiOstream& PrintBegin(CNcbiOstream &, TMode mode);
  439.     virtual CNcbiOstream& PrintEnd(CNcbiOstream &, TMode mode);
  440. };
  441. // <list> tag.
  442. class NCBI_XHTML_EXPORT CHTMLListElement : public CHTMLElement
  443. {
  444.     typedef CHTMLElement CParent;
  445. public:
  446.     CHTMLListElement(const char* tagname, bool compact = false)
  447.         : CParent(tagname)
  448.     {
  449.         if ( compact ) {
  450.             SetCompact();
  451.         }
  452.     }
  453.     CHTMLListElement(const char* tagname, const char* type,
  454.                      bool compact = false)
  455.         : CParent(tagname)
  456.     {
  457.         SetType(type);
  458.         if ( compact ) {
  459.             SetCompact();
  460.         }
  461.     }
  462.     CHTMLListElement(const char* tagname, const string& type,
  463.                      bool compact = false)
  464.         : CParent(tagname)
  465.     {
  466.         SetType(type);
  467.         if ( compact ) {
  468.             SetCompact();
  469.         }
  470.     }
  471.     ~CHTMLListElement(void);
  472.     CHTMLListElement* AppendItem(const char* text);
  473.     CHTMLListElement* AppendItem(const string& text);
  474.     CHTMLListElement* AppendItem(CNCBINode* node);
  475.     CHTMLListElement* SetType(const char* type);
  476.     CHTMLListElement* SetType(const string& type);
  477.     CHTMLListElement* SetCompact(void);
  478.     CNcbiOstream& PrintChildren(CNcbiOstream& out, TMode mode);
  479. };
  480. // HTML special char.
  481. class NCBI_XHTML_EXPORT CHTMLSpecialChar: public CHTMLDualNode
  482. {
  483.     typedef CHTMLDualNode CParent;
  484. public:
  485.     // The "html" argument will be automagically wrapped into '&...;',
  486.     // e.g. 'amp' --> '&amp;'
  487.     CHTMLSpecialChar(const char* html, const char* plain, int count = 1);
  488.     ~CHTMLSpecialChar(void);
  489.     virtual CNcbiOstream& PrintChildren(CNcbiOstream& out, TMode mode);
  490. private:
  491.     string m_Html;
  492.     int    m_Count;
  493. };
  494. // <html> tag
  495. class NCBI_XHTML_EXPORT CHTML_html : public CHTMLElement
  496. {
  497.     // CParent, constructors, destructor.
  498.     DECLARE_HTML_ELEMENT_COMMON_WITH_INIT(html, CHTMLElement);
  499.    
  500.     // Enable using popup menus, set URL for popup menu library.
  501.     // If "menu_lib_url" is not defined, then using default URL.
  502.     // use_dynamic_menu - enable/disable using dynamic popup menus 
  503.     // (default it is disabled).
  504.     // NOTE: 1) If we not change value "menu_script_url", namely use default
  505.     //          value for it, then we can skip call this function.
  506.     //       2) Dynamic menu work only in new browsers. They use one container
  507.     //          for all menus instead of separately container for each menu in 
  508.     //          nondynamic mode. This parameter have effect only with eSmith
  509.     //          menu type.
  510.     void EnablePopupMenu(CHTMLPopupMenu::EType type = CHTMLPopupMenu::eSmith,
  511.                          const string&         menu_script_url  = kEmptyStr,
  512.                          bool                  use_dynamic_menu = false);
  513. private:
  514.     // Init members.
  515.     void Init(void);
  516.     
  517.     // Print all self childrens (automatic include code for support 
  518.     // popup menus, if it needed).
  519.     virtual CNcbiOstream& PrintChildren(CNcbiOstream& out, TMode mode);
  520.     // The popup menu info structure.
  521.     struct SPopupMenuInfo {
  522.         SPopupMenuInfo() 
  523.             : m_UseDynamicMenu(false)
  524.         { };
  525.         SPopupMenuInfo(const string& url, bool use_dynamic_menu)
  526.             : m_Url(url), m_UseDynamicMenu(use_dynamic_menu)
  527.         { }
  528.         string m_Url;
  529.         bool   m_UseDynamicMenu; // Only for eSmith menu type.
  530.     };
  531.     // The popup menus usage info.
  532.     typedef map<CHTMLPopupMenu::EType, SPopupMenuInfo> TPopupMenus;
  533.     TPopupMenus m_PopupMenus;
  534. };
  535. // Table classes.
  536. class CHTML_table;   // Table
  537. class CHTML_tr;      // Row
  538. class CHTML_tc;      // Any cell
  539. class CHTML_th;      // Header cell
  540. class CHTML_td;      // Data cell
  541. class CHTML_tc_Cache;
  542. class CHTML_tr_Cache;
  543. class CHTML_table_Cache;
  544. class NCBI_XHTML_EXPORT CHTML_tc : public CHTMLElement
  545. {
  546.     typedef CHTMLElement CParent;
  547. public:
  548.     typedef unsigned TIndex;
  549.     CHTML_tc(const char* tagname)
  550.         : CParent(tagname), m_Parent(0)
  551.     { }
  552.     CHTML_tc(const char* tagname, const char* text)
  553.         : CParent(tagname, text), m_Parent(0)
  554.     { }
  555.     CHTML_tc(const char* tagname, const string& text)
  556.         : CParent(tagname, text), m_Parent(0)
  557.     { }
  558.     CHTML_tc(const char* tagname, CNCBINode* node)
  559.         : CParent(tagname, node), m_Parent(0)
  560.     { }
  561.     ~CHTML_tc(void);
  562.     // Type for row and column indexing.
  563.     CHTML_tc* SetRowSpan(TIndex span);
  564.     CHTML_tc* SetColSpan(TIndex span);
  565.     void ResetTableCache(void);
  566. protected:
  567.     virtual void DoSetAttribute(const string& name,
  568.                                 const string& value, bool optional);
  569.     friend class CHTML_tr;
  570.     friend class CHTML_tc_Cache;
  571.     CHTML_tr* m_Parent;
  572. };
  573. class NCBI_XHTML_EXPORT CHTML_tr : public CHTMLElement
  574. {
  575.     typedef CHTMLElement CParent;
  576. public:
  577.     typedef unsigned TIndex;
  578.     CHTML_tr(void);
  579.     CHTML_tr(CNCBINode* node);
  580.     CHTML_tr(const string& text);
  581.     void ResetTableCache(void);
  582.     virtual CNcbiOstream& PrintChildren(CNcbiOstream& out, TMode mode);
  583.     virtual CNcbiOstream& PrintEnd(CNcbiOstream& out, TMode mode);
  584. protected:
  585.     virtual void DoAppendChild(CNCBINode* node);
  586.     void AppendCell(CHTML_tc* cell);
  587.     size_t GetTextLength(TMode mode);
  588.     friend class CHTML_table;
  589.     friend class CHTML_tr_Cache;
  590.     CHTML_table* m_Parent;
  591. };
  592. // <table> tag.
  593. class NCBI_XHTML_EXPORT CHTML_table : public CHTMLElement
  594. {
  595.     typedef CHTMLElement CParent;
  596. public:
  597.     // Type for row and column indexing.
  598.     typedef unsigned TIndex;
  599.     enum ECellType {
  600.         eAnyCell,
  601.         eDataCell,
  602.         eHeaderCell
  603.     };
  604.     CHTML_table(void);
  605.     ~CHTML_table(void);
  606.     // Return row, will add rows if needed.
  607.     // Throws exception if it is not left upper corner of cell.
  608.     CHTML_tr* Row(TIndex row);
  609.     // Get/set current insertion point.
  610.     void SetCurrentCell(TIndex row, TIndex col)
  611.         { m_CurrentRow = row; m_CurrentCol = col; }
  612.     TIndex GetCurrentRow(void) const
  613.         { return m_CurrentRow; }
  614.     TIndex GetCurrentCol(void) const
  615.         { return m_CurrentCol; }
  616.     class CTableInfo;
  617.     // Return cell, will add rows/columns if needed.
  618.     // Throws exception if it is not left upper corner of cell
  619.     // also sets current insertion point.
  620.     CHTML_tc* Cell(TIndex row, TIndex column, ECellType type = eAnyCell);
  621.     CHTML_tc* Cell(TIndex row, TIndex column, ECellType type,
  622.                    TIndex rowSpan, TIndex colSpan);
  623.     CHTML_tc* HeaderCell(TIndex row, TIndex column)
  624.         { return Cell(row, column, eHeaderCell); }
  625.     CHTML_tc* DataCell(TIndex row, TIndex column)
  626.         { return Cell(row, column, eDataCell); }
  627.     CHTML_tc* NextCell(ECellType type = eAnyCell);
  628.     CHTML_tc* NextHeaderCell(void)
  629.         { return NextCell(eHeaderCell); }
  630.     CHTML_tc* NextDataCell(void)
  631.         { return NextCell(eDataCell); }
  632.     CHTML_tc* NextRowCell(ECellType type = eAnyCell);
  633.     CHTML_tc* NextRowHeaderCell(void)
  634.         { return NextRowCell(eHeaderCell); }
  635.     CHTML_tc* NextRowDataCell(void)
  636.         { return NextRowCell(eDataCell); }
  637.     // Check table contents for validaty, throws exception if invalid.
  638.     void CheckTable(void) const;
  639.     // Return width of table in columns. Should call CheckTable before.
  640.     TIndex CalculateNumberOfColumns(void) const;
  641.     TIndex CalculateNumberOfRows(void) const;
  642.     // Return cell of insertion.
  643.     CHTML_tc* InsertAt(TIndex row, TIndex column, CNCBINode* node);
  644.     CHTML_tc* InsertAt(TIndex row, TIndex column, const string& text);
  645.     CHTML_tc* InsertTextAt(TIndex row, TIndex column, const string& text);
  646.     CHTML_tc* InsertNextCell(CNCBINode* node);
  647.     CHTML_tc* InsertNextCell(const string& text);
  648.     CHTML_tc* InsertNextRowCell(CNCBINode* node);
  649.     CHTML_tc* InsertNextRowCell(const string& text);
  650.     void ColumnWidth(CHTML_table*, TIndex column, const string & width);
  651.     CHTML_table* SetCellSpacing(int spacing);
  652.     CHTML_table* SetCellPadding(int padding);
  653.     void ResetTableCache(void);
  654.     virtual CNcbiOstream& PrintBegin(CNcbiOstream &, TMode mode);
  655.     // If to print horizontal row separator (affects ePlainText mode only).
  656.     enum ERowPlainSep {
  657.         ePrintRowSep,   // print
  658.         eSkipRowSep     // do not print
  659.     };
  660.     // Set rows and cols separators (affects ePlainText mode only).
  661.     void SetPlainSeparators(const string& col_left     = kEmptyStr,
  662.                             const string& col_middle   = " ",
  663.                             const string& col_right    = kEmptyStr,
  664.                             const char    row_sep_char = '-',
  665.                             ERowPlainSep  is_row_sep   = eSkipRowSep);
  666. protected:
  667.     TIndex m_CurrentRow, m_CurrentCol;
  668.     mutable auto_ptr<CHTML_table_Cache> m_Cache;
  669.     CHTML_table_Cache& GetCache(void) const;
  670.     friend class CHTML_table_Cache;
  671.     friend class CHTML_tr;
  672.     virtual void DoAppendChild(CNCBINode* node);
  673.     void AppendRow(CHTML_tr* row);
  674.     string       m_ColSepL, m_ColSepM, m_ColSepR;
  675.     char         m_RowSepChar;
  676.     ERowPlainSep m_IsRowSep;
  677. };
  678. // <form> tag
  679. class NCBI_XHTML_EXPORT CHTML_form : public CHTMLElement
  680. {
  681.     typedef CHTMLElement CParent;
  682. public:
  683.     enum EMethod {
  684.         eGet,
  685.         ePost,
  686.         ePostData
  687.     };
  688.     CHTML_form(void);
  689.     CHTML_form(const string& url, EMethod method = eGet);
  690.     CHTML_form(const string& url, CNCBINode* node, EMethod method = eGet);
  691.     ~CHTML_form(void);
  692.     void Init(const string& url, EMethod method = eGet);
  693.     void AddHidden(const string& name, const string& value);
  694.     void AddHidden(const string& name, int value);
  695. };
  696. // <legend> tag.
  697. class NCBI_XHTML_EXPORT CHTML_legend : public CHTMLElement
  698. {
  699.     typedef CHTMLElement CParent;
  700. public:
  701.     CHTML_legend(const string& legend);
  702.     CHTML_legend(CHTMLNode* legend);
  703.     ~CHTML_legend(void);
  704. };
  705. // <fieldset> tag.
  706. class NCBI_XHTML_EXPORT CHTML_fieldset : public CHTMLElement
  707. {
  708.     typedef CHTMLElement CParent;
  709. public:
  710.     CHTML_fieldset(void);
  711.     CHTML_fieldset(const string& legend);
  712.     CHTML_fieldset(CHTML_legend* legend);
  713.     ~CHTML_fieldset(void);
  714. };
  715. // <label> tag.
  716. class NCBI_XHTML_EXPORT CHTML_label : public CHTMLInlineElement
  717. {
  718.     typedef CHTMLInlineElement CParent;
  719. public:
  720.     CHTML_label(const string& text);
  721.     CHTML_label(const string& text, const string& idRef);
  722.     ~CHTML_label(void);
  723.     void SetFor(const string& idRef);
  724. };
  725. // <textarea> tag.
  726. class NCBI_XHTML_EXPORT CHTML_textarea : public CHTMLElement
  727. {
  728.     typedef CHTMLElement CParent;
  729. public:
  730.     CHTML_textarea(const string& name, int cols, int rows);
  731.     CHTML_textarea(const string& name, int cols, int rows,
  732.                    const string& value);
  733.     ~CHTML_textarea(void);
  734. };
  735. // <input> tag.
  736. class NCBI_XHTML_EXPORT CHTML_input : public CHTMLOpenElement
  737. {
  738.     typedef CHTMLOpenElement CParent;
  739. public:
  740.     CHTML_input(const char* type, const string& name);
  741.     ~CHTML_input(void);
  742. };
  743. // <input type=checkbox> tag.
  744. class NCBI_XHTML_EXPORT CHTML_checkbox : public CHTML_input
  745. {
  746.     typedef CHTML_input CParent;
  747.     static const char sm_InputType[];
  748. public:
  749.     CHTML_checkbox(const string& name);
  750.     CHTML_checkbox(const string& name, bool checked,
  751.                    const string& description = kEmptyStr);
  752.     CHTML_checkbox(const string& name, const string& value);
  753.     CHTML_checkbox(const string& name, const string& value,
  754.                    bool checked, const string& description = kEmptyStr);
  755.     ~CHTML_checkbox(void);
  756. };
  757. // <input type=hidden> tag.
  758. class NCBI_XHTML_EXPORT CHTML_hidden : public CHTML_input
  759. {
  760.     typedef CHTML_input CParent;
  761.     static const char sm_InputType[];
  762. public:
  763.     CHTML_hidden(const string& name, const string& value);
  764.     CHTML_hidden(const string& name, int value);
  765.     ~CHTML_hidden(void);
  766. };
  767. // <input type=image> tag.
  768. class NCBI_XHTML_EXPORT CHTML_image : public CHTML_input
  769. {
  770.     typedef CHTML_input CParent;
  771.     static const char sm_InputType[];
  772. public:
  773.     CHTML_image(const string& name, const string& src, 
  774.                 const string& alt = kEmptyStr);
  775.     CHTML_image(const string& name, const string& src, int border,
  776.                 const string& alt = kEmptyStr);
  777.     ~CHTML_image(void);
  778. };
  779. // <input type=radio> tag.
  780. class NCBI_XHTML_EXPORT CHTML_radio : public CHTML_input
  781. {
  782.     typedef CHTML_input CParent;
  783.     static const char sm_InputType[];
  784. public:
  785.     CHTML_radio(const string& name, const string& value);
  786.     CHTML_radio(const string& name, const string& value,
  787.                 bool checked, const string& description = kEmptyStr);
  788.     ~CHTML_radio(void);
  789. };
  790. // <input type=text> tag.
  791. class NCBI_XHTML_EXPORT CHTML_reset : public CHTML_input
  792. {
  793.     typedef CHTML_input CParent;
  794.     static const char sm_InputType[];
  795. public:
  796.     CHTML_reset(const string& label = kEmptyStr);
  797.     ~CHTML_reset(void);
  798. };
  799. // <input type=submit> tag.
  800. class NCBI_XHTML_EXPORT CHTML_submit : public CHTML_input
  801. {
  802.     typedef CHTML_input CParent;
  803.     static const char sm_InputType[];
  804. public:
  805.     CHTML_submit(const string& name);
  806.     CHTML_submit(const string& name, const string& label);
  807.     ~CHTML_submit(void);
  808. };
  809. // <button> tag.
  810. /*
  811.   commented out because it's not supported in most browsers
  812.   class CHTML_button : public CHTMLElement
  813.   {
  814.   typedef CHTMLElement CParent;
  815.   public:
  816.   enum EButtonType {
  817.   eSubmit,
  818.   eReset,
  819.   eButton
  820.   };
  821.   CHTML_button(const string& text, EButtonType type);
  822.   CHTML_button(CNCBINode* contents, EButtonType type);
  823.   CHTML_button(const string& text, const string& name,
  824.   const string& value = kEmptyStr);
  825.   CHTML_button(CNCBINode* contents, const string& name,
  826.   const string& value = kEmptyStr);
  827.   ~CHTML_button(void);
  828.   CHTML_button* SetType(EButtonType type);
  829.   CHTML_button* SetSubmit(const string& name,
  830.   const string& value = kEmptyStr);
  831.   };
  832. */
  833. // <input type=text> tag.
  834. class NCBI_XHTML_EXPORT CHTML_text : public CHTML_input
  835. {
  836.     typedef CHTML_input CParent;
  837.     static const char sm_InputType[];
  838. public:
  839.     CHTML_text(const string& name,
  840.                const string& value = kEmptyStr);
  841.     CHTML_text(const string& name, int size,
  842.                const string& value = kEmptyStr);
  843.     CHTML_text(const string& name, int size, int maxlength,
  844.                const string& value = kEmptyStr);
  845.     ~CHTML_text(void);
  846. };
  847. // <input type=file> tag.
  848. class NCBI_XHTML_EXPORT CHTML_file : public CHTML_input
  849. {
  850.     typedef CHTML_input CParent;
  851.     static const char sm_InputType[];
  852. public:
  853.     CHTML_file(const string& name, const string& value = kEmptyStr);
  854.     ~CHTML_file(void);
  855. };
  856. // <select> tag.
  857. class NCBI_XHTML_EXPORT CHTML_select : public CHTMLElement
  858. {
  859.     typedef CHTMLElement CParent;
  860.     static const char sm_TagName[];
  861. public:
  862.     CHTML_select(const string& name, bool multiple = false);
  863.     CHTML_select(const string& name, int size, bool multiple = false);
  864.     ~CHTML_select(void);
  865.     // Return 'this' to allow chained AppendOption().
  866.     CHTML_select* AppendOption(const string& value, bool selected = false);
  867.     CHTML_select* AppendOption(const string& value, const char* label,
  868.                                bool selected = false);
  869.     CHTML_select* AppendOption(const string& value, const string& label,
  870.                                bool selected = false);
  871.     CHTML_select* SetMultiple(void);
  872. };
  873. // <option> tag. Rarely used alone. See <select> tag.
  874. class NCBI_XHTML_EXPORT CHTML_option : public CHTMLElement
  875. {
  876.     typedef CHTMLElement CParent;
  877.     static const char sm_TagName[];
  878. public:
  879.     CHTML_option(const string& value, bool selected = false);
  880.     CHTML_option(const string& value, const char* label,
  881.                  bool selected = false);
  882.     CHTML_option(const string& value, const string& label,
  883.                  bool selected = false);
  884.     ~CHTML_option(void);
  885.     CHTML_option* SetValue(const string& value);
  886.     CHTML_option* SetSelected(void);
  887. };
  888. // <a> tag.
  889. class NCBI_XHTML_EXPORT CHTML_a : public CHTMLInlineElement
  890. {
  891.     typedef CHTMLInlineElement CParent;
  892.     static const char sm_TagName[];
  893. public:
  894.     CHTML_a(void);
  895.     CHTML_a(const string& href);
  896.     CHTML_a(const string& href, const char* text);
  897.     CHTML_a(const string& href, const string& text);
  898.     CHTML_a(const string& href, CNCBINode* node);
  899.     ~CHTML_a(void);
  900.     CHTML_a* SetHref(const string& href);
  901. };
  902. // <br> tag (break).
  903. class NCBI_XHTML_EXPORT CHTML_br : public CHTMLOpenElement
  904. {
  905.     typedef CHTMLOpenElement CParent;
  906.     static const char sm_TagName[];
  907. public:
  908.     CHTML_br(void);
  909.     // create "number" of <br> tags
  910.     CHTML_br(int number);
  911.     ~CHTML_br(void);
  912.     virtual CNcbiOstream& PrintBegin(CNcbiOstream &, TMode mode);
  913. };
  914. // <img> tag.
  915. class NCBI_XHTML_EXPORT CHTML_img : public CHTMLOpenElement
  916. {
  917.     typedef CHTMLOpenElement CParent;
  918. public:
  919.     CHTML_img(const string& url, const string& alt = kEmptyStr);
  920.     CHTML_img(const string& url, int width, int height, 
  921.               const string& alt = kEmptyStr);
  922.     ~CHTML_img(void);
  923. };
  924. // <dl> tag.
  925. class NCBI_XHTML_EXPORT CHTML_dl : public CHTMLElement
  926. {
  927.     typedef CHTMLElement CParent;
  928.     static const char sm_TagName[];
  929. public:
  930.     CHTML_dl(bool compact = false);
  931.     ~CHTML_dl(void);
  932.     // Return 'this' to allow chained AppendTerm().
  933.     CHTML_dl* AppendTerm(const string& term, CNCBINode* definition = 0);
  934.     CHTML_dl* AppendTerm(const string& term, const string& definition);
  935.     CHTML_dl* AppendTerm(CNCBINode* term, CNCBINode* definition = 0);
  936.     CHTML_dl* AppendTerm(CNCBINode* term, const string& definition);
  937.     CHTML_dl* SetCompact(void);
  938. };
  939. // <ol> tag.
  940. class NCBI_XHTML_EXPORT CHTML_ol : public CHTMLListElement
  941. {
  942.     typedef CHTMLListElement CParent;
  943.     static const char sm_TagName[];
  944. public:
  945.     CHTML_ol(bool compact = false);
  946.     CHTML_ol(const char* type, bool compact = false);
  947.     CHTML_ol(const string& type, bool compact = false);
  948.     CHTML_ol(int start, bool compact = false);
  949.     CHTML_ol(int start, const char* type, bool compact = false);
  950.     CHTML_ol(int start, const string& type, bool compact = false);
  951.     ~CHTML_ol(void);
  952.     CHTML_ol* SetStart(int start);
  953. };
  954. // <ul> tag.
  955. class NCBI_XHTML_EXPORT CHTML_ul : public CHTMLListElement
  956. {
  957.     typedef CHTMLListElement CParent;
  958.     static const char sm_TagName[];
  959. public:
  960.     CHTML_ul(bool compact = false);
  961.     CHTML_ul(const char* type, bool compact = false);
  962.     CHTML_ul(const string& type, bool compact = false);
  963.     ~CHTML_ul(void);
  964. };
  965. // <dir> tag.
  966. class NCBI_XHTML_EXPORT CHTML_dir : public CHTMLListElement
  967. {
  968.     typedef CHTMLListElement CParent;
  969.     static const char sm_TagName[];
  970. public:
  971.     CHTML_dir(bool compact = false);
  972.     CHTML_dir(const char* type, bool compact = false);
  973.     CHTML_dir(const string& type, bool compact = false);
  974.     ~CHTML_dir(void);
  975. };
  976. // <menu> tag.
  977. class NCBI_XHTML_EXPORT CHTML_menu : public CHTMLListElement
  978. {
  979.     typedef CHTMLListElement CParent;
  980.     static const char sm_TagName[];
  981. public:
  982.     CHTML_menu(bool compact = false);
  983.     CHTML_menu(const char* type, bool compact = false);
  984.     CHTML_menu(const string& type, bool compact = false);
  985.     ~CHTML_menu(void);
  986. };
  987. // <font> tag.
  988. class NCBI_XHTML_EXPORT CHTML_font : public CHTMLInlineElement
  989. {
  990.     typedef CHTMLInlineElement CParent;
  991.     static const char sm_TagName[];
  992. public:
  993.     CHTML_font(void);
  994.     CHTML_font(int size,
  995.                CNCBINode* node = 0);
  996.     CHTML_font(int size,
  997.                const char* text);
  998.     CHTML_font(int size,
  999.                const string& text);
  1000.     CHTML_font(int size, bool absolute,
  1001.                CNCBINode* node = 0);
  1002.     CHTML_font(int size, bool absolute,
  1003.                const string& text);
  1004.     CHTML_font(int size, bool absolute,
  1005.                const char* text);
  1006.     CHTML_font(const string& typeface,
  1007.                CNCBINode* node = 0);
  1008.     CHTML_font(const string& typeface,
  1009.                const string& text);
  1010.     CHTML_font(const string& typeface,
  1011.                const char* text);
  1012.     CHTML_font(const string& typeface, int size,
  1013.                CNCBINode* node = 0);
  1014.     CHTML_font(const string& typeface, int size,
  1015.                const string& text);
  1016.     CHTML_font(const string& typeface, int size,
  1017.                const char* text);
  1018.     CHTML_font(const string& typeface, int size, bool absolute,
  1019.                CNCBINode* node = 0);
  1020.     CHTML_font(const string& typeface, int size, bool absolute,
  1021.                const string& text);
  1022.     CHTML_font(const string& typeface, int size, bool absolute,
  1023.                const char* text);
  1024.     ~CHTML_font(void);
  1025.     CHTML_font* SetTypeFace(const string& typeface);
  1026.     CHTML_font* SetFontSize(int size, bool absolute);
  1027.     CHTML_font* SetRelativeSize(int size);
  1028. };
  1029. class NCBI_XHTML_EXPORT CHTML_basefont : public CHTMLOpenElement
  1030. {
  1031.     typedef CHTMLOpenElement CParent;
  1032.     static const char sm_TagName[];
  1033. public:
  1034.     CHTML_basefont(int size);
  1035.     CHTML_basefont(const string& typeface);
  1036.     CHTML_basefont(const string& typeface, int size);
  1037.     ~CHTML_basefont(void);
  1038.     CHTML_basefont* SetTypeFace(const string& typeface);
  1039. };
  1040. class NCBI_XHTML_EXPORT CHTML_color : public CHTML_font
  1041. {
  1042.     typedef CHTML_font CParent;
  1043. public:
  1044.     CHTML_color(const string& color, CNCBINode* node = 0);
  1045.     CHTML_color(const string& color, const string& text);
  1046.     ~CHTML_color(void);
  1047. };
  1048. // <hr> tag.
  1049. class NCBI_XHTML_EXPORT CHTML_hr : public CHTMLOpenElement
  1050. {
  1051.     typedef CHTMLOpenElement CParent;
  1052.     static const char sm_TagName[];
  1053. public:
  1054.     CHTML_hr(bool noShade = false);
  1055.     CHTML_hr(int size, bool noShade = false);
  1056.     CHTML_hr(int size, int width, bool noShade = false);
  1057.     CHTML_hr(int size, const string& width, bool noShade = false);
  1058.     ~CHTML_hr(void);
  1059.     CHTML_hr* SetNoShade(void);
  1060.     CHTML_hr* SetNoShade(bool noShade);
  1061.     virtual CNcbiOstream& PrintBegin(CNcbiOstream &, TMode mode);
  1062. };
  1063. // <meta> tag.
  1064. class NCBI_XHTML_EXPORT CHTML_meta : public CHTMLOpenElement
  1065. {
  1066.     typedef CHTMLOpenElement CParent;
  1067.     static const char sm_TagName[];
  1068. public:
  1069.     enum EType {
  1070.         eName,
  1071.         eHttpEquiv
  1072.     }; 
  1073.     CHTML_meta(EType mtype, const string& var, const string& content);
  1074.     ~CHTML_meta(void);
  1075. };
  1076. // <scrpt> tag.
  1077. class NCBI_XHTML_EXPORT CHTML_script : public CHTMLElement
  1078. {
  1079.     typedef CHTMLElement CParent;
  1080.     static const char sm_TagName[];
  1081. public:
  1082.     CHTML_script(const string& stype);
  1083.     CHTML_script(const string& stype, const string& url);
  1084.     ~CHTML_script(void);
  1085.     CHTML_script* AppendScript(const string& script);
  1086. };
  1087. // Other tags (default implementation).
  1088. DECLARE_HTML_ELEMENT( head,       CHTMLElement);
  1089. DECLARE_HTML_ELEMENT( body,       CHTMLElement);
  1090. DECLARE_HTML_ELEMENT( base,       CHTMLElement);
  1091. DECLARE_HTML_ELEMENT( isindex,    CHTMLOpenElement);
  1092. DECLARE_HTML_ELEMENT( link,       CHTMLOpenElement);
  1093. DECLARE_HTML_ELEMENT( noscript,   CHTMLElement);
  1094. DECLARE_HTML_ELEMENT( object,     CHTMLElement);
  1095. DECLARE_HTML_ELEMENT( style,      CHTMLElement);
  1096. DECLARE_HTML_ELEMENT( title,      CHTMLElement);
  1097. DECLARE_HTML_ELEMENT( address,    CHTMLElement);
  1098. DECLARE_HTML_ELEMENT( blockquote, CHTMLBlockElement);
  1099. DECLARE_HTML_ELEMENT( center,     CHTMLElement);
  1100. DECLARE_HTML_ELEMENT( div,        CHTMLBlockElement);
  1101. DECLARE_HTML_ELEMENT( h1,         CHTMLBlockElement);
  1102. DECLARE_HTML_ELEMENT( h2,         CHTMLBlockElement);
  1103. DECLARE_HTML_ELEMENT( h3,         CHTMLBlockElement);
  1104. DECLARE_HTML_ELEMENT( h4,         CHTMLBlockElement);
  1105. DECLARE_HTML_ELEMENT( h5,         CHTMLBlockElement);
  1106. DECLARE_HTML_ELEMENT( h6,         CHTMLBlockElement);
  1107. DECLARE_HTML_ELEMENT( p,          CHTMLBlockElement);
  1108. DECLARE_HTML_ELEMENT( pnop,       CHTMLOpenElement);
  1109. DECLARE_HTML_ELEMENT( pre,        CHTMLBlockElement);
  1110. DECLARE_HTML_ELEMENT( dt,         CHTMLElement);
  1111. DECLARE_HTML_ELEMENT( dd,         CHTMLElement);
  1112. DECLARE_HTML_ELEMENT( li,         CHTMLBlockElement);
  1113. DECLARE_HTML_ELEMENT( caption,    CHTMLElement);
  1114. DECLARE_HTML_ELEMENT( col,        CHTMLElement);
  1115. DECLARE_HTML_ELEMENT( colgroup,   CHTMLElement);
  1116. DECLARE_HTML_ELEMENT( thead,      CHTMLElement);
  1117. DECLARE_HTML_ELEMENT( tbody,      CHTMLElement);
  1118. DECLARE_HTML_ELEMENT( tfoot,      CHTMLElement);
  1119. DECLARE_HTML_ELEMENT( th,         CHTML_tc);
  1120. DECLARE_HTML_ELEMENT( td,         CHTML_tc);
  1121. DECLARE_HTML_ELEMENT( applet,     CHTMLElement);
  1122. DECLARE_HTML_ELEMENT( param,      CHTMLOpenElement);
  1123. DECLARE_HTML_ELEMENT( cite,       CHTMLInlineElement);
  1124. DECLARE_HTML_ELEMENT( code,       CHTMLInlineElement);
  1125. DECLARE_HTML_ELEMENT( dfn,        CHTMLElement);
  1126. DECLARE_HTML_ELEMENT( em,         CHTMLInlineElement);
  1127. DECLARE_HTML_ELEMENT( kbd,        CHTMLInlineElement);
  1128. DECLARE_HTML_ELEMENT( samp,       CHTMLElement);
  1129. DECLARE_HTML_ELEMENT( strike,     CHTMLInlineElement);
  1130. DECLARE_HTML_ELEMENT( strong,     CHTMLInlineElement);
  1131. DECLARE_HTML_ELEMENT( var,        CHTMLInlineElement);
  1132. DECLARE_HTML_ELEMENT( b,          CHTMLInlineElement);
  1133. DECLARE_HTML_ELEMENT( big,        CHTMLInlineElement);
  1134. DECLARE_HTML_ELEMENT( i,          CHTMLInlineElement);
  1135. DECLARE_HTML_ELEMENT( s,          CHTMLInlineElement);
  1136. DECLARE_HTML_ELEMENT( small,      CHTMLInlineElement);
  1137. DECLARE_HTML_ELEMENT( sub,        CHTMLInlineElement);
  1138. DECLARE_HTML_ELEMENT( sup,        CHTMLInlineElement);
  1139. DECLARE_HTML_ELEMENT( tt,         CHTMLInlineElement);
  1140. DECLARE_HTML_ELEMENT( u,          CHTMLInlineElement);
  1141. DECLARE_HTML_ELEMENT( blink,      CHTMLInlineElement);
  1142. DECLARE_HTML_ELEMENT( span,       CHTMLInlineElement);
  1143. DECLARE_HTML_ELEMENT( map,        CHTMLElement);
  1144. DECLARE_HTML_ELEMENT( area,       CHTMLElement);
  1145. DECLARE_HTML_SPECIAL_CHAR( nbsp, " ");
  1146. DECLARE_HTML_SPECIAL_CHAR( gt,   ">");
  1147. DECLARE_HTML_SPECIAL_CHAR( lt,   "<");
  1148. DECLARE_HTML_SPECIAL_CHAR( quot, """);
  1149. DECLARE_HTML_SPECIAL_CHAR( amp,  "&");
  1150. DECLARE_HTML_SPECIAL_CHAR( copy, "(c)");
  1151. DECLARE_HTML_SPECIAL_CHAR( reg,  "(r)");
  1152. #include <html/html.inl>
  1153. END_NCBI_SCOPE
  1154. /* @} */
  1155. /*
  1156.  * ===========================================================================
  1157.  * $Log: html.hpp,v $
  1158.  * Revision 1000.5  2004/06/01 19:15:12  gouriano
  1159.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.75
  1160.  *
  1161.  * Revision 1.75  2004/04/05 15:50:49  ivanov
  1162.  * Cosmetic changes
  1163.  *
  1164.  * Revision 1.74  2004/04/01 14:14:01  lavr
  1165.  * Spell "occurred", "occurrence", and "occurring"
  1166.  *
  1167.  * Revision 1.73  2004/02/03 19:45:41  ivanov
  1168.  * Binded dummy names for the unnamed nodes
  1169.  *
  1170.  * Revision 1.72  2004/02/02 14:08:06  ivanov
  1171.  * Added export specifier to the macro for declare HTML classes
  1172.  *
  1173.  * Revision 1.71  2004/01/26 16:26:42  ivanov
  1174.  * Added NOWRAP attribute support
  1175.  *
  1176.  * Revision 1.70  2003/12/31 19:00:45  ivanov
  1177.  * Added default constructor for CHTML_a
  1178.  *
  1179.  * Revision 1.69  2003/12/02 14:18:52  ivanov
  1180.  * AttachPopupMenu() comment changes
  1181.  *
  1182.  * Revision 1.68  2003/11/05 18:41:06  dicuccio
  1183.  * Added export specifiers
  1184.  *
  1185.  * Revision 1.67  2003/11/03 17:02:53  ivanov
  1186.  * Some formal code rearrangement. Move log to end.
  1187.  *
  1188.  * Revision 1.66  2003/11/03 14:47:39  ivanov
  1189.  * Some formal code rearrangement
  1190.  *
  1191.  * Revision 1.65  2003/10/01 15:54:31  ivanov
  1192.  * Added comments for AttachPopupMenu
  1193.  *
  1194.  * Revision 1.64  2003/04/25 13:45:26  siyan
  1195.  * Added doxygen groupings
  1196.  *
  1197.  * Revision 1.63  2003/02/14 16:18:29  ucko
  1198.  * Override CHTMLListItem::PrintChildren (so we can indent them in text
  1199.  * mode); make <li> a block element for proper text display.
  1200.  *
  1201.  * Revision 1.62  2002/12/24 14:56:20  ivanov
  1202.  * Fix for R1.76:  HTML classes for tags <h1-6>, <p>, <div>. <pre>, <blockquote>
  1203.  * now inherits from CHTMLBlockElement (not CHTMElement as before)
  1204.  *
  1205.  * Revision 1.61  2002/12/20 19:19:30  ivanov
  1206.  * Added SPAN tag support
  1207.  *
  1208.  * Revision 1.60  2002/12/09 22:12:25  ivanov
  1209.  * Added support for Sergey Kurdin's popup menu.
  1210.  * Added CHTMLNode::AttachPopupMenu().
  1211.  *
  1212.  * Revision 1.59  2002/09/25 01:24:29  dicuccio
  1213.  * Added CHTMLHelper::StripTags() - strips HTML comments and tags from any
  1214.  * string
  1215.  *
  1216.  * Revision 1.58  2002/02/13 20:17:06  ivanov
  1217.  * Added support of dynamic popup menus. Changed EnablePopupMenu().
  1218.  *
  1219.  * Revision 1.57  2002/01/29 20:00:18  ivanov
  1220.  * (plain text) CHTML_table:: set def. medium sep. to " " instead of "t"
  1221.  *
  1222.  * Revision 1.56  2002/01/28 17:56:43  vakatov
  1223.  * (plain text) CHTML_table:: set def. medium sep. to "t" instead of "t|t"
  1224.  *
  1225.  * Revision 1.55  2002/01/17 23:39:35  ivanov
  1226.  * Added means to print HTML tables in plain text mode
  1227.  *
  1228.  * Revision 1.54  2001/08/14 16:51:33  ivanov
  1229.  * Change mean for init JavaScript popup menu & add it to HTML document.
  1230.  * Remove early redefined classes for tags HEAD and BODY.
  1231.  *
  1232.  * Revision 1.53  2001/07/16 19:45:22  ivanov
  1233.  * Changed default value for JS menu lib path in CHTML_html::InitPopupMenus().
  1234.  *
  1235.  * Revision 1.52  2001/07/16 13:54:42  ivanov
  1236.  * Added support JavaScript popups menu (jsmenu.[ch]pp)
  1237.  *
  1238.  * Revision 1.51  2001/06/08 19:01:41  ivanov
  1239.  * Added base classes: CHTMLDualNode, CHTMLSpecialChar
  1240.  *     (and based on it: CHTML_nbsp, _gt, _lt, _quot, _amp, _copy, _reg)
  1241.  * Added realization for tags <meta> (CHTML_meta) and <script> (CHTML_script)
  1242.  * Changed base class for tags LINK, PARAM, ISINDEX -> CHTMLOpenElement
  1243.  * Added tags: OBJECT, NOSCRIPT
  1244.  * Added attribute "alt" for CHTML_img
  1245.  * Added CHTMLComment::Print() for disable print html-comments in plaintext mode
  1246.  *
  1247.  * Revision 1.50  2001/06/05 15:36:10  ivanov
  1248.  * Added attribute "alt" to CHTML_image
  1249.  *
  1250.  * Revision 1.49  2001/05/17 14:55:24  lavr
  1251.  * Typos corrected
  1252.  *
  1253.  * Revision 1.48  2000/10/18 13:25:46  vasilche
  1254.  * Added missing constructors to CHTML_font.
  1255.  *
  1256.  * Revision 1.47  2000/09/27 14:11:10  vasilche
  1257.  * Newline 'n' will not be generated after tags LABEL, A, FONT, CITE, CODE, EM,
  1258.  * KBD, STRIKE STRONG, VAR, B, BIG, I, S, SMALL, SUB, SUP, TT, U and BLINK.
  1259.  *
  1260.  * Revision 1.46  2000/08/15 19:40:16  vasilche
  1261.  * Added CHTML_label::SetFor() method for setting HTML attribute FOR.
  1262.  *
  1263.  * Revision 1.45  2000/07/25 15:26:00  vasilche
  1264.  * Added newline symbols before table and after each table row in text mode.
  1265.  *
  1266.  * Revision 1.44  2000/07/18 19:08:48  vasilche
  1267.  * Fixed uninitialized members.
  1268.  * Fixed NextCell to advance to next cell.
  1269.  *
  1270.  * Revision 1.43  2000/07/18 17:21:34  vasilche
  1271.  * Added possibility to force output of empty attribute value.
  1272.  * Added caching to CHTML_table, now large tables work much faster.
  1273.  * Changed algorithm of emitting EOL symbols in html output.
  1274.  *
  1275.  * Revision 1.42  2000/07/12 16:37:37  vasilche
  1276.  * Added new HTML4 tags: LABEL, BUTTON, FIELDSET, LEGEND.
  1277.  * Added methods for setting common attributes: STYLE, ID, TITLE, ACCESSKEY.
  1278.  *
  1279.  * Revision 1.41  1999/12/28 21:01:03  vasilche
  1280.  * Fixed conflict on MS VC between bool and const string& arguments by
  1281.  * adding const char* argument.
  1282.  *
  1283.  * Revision 1.40  1999/12/28 18:55:28  vasilche
  1284.  * Reduced size of compiled object files:
  1285.  * 1. avoid inline or implicit virtual methods (especially destructors).
  1286.  * 2. avoid std::string's methods usage in inline methods.
  1287.  * 3. avoid string literals ("xxx") in inline methods.
  1288.  *
  1289.  * Revision 1.39  1999/10/29 18:28:53  vakatov
  1290.  * [MSVC]  bool vs. const string& arg confusion
  1291.  *
  1292.  * Revision 1.38  1999/10/28 13:40:29  vasilche
  1293.  * Added reference counters to CNCBINode.
  1294.  *
  1295.  * Revision 1.37  1999/08/20 16:14:36  golikov
  1296.  * 'non-<TR> tag' bug fixed
  1297.  *
  1298.  * Revision 1.36  1999/05/28 18:04:05  vakatov
  1299.  * CHTMLNode::  added attribute "CLASS"
  1300.  *
  1301.  * Revision 1.35  1999/05/20 16:49:11  pubmed
  1302.  * Changes for SaveAsText: all Print() methods get mode parameter that can be 
  1303.  * HTML or PlainText
  1304.  *
  1305.  * Revision 1.34  1999/05/10 17:01:11  vasilche
  1306.  * Fixed warning on Sun by renaming CHTML_font::SetSize() -> SetFontSize().
  1307.  *
  1308.  * Revision 1.33  1999/05/10 14:26:09  vakatov
  1309.  * Fixes to compile and link with the "egcs" C++ compiler under Linux
  1310.  *
  1311.  * Revision 1.32  1999/04/27 14:49:57  vasilche
  1312.  * Added FastCGI interface.
  1313.  * CNcbiContext renamed to CCgiContext.
  1314.  *
  1315.  * Revision 1.31  1999/04/22 14:20:10  vasilche
  1316.  * Now CHTML_select::AppendOption and CHTML_option constructor accept option
  1317.  * name always as first argument.
  1318.  *
  1319.  * Revision 1.30  1999/04/15 22:05:16  vakatov
  1320.  * Include NCBI C++ headers before the standard ones
  1321.  *
  1322.  * Revision 1.29  1999/04/15 19:48:16  vasilche
  1323.  * Fixed several warnings detected by GCC
  1324.  *
  1325.  * Revision 1.28  1999/04/08 19:00:24  vasilche
  1326.  * Added current cell pointer to CHTML_table
  1327.  *
  1328.  * Revision 1.27  1999/03/01 21:03:27  vasilche
  1329.  * Added CHTML_file input element.
  1330.  * Changed CHTML_form constructors.
  1331.  *
  1332.  * Revision 1.26  1999/02/26 21:03:30  vasilche
  1333.  * CAsnWriteNode made simple node. Use CHTML_pre explicitly.
  1334.  * Fixed bug in CHTML_table::Row.
  1335.  * Added CHTML_table::HeaderCell & DataCell methods.
  1336.  *
  1337.  * Revision 1.25  1999/02/02 17:57:46  vasilche
  1338.  * Added CHTML_table::Row(int row).
  1339.  * Linkbar now have equal image spacing.
  1340.  *
  1341.  * Revision 1.24  1999/01/28 21:58:05  vasilche
  1342.  * QueryBox now inherits from CHTML_table (not CHTML_form as before).
  1343.  * Use 'new CHTML_form("url", queryBox)' as replacement of old QueryBox.
  1344.  *
  1345.  * Revision 1.23  1999/01/28 16:58:58  vasilche
  1346.  * Added several constructors for CHTML_hr.
  1347.  * Added CHTMLNode::SetSize method.
  1348.  *
  1349.  * Revision 1.22  1999/01/25 19:34:14  vasilche
  1350.  * String arguments which are added as HTML text now treated as plain text.
  1351.  *
  1352.  * Revision 1.21  1999/01/21 21:12:54  vasilche
  1353.  * Added/used descriptions for HTML submit/select/text.
  1354.  * Fixed some bugs in paging.
  1355.  * 
  1356.  * Revision 1.20  1999/01/14 21:25:16  vasilche
  1357.  * Changed CPageList to work via form image input elements.
  1358.  *
  1359.  * Revision 1.19  1999/01/11 22:05:48  vasilche
  1360.  * Fixed CHTML_font size.
  1361.  * Added CHTML_image input element.
  1362.  *
  1363.  * Revision 1.18  1999/01/11 15:13:32  vasilche
  1364.  * Fixed CHTML_font size.
  1365.  * CHTMLHelper extracted to separate file.
  1366.  *
  1367.  * Revision 1.17  1999/01/07 16:41:53  vasilche
  1368.  * CHTMLHelper moved to separate file.
  1369.  * TagNames of CHTML classes ara available via s_GetTagName() static
  1370.  * method.
  1371.  * Input tag types ara available via s_GetInputType() static method.
  1372.  * Initial selected database added to CQueryBox.
  1373.  * Background colors added to CPagerBax & CSmallPagerBox.
  1374.  *
  1375.  * Revision 1.16  1999/01/05 21:47:10  vasilche
  1376.  * Added 'current page' to CPageList.
  1377.  * CPageList doesn't display forward/backward if empty.
  1378.  *
  1379.  * Revision 1.15  1999/01/04 20:06:09  vasilche
  1380.  * Redesigned CHTML_table.
  1381.  * Added selection support to HTML forms (via hidden values).
  1382.  *
  1383.  * Revision 1.13  1998/12/28 21:48:12  vasilche
  1384.  * Made Lewis's 'tool' compilable
  1385.  *
  1386.  * Revision 1.12  1998/12/28 16:48:05  vasilche
  1387.  * Removed creation of QueryBox in CHTMLPage::CreateView()
  1388.  * CQueryBox extends from CHTML_form
  1389.  * CButtonList, CPageList, CPagerBox, CSmallPagerBox extend from CNCBINode.
  1390.  *
  1391.  * Revision 1.11  1998/12/24 16:15:36  vasilche
  1392.  * Added CHTMLComment class.
  1393.  * Added TagMappers from static functions.
  1394.  *
  1395.  * Revision 1.10  1998/12/23 21:20:56  vasilche
  1396.  * Added more HTML tags (almost all).
  1397.  * Importent ones: all lists (OL, UL, DIR, MENU), fonts (FONT, BASEFONT).
  1398.  *
  1399.  * Revision 1.9  1998/12/23 14:28:07  vasilche
  1400.  * Most of closed HTML tags made via template.
  1401.  *
  1402.  * Revision 1.8  1998/12/21 22:24:56  vasilche
  1403.  * A lot of cleaning.
  1404.  *
  1405.  * Revision 1.7  1998/12/09 23:02:55  lewisg
  1406.  * update to new cgiapp class
  1407.  *
  1408.  * Revision 1.6  1998/12/08 00:34:55  lewisg
  1409.  * cleanup
  1410.  *
  1411.  * Revision 1.5  1998/12/03 22:49:10  lewisg
  1412.  * added HTMLEncode() and CHTML_img
  1413.  *
  1414.  * Revision 1.4  1998/12/01 19:09:05  lewisg
  1415.  * uses CCgiApplication and new page factory
  1416.  * ===========================================================================
  1417.  */
  1418. #endif  /* HTML___HTML__HPP */