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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: node.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/04/01 21:02:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_002] Dev-tree R1.26
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef HTML___NODE__HPP
  10. #define HTML___NODE__HPP
  11. /*  $Id: node.hpp,v 1000.3 2004/04/01 21:02:00 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 node.hpp 
  40. /// The standard node class.
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiobj.hpp>
  43. #include <map>
  44. #include <list>
  45. #include <memory>
  46. /** @addtogroup HTMLcomp
  47.  *
  48.  * @{
  49.  */
  50. BEGIN_NCBI_SCOPE
  51. class CNCBINode;
  52. typedef CRef<CNCBINode> CNodeRef;
  53. // Base class for a graph node.
  54. class NCBI_XHTML_EXPORT CNCBINode : public CObject
  55. {
  56. public:
  57.     friend class CRef<CNCBINode>;
  58.     typedef list<CNodeRef> TChildren;
  59. #if NCBI_LIGHTWEIGHT_LIST
  60.     typedef TChildren TChildrenMember;
  61. #else
  62.     typedef auto_ptr<TChildren> TChildrenMember;
  63. #endif
  64.     struct SAttributeValue
  65.     {
  66.         SAttributeValue(void)
  67.             : m_Optional(true)
  68.             {
  69.                 return;
  70.             }
  71.         SAttributeValue(const string& value, bool optional)
  72.             : m_Value(value), m_Optional(optional)
  73.             {
  74.                 return;
  75.             }
  76.         SAttributeValue& operator=(const string& value)
  77.             {
  78.                 m_Value = value;
  79.                 m_Optional = true;
  80.                 return *this;
  81.             }
  82.         const string& GetValue(void) const
  83.             {
  84.                 return m_Value;
  85.             }
  86.         operator const string&(void) const
  87.             {
  88.                 return m_Value;
  89.             }
  90.         bool IsOptional(void) const
  91.             {
  92.                 return m_Optional;
  93.             }
  94.         void SetOptional(bool optional = true)
  95.             {
  96.                 m_Optional = optional;
  97.             }
  98.     private:
  99.         string m_Value;
  100.         bool m_Optional;
  101.     };
  102.     typedef map<string, SAttributeValue, PNocase> TAttributes;
  103.     
  104.     enum EMode {
  105.         eHTML = 0,
  106.         ePlainText  = 1
  107.     };
  108.     class TMode {
  109.     public:
  110.         TMode(EMode mode = eHTML)
  111.             : m_Mode(mode), m_Node(0), m_Previous(0)
  112.             {
  113.                 return;
  114.             }
  115.         TMode(int mode)
  116.             : m_Mode(EMode(mode)), m_Node(0), m_Previous(0)
  117.             {
  118.                 return;
  119.             }
  120.         TMode(const TMode* mode, CNCBINode* node)
  121.             : m_Mode(mode->m_Mode), m_Node(node), m_Previous(mode)
  122.             {
  123.                 return;
  124.             }
  125.         operator EMode(void) const
  126.             {
  127.                 return m_Mode;
  128.             }
  129.         bool operator==(EMode mode) const
  130.             {
  131.                 return mode == m_Mode;
  132.             }
  133.         CNCBINode* GetNode(void) const
  134.             {
  135.                 return m_Node;
  136.             }
  137.         const TMode* GetPreviousContext(void) const
  138.             {
  139.                 return m_Previous;
  140.             }
  141.     private:
  142.         // to avoid allocation in 
  143.         EMode m_Mode;
  144.         CNCBINode* m_Node;
  145.         const TMode* m_Previous;
  146.     };
  147.     // 'structors
  148.     CNCBINode(void);
  149.     CNCBINode(const string& name);
  150.     CNCBINode(const char* name);
  151.     virtual ~CNCBINode();
  152.     // Add a Node * to the end of m_Children.
  153.     // Returns 'this' for chained AppendChild().
  154.     CNCBINode* AppendChild(CNCBINode* child);
  155.     CNCBINode* AppendChild(CNodeRef& ref);
  156.     void RemoveAllChildren(void);
  157.     // All child operations (except AppendChild) are valid only if
  158.     // have children return true
  159.     bool HaveChildren(void) const;
  160.     TChildren& Children(void);
  161.     const TChildren& Children(void) const;
  162.     TChildren::iterator ChildBegin(void);
  163.     TChildren::iterator ChildEnd(void);
  164.     static CNCBINode* Node(TChildren::iterator i);
  165.     TChildren::const_iterator ChildBegin(void) const;
  166.     TChildren::const_iterator ChildEnd(void) const;
  167.     static const CNCBINode* Node(TChildren::const_iterator i);
  168.     virtual CNcbiOstream& Print(CNcbiOstream& out, TMode mode = eHTML);
  169.     virtual CNcbiOstream& PrintBegin(CNcbiOstream& out, TMode mode);
  170.     virtual CNcbiOstream& PrintChildren(CNcbiOstream& out, TMode mode);
  171.     virtual CNcbiOstream& PrintEnd(CNcbiOstream& out, TMode mode);
  172.     void    SetRepeatCount(size_t count = 0);
  173.     size_t  GetRepeatCount(void);
  174.     // This method will be called once before Print().
  175.     virtual void CreateSubNodes(void);
  176.     // Call CreateSubNodes() if it's not called yet.
  177.     void Initialize(void);
  178.     // Find and replace text with a node.
  179.     virtual CNCBINode* MapTag(const string& tagname);
  180.     CNodeRef MapTagAll(const string& tagname, const TMode& mode);
  181.     // Repeat tag node (works only inside tag node mappers)
  182.     void RepeatTag(bool enable = true);
  183.     bool NeedRepeatTag(void);
  184.     const string& GetName(void) const;
  185.     bool HaveAttributes(void) const;
  186.     TAttributes& Attributes(void);
  187.     const TAttributes& Attributes(void) const;
  188.     // Retrieve attribute.
  189.     bool HaveAttribute(const string& name) const;
  190.     const string& GetAttribute(const string& name) const;
  191.     bool AttributeIsOptional(const string& name) const;
  192.     bool AttributeIsOptional(const char* name) const;
  193.     void SetAttributeOptional(const string& name, bool optional = true);
  194.     void SetAttributeOptional(const char* name, bool optional = true);
  195.     const string* GetAttributeValue(const string& name) const;
  196.     // Set attribute.
  197.     void SetAttribute(const string& name, const string& value);
  198.     void SetAttribute(const string& name);
  199.     void SetAttribute(const string& name, int value);
  200.     void SetOptionalAttribute(const string& name, const string& value);
  201.     void SetOptionalAttribute(const string& name, bool set);
  202.     void SetAttribute(const char* name, const string& value);
  203.     void SetAttribute(const char* name);
  204.     void SetAttribute(const char* name, int value);
  205.     void SetOptionalAttribute(const char* name, const string& value);
  206.     void SetOptionalAttribute(const char* name, bool set);
  207.     // Exception handling.
  208.     /// Flags defining how to catch and process exceptions.
  209.     /// By default flags are unsettled.
  210.     /// Note that without the fCatchAll flag only CHTMLExceptions and
  211.     /// all derived exceptons can be traced.
  212.     enum EExceptionFlags {
  213.         fAddTrace              = 0x1, ///< Enable tag trace.
  214.         fCatchAll              = 0x2, ///< Catch all other exceptions and
  215.                                       ///< rethrow CHTMLException.
  216.         fDisableCheckRecursion = 0x4  ///< Disable to throw exception if
  217.                                       ///<  nodes tree have endless recursion.
  218.     };
  219.     typedef int TExceptionFlags;      ///< Binary OR of "EExceptionFlags"
  220.     // Set/get global exception handling flags.
  221.     static void SetExceptionFlags(TExceptionFlags flags);
  222.     static TExceptionFlags GetExceptionFlags(void);
  223. protected:
  224.     virtual void DoAppendChild(CNCBINode* child);
  225.     virtual void DoSetAttribute(const string& name,
  226.                                 const string& value, bool optional);
  227.     bool            m_CreateSubNodesCalled;
  228.     TChildrenMember m_Children;         ///< Child nodes
  229.     string          m_Name;             ///< Node name
  230.     size_t          m_RepeatCount;      ///< How many times repeat node
  231.     // Repeat tag flag (used only inside tag node mappers hooks). See RepeatTag().
  232.     bool            m_RepeatTag; 
  233.                                       
  234.                                          
  235.                                             
  236.     // Attributes, e.g. href="link.html"
  237.     auto_ptr<TAttributes> m_Attributes;     
  238. private:
  239.     // To prevent copy constructor.
  240.     CNCBINode(const CNCBINode& node);
  241.     // To prevent assignment operator.
  242.     CNCBINode& operator=(const CNCBINode& node);
  243.     // Return children list (create if needed).
  244.     TChildren& GetChildren(void);
  245.     // Return attributes map (create if needed).
  246.     TAttributes& GetAttributes(void);
  247. };
  248. // Inline functions are defined here:
  249. #include <html/node.inl>
  250. END_NCBI_SCOPE
  251. /* @} */
  252. /*
  253.  * ===========================================================================
  254.  * $Log: node.hpp,v $
  255.  * Revision 1000.3  2004/04/01 21:02:00  gouriano
  256.  * PRODUCTION: UPGRADED [CORE_002] Dev-tree R1.26
  257.  *
  258.  * Revision 1.26  2004/03/18 12:28:15  ivanov
  259.  * Remove extra comma after last enum value in EExceptionFlags.
  260.  *
  261.  * Revision 1.25  2004/03/10 20:14:44  ivanov
  262.  * Added new exception flag fDisableCheckRecursion.
  263.  * By default endless nodes recursion check is enabled.
  264.  *
  265.  * Revision 1.24  2004/02/02 14:26:04  ivanov
  266.  * CNCBINode: added ability to repeat stored context
  267.  *
  268.  * Revision 1.23  2003/12/23 17:58:51  ivanov
  269.  * Added exception tracing
  270.  *
  271.  * Revision 1.22  2003/11/05 18:41:06  dicuccio
  272.  * Added export specifiers
  273.  *
  274.  * Revision 1.21  2003/11/03 17:02:53  ivanov
  275.  * Some formal code rearrangement. Move log to end.
  276.  *
  277.  * Revision 1.20  2003/04/25 13:45:33  siyan
  278.  * Added doxygen groupings
  279.  *
  280.  * Revision 1.19  2001/05/17 14:55:37  lavr
  281.  * Typos corrected
  282.  *
  283.  * Revision 1.18  2000/12/12 14:38:37  vasilche
  284.  * Changed the way CHTMLNode::CreateSubNodes() is called.
  285.  *
  286.  * Revision 1.17  2000/07/18 17:21:34  vasilche
  287.  * Added possibility to force output of empty attribute value.
  288.  * Added caching to CHTML_table, now large tables work much faster.
  289.  * Changed algorithm of emitting EOL symbols in html output.
  290.  *
  291.  * Revision 1.16  2000/03/29 15:50:38  vasilche
  292.  * Added const version of CRef - CConstRef.
  293.  * CRef and CConstRef now accept classes inherited from CObject.
  294.  *
  295.  * Revision 1.15  2000/03/07 15:40:37  vasilche
  296.  * Added AppendChild(CNodeRef&)
  297.  *
  298.  * Revision 1.14  2000/03/07 15:26:06  vasilche
  299.  * Removed second definition of CRef.
  300.  *
  301.  * Revision 1.13  1999/12/28 18:55:29  vasilche
  302.  * Reduced size of compiled object files:
  303.  * 1. avoid inline or implicit virtual methods (especially destructors).
  304.  * 2. avoid std::string's methods usage in inline methods.
  305.  * 3. avoid string literals ("xxx") in inline methods.
  306.  *
  307.  * Revision 1.12  1999/11/19 15:45:32  vasilche
  308.  * CNodeRef implemented as CRef<CNCBINode>
  309.  *
  310.  * Revision 1.11  1999/10/28 13:40:30  vasilche
  311.  * Added reference counters to CNCBINode.
  312.  *
  313.  * Revision 1.10  1999/05/28 16:32:09  vasilche
  314.  * Fixed memory leak in page tag mappers.
  315.  *
  316.  * Revision 1.9  1999/05/20 16:49:13  pubmed
  317.  * Changes for SaveAsText: all Print() methods get mode parameter that can be HTML or PlainText
  318.  *
  319.  * Revision 1.8  1999/01/04 20:06:11  vasilche
  320.  * Redesigned CHTML_table.
  321.  * Added selection support to HTML forms (via hidden values).
  322.  *
  323.  * Revision 1.7  1998/12/28 20:29:13  vakatov
  324.  * New CVS and development tree structure for the NCBI C++ projects
  325.  *
  326.  * Revision 1.6  1998/12/23 21:20:58  vasilche
  327.  * Added more HTML tags (almost all).
  328.  * Importent ones: all lists (OL, UL, DIR, MENU), fonts (FONT, BASEFONT).
  329.  *
  330.  * Revision 1.5  1998/12/23 14:28:08  vasilche
  331.  * Most of closed HTML tags made via template.
  332.  *
  333.  * Revision 1.4  1998/12/21 22:24:57  vasilche
  334.  * A lot of cleaning.
  335.  *
  336.  * Revision 1.3  1998/11/23 23:47:50  lewisg
  337.  * *** empty log message ***
  338.  *
  339.  * Revision 1.2  1998/10/29 16:15:52  lewisg
  340.  * version 2
  341.  *
  342.  * Revision 1.1  1998/10/06 20:34:31  lewisg
  343.  * html library includes
  344.  *
  345.  * ===========================================================================
  346.  */ 
  347. #endif  /*  HTML___NODE__HPP */