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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: page.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/01 21:02:12  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_002] Dev-tree R1.35
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef HTML___PAGE__HPP
  10. #define HTML___PAGE__HPP
  11. /*  $Id: page.hpp,v 1000.2 2004/04/01 21:02: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 page.hpp 
  40. /// The HTML page.
  41. ///
  42. /// Defines class to generate HTML code from template file.
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbifile.hpp>
  45. #include <corelib/ncbi_limits.hpp>
  46. #include <html/html_exception.hpp>
  47. #include <html/html.hpp>
  48. #include <html/nodemap.hpp>
  49. #include <html/jsmenu.hpp>
  50. /** @addtogroup HTMLcomp
  51.  *
  52.  * @{
  53.  */
  54. BEGIN_NCBI_SCOPE
  55. // Forward declarations.
  56. class CCgiApplication;
  57. /////////////////////////////////////////////////////////////////////////////
  58. ///
  59. /// CHTMLBasicPage --
  60. ///
  61. /// The virtual base class.
  62. ///
  63. /// The main functionality is the turning on and off of sub HTML components
  64. /// via style bits and a creation function that orders sub components on
  65. /// the page. The ability to hold children and print HTML is inherited from
  66. /// CHTMLNode.
  67. class NCBI_XHTML_EXPORT CHTMLBasicPage: public CNCBINode
  68. {
  69.     /// Parent class.
  70.     typedef CNCBINode CParent;
  71.     typedef map<string, BaseTagMapper*> TTagMap;
  72. public: 
  73.     /// Default constructor.
  74.     CHTMLBasicPage(void);
  75.     /// Constructor.
  76.     CHTMLBasicPage(CCgiApplication* app, int style = 0);
  77.     /// Dectructor.
  78.     virtual ~CHTMLBasicPage(void);
  79.     virtual CCgiApplication* GetApplication(void) const;
  80.     virtual void SetApplication(CCgiApplication* App);
  81.     int  GetStyle(void) const;
  82.     void SetStyle(int style);
  83.     /// Resolve <@XXX@> tag.
  84.     virtual CNCBINode* MapTag(const string& name);
  85.     /// Add tag resolver.
  86.     virtual void AddTagMap(const string& name, BaseTagMapper* mapper);
  87.     virtual void AddTagMap(const string& name, CNCBINode*     node);
  88. protected:
  89.     CCgiApplication* m_CgiApplication;  ///< Pointer to runtime information
  90.     int              m_Style;
  91.     TMode            m_PrintMode;       ///< Current print mode
  92.                                         ///< (used by RepeatHook).
  93.     /// Tag resolvers (as registered by AddTagMap).
  94.     TTagMap m_TagMap;
  95. };
  96. /////////////////////////////////////////////////////////////////////////////
  97. ///
  98. /// CHTMLPage --
  99. ///
  100. /// This is the basic 3 section NCBI page.
  101. class NCBI_XHTML_EXPORT CHTMLPage : public CHTMLBasicPage
  102. {
  103.     /// Parent class.
  104.     typedef CHTMLBasicPage CParent;
  105. public:
  106.     /// Style flags.
  107.     enum EFlags {
  108.         fNoTITLE      = 0x1,
  109.         fNoVIEW       = 0x2,
  110.         fNoTEMPLATE   = 0x4
  111.     };
  112.     /// Binary AND of "EFlags".
  113.     typedef int TFlags;  
  114.     /// Constructors.
  115.     CHTMLPage(const string& title = kEmptyStr);
  116.     CHTMLPage(const string& title, const string&  template_file);
  117.     CHTMLPage(const string& title,
  118.               const void* template_buffer, size_t size);
  119.     CHTMLPage(const string& title, istream& template_stream);
  120.     // HINT: use SetTemplateString to read the page from ''-terminated string
  121.     CHTMLPage(CCgiApplication* app,
  122.               TFlags           style         = 0,
  123.               const string&    title         = kEmptyStr,
  124.               const string&    template_file = kEmptyStr);
  125.     static CHTMLBasicPage* New(void);
  126.     /// Create the individual sub pages.
  127.     virtual void CreateSubNodes(void);
  128.     /// Create the static part of the page
  129.     /// (here - read it from <m_TemplateFile>).
  130.     virtual CNCBINode* CreateTemplate(CNcbiOstream* out = 0,
  131.                                       TMode mode = eHTML);
  132.     /// Tag substitution callbacks.
  133.     virtual CNCBINode* CreateTitle(void);  // def for tag "@TITLE@" - <m_Title>
  134.     virtual CNCBINode* CreateView(void);   // def for tag "@VIEW@"  - none
  135.     /// To set title or template outside(after) the constructor.
  136.     void SetTitle(const string&  title);
  137.     /// Set source which contains the template.
  138.     ///
  139.     /// Each function assign new template source and annihilate any other.
  140.     /// installed before.
  141.     void SetTemplateFile  (const string&  template_file);
  142.     void SetTemplateString(const char*    template_string);
  143.     void SetTemplateBuffer(const void*    template_buffer, size_t size);
  144.     void SetTemplateStream(istream& template_stream);
  145.     /// Load template library.
  146.     ///
  147.     /// Automaticaly map all sub-templates from loaded library.
  148.     void LoadTemplateLibFile  (const string&  template_file);
  149.     void LoadTemplateLibString(const char*    template_string);
  150.     void LoadTemplateLibBuffer(const void*    template_buffer, size_t size);
  151.     void LoadTemplateLibStream(istream& template_stream);
  152.     /// Enable using popup menus. Set URL for popup menu library.
  153.     ///
  154.     /// @param type
  155.     ///   Menu type to enable
  156.     /// @param menu_script_url
  157.     ///   An URL for popup menu library.
  158.     ///   If "menu_lib_url" is not defined, then using default URL.
  159.     /// @param use_dynamic_menu
  160.     ///   Enable/disable using dynamic popup menus (eSmith menu only)
  161.     ///   (default it is disabled).
  162.     /// Note:
  163.     ///   - If we not change value "menu_script_url", namely use default
  164.     ///     value for it, then we can skip call this function.
  165.     ///   - Dynamic menues work only in new browsers. They use one container
  166.     ///     for all menus instead of separately container for each menu in 
  167.     ///     nondynamic mode. This parameter have effect only with eSmith
  168.     ///     menu type.
  169.     void EnablePopupMenu(CHTMLPopupMenu::EType type = CHTMLPopupMenu::eSmith,
  170.                          const string& menu_script_url= kEmptyStr,
  171.                          bool use_dynamic_menu = false);
  172.     /// Tag mappers. 
  173.     virtual void AddTagMap(const string& name, BaseTagMapper* mapper);
  174.     virtual void AddTagMap(const string& name, CNCBINode*     node);
  175.     // Overridden to reduce latency
  176.     CNcbiOstream& PrintChildren(CNcbiOstream& out, TMode mode);
  177. private:
  178.     void Init(void);
  179.     /// Create the static part of the page.
  180.     ///
  181.     /// This is an internal version that gets around some
  182.     /// issues with local versus externally-supplied streams.
  183.     CNCBINode* x_CreateTemplate(CNcbiIstream& is, CNcbiOstream* out,
  184.                                 TMode mode);
  185.     /// Load template library.
  186.     ///
  187.     /// This is an internal version that works only with streams.
  188.     /// @param is
  189.     ///   Menu type to enable
  190.     /// @param size
  191.     ///   Size of input, if known (0 otherwise).
  192.     /// @sa
  193.     ///   LoadTemplateLibFile(), LoadTemplateLibString(),
  194.     ///   LoadTemplateLibBuffer(), LoadTemplateLibStream()
  195.     void x_LoadTemplateLib(CNcbiIstream& is, size_t size = 0);
  196. private:
  197.     /// Generate page internal name on the base of template source.
  198.     /// Debug function used at output tag trace on exception.
  199.     void GeneratePageInternalName(const string& template_src);
  200. private:
  201.     string      m_Title;          ///< Page title
  202.     /// Template sources.
  203.     string      m_TemplateFile;   ///< File name
  204.     istream*    m_TemplateStream; ///< Stream
  205.     const void* m_TemplateBuffer; ///< Some buffer
  206.     size_t      m_TemplateSize;   ///< Size of input, if known (0 otherwise)
  207.     /// Popup menu info structure.
  208.     struct SPopupMenuInfo {
  209.         SPopupMenuInfo() {
  210.             m_UseDynamicMenu = false;
  211.         };
  212.         SPopupMenuInfo(const string& url, bool use_dynamic_menu) {
  213.             m_Url = url;
  214.             m_UseDynamicMenu = use_dynamic_menu;
  215.         }
  216.         string m_Url;             ///< Menu library URL 
  217.         bool   m_UseDynamicMenu;  ///< Dynamic/static. Only for eSmith type.
  218.     };
  219.     /// Popup menus usage info.
  220.     typedef map<CHTMLPopupMenu::EType, SPopupMenuInfo> TPopupMenus;
  221.     TPopupMenus m_PopupMenus;
  222.     bool        m_UsePopupMenus;
  223. };
  224. /* @} */
  225. /////////////////////////////////////////////////////////////////////////////
  226. //
  227. //  IMPLEMENTATION of INLINE functions
  228. //
  229. /////////////////////////////////////////////////////////////////////////////
  230. //
  231. //  CHTMLBasicPage::
  232. //
  233. inline CCgiApplication* CHTMLBasicPage::GetApplication(void) const
  234. {
  235.     return m_CgiApplication;
  236. }
  237. inline int CHTMLBasicPage::GetStyle(void) const
  238. {
  239.     return m_Style;
  240. }
  241. //
  242. //  CHTMLPage::
  243. //
  244. inline CHTMLBasicPage* CHTMLPage::New(void)
  245. {
  246.     return new CHTMLPage;
  247. }
  248. inline void CHTMLPage::SetTitle(const string& title)
  249. {
  250.     m_Title = title;
  251. }
  252. inline void CHTMLPage::SetTemplateString(const char* template_string)
  253. {
  254.     m_TemplateFile   = kEmptyStr;
  255.     m_TemplateStream = 0;
  256.     m_TemplateBuffer = template_string;
  257.     m_TemplateSize   = strlen(template_string);
  258.     GeneratePageInternalName("str");
  259. }
  260. inline void CHTMLPage::SetTemplateBuffer(const void* template_buffer,
  261.                                          size_t size)
  262. {
  263.     m_TemplateFile   = kEmptyStr;
  264.     m_TemplateStream = 0;
  265.     m_TemplateBuffer = template_buffer;
  266.     m_TemplateSize   = size;
  267.     GeneratePageInternalName("buf");
  268. }
  269. inline void CHTMLPage::SetTemplateStream(istream& template_stream)
  270. {
  271.     m_TemplateFile   = kEmptyStr;
  272.     m_TemplateStream = &template_stream;
  273.     m_TemplateBuffer = 0;
  274.     m_TemplateSize   = 0;
  275.     GeneratePageInternalName("stream");
  276. }
  277. inline void CHTMLPage::LoadTemplateLibString(const char* template_string)
  278. {
  279.     size_t size = strlen(template_string);
  280.     CNcbiIstrstream is(template_string, size);
  281.     x_LoadTemplateLib(is, size);
  282. }
  283. inline void CHTMLPage::LoadTemplateLibBuffer(const void* template_buffer,
  284.                                              size_t size)
  285. {
  286.     CNcbiIstrstream is((char*)template_buffer, size);
  287.     x_LoadTemplateLib(is, size);
  288. }
  289. inline void CHTMLPage::LoadTemplateLibStream(istream& template_stream)
  290. {
  291.     x_LoadTemplateLib(template_stream);
  292. }
  293. inline void CHTMLPage::GeneratePageInternalName(const string& template_src = kEmptyStr)
  294. {
  295.     m_Name = "htmlpage";
  296.     if ( !template_src.empty() ) {
  297.         m_Name += "(" + template_src + ")";
  298.     }
  299. }
  300. END_NCBI_SCOPE
  301. /*
  302.  * ===========================================================================
  303.  * $Log: page.hpp,v $
  304.  * Revision 1000.2  2004/04/01 21:02:12  gouriano
  305.  * PRODUCTION: UPGRADED [CORE_002] Dev-tree R1.35
  306.  *
  307.  * Revision 1.35  2004/02/04 17:15:10  ivanov
  308.  * Added debug function GeneratePageInternalName()
  309.  *
  310.  * Revision 1.34  2004/02/02 14:27:05  ivanov
  311.  * Added HTML template support
  312.  *
  313.  * Revision 1.33  2003/11/05 18:41:06  dicuccio
  314.  * Added export specifiers
  315.  *
  316.  * Revision 1.32  2003/10/02 18:16:46  ivanov
  317.  * Get rid of compilation warnings; some formal code rearrangement
  318.  *
  319.  * Revision 1.31  2003/10/01 15:53:11  ivanov
  320.  * Formal code rearrangement
  321.  *
  322.  * Revision 1.30  2003/07/08 17:12:40  gouriano
  323.  * changed thrown exceptions to CException-derived ones
  324.  *
  325.  * Revision 1.29  2003/05/23 17:34:10  ucko
  326.  * CHTMLPage::SetTemplateFile: fix logic for setting m_TemplateSize.
  327.  *
  328.  * Revision 1.28  2003/05/14 21:53:02  ucko
  329.  * Adjust interface to allow automatic streaming of large templates when
  330.  * not using JavaScript menus.
  331.  *
  332.  * Revision 1.27  2003/05/13 15:44:19  ucko
  333.  * Make reading large templates more efficient.
  334.  *
  335.  * Revision 1.26  2003/04/25 13:45:37  siyan
  336.  * Added doxygen groupings
  337.  *
  338.  * Revision 1.25  2002/12/09 22:12:45  ivanov
  339.  * Added support for Sergey Kurdin's popup menu.
  340.  *
  341.  * Revision 1.24  2002/09/11 16:07:32  dicuccio
  342.  * added x_CreateTemplate()
  343.  * moved cvs log to the bottom of the page
  344.  *
  345.  * Revision 1.23  2002/08/09 21:12:15  ivanov
  346.  * Added stuff to read template from a stream and string
  347.  *
  348.  * Revision 1.22  2002/02/13 20:17:06  ivanov
  349.  * Added support of dynamic popup menus. Changed EnablePopupMenu().
  350.  *
  351.  * Revision 1.21  2001/08/14 16:57:14  ivanov
  352.  * Added support for work HTML templates with JavaScript popup menu.
  353.  * Renamed type Flags -> ETypes. Moved all code from "page.inl" to header file.
  354.  *
  355.  * Revision 1.20  1999/10/28 13:40:31  vasilche
  356.  * Added reference counters to CNCBINode.
  357.  *
  358.  * Revision 1.19  1999/05/28 16:32:11  vasilche
  359.  * Fixed memory leak in page tag mappers.
  360.  *
  361.  * Revision 1.18  1999/04/27 14:49:59  vasilche
  362.  * Added FastCGI interface.
  363.  * CNcbiContext renamed to CCgiContext.
  364.  *
  365.  * Revision 1.17  1999/04/26 21:59:28  vakatov
  366.  * Cleaned and ported to build with MSVC++ 6.0 compiler
  367.  *
  368.  * Revision 1.16  1999/04/20 13:51:59  vasilche
  369.  * Removed unused parameter name to avoid warning.
  370.  *
  371.  * Revision 1.15  1999/04/19 20:11:47  vakatov
  372.  * CreateTagMapper() template definitions moved from "page.inl" to
  373.  * "page.hpp" because MSVC++ gets confused(cannot understand what
  374.  * is declaration and what is definition).
  375.  *
  376.  * Revision 1.14  1999/04/15 22:06:46  vakatov
  377.  * CQueryBox:: use "enum { kNo..., };" rather than "static const int kNo...;"
  378.  * Fixed "class BaseTagMapper" to "struct ..."
  379.  *
  380.  * Revision 1.13  1998/12/28 23:29:03  vakatov
  381.  * New CVS and development tree structure for the NCBI C++ projects
  382.  *
  383.  * Revision 1.12  1998/12/28 21:48:13  vasilche
  384.  * Made Lewis's 'tool' compilable
  385.  *
  386.  * Revision 1.11  1998/12/24 16:15:38  vasilche
  387.  * Added CHTMLComment class.
  388.  * Added TagMappers from static functions.
  389.  *
  390.  * Revision 1.10  1998/12/23 21:21:00  vasilche
  391.  * Added more HTML tags (almost all).
  392.  * Importent ones: all lists (OL, UL, DIR, MENU), fonts (FONT, BASEFONT).
  393.  *
  394.  * Revision 1.9  1998/12/22 16:39:12  vasilche
  395.  * Added ReadyTagMapper to map tags to precreated nodes.
  396.  *
  397.  * Revision 1.8  1998/12/21 22:24:59  vasilche
  398.  * A lot of cleaning.
  399.  *
  400.  * Revision 1.7  1998/12/11 22:53:41  lewisg
  401.  * added docsum page
  402.  *
  403.  * Revision 1.6  1998/12/11 18:13:51  lewisg
  404.  * frontpage added
  405.  *
  406.  * Revision 1.5  1998/12/09 23:02:56  lewisg
  407.  * update to new cgiapp class
  408.  *
  409.  * Revision 1.4  1998/12/09 17:27:44  sandomir
  410.  * tool should be changed to work with the new CCgiApplication
  411.  *
  412.  * Revision 1.2  1998/12/01 19:09:06  lewisg
  413.  * uses CCgiApplication and new page factory
  414.  *
  415.  * ===========================================================================
  416.  */
  417. #endif  /* HTML___PAGE__HPP */