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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: components.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:15:23  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.34
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: components.cpp,v 1000.3 2004/06/01 19:15:23 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:  Lewis Geer
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <html/components.hpp>
  39. #include <html/nodemap.hpp>
  40. BEGIN_NCBI_SCOPE
  41. CSubmitDescription::CSubmitDescription(void)
  42. {
  43.     return;
  44. }
  45. CSubmitDescription::CSubmitDescription(const string& name)
  46.     : m_Name(name)
  47. {
  48.     return;
  49. }
  50. CSubmitDescription::CSubmitDescription(const string& name, const string& label)
  51.     : m_Name(name), m_Label(label)
  52. {
  53.     return;
  54. }
  55. CNCBINode* CSubmitDescription::CreateComponent(void) const
  56. {
  57.     if ( m_Name.empty() ) {
  58.         return 0;
  59.     }
  60.     if ( m_Label.empty() ) {
  61.         return new CHTML_submit(m_Name);
  62.     }else {
  63.         return new CHTML_submit(m_Name, m_Label);
  64.     }
  65. }
  66. CNCBINode* COptionDescription::CreateComponent(const string& def) const
  67. {
  68.     if ( m_Value.empty() ) {
  69.         return new CHTML_option(m_Label, m_Label == def);
  70.     } else if ( m_Label.empty() ) {
  71.         return new CHTML_option(m_Value, m_Value == def);
  72.     } else {
  73.         return new CHTML_option(m_Value, m_Label, m_Value == def);
  74.     }
  75. }
  76. CSelectDescription::CSelectDescription(void)
  77. {
  78.     return;
  79. }
  80. CSelectDescription::CSelectDescription(const string& name)
  81.     : m_Name(name)
  82. {
  83.     return;
  84. }
  85. void CSelectDescription::Add(const string& value)
  86. {
  87.     m_List.push_back(COptionDescription(value));
  88. }
  89. void CSelectDescription::Add(const string& value, const string& label)
  90. {
  91.     m_List.push_back(COptionDescription(value, label));
  92. }
  93. CNCBINode* CSelectDescription::CreateComponent(void) const
  94. {
  95.     if ( m_Name.empty() || m_List.empty() ) {
  96.         return 0;
  97.     }
  98.     CNCBINode* select = new CHTML_select(m_Name);
  99.     for ( list<COptionDescription>::const_iterator i = m_List.begin();
  100.           i != m_List.end(); ++i ) {
  101.         select->AppendChild(i->CreateComponent(m_Default));
  102.     }
  103.     if ( !m_TextBefore.empty() || !m_TextAfter.empty() ) {
  104.         CNCBINode* combine = new CNCBINode;
  105.         if ( !m_TextBefore.empty() ) {
  106.             combine->AppendChild(new CHTMLPlainText(m_TextBefore));
  107.         }
  108.         combine->AppendChild(select);
  109.         if ( !m_TextAfter.empty() ) {
  110.             combine->AppendChild(new CHTMLPlainText(m_TextAfter));
  111.         }
  112.         select = combine;
  113.     }
  114.     return select;
  115. }
  116. CTextInputDescription::CTextInputDescription(void)
  117.     : m_Width(0)
  118. {
  119.     return;
  120. }
  121. CTextInputDescription::CTextInputDescription(const string& name)
  122.     : m_Name(name), m_Width(0)
  123. {
  124.     return;
  125. }
  126. CNCBINode* CTextInputDescription::CreateComponent(void) const
  127. {
  128.     if ( m_Name.empty() ) {
  129.         return 0;
  130.     }
  131.     if ( m_Width ) {
  132.         return new CHTML_text(m_Name, m_Width, m_Value);
  133.     } else {
  134.         return new CHTML_text(m_Name, m_Value);
  135.     }
  136. }
  137. CQueryBox::CQueryBox(void)
  138.     : m_Submit("cmd", "Search"), m_Database("db"),
  139.       m_Term("term"), m_DispMax("dispmax"),
  140.       m_Width(-1)
  141. {
  142.     SetCellSpacing(0);
  143.     SetCellPadding(5);
  144.     m_Database.m_TextBefore = "Search ";
  145.     m_Database.m_TextAfter = "for";
  146.     m_DispMax.m_TextBefore = "Show ";
  147.     m_DispMax.m_TextAfter = "documents per page";
  148. }
  149. void CQueryBox::CreateSubNodes()
  150. {
  151.     SetBgColor(m_BgColor);
  152.     if ( m_Width >= 0 ) {
  153.         SetWidth(m_Width);
  154.     }
  155.     CheckTable();
  156.     int row = CalculateNumberOfRows();
  157.     InsertAt(row, 0, m_Database.CreateComponent())->SetColSpan(2);
  158.     InsertAt(row + 1, 0, m_Term.CreateComponent());
  159.     InsertAt(row + 1, 0, m_Submit.CreateComponent());
  160.     InsertAt(row + 2, 0, m_DispMax.CreateComponent()); 
  161. }
  162. CNCBINode* CQueryBox::CreateComments(void)
  163. {
  164.     return 0;
  165. }
  166. // Pager
  167. CButtonList::CButtonList(void)
  168. {
  169.     return;
  170. }
  171. void CButtonList::CreateSubNodes()
  172. {
  173.     CNCBINode* select = m_List.CreateComponent();
  174.     if ( select ) {
  175.         AppendChild(m_Button.CreateComponent());
  176.         AppendChild(select);
  177.     }
  178. }
  179. CPageList::CPageList(void)
  180.     : m_Current(-1)
  181. {
  182.     SetCellSpacing(2);
  183. }
  184. void CPageList::x_AddImageString(CNCBINode* node, const string& name, int number,
  185.                                  const string& imageStart, const string& imageEnd)
  186. {
  187.     string s = NStr::IntToString(number);
  188.     for ( size_t i = 0; i < s.size(); ++i ) {
  189.         node->AppendChild(new CHTML_image(name, imageStart + s[i] + imageEnd, 0));
  190.     }
  191. }
  192. void CPageList::x_AddInactiveImageString(CNCBINode* node, const string&,
  193.                                          int number,
  194.                                          const string& imageStart,
  195.                                          const string& imageEnd)
  196. {
  197.     string s = NStr::IntToString(number);
  198.    
  199.     for ( size_t i = 0; i < s.size(); ++i ) {
  200.         node->AppendChild(new CHTML_img(imageStart + s[i] + imageEnd));
  201.     }
  202. }
  203. void CPageList::CreateSubNodes()
  204. {
  205.     int column = 0;
  206.     if ( !m_Backward.empty() ) {
  207.         InsertAt(0, column++,
  208.                  new CHTML_image(m_Backward, "/images/prev.gif", 0));
  209.     }
  210.     for (map<int, string>::iterator i = m_Pages.begin();
  211.          i != m_Pages.end(); ++i ) {
  212.         if ( i->first == m_Current ) {
  213.             // Current link
  214.             x_AddInactiveImageString(Cell(0, column++), i->second, i->first, "/images/black_", ".gif");
  215.         }
  216.         else {
  217.             // Normal link
  218.             x_AddImageString(Cell(0, column++), i->second, i->first, "/images/", ".gif");
  219.         }
  220.     }
  221.     if ( !m_Forward.empty() ) {
  222.         InsertAt(0, column++, new CHTML_image(m_Forward, "/images/next.gif", 0));
  223.     }
  224. }
  225. // Pager box
  226. CPagerBox::CPagerBox(void)
  227.     : m_Width(460),
  228.       m_TopButton(new CButtonList),
  229.       m_LeftButton(new CButtonList),
  230.       m_RightButton(new CButtonList),
  231.       m_PageList(new CPageList),
  232.       m_NumResults(0),
  233.       m_BgColor("#c0c0c0")
  234. {
  235.     return;
  236. }
  237. void CPagerBox::CreateSubNodes(void)
  238. {
  239.     CHTML_table* table;
  240.     CHTML_table* tableTop;
  241.     CHTML_table* tableBot;
  242.     table = new CHTML_table();
  243.     table->SetCellSpacing(0)->SetCellPadding(0)->SetBgColor(m_BgColor)->SetWidth(m_Width)->SetAttribute("border", "0");
  244.     AppendChild(table);
  245.     tableTop = new CHTML_table();
  246.     tableTop->SetCellSpacing(0)->SetCellPadding(0)->SetWidth(m_Width);
  247.     tableBot = new CHTML_table();
  248.     tableBot->SetCellSpacing(0)->SetCellPadding(0)->SetWidth(m_Width);
  249.     table->InsertAt(0, 0, tableTop);
  250.     table->InsertAt(1, 0, tableBot);
  251.     tableTop->InsertAt(0, 0, m_TopButton);
  252.     tableTop->InsertAt(0, 1, m_PageList);
  253.     tableBot->InsertAt(0, 0, m_LeftButton);
  254.     tableBot->InsertAt(0, 1, m_RightButton);
  255.     tableBot->InsertAt(0, 2, new CHTMLText(NStr::IntToString(m_NumResults) + ((m_NumResults==1)?" result":" results")));
  256. }
  257. CSmallPagerBox::CSmallPagerBox()
  258.     : m_Width(460), m_PageList(0), m_NumResults(0)
  259. {
  260.     return;
  261. }
  262. void CSmallPagerBox::CreateSubNodes()
  263. {
  264.     CHTML_table* Table = new CHTML_table();
  265.     AppendChild(Table);
  266.     Table->SetCellSpacing(0)->SetCellPadding(0)->SetBgColor(m_BgColor)
  267.         ->SetWidth(m_Width)->SetAttribute("border", 0);
  268.     
  269.     Table->InsertAt(0, 0, new CPageList);
  270.     Table->InsertAt(0, 1, new CHTMLText(NStr::IntToString(m_NumResults) + ((m_NumResults==1)?" result":" results")));
  271. }
  272. END_NCBI_SCOPE
  273. /*
  274.  * ===========================================================================
  275.  * $Log: components.cpp,v $
  276.  * Revision 1000.3  2004/06/01 19:15:23  gouriano
  277.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.34
  278.  *
  279.  * Revision 1.34  2004/05/17 20:59:50  gorelenk
  280.  * Added include of PCH ncbi_pch.hpp
  281.  *
  282.  * Revision 1.33  2004/01/30 14:03:21  lavr
  283.  * Cosmetic change to sync with .hpp
  284.  *
  285.  * Revision 1.32  2004/01/27 15:39:52  ivanov
  286.  * Get rid of Sun Workshop compilation warning.
  287.  *
  288.  * Revision 1.31  2003/11/03 17:03:08  ivanov
  289.  * Some formal code rearrangement. Move log to end.
  290.  *
  291.  * Revision 1.30  1999/10/28 13:40:34  vasilche
  292.  * Added reference counters to CNCBINode.
  293.  *
  294.  * Revision 1.29  1999/06/07 15:21:04  vasilche
  295.  * Fixed some warnings.
  296.  *
  297.  * Revision 1.28  1999/04/22 14:20:19  vasilche
  298.  * Now CHTML_select::AppendOption and CHTML_option constructor accept option
  299.  * name always as first argument.
  300.  *
  301.  * Revision 1.27  1999/04/15 19:56:23  vasilche
  302.  * More warnings fixed
  303.  *
  304.  * Revision 1.26  1999/04/15 19:48:22  vasilche
  305.  * Fixed several warnings detected by GCC
  306.  *
  307.  * Revision 1.25  1999/04/08 19:00:30  vasilche
  308.  * Added current cell pointer to CHTML_table
  309.  *
  310.  * Revision 1.24  1999/02/23 19:04:27  vasilche
  311.  * Fixed uninitialized m_Width in CQueryBox
  312.  *
  313.  * Revision 1.23  1999/01/28 21:58:07  vasilche
  314.  * QueryBox now inherits from CHTML_table (not CHTML_form as before).
  315.  * Use 'new CHTML_form("url", queryBox)' as replacement of old QueryBox.
  316.  *
  317.  * Revision 1.22  1999/01/21 21:12:58  vasilche
  318.  * Added/used descriptions for HTML submit/select/text.
  319.  * Fixed some bugs in paging.
  320.  *
  321.  * Revision 1.21  1999/01/21 16:18:05  sandomir
  322.  * minor changes due to NStr namespace to contain string utility functions
  323.  *
  324.  * Revision 1.20  1999/01/20 18:12:44  vasilche
  325.  * Added possibility to change label of buttons.
  326.  *
  327.  * Revision 1.19  1999/01/19 21:17:41  vasilche
  328.  * Added CPager class
  329.  *
  330.  * Revision 1.18  1999/01/15 17:47:55  vasilche
  331.  * Changed CButtonList options: m_Name -> m_SubmitName, m_Select ->
  332.  * m_SelectName. Added m_Selected.
  333.  * Fixed CIDs Encode/Decode.
  334.  *
  335.  * Revision 1.17  1999/01/14 21:25:19  vasilche
  336.  * Changed CPageList to work via form image input elements.
  337.  *
  338.  * Revision 1.16  1999/01/07 17:06:35  vasilche
  339.  * Added default query text in CQueryBox.
  340.  * Added query text width in CQueryBox.
  341.  *
  342.  * Revision 1.15  1999/01/07 16:41:56  vasilche
  343.  * CHTMLHelper moved to separate file.
  344.  * TagNames of CHTML classes ara available via s_GetTagName() static
  345.  * method.
  346.  * Input tag types ara available via s_GetInputType() static method.
  347.  * Initial selected database added to CQueryBox.
  348.  * Background colors added to CPagerBax & CSmallPagerBox.
  349.  *
  350.  * Revision 1.14  1999/01/07 14:53:57  vasilche
  351.  * CButtonList displays nothing if list is empty.
  352.  *
  353.  * Revision 1.13  1999/01/06 21:35:37  vasilche
  354.  * Avoid use of Clone.
  355.  * Fixed default CHTML_text width.
  356.  *
  357.  * Revision 1.12  1999/01/05 21:47:14  vasilche
  358.  * Added 'current page' to CPageList.
  359.  * CPageList doesn't display forward/backward if empty.
  360.  *
  361.  * Revision 1.11  1999/01/04 20:06:13  vasilche
  362.  * Redesigned CHTML_table.
  363.  * Added selection support to HTML forms (via hidden values).
  364.  *
  365.  * Revision 1.10  1998/12/28 23:29:09  vakatov
  366.  * New CVS and development tree structure for the NCBI C++ projects
  367.  *
  368.  * Revision 1.9  1998/12/28 16:48:08  vasilche
  369.  * Removed creation of QueryBox in CHTMLPage::CreateView()
  370.  * CQueryBox extends from CHTML_form
  371.  * CButtonList, CPageList, CPagerBox, CSmallPagerBox extend from CNCBINode.
  372.  *
  373.  * Revision 1.8  1998/12/23 21:21:03  vasilche
  374.  * Added more HTML tags (almost all).
  375.  * Importent ones: all lists (OL, UL, DIR, MENU), fonts (FONT, BASEFONT).
  376.  *
  377.  * Revision 1.7  1998/12/21 22:25:02  vasilche
  378.  * A lot of cleaning.
  379.  *
  380.  * Revision 1.6  1998/12/11 22:52:01  lewisg
  381.  * added docsum page
  382.  *
  383.  * Revision 1.5  1998/12/11 18:12:45  lewisg
  384.  * frontpage added
  385.  *
  386.  * Revision 1.4  1998/12/09 23:00:53  lewisg
  387.  * use new cgiapp class
  388.  *
  389.  * Revision 1.3  1998/12/08 00:33:42  lewisg
  390.  * cleanup
  391.  *
  392.  * Revision 1.2  1998/11/23 23:44:28  lewisg
  393.  * toolpages.cpp
  394.  *
  395.  * Revision 1.1  1998/10/29 16:13:07  lewisg
  396.  * version 2
  397.  *
  398.  * ===========================================================================
  399.  */