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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: jsmenu.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:15:41  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: jsmenu.cpp,v 1000.4 2004/06/01 19:15:41 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Vladimir Ivanov
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <html/jsmenu.hpp>
  39. #include <html/html_exception.hpp>
  40. #include <corelib/ncbi_safe_static.hpp>
  41. BEGIN_NCBI_SCOPE
  42. // URL to menu library (default)
  43. // Smith's menu 
  44. const string kJSMenuDefaultURL_Smith
  45.  = "http://www.ncbi.nlm.nih.gov/corehtml/jscript/ncbi_menu_dnd.js";
  46. // Sergey Kurdin's popup menu
  47. const string kJSMenuDefaultURL_Kurdin
  48.  = "http://www.ncbi.nlm.nih.gov/coreweb/javascript/popupmenu2/popupmenu2_4.js";
  49. // Sergey Kurdin's popup menu with configurations
  50. const string kJSMenuDefaultURL_KurdinConf
  51.  = "http://www.ncbi.nlm.nih.gov/coreweb/javascript/popupmenu2/popupmenu2_5loader.js";
  52. // Sergey Kurdin's side menu
  53. const string kJSMenuDefaultURL_KurdinSide
  54.  = "http://www.ncbi.nlm.nih.gov/coreweb/javascript/sidemenu/sidemenu1.js";
  55. const string kJSMenuDefaultURL_KurdinSideCSS
  56.  = "http://www.ncbi.nlm.nih.gov/coreweb/styles/sidemenu.css"; 
  57. // ===========================================================================
  58. // MT Safe: Have individual copy of global attributes for each thread
  59. // Store menu global attributes in TLS (eKurdinConf menu type only)
  60. static CSafeStaticRef< CTls<CHTMLPopupMenu::TAttributes> > s_TlsGlobalAttrs;
  61. CHTMLPopupMenu::TAttributes* CHTMLPopupMenu::GetGlobalAttributesPtr(void)
  62. {
  63.     CHTMLPopupMenu::TAttributes* attrs = s_TlsGlobalAttrs->GetValue();
  64.     if ( !attrs ) {
  65.         attrs = new CHTMLPopupMenu::TAttributes; 
  66.         s_TlsGlobalAttrs->SetValue(attrs);
  67.     }
  68.     return attrs;
  69. }
  70. // ===========================================================================
  71.  
  72. CHTMLPopupMenu::CHTMLPopupMenu(const string& name, EType type)
  73. {
  74.     m_Name = name;
  75.     m_Type = type;
  76.     // Other menu-specific members (eKurdinConf)
  77.     m_ConfigName = kEmptyStr;
  78.     m_DisableLocalConfig = false;
  79. }
  80. CHTMLPopupMenu::~CHTMLPopupMenu(void)
  81. {
  82.     return;
  83. }
  84. CHTMLPopupMenu::SItem::SItem(const string& v_title, 
  85.                              const string& v_action, 
  86.                              const string& v_color,
  87.                              const string& v_mouseover, 
  88.                              const string& v_mouseout)
  89. {
  90.     title     = v_title;
  91.     action    = v_action;
  92.     color     = v_color;
  93.     mouseover = v_mouseover;
  94.     mouseout  = v_mouseout;
  95. }
  96. CHTMLPopupMenu::SItem::SItem()
  97. {
  98.     title = kEmptyStr;
  99. }
  100.         
  101. void CHTMLPopupMenu::AddItem(const string& title,
  102.                              const string& action, 
  103.                              const string& color,
  104.                              const string& mouseover, const string& mouseout)
  105. {
  106.     string x_action = action;
  107.     switch (m_Type) {
  108.     case eKurdinSide:
  109.         if ( x_action.empty() ) {
  110.             x_action = "none";
  111.         }
  112.     default:
  113.         if ( NStr::StartsWith(action, "http:", NStr::eNocase) ) {
  114.             x_action = "window.location='" + action + "'";
  115.         }
  116.     }
  117.     SItem item(title, x_action, color, mouseover, mouseout);
  118.     m_Items.push_back(item);
  119. }
  120. void CHTMLPopupMenu::AddItem(const char*   title,
  121.                              const string& action, 
  122.                              const string& color,
  123.                              const string& mouseover, const string& mouseout)
  124. {
  125.     if ( !title ) {
  126.         NCBI_THROW(CHTMLException,eNullPtr,
  127.                    "CHTMLPopupMenu::AddItem() passed NULL title");
  128.     }
  129.     const string x_title(title);
  130.     AddItem(x_title, action, color, mouseover, mouseout);
  131. }
  132. void CHTMLPopupMenu::AddItem(CNCBINode& node,
  133.                              const string& action, 
  134.                              const string& color,
  135.                              const string& mouseover, const string& mouseout)
  136. {
  137.     // Convert "node" to string
  138.     CNcbiOstrstream out;
  139.     node.Print(out, eHTML);
  140.     string title = CNcbiOstrstreamToString(out);
  141.     // Shield double quotes
  142.     title = NStr::Replace(title,""","'");
  143.     // Add menu item
  144.     AddItem(title, action, color, mouseover, mouseout);
  145. }
  146. void CHTMLPopupMenu::AddSeparator(const string& text)
  147. {
  148.     SItem item;
  149.     switch (m_Type) {
  150.     case eSmith:
  151.         break;
  152.     case eKurdin:
  153.         // eKurdin popup menu doesn't support separators
  154.         return;
  155.     case eKurdinConf:
  156.         item.title  = text.empty() ? "-" : text;
  157.         item.action = "-";
  158.         break;
  159.     case eKurdinSide:
  160.         item.title  = "none";
  161.         item.action = "none";
  162.         break;
  163.     }
  164.     m_Items.push_back(item);
  165. void CHTMLPopupMenu::SetAttribute(EHTML_PM_Attribute attribute,
  166.                                   const string&      value)
  167. {
  168.     m_Attrs[attribute] = value;
  169.     if (m_Type == eKurdinConf  &&  m_ConfigName.empty()) {
  170.         m_ConfigName = m_Name;
  171.     }
  172. }
  173. void CHTMLPopupMenu::SetAttributeGlobal(EHTML_PM_Attribute attribute,
  174.                                         const string&      value)
  175. {
  176.     CHTMLPopupMenu::TAttributes* attrs = GetGlobalAttributesPtr();
  177.     (*attrs)[attribute] = value;
  178. }
  179. string CHTMLPopupMenu::GetAttributeValue(EHTML_PM_Attribute attribute) const
  180. {
  181.     TAttributes::const_iterator i = m_Attrs.find(attribute);
  182.     if ( i != m_Attrs.end() ) {
  183.         return i->second;
  184.     }
  185.     return kEmptyStr;
  186. }
  187. struct SAttributeSupport {
  188.     EHTML_PM_Attribute attr;
  189.     const char*        name[CHTMLPopupMenu::ePMLast+1];
  190. };
  191. const SAttributeSupport ksAttributeSupportTable[] = {
  192.     //
  193.     //  Old menu attributes
  194.     //  (used for compatibility with previous version only).
  195.     //
  196.     //  S  - eSmith 
  197.     //  K  - eKurdin 
  198.     //  KC - eKurdinConf
  199.     //  KS - eKurdinSide
  200.     //
  201.     //  0     - not sopported, 
  202.     //  ""    - supported (name not used)
  203.     //  "..." - supported (with name)
  204.     //                                     S  K  KC KS            
  205.     { eHTML_PM_enableTracker,            { "enableTracker"       , 0,  0,  0 } },
  206.     { eHTML_PM_disableHide,              { "disableHide"         , 0,  "", 0 } },
  207.     { eHTML_PM_menuWidth,                { 0                     , 0,  "", 0 } },
  208.     { eHTML_PM_peepOffset,               { 0                     , 0,  "", 0 } },
  209.     { eHTML_PM_topOffset,                { 0                     , 0,  "", 0 } },
  210.     { eHTML_PM_fontSize,                 { "fontSize"            , 0,  0,  0 } },
  211.     { eHTML_PM_fontWeigh,                { "fontWeigh"           , 0,  0,  0 } },
  212.     { eHTML_PM_fontFamily,               { "fontFamily"          , 0,  0,  0 } },
  213.     { eHTML_PM_fontColor,                { "fontColor"           , 0,  0,  0 } },
  214.     { eHTML_PM_fontColorHilite,          { "fontColorHilite"     , 0,  0,  0 } },
  215.     { eHTML_PM_menuBorder,               { "menuBorder"          , 0,  0,  0 } },
  216.     { eHTML_PM_menuItemBorder,           { "menuItemBorder"      , 0,  0,  0 } },
  217.     { eHTML_PM_menuItemBgColor,          { "menuItemBgColor"     , 0,  0,  0 } },
  218.     { eHTML_PM_menuLiteBgColor,          { "menuLiteBgColor"     , 0,  0,  0 } },
  219.     { eHTML_PM_menuBorderBgColor,        { "menuBorderBgColor"   , 0,  0,  0 } },
  220.     { eHTML_PM_menuHiliteBgColor,        { "menuHiliteBgColor"   , 0,  0,  0 } },
  221.     { eHTML_PM_menuContainerBgColor,     { "menuContainerBgColor", 0,  0,  0 } },
  222.     { eHTML_PM_childMenuIcon,            { "childMenuIcon"       , 0,  0,  0 } },
  223.     { eHTML_PM_childMenuIconHilite,      { "childMenuIconHilite" , 0,  0,  0 } },
  224.     { eHTML_PM_bgColor,                  { "bgColor"             , "", 0,  0 } },
  225.     { eHTML_PM_titleColor,               { 0                     , "", 0,  0 } },
  226.     { eHTML_PM_borderColor,              { 0                     , "", 0,  0 } },
  227.     { eHTML_PM_alignH,                   { 0                     , "", 0,  0 } },
  228.     { eHTML_PM_alignV,                   { 0                     , "", 0,  0 } },
  229.     //
  230.     //  New menu attributes.
  231.     //
  232.     // View
  233.     { eHTML_PM_ColorTheme,               { 0, 0, "ColorTheme",                0 } },
  234.     { eHTML_PM_ShowTitle,                { 0, 0, "ShowTitle",                 0 } },
  235.     { eHTML_PM_ShowCloseIcon,            { 0, 0, "ShowCloseIcon",             0 } },
  236.     { eHTML_PM_HelpURL,                  { 0, 0, "Help",                      0 } },
  237.     { eHTML_PM_HideTime,                 { 0, 0, "HideTime",                  0 } },
  238.     { eHTML_PM_FreeText,                 { 0, 0, "FreeText",                  0 } },
  239. /*
  240.     { eHTML_PM_DisableHide,              { 0, 0, "", 0 } },
  241.     { eHTML_PM_MenuWidth,                { 0, 0, "", 0 } },
  242.     { eHTML_PM_PeepOffset,               { 0, 0, "", 0 } },
  243.     { eHTML_PM_TopOffset,                { 0, 0, "", 0 } },
  244. */
  245.     // Menu colors
  246.     { eHTML_PM_BorderColor,              { 0, 0, "BorderColor",               0 } },
  247.     { eHTML_PM_BackgroundColor,          { 0, 0, "BackgroundColor",           0 } },
  248.     // Position
  249.     
  250.     { eHTML_PM_AlignLR,                  { 0, 0, "AlignLR",                   0 } },
  251.     { eHTML_PM_AlignTB,                  { 0, 0, "AlignTB",                   0 } },
  252.     { eHTML_PM_AlignCenter,              { 0, 0, "AlignCenter",               0 } },
  253.     // Title
  254.     { eHTML_PM_TitleText,                { 0, 0, "TitleText",                 0 } },
  255.     { eHTML_PM_TitleColor,               { 0, 0, "TitleColor",                0 } },
  256.     { eHTML_PM_TitleSize,                { 0, 0, "TitleSize",                 0 } },
  257.     { eHTML_PM_TitleFont,                { 0, 0, "TitleFont",                 0 } },
  258.     { eHTML_PM_TitleBackgroundColor,     { 0, 0, "TitleBackgroundColor",      0 } },
  259.     { eHTML_PM_TitleBackgroundImage,     { 0, 0, "TitleBackgroundImage",      0 } },
  260.     // Items
  261.     { eHTML_PM_ItemColor,                { 0, 0, "ItemColor", 0 } },
  262.     { eHTML_PM_ItemColorActive,          { 0, 0, "ItemColorActive",           0 } },
  263.     { eHTML_PM_ItemBackgroundColorActive,{ 0, 0, "ItemBackgroundColorActive", 0 } },
  264.     { eHTML_PM_ItemSize,                 { 0, 0, "ItemSize",                  0 } },
  265.     { eHTML_PM_ItemFont,                 { 0, 0, "ItemFont",                  0 } },
  266.     { eHTML_PM_ItemBulletImage,          { 0, 0, "ItemBulletImage",           0 } },
  267.     { eHTML_PM_ItemBulletImageActive,    { 0, 0, "ItemBulletImageActive",     0 } },
  268.     { eHTML_PM_SeparatorColor,           { 0, 0, "SeparatorColor",            0 } }
  269. };
  270. string CHTMLPopupMenu::GetAttributeName(EHTML_PM_Attribute attribute, EType type)
  271. {
  272.     // Find attribute
  273.     size_t i;
  274.     for (i = 0; i < sizeof(ksAttributeSupportTable)/sizeof(SAttributeSupport);
  275.          i++) {
  276.         if ( ksAttributeSupportTable[i].attr == attribute ) {
  277.             if ( ksAttributeSupportTable[i].name[type] ) {
  278.                 return ksAttributeSupportTable[i].name[type];
  279.             }
  280.             break;
  281.         }
  282.     }
  283.     string type_name = "This";
  284.     switch (type) {
  285.     case eSmith:
  286.         type_name = "eSmith";
  287.         break;
  288.     case eKurdin:
  289.         type_name = "eKurdin";
  290.         break;
  291.     case eKurdinConf:
  292.         type_name = "eKurdinConf";
  293.         break;
  294.     case eKurdinSide:
  295.         type_name = "eKurdinSide";
  296.         break;
  297.     }
  298.     // Get attribute name approximately on the base other menu types
  299.     string attr_name;
  300.     for (size_t j = 0; j < ePMLast; j++) {
  301.         const char* name = ksAttributeSupportTable[i].name[j];
  302.         if ( name  &&  name[0] != '' ) {
  303.             attr_name = name;
  304.         }
  305.     }
  306.     // Name is not defined, use attribute numeric value
  307.     if ( attr_name.empty() ) {
  308.         attr_name = "with code " + NStr::IntToString(attribute);
  309.     }
  310.     ERR_POST(Warning << "CHTMLPopupMenu::GetMenuAttributeName:  " <<
  311.              type_name << " menu type does not support attribute " <<
  312.              attr_name);
  313.     return kEmptyStr;
  314. }
  315. string CHTMLPopupMenu::ShowMenu(void) const
  316. {
  317.     switch (m_Type) {
  318.     case eSmith:
  319.         return "window.showMenu(window." + m_Name + ");";
  320.     case eKurdin:
  321.         {
  322.         string align_h      = GetAttributeValue(eHTML_PM_alignH);
  323.         string align_v      = GetAttributeValue(eHTML_PM_alignV);
  324.         string color_border = GetAttributeValue(eHTML_PM_borderColor);
  325.         string color_title  = GetAttributeValue(eHTML_PM_titleColor);
  326.         string color_back   = GetAttributeValue(eHTML_PM_bgColor);
  327.         string s = "','"; 
  328.         return "PopUpMenu2_Set(" + m_Name + ",'" + align_h + s + align_v + s + 
  329.                 color_border + s + color_title + s + color_back + "');";
  330.         }
  331.     case eKurdinConf:
  332.         return "PopUpMenu2_Set(" + m_Name + ");";
  333.     case eKurdinSide:
  334.         return "<script language="JavaScript1.2">n<!--n" 
  335.                "document.write(SideMenuType == "static" ? " 
  336.                "SideMenuStaticHtml : SideMenuDynamicHtml);" 
  337.                "n//-->n</script>n";
  338.     }
  339.     _TROUBLE;
  340.     return kEmptyStr;
  341. }
  342. string CHTMLPopupMenu::HideMenu(void) const
  343. {
  344.     switch (m_Type) {
  345.     case eKurdin:
  346.     case eKurdinConf:
  347.         return "PopUpMenu2_Hide(); return false;";
  348.     default:
  349.         ;
  350.     }
  351.     return kEmptyStr;
  352. }
  353. CNcbiOstream& CHTMLPopupMenu::PrintBegin(CNcbiOstream& out, TMode mode)
  354. {
  355.     if ( mode == eHTML ) {
  356.         string items = GetCodeItems();
  357.         if ( !items.empty() ) {
  358.             out << "<script language="JavaScript1.2">n<!--n" 
  359.                 << items << "//-->n</script>n";
  360.         }
  361.     }
  362.     return out;
  363. }
  364. string CHTMLPopupMenu::GetCodeHead(EType type, const string& menu_lib_url)
  365. {
  366.     string url, code;
  367.     switch (type) {
  368.     case eSmith:
  369.         url  = menu_lib_url.empty() ? kJSMenuDefaultURL_Smith : menu_lib_url;
  370.         break;
  371.     case eKurdin:
  372.         url  = menu_lib_url.empty() ? kJSMenuDefaultURL_Kurdin : menu_lib_url;
  373.         break;
  374.     case eKurdinConf:
  375.         {
  376.         code = "<script language="JavaScript1.2">n<!--n";
  377.         code += "var PopUpMenu2_GlobalConfig = [n";
  378.         code += "  ["UseThisGlobalConfig","yes"]";
  379.         // Write properties
  380.         CHTMLPopupMenu::TAttributes* attrs = GetGlobalAttributesPtr();
  381.         ITERATE (TAttributes, i, *attrs) {
  382.             string name  = GetAttributeName(i->first, eKurdinConf);
  383.             string value = i->second;
  384.             code += ",n  ["" + name + "","" + value + ""]";
  385.         }
  386.         code += "n]n//-->n</script>n";
  387.         url  = menu_lib_url.empty() ? kJSMenuDefaultURL_KurdinConf :
  388.                menu_lib_url;
  389.         break;
  390.         }
  391.     case eKurdinSide:
  392.         url  = menu_lib_url.empty() ? kJSMenuDefaultURL_KurdinSide :
  393.                menu_lib_url;
  394.         code = "<link rel="stylesheet" type="text/css" href="" +
  395.                kJSMenuDefaultURL_KurdinSideCSS + "">n"; 
  396.         break;
  397.     }
  398.     if ( !url.empty() ) {
  399.         code += "<script language="JavaScript1.2" src="" + url +
  400.             ""></script>n";
  401.     }
  402.     return code;
  403. }
  404. string CHTMLPopupMenu::GetCodeBody(EType type, bool use_dyn_menu)
  405. {
  406.     if ( type != eSmith ) {
  407.         return kEmptyStr;
  408.     }
  409.     string use_dm = use_dyn_menu ? "true" : "false";
  410.     return "<script language="JavaScript1.2">n"
  411.         "<!--nfunction onLoad() {n"
  412.         "window.useDynamicMenu = " + use_dm + ";n"
  413.         "window.defaultjsmenu = new Menu();n"
  414.         "defaultjsmenu.addMenuSeparator();n"
  415.         "defaultjsmenu.writeMenus();n"
  416.         "}n"
  417.         "// For IE & NS6nif (!document.layers) onLoad();n//-->n</script>n";
  418. }
  419. string CHTMLPopupMenu::GetCodeItems(void) const
  420. {
  421.     string code;
  422.     switch (m_Type) {
  423.     case eSmith: 
  424.         {
  425.             code = "window." + m_Name + " = new Menu();n";
  426.             // Write menu items
  427.             ITERATE (TItems, i, m_Items) {
  428.                 if ( (i->title).empty() ) {
  429.                     code += m_Name + ".addMenuSeparator();n";
  430.                 }
  431.                 else {
  432.                     code += m_Name + ".addMenuItem("" +
  433.                         i->title     + "",""  +
  434.                         i->action    + "",""  +
  435.                         i->color     + "",""  +
  436.                         i->mouseover + "",""  +
  437.                         i->mouseout  + "");n";
  438.                 }
  439.             }
  440.             // Write properties
  441.             ITERATE (TAttributes, i, m_Attrs) {
  442.                 string name  = GetAttributeName(i->first);
  443.                 string value = i->second;
  444.                 code += m_Name + "." + name + " = "" + value + "";n";
  445.             }
  446.         }
  447.         break;
  448.     case eKurdin: 
  449.         {
  450.             code = "var " + m_Name + " = [n";
  451.             // Write menu items
  452.             ITERATE (TItems, i, m_Items) {
  453.                 if ( i != m_Items.begin()) {
  454.                     code += ",n";
  455.                 }
  456.                 code += "["" +
  457.                     i->title     + "",""  +
  458.                     i->action    + "",""  +
  459.                     i->mouseover + "",""  +
  460.                     i->mouseout  + ""]";
  461.             }
  462.             code += "n]n";
  463.         }
  464.         break;
  465.     case eKurdinConf:
  466.         {
  467.             if ( m_ConfigName == m_Name ) {
  468.                 code += "var PopUpMenu2_LocalConfig_" + m_Name + " = [n";
  469.                 // If local config is disabled
  470.                 if ( m_DisableLocalConfig ) {
  471.                     code += "  ["UseThisLocalConfig","no"]";
  472.                 }
  473.                 // Write properties
  474.                 ITERATE (TAttributes, i, m_Attrs) {
  475.                     if ( m_DisableLocalConfig  ||  i != m_Attrs.begin() ) {
  476.                         code += ",n";
  477.                     }
  478.                     string name  = GetAttributeName(i->first);
  479.                     string value = i->second;
  480.                     code += "  ["" + name + "","" + value + ""]";
  481.                 }
  482.                 code += "n]n";
  483.             }
  484.             // Write menu only if it have items
  485.             if ( m_Items.size() ) {
  486.                 code += "var " + m_Name + " = [n";
  487.                 if ( !m_ConfigName.empty() ) {
  488.                     code += "  ["UseLocalConfig","" + m_ConfigName + "","",""]";
  489.                 }
  490.                 // Write menu items
  491.                 ITERATE (TItems, i, m_Items) {
  492.                     if ( !m_ConfigName.empty()  ||  i != m_Items.begin()) {
  493.                         code += ",n";
  494.                     }
  495.                     code += "  ["" +
  496.                         i->title     + "",""  +
  497.                         i->action    + "",""  +
  498.                         i->mouseover + "",""  +
  499.                         i->mouseout  + ""]";
  500.                 }
  501.                 code += "n]n";
  502.             }
  503.         }
  504.         break;
  505.     case eKurdinSide:
  506.         {
  507.             // Menu name always is "SideMenuParams"
  508.             code = "var SideMenuParams = [n";
  509.             // Menu configuration
  510.             string disable_hide = GetAttributeValue(eHTML_PM_disableHide);
  511.             string menu_type;
  512.             if ( disable_hide == "true" ) {
  513.                 menu_type = "static";
  514.             } else if ( disable_hide == "false" ) {  
  515.                 menu_type = "dynamic";
  516.             // else menu_type have default value
  517.             }
  518.             string width       = GetAttributeValue(eHTML_PM_menuWidth);
  519.             string peep_offset = GetAttributeValue(eHTML_PM_peepOffset);
  520.             string top_offset  = GetAttributeValue(eHTML_PM_topOffset);
  521.             code += "["","" + menu_type + "","","" + width + "","" +
  522.                 peep_offset + "","" + top_offset + "","",""]";
  523.             // Write menu items
  524.             ITERATE (TItems, i, m_Items) {
  525.                 code += ",n["" +
  526.                     i->title     + "",""  +
  527.                     i->action    + "","",""]";
  528.             }
  529.             code += "n]n";
  530.         }
  531.         break;
  532.     }
  533.     return code;
  534. }
  535. END_NCBI_SCOPE
  536. /*
  537.  * ===========================================================================
  538.  * $Log: jsmenu.cpp,v $
  539.  * Revision 1000.4  2004/06/01 19:15:41  gouriano
  540.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  541.  *
  542.  * Revision 1.31  2004/05/17 20:59:50  gorelenk
  543.  * Added include of PCH ncbi_pch.hpp
  544.  *
  545.  * Revision 1.30  2004/05/05 13:58:14  ivanov
  546.  * Added DisableLocalConfig(). Do not print out empty menues.
  547.  *
  548.  * Revision 1.29  2004/04/22 15:26:34  ivanov
  549.  * GetAttributeName(): improved diagnostic messages
  550.  *
  551.  * Revision 1.28  2004/04/20 16:16:05  ivanov
  552.  * eKurdinConf: Remove extra comma if local configuration is not specified
  553.  *
  554.  * Revision 1.27  2004/04/05 16:19:57  ivanov
  555.  * Added support for Sergey Kurdin's popup menu with configurations
  556.  *
  557.  * Revision 1.26  2004/01/08 18:36:52  ivanov
  558.  * Removed _TROUBLE from HideMenu()
  559.  *
  560.  * Revision 1.25  2003/12/18 20:14:40  golikov
  561.  * Added HideMenu
  562.  *
  563.  * Revision 1.24  2003/12/12 12:10:38  ivanov
  564.  * Updated Sergey Kurdin's popup menu to v2.4
  565.  *
  566.  * Revision 1.23  2003/12/10 19:14:16  ivanov
  567.  * Move adding a string "return false;" to menues JS code call from ShowMenu()
  568.  * to AttachPopupMenu()
  569.  *
  570.  * Revision 1.22  2003/12/03 12:39:24  ivanov
  571.  * ShowMenu(): finalize JS code for eKurdin type with "return false;"
  572.  *
  573.  * Revision 1.21  2003/12/02 14:27:06  ivanov
  574.  * Removed obsolete functions GetCodeBodyTag[Handler|Action]().
  575.  *
  576.  * Revision 1.20  2003/11/03 17:03:08  ivanov
  577.  * Some formal code rearrangement. Move log to end.
  578.  *
  579.  * Revision 1.19  2003/10/02 18:24:38  ivanov
  580.  * Get rid of compilation warnings; some formal code rearrangement
  581.  *
  582.  * Revision 1.18  2003/10/01 15:56:44  ivanov
  583.  * Added support for Sergey Kurdin's side menu
  584.  *
  585.  * Revision 1.17  2003/09/03 20:21:35  ivanov
  586.  * Updated Sergey Kurdin's popup menu to v2.3
  587.  *
  588.  * Revision 1.16  2003/07/08 17:13:53  gouriano
  589.  * changed thrown exceptions to CException-derived ones
  590.  *
  591.  * Revision 1.15  2003/06/30 21:16:50  ivanov
  592.  * Updated Sergey Kurdin's popup menu to v2.2
  593.  *
  594.  * Revision 1.14  2003/04/29 18:42:14  ivanov
  595.  * Fix for previous commit
  596.  *
  597.  * Revision 1.13  2003/04/29 17:45:43  ivanov
  598.  * Changed array with file names for Kurdin's menu to const definitions
  599.  *
  600.  * Revision 1.12  2003/04/29 16:28:13  ivanov
  601.  * Use one JS Script for Kurdin's menu
  602.  *
  603.  * Revision 1.11  2003/04/01 16:35:29  ivanov
  604.  * Changed path for the Kurdin's popup menu
  605.  *
  606.  * Revision 1.10  2003/03/11 15:28:57  kuznets
  607.  * iterate -> ITERATE
  608.  *
  609.  * Revision 1.9  2002/12/12 17:20:46  ivanov
  610.  * Renamed GetAttribute() -> GetMenuAttributeValue,
  611.  *         GetAttributeName() -> GetMenuAttributeName().
  612.  *
  613.  * Revision 1.8  2002/12/09 22:11:59  ivanov
  614.  * Added support for Sergey Kurdin's popup menu
  615.  *
  616.  * Revision 1.7  2002/04/29 18:07:21  ucko
  617.  * Make GetName const.
  618.  *
  619.  * Revision 1.6  2002/02/13 20:16:09  ivanov
  620.  * Added support of dynamic popup menues. Changed GetCodeBody().
  621.  *
  622.  * Revision 1.5  2001/11/29 16:06:31  ivanov
  623.  * Changed using menu script name "menu.js" -> "ncbi_menu.js".
  624.  * Fixed error in using menu script without menu definitions.
  625.  *
  626.  * Revision 1.4  2001/10/15 23:16:22  vakatov
  627.  * + AddItem(const char* title, ...) to avoid "string/CNCBINode" ambiguity
  628.  *
  629.  * Revision 1.3  2001/08/15 19:43:13  ivanov
  630.  * Added AddMenuItem( node, ...)
  631.  *
  632.  * Revision 1.2  2001/08/14 16:53:07  ivanov
  633.  * Changed parent class for CHTMLPopupMenu.
  634.  * Changed mean for init JavaScript popup menu & add it to HTML document.
  635.  *
  636.  * Revision 1.1  2001/07/16 13:41:32  ivanov
  637.  * Initialization
  638.  *
  639.  * ===========================================================================
  640.  */