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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: jsmenu.hpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 19:15:17  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.19
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef HTML___JSMENU__HPP
  10. #define HTML___JSMENU__HPP
  11. /*  $Id: jsmenu.hpp,v 1000.5 2004/06/01 19:15:17 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:  Vladimir Ivanov
  37.  *
  38.  */
  39. /// @file jsmenu.hpp 
  40. /// JavaScript popup menu support.
  41. #include <corelib/ncbistd.hpp>
  42. #include <html/node.hpp>
  43. /** @addtogroup HTMLcomp
  44.  *
  45.  * @{
  46.  */
  47. BEGIN_NCBI_SCOPE
  48. /// Popup menu attribute.
  49. ///
  50. /// If attribute not define for menu with function SetAttribute(), 
  51. /// then it have some default value dependent on menu type.
  52. /// All attributes have effect only for specified menu type, otherwise it
  53. /// will be ignored.
  54. ///
  55. /// NOTE: See documentation for detail attribute description.
  56. enum EHTML_PM_Attribute {
  57.     //
  58.     //  Old menu attributes
  59.     //  (used for compatibility with previous version only).
  60.     //
  61.     //                               Using by       Value example
  62.     //
  63.     //                               S  - eSmith 
  64.     //                               K  - eKurdin 
  65.     //                               KC - eKurdinConf
  66.     //                               KS - eKurdinSide
  67.     
  68.     eHTML_PM_enableTracker,          // S           "true"
  69.     eHTML_PM_disableHide,            // S      KS   "false"
  70.     eHTML_PM_menuWidth,              //        KS   "100"
  71.     eHTML_PM_peepOffset,             //        KS   "20"
  72.     eHTML_PM_topOffset,              //        KS   "10"
  73.     eHTML_PM_fontSize,               // S           "14"
  74.     eHTML_PM_fontWeigh,              // S           "plain"
  75.     eHTML_PM_fontFamily,             // S           "arial,helvetica"
  76.     eHTML_PM_fontColor,              // S           "black"
  77.     eHTML_PM_fontColorHilite,        // S           "#ffffff"
  78.     eHTML_PM_menuBorder,             // S           "1"
  79.     eHTML_PM_menuItemBorder,         // S           "0"
  80.     eHTML_PM_menuItemBgColor,        // S           "#cccccc"
  81.     eHTML_PM_menuLiteBgColor,        // S           "white"
  82.     eHTML_PM_menuBorderBgColor,      // S           "#777777"
  83.     eHTML_PM_menuHiliteBgColor,      // S           "#000084"
  84.     eHTML_PM_menuContainerBgColor,   // S           "#cccccc"
  85.     eHTML_PM_childMenuIcon,          // S           "images/arrows.gif"
  86.     eHTML_PM_childMenuIconHilite,    // S           "images/arrows2.gif"
  87.     eHTML_PM_bgColor,                // S K         "#555555"
  88.     eHTML_PM_titleColor,             //   K         "#FFFFFF"
  89.     eHTML_PM_borderColor,            //   K         "black"
  90.     eHTML_PM_alignH,                 //   K         "left" or "right"
  91.     eHTML_PM_alignV,                 //   K         "bottom" or "top"
  92.     //
  93.     //  New menu attributes.
  94.     //
  95.     // View
  96.     eHTML_PM_ColorTheme,               //     KC      Name of theme
  97.     eHTML_PM_ShowTitle,                //     KC      "yes" / "no"
  98.     eHTML_PM_ShowCloseIcon,            //             "yes" / "no"
  99.     eHTML_PM_HelpURL,                  //     KC      URL or JS code
  100.     eHTML_PM_HideTime,                 //     KC      Number of milliseconds
  101.     eHTML_PM_FreeText,                 //     KC      Some text or html
  102. /*
  103.     eHTML_PM_DisableHide,              //             
  104.     eHTML_PM_MenuWidth,                //             
  105.     eHTML_PM_PeepOffset,               //             
  106.     eHTML_PM_TopOffset,                //             
  107. */
  108.     // Menu colors
  109.     eHTML_PM_BorderColor,              //     KC      Standard web color
  110.     eHTML_PM_BackgroundColor,          //   K KC      Standard web color
  111.     // Position
  112.     
  113.     eHTML_PM_AlignLR,                  //   K KC      "left" / "right"
  114.     eHTML_PM_AlignTB,                  //   K KC      "bottom" / "top"
  115.     eHTML_PM_AlignCenter,              //     KC      "yes" / "no"
  116.     // Title
  117.     eHTML_PM_TitleText,                //     KC      Title text
  118.     eHTML_PM_TitleColor,               //   K KC      Standard web color
  119.     eHTML_PM_TitleSize,                //     KC      "11" / "11px" / "11em"
  120.     eHTML_PM_TitleFont,                //     KC      Web fonts name(s)
  121.     eHTML_PM_TitleBackgroundColor,     //             Standard web color
  122.     eHTML_PM_TitleBackgroundImage,     //     KC      Path to image file
  123.     // Items
  124.     eHTML_PM_ItemColor,                //     KC      Standard web color
  125.     eHTML_PM_ItemColorActive,          //             Standard web color
  126.     eHTML_PM_ItemBackgroundColorActive,//     KC      Standard web color
  127.     eHTML_PM_ItemSize,                 //     KC      "11" / "11px" / "11em"
  128.     eHTML_PM_ItemFont,                 //     KC      Web fonts name(s)
  129.     eHTML_PM_ItemBulletImage,          //     KC      Path to image file
  130.     eHTML_PM_ItemBulletImageActive,    //             Path to image file
  131.     eHTML_PM_SeparatorColor            //     KC      Standard web color
  132. };
  133. /////////////////////////////////////////////////////////////////////////////
  134. ///
  135. /// CHTMLPopupMenu --
  136. ///
  137. /// Define for support JavaScript popup menues.
  138. ///
  139. /// For successful work menu in HTML pages next steps required:
  140. ///    - File with popup menu JavaScript library -- "*.js".
  141. ///      By default using menu with URL, defined in constant
  142. ///      kJSMenuDefaultURL*, defined in the jsmenu.cpp.
  143. ///    - Define menues and add it to HTML page (AppendChild()).
  144. ///    - Call EnablePopupMenu() (member function of CHTML_html and CHTMLPage).
  145. /// 
  146. /// NOTE: We must add menues to a BODY only, otherwise menu not will be work.
  147. /// NOTE: Menues of eKurdinSide type must be added (using AppendChild) only
  148. ///       to a HEAD node. And menu of this type must be only one on the page!
  149. class NCBI_XHTML_EXPORT CHTMLPopupMenu : public CNCBINode
  150. {
  151.     typedef CNCBINode CParent;
  152.     friend class CHTMLPage;
  153.     friend class CHTMLNode;
  154. public:
  155.     /// Popup menu type.
  156.     enum EType {
  157.         eSmith,             ///< Smith's menu (ncbi_menu*.js)
  158.         eKurdin,            ///< Sergey Kurdin's popup menu (popupmenu2*.js)
  159.         eKurdinConf,        ///< Sergey Kurdin's popup menu with configurations
  160.                             ///< (popupmenu2*.js, v2.5 and above)
  161.         eKurdinSide,        ///< Sergey Kurdin's side menu (sidemenu*.js)
  162.         ePMFirst = eSmith,
  163.         ePMLast  = eKurdinSide
  164.     };
  165.     /// Menu attribute type.
  166.     typedef map<EHTML_PM_Attribute, string> TAttributes;
  167.     /// Constructor.
  168.     ///
  169.     /// Construct menu with name "name" (JavaScript variable name).
  170.     CHTMLPopupMenu(const string& name, EType type = eSmith);
  171.     /// Destructor.
  172.     virtual ~CHTMLPopupMenu(void);
  173.     /// Get menu name.
  174.     string GetName(void) const;
  175.     /// Get menu type.
  176.     EType  GetType(void) const;
  177.     /// Add new item to current menu.
  178.     ///
  179.     /// NOTE: action - can be also URL type like "http://...".
  180.     /// NOTE: Parameters have some restrictions according to menu type:
  181.     ///       title  - can be text or HTML-code (for eSmith menu type only);
  182.     ///       color  - will be ignored for eKurdin menu type.
  183.     void AddItem(const string& title,                  ///< Text or HTML-code
  184.                  const string& action    = kEmptyStr,  ///< JS code
  185.                  const string& color     = kEmptyStr,
  186.                  const string& mouseover = kEmptyStr,  ///< JS code
  187.                  const string& mouseout  = kEmptyStr); ///< JS code
  188.     void AddItem(const char*   title,                  ///< Text or HTML-code
  189.                  const string& action    = kEmptyStr,  ///< JS code
  190.                  const string& color     = kEmptyStr,
  191.                  const string& mouseover = kEmptyStr,  ///< JS code
  192.                  const string& mouseout  = kEmptyStr); ///< JS code
  193.     /// NOTE: The "node" will be convert to a string inside function, so
  194.     ///       the node's Print() method must not change a node structure.
  195.     void AddItem(CNCBINode& node,
  196.                  const string& action    = kEmptyStr,  // JS code
  197.                  const string& color     = kEmptyStr,
  198.                  const string& mouseover = kEmptyStr,  // JS code
  199.                  const string& mouseout  = kEmptyStr); // JS code
  200.     /// Add item's separator.
  201.     ///
  202.     /// NOTE: parameter 'text' have effect only for eKurdinKC menu type.
  203.     void AddSeparator(const string& text = kEmptyStr); 
  204.     /// Set menu attribute.
  205.     void SetAttribute(EHTML_PM_Attribute attribute, const string& value);
  206.     /// Get attribute name.
  207.     string GetAttributeName(EHTML_PM_Attribute attribute) const;
  208.     static
  209.     string GetAttributeName(EHTML_PM_Attribute attribute, EType type);
  210.     /// Get attribute value.
  211.     string GetAttributeValue(EHTML_PM_Attribute attribute) const;
  212.     /// Set global menu attribute.
  213.     /// NOTE: Works only with eKurdinConf menu type.
  214.     static void SetAttributeGlobal(EHTML_PM_Attribute attribute,
  215.                                    const              string& value);
  216.     /// Get JavaScript code for menu call.
  217.     string ShowMenu(void) const;
  218.     /// Get JavaScript code for menu hide.
  219.     string HideMenu(void) const;
  220.     /// Use specified menu configuration (for eKurdinConf only).
  221.     /// NOTE: All attributes stated by SetAttribute() will be ignored.
  222.     void UseConfig(const string& name);
  223.     void DisableLocalConfig(bool disable = true);
  224.     /// Get HTML code for inserting into the end of the HEAD and BODY blocks.
  225.     /// If "menu_lib_url" is not defined, then use default URL.
  226.     /// NOTE: Parameters "use_dyn_menu" have effect only for eSmith menu
  227.     static string GetCodeHead(EType         type         = eSmith,
  228.                               const string& menu_lib_url = kEmptyStr);
  229.     static string GetCodeBody(EType         type         = eSmith,
  230.                               bool          use_dyn_menu = false);
  231.     /// Get string with JavaScript code for menu items
  232.     string GetCodeItems(void) const;
  233. private:
  234.     /// Print menu.
  235.     virtual CNcbiOstream& PrintBegin(CNcbiOstream& out, TMode mode);
  236.     /// Menu item type.
  237.     struct SItem {
  238.         /// Constructor for menu item.
  239.         SItem(const string& title, const string& action, const string& color,
  240.               const string& mouseover, const string& mouseout);
  241.         /// Constructor for separator.
  242.         SItem(void);
  243.         string title;      ///< Menu item title.
  244.         string action;     ///< JS action on press item.
  245.         string color;      ///< ? (not used in JSMenu script).
  246.         string mouseover;  ///< JS action on mouse over event for item.
  247.         string mouseout;   ///< JS action on mouse out event for item.
  248.     };
  249.     typedef list<SItem> TItems;
  250.     /// Get pointer to global attributes.
  251.     static TAttributes* GetGlobalAttributesPtr(void);
  252. private:
  253.     string       m_Name;   ///< Menu name
  254.     EType        m_Type;   ///< Menu type
  255.     TItems       m_Items;  ///< Menu items
  256.     TAttributes  m_Attrs;  ///< Menu attributes
  257.     // Name of local configuration for eKurdinConf menu type.
  258.     string       m_ConfigName; 
  259.     // Enable/disable local configuration for current menu.
  260.     bool         m_DisableLocalConfig; 
  261. };
  262. //=============================================================================
  263. //
  264. //  Inline
  265. //
  266. //=============================================================================
  267. inline 
  268. string CHTMLPopupMenu::GetName(void) const
  269. {
  270.     return m_Name;
  271. }
  272. inline 
  273. CHTMLPopupMenu::EType CHTMLPopupMenu::GetType(void) const
  274. {
  275.     return m_Type;
  276. }
  277. inline 
  278. void CHTMLPopupMenu::UseConfig(const string& name)
  279. {
  280.     m_ConfigName = name;
  281. }
  282. inline 
  283. string CHTMLPopupMenu::GetAttributeName(EHTML_PM_Attribute attribute) const
  284. {
  285.     return GetAttributeName(attribute, m_Type);
  286. }
  287. inline 
  288. void CHTMLPopupMenu::DisableLocalConfig(bool disable)
  289. {
  290.     m_DisableLocalConfig = disable;
  291. }
  292. END_NCBI_SCOPE
  293. /* @} */
  294. /*
  295.  * ===========================================================================
  296.  * $Log: jsmenu.hpp,v $
  297.  * Revision 1000.5  2004/06/01 19:15:17  gouriano
  298.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.19
  299.  *
  300.  * Revision 1.19  2004/05/05 13:55:40  ivanov
  301.  * + DisableLocalConfig()
  302.  *
  303.  * Revision 1.18  2004/04/05 16:19:46  ivanov
  304.  * Added support for Sergey Kurdin's popup menu with configurations
  305.  *
  306.  * Revision 1.17  2004/01/16 15:12:32  ivanov
  307.  * Minor cosmetic changes
  308.  *
  309.  * Revision 1.16  2003/12/18 20:14:21  golikov
  310.  * Added HideMenu
  311.  *
  312.  * Revision 1.15  2003/12/02 14:21:35  ivanov
  313.  * Remjved obsolete functions GetCodeBodyTag[Handler|Action]()
  314.  *
  315.  * Revision 1.14  2003/11/05 18:41:06  dicuccio
  316.  * Added export specifiers
  317.  *
  318.  * Revision 1.13  2003/11/03 17:02:53  ivanov
  319.  * Some formal code rearrangement. Move log to end.
  320.  *
  321.  * Revision 1.12  2003/10/02 18:16:46  ivanov
  322.  * Get rid of compilation warnings; some formal code rearrangement
  323.  *
  324.  * Revision 1.11  2003/10/01 15:55:04  ivanov
  325.  * Added support for Sergey Kurdin's side menu
  326.  *
  327.  * Revision 1.10  2003/04/25 13:45:32  siyan
  328.  * Added doxygen groupings
  329.  *
  330.  * Revision 1.9  2002/12/12 17:20:21  ivanov
  331.  * Renamed GetAttribute() -> GetMenuAttributeValue,
  332.  *         GetAttributeName() -> GetMenuAttributeName().
  333.  *
  334.  * Revision 1.8  2002/12/09 22:12:45  ivanov
  335.  * Added support for Sergey Kurdin's popup menu.
  336.  *
  337.  * Revision 1.7  2002/04/29 15:48:16  ucko
  338.  * Make CHTMLPopupMenu::GetName const for consistency with CNcbiNode (and
  339.  * because there's no reason for it not to be const).
  340.  *
  341.  * Revision 1.6  2002/02/13 20:15:39  ivanov
  342.  * Added support of dynamic popup menues. Changed GetCodeBody().
  343.  *
  344.  * Revision 1.5  2001/11/29 16:05:16  ivanov
  345.  * Changed using menu script name "menu.js" -> "ncbi_menu.js"
  346.  *
  347.  * Revision 1.4  2001/10/15 23:16:19  vakatov
  348.  * + AddItem(const char* title, ...) to avoid "string/CNCBINode" ambiguity
  349.  *
  350.  * Revision 1.3  2001/08/15 19:43:30  ivanov
  351.  * Added AddMenuItem( node, ...)
  352.  *
  353.  * Revision 1.2  2001/08/14 16:52:47  ivanov
  354.  * Changed parent class for CHTMLPopupMenu.
  355.  * Changed means for init JavaScript popup menu & add it to HTML document.
  356.  *
  357.  * Revision 1.1  2001/07/16 13:45:33  ivanov
  358.  * Initial revision
  359.  *
  360.  * ===========================================================================
  361.  */
  362. #endif  /* HTML___JSMENU__HPP */