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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: reference_editor.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:02:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*
  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.  * Authors:  Lou Friedman
  35.  *
  36.  * File Description:
  37.  *    Implementaion of CReferenceEntryForm reference editing
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include "reference_editor.hpp"
  42. #include "auth_form.hpp"
  43. #include <gui/dialogs/entry_form/table.hpp>
  44. #include <corelib/ncbistre.hpp>
  45. #include <serial/iterator.hpp>
  46. #include <objects/general/Object_id.hpp>
  47. #include <objects/general/Date.hpp>
  48. #include <objects/general/Date_std.hpp>
  49. #include <objects/general/Person_id.hpp>
  50. #include <objects/general/Name_std.hpp>
  51. #include <objects/seq/Pubdesc.hpp>
  52. #include <objects/seq/Seq_inst.hpp>
  53. #include <objects/pub/Pub.hpp>
  54. #include <objects/pub/Pub_equiv.hpp>
  55. #include <objects/biblio/Cit_art.hpp>
  56. #include <objects/biblio/Cit_book.hpp>
  57. #include <objects/biblio/Cit_gen.hpp>
  58. #include <objects/biblio/Cit_jour.hpp>
  59. #include <objects/biblio/Cit_let.hpp>
  60. #include <objects/biblio/Cit_pat.hpp>
  61. #include <objects/biblio/Cit_proc.hpp>
  62. #include <objects/biblio/Cit_sub.hpp>
  63. #include <objects/biblio/Imprint.hpp>
  64. #include <objects/biblio/PubMedId.hpp>
  65. #include <objects/biblio/Auth_list.hpp>
  66. #include <objects/biblio/Author.hpp>
  67. #include <objects/biblio/Title.hpp>
  68. #include "paragraph.hpp"
  69. BEGIN_NCBI_SCOPE
  70. USING_SCOPE(objects);
  71. SEditorFlatPub::SEditorFlatPub (CPubdesc* pub)
  72.     : m_Pubdesc(0), m_Pub(0), m_CitType(CPub::e_not_set), 
  73.       m_PubClass(ePubClass_not_set), m_Medline_entry(0), m_PubMedId(0), 
  74.       m_Pub_equiv(0), m_Auth_list(0), m_Imprint(0), m_Title(0),
  75.       m_Meeting(0), m_Date(0), m_FromAuth_list(0), m_FromImprint(0),
  76.       m_FromTitle(0), m_Muid(0), m_Pmid(0)
  77. {
  78.     m_Pubdesc = pub;
  79.     m_Pub = NULL;
  80.     
  81.     NON_CONST_ITERATE (CPub_equiv::Tdata, it, pub->SetPub().Set()) {
  82.         x_Init (**it);
  83.     }
  84. }
  85. void SEditorFlatPub::x_Init (CPub& pub) 
  86. {
  87.     m_CitType =  pub.Which();
  88.     switch (m_CitType) {
  89.         case CPub::e_Gen:
  90.         {{
  91.             m_Pub = &pub;
  92.             CCit_gen& cit = pub.SetGen();
  93.             if (cit.IsSetCit()) {  
  94.                 if (NStr::CompareNocase(cit.GetCit(), "unpublished") == 0) {
  95.                     m_PubClass = eUnpub;
  96.                 } else if (NStr::CompareNocase(cit.GetCit(), 
  97.                                  "Online Publication") == 0 ||
  98.                            NStr::CompareNocase(cit.GetCit(), 
  99.                                  "Published Only in DataBase") == 0) {
  100.                     m_PubClass = eOnline;
  101.                 } else {    // Assumed to be a journal publication
  102.                     m_PubClass = eJournal;
  103.                 }
  104.                 
  105.             }
  106.             if (cit.IsSetAuthors()) m_Auth_list =  &cit.SetAuthors();
  107.             if (cit.IsSetDate()) m_Date =  &cit.SetDate();
  108.  
  109.             break;
  110.         }}
  111.         case CPub::e_Sub:
  112.         {{
  113.             CCit_sub& cit = pub.SetSub();
  114.             m_Auth_list =  &cit.SetAuthors();
  115.             if (cit.IsSetImp()) {
  116.                 m_Date =  &cit.SetImp().SetDate();
  117.             } else {
  118.                 if (cit.IsSetDate()) m_Date =  &cit.SetDate();
  119.             }
  120.             m_Pub = &pub;
  121.             m_PubClass = eUnpub;
  122.             break;
  123.         }}
  124.         case CPub::e_Medline:
  125.             break;
  126.         case CPub::e_Muid:
  127.             m_Muid = pub.GetMuid();
  128.             break;
  129.         case CPub::e_Article:
  130.         {{
  131.             CCit_art& cit = pub.SetArticle();
  132.             if (cit.IsSetAuthors()) m_Auth_list =  &cit.SetAuthors();
  133.             if (cit.IsSetTitle()) m_Title =  &cit.SetTitle();
  134.             
  135.             m_Pub = &pub;
  136.             CCit_art::C_From& from = cit.SetFrom();
  137.             if (from.IsJournal()) {
  138.                 CCit_jour& from_cit = from.SetJournal();
  139.                 m_PubClass = eJournal;
  140.                 m_Imprint = &from_cit.SetImp();
  141.                 m_FromTitle = &from_cit.SetTitle();
  142.             } else if (from.IsBook()) {
  143.                 CCit_book& from_cit = from.SetBook();
  144.                 m_PubClass = eBookChapter;
  145.                 m_Imprint = &from_cit.SetImp();
  146.                 m_FromTitle = &from_cit.SetTitle();
  147.                 m_FromAuth_list = &from_cit.SetAuthors();
  148.             } else if (from.IsProc()) {
  149.                 CCit_proc& from_cit = from.SetProc();
  150.                 m_PubClass = eProcChapter;
  151.                 m_Meeting = &from_cit.SetMeet();
  152.                 CCit_book& citbook = from_cit.SetBook();
  153.                 m_Imprint = &citbook.SetImp();
  154.                 m_FromTitle = &citbook.SetTitle();
  155.                 m_FromAuth_list = &citbook.SetAuthors();
  156.             } else {
  157.             }
  158.             break;
  159.         }}
  160.         case CPub::e_Journal:
  161.         {{
  162.             CCit_jour& cit = pub.SetJournal();
  163.             m_Imprint = &cit.SetImp();
  164.             m_Title = &cit.SetTitle();
  165.             m_Pub = &pub;
  166.             m_PubClass = eJournal;
  167.         }}
  168.         case CPub::e_Book:
  169.         {{
  170.             CCit_book& cit = pub.SetBook();
  171.             m_Imprint = &cit.SetImp();
  172.             m_Title = &cit.SetTitle();
  173.             m_Auth_list = &cit.SetAuthors();
  174.             m_Pub = &pub;
  175.             m_PubClass = eBook;
  176.             break;
  177.         }}
  178.         case CPub::e_Proc:
  179.         {{
  180.             CCit_proc& cit = pub.SetProc();
  181.             m_Meeting = &cit.SetMeet();
  182.             CCit_book& citbook = cit.SetBook();
  183.             m_Imprint = &citbook.SetImp();
  184.             m_Title = &citbook.SetTitle();
  185.             m_Auth_list = &citbook.SetAuthors();
  186.             m_Pub = &pub;
  187.             m_PubClass = eProc;
  188.                 
  189.             break;
  190.         }}
  191.         case CPub::e_Patent:
  192.             break;
  193.         case CPub::e_Man:
  194.             break;
  195.         case CPub::e_Equiv:
  196. #if 0
  197.             ITERATE (CPub_equiv::Tdata, it, pub.GetEquiv().Get()) {
  198.                 x_Init(**it, ctx);
  199.             }
  200. #endif
  201.             break;
  202.         case CPub::e_Pmid:
  203.         {{
  204.             m_Pmid = pub.GetPmid().Get();
  205.             break;
  206.         }}
  207.         default:               
  208.             break;
  209.     } // switch
  210.     if (m_Date == 0 && m_Imprint) {
  211.         m_Date = & m_Imprint->SetDate();
  212.     }
  213. }
  214. SEditorFlatPub::EPubStatus SEditorFlatPub::GetPubStatus ()
  215. {
  216.     if (m_CitType == CPub::e_Sub) {
  217.         return SEditorFlatPub::eUnpublished;
  218.     }
  219.     if (m_CitType == CPub::e_Gen) { 
  220.         const CCit_gen& g = m_Pub->GetGen();
  221.         if (g.IsSetCit() && 
  222.                 NStr::CompareNocase(g.GetCit(), "unpublished") == 0) {
  223.             return SEditorFlatPub::eUnpublished;
  224.         } else {
  225.             return SEditorFlatPub::ePublished;
  226.         }
  227.     }
  228.     if (m_Imprint && m_Imprint->IsSetPrepub()) {
  229.         if (m_Imprint->GetPrepub() == CImprint::ePrepub_submitted) {
  230.             return SEditorFlatPub::eUnpublished;
  231.         } else if (m_Imprint->GetPrepub() == CImprint::ePrepub_in_press) {
  232.             return SEditorFlatPub::eIn_press;
  233.         }
  234.     } 
  235.     return SEditorFlatPub::ePublished;
  236. }
  237. // Menu Declarations
  238. SMenuEntryInfo RefStatusEntries [] = {
  239.     { "Unpublished", SEditorFlatPub::eUnpublished, 
  240.                         &CReferenceEntryForm::DeactivateRefClassMenu }, 
  241.     { "In Press",    SEditorFlatPub::eIn_press, 
  242.                         &CReferenceEntryForm::ActivateRefClassMenu }, 
  243.     { "Published",   SEditorFlatPub::ePublished, 
  244.                         &CReferenceEntryForm::ActivateRefClassMenu }, 
  245.     { 0,             0 }
  246. };
  247. CEntryFormMenu SRefStatusMenu(RefStatusEntries);
  248. // user data is set to 1. This indicates a redraw should
  249. //  be called in the cb_UnpubUI and cb_PubUI call backs.
  250. SMenuEntryInfo RefClassEntries [] = {
  251.     { " ",                   SEditorFlatPub::eUnpub, 
  252.       &CReferenceEntryForm::cb_UnpubUI, (void*)1 },
  253.     { "Journal",             SEditorFlatPub::eJournal, 
  254.       &CReferenceEntryForm::cb_PubUI,  (void*)1 },
  255.     { "Book Chapter",        SEditorFlatPub::eBookChapter,
  256.       &CReferenceEntryForm::cb_PubUI,  (void*)1 },
  257.     { "Book",                SEditorFlatPub::eBook,
  258.       &CReferenceEntryForm::cb_PubUI,  (void*)1 },
  259.     { "Thesis / Monograph",  SEditorFlatPub::eThesis,
  260.       &CReferenceEntryForm::cb_PubUI,  (void*)1 },
  261.     { "Proceedings Chapter", SEditorFlatPub::eProcChapter,
  262.       &CReferenceEntryForm::cb_PubUI,  (void*)1 },
  263.     { "Proceedings",         SEditorFlatPub::eProc,
  264.       &CReferenceEntryForm::cb_PubUI,  (void*)1 },
  265.     { "Patent",              SEditorFlatPub::ePatent,
  266.       &CReferenceEntryForm::cb_PubUI,  (void*)1 },
  267.     { "Online Publication",  SEditorFlatPub::eOnline,
  268.       &CReferenceEntryForm::cb_PubUI,  (void*)1 },
  269.     { 0,                     0 }
  270. };
  271. CEntryFormMenu SRefClassMenu(RefClassEntries);
  272. SMenuEntryInfo RefScopeEntries [] = {
  273.     { "Refers to the entire sequence",   0 },
  274.     { "Refers to part of the sequence",  0 },
  275.     { "Cites a feature on the sequence", 0 },
  276.     { 0,                                 0 }
  277. };
  278. CEntryFormMenu SRefScopeMenu(RefScopeEntries);
  279. CReferenceEntryForm::CReferenceEntryForm(CParagraph* p)
  280.     : CGenbankEntryForm(p),
  281.       m_FlatPub (const_cast<CPubdesc*> ((CPubdesc*) p->topic()))
  282.       
  283. {
  284.     CPubdesc* pubdesc =
  285.         const_cast<CPubdesc*> (dynamic_cast<const CPubdesc*> (p->topic()));
  286.     SEditorFlatPub flat_pub (pubdesc);
  287.     
  288.     SetTitle("Reference");
  289.     auto_ptr<CEntryFormTable> t
  290.         (new CEntryFormTable(GetFormWidget()->GetFormWidth(), 5));
  291.     t->AddTitleRow ("Publication Type");
  292.     m_Status      = t->AddMenuRow("Status", SRefStatusMenu, 
  293.                        SRefStatusMenu.FindEntry (m_FlatPub.GetPubStatus()), 
  294.                        this);
  295.     m_Class       = t->AddMenuRow("Class", SRefClassMenu, 
  296.                        SRefClassMenu.FindEntry (m_FlatPub.m_PubClass), this);
  297.     m_Scope       = t->AddMenuRow("Scope", SRefScopeMenu, 0);
  298.     t->End();
  299.     AddEditWidget(t.release());
  300.     if (m_Status->value() == 0) {
  301.         DeactivateRefClassMenu(m_Status, 0);
  302.     }
  303.     int ref_class = m_Class->value();
  304.     if (m_Class->menu()[ref_class].callback()) {
  305.         // user data is 0 to so that a Show will 
  306.         //  not be issued (look in cb_PubUI and cb_UnpubUI)
  307.         m_Class->menu()[ref_class].do_callback(m_Class, (void *)0);
  308.     }
  309. }
  310. CReferenceEntryForm::~CReferenceEntryForm()
  311. {
  312. }
  313. void CReferenceEntryForm::DeactivateRefClassMenu(Fl_Widget* w, void *u)
  314. {
  315.     CReferenceEntryForm* ref = (CReferenceEntryForm*) w->user_data();
  316.     Fl_Choice* ref_class = ref->m_Class;
  317.     for (int i = 1;  ref_class->text(i);  i++) {
  318.         ref_class->mode(i, FL_MENU_INACTIVE);
  319.     }
  320.     // Set the Ref Class to blank
  321.     ref_class->value(0);
  322.     // Issue the callback for a Ref Class change
  323.     if (ref_class->menu()[0].callback()) {
  324.         // user data is 1 to so that a Show will 
  325.         //  be issued (look in cb_PubUI and cb_UnpubUI)
  326.         ref_class->menu()[0].do_callback(ref_class, (void *)1);
  327.     }
  328.     
  329. }
  330. void CReferenceEntryForm::ActivateRefClassMenu(Fl_Widget* w, void *u)
  331. {
  332.     CReferenceEntryForm* ref = (CReferenceEntryForm*) w->user_data();
  333.     Fl_Choice* ref_class = ref->m_Class;
  334.     for (int i = 1;  ref_class->text(i);  i++) {
  335.         ref_class->mode(i, 0);
  336.     }
  337.     // the default Ref Class is Journal (1)
  338.     int menu_value = 1;
  339.     if (ref->m_FlatPub.m_PubClass != SEditorFlatPub::eUnpub) {
  340.         menu_value = SRefClassMenu.FindEntry (ref->m_FlatPub.m_PubClass);
  341.     }
  342.     ref_class->value(menu_value);
  343.     // Issue the callback for a Ref Class change
  344.     if (ref_class->menu()[menu_value].callback()) {
  345.         // user data is 1 to so that a Show will 
  346.         //  be issued (look in cb_PubUI and cb_UnpubUI)
  347.         ref_class->menu()[menu_value].do_callback(ref_class, (void *)1);
  348.     }
  349. }
  350. SMenuEntryInfo StandardRemarkEntries [] = {
  351.     { " ",                      0 },
  352.     { "AA by submitter",        0, &CReferenceEntryForm::cb_StandardRemark},
  353.     { "NT by submitter",        0, &CReferenceEntryForm::cb_StandardRemark},
  354.     { "NT and AA by submitter", 0, &CReferenceEntryForm::cb_StandardRemark},
  355.     { "AA by database",         0, &CReferenceEntryForm::cb_StandardRemark},
  356.     { "NT by database",         0, &CReferenceEntryForm::cb_StandardRemark},
  357.     { "NT and AA by database",  0, &CReferenceEntryForm::cb_StandardRemark},
  358.     { 0,                        0, &CReferenceEntryForm::cb_StandardRemark}
  359. };
  360. CEntryFormMenu SStandardRemarkMenu(StandardRemarkEntries);
  361. void CReferenceEntryForm::cb_UnpubUI(Fl_Widget* w, void *u)
  362. {
  363.     CReferenceEntryForm *ref_ui = (CReferenceEntryForm *) (w->user_data());
  364.     ref_ui->x_UnpubUI();
  365.     // If user data is set, issue a Show to resize 
  366.     //  and redraw the window.
  367.     // The Show will be issued if the call back was 
  368.     //  triggered by a Pub Class menu change. The redraw
  369.     //  is not issued if called from the constructor.
  370.     if (u) {
  371.         ref_ui->Show();
  372.     }
  373. }
  374. void CReferenceEntryForm::x_UnpubUI ()
  375. {
  376.     string title;
  377.     string remark;
  378.     SEditorFlatPub& flatpub = m_FlatPub; 
  379.     CPubdesc* pubdesc = flatpub.m_Pubdesc;
  380.     CPub* pub = flatpub.m_Pub;
  381.     x_Clear();
  382.     auto_ptr<CEntryFormTable> 
  383.         t(new CEntryFormTable(GetFormWidget()->GetFormWidth(), 5));
  384.     t->AddTitleRow ("Publication Information");
  385.     if (flatpub.m_CitType == CPub::e_Gen) {
  386.         const CCit_gen& g = pub->GetGen();
  387.         m_Title = t->AddInputRow("Title", " ");
  388.         if (g.IsSetTitle() && m_Title) {
  389.             m_Title->value(g.GetTitle().c_str());
  390.         }
  391.     }
  392.     m_Remark = t->AddInputRow("Remark", " ");
  393.     if (pubdesc->IsSetComment() && m_Remark) {
  394.         m_Remark->value(pubdesc->GetComment().c_str());
  395.     }
  396.     m_StandardRemark = t->AddMenuRow("Use Standard Remark", 
  397.                                             SStandardRemarkMenu, 0, this); 
  398.     t->End();
  399.     AddEditWidget(t.release());
  400.     x_AuthUI(flatpub);
  401.     x_DateUI(flatpub);
  402. }
  403. void CReferenceEntryForm::cb_PubUI(Fl_Widget* w, void *u)
  404. {
  405.     CReferenceEntryForm *ref_ui = (CReferenceEntryForm *) (w->user_data());
  406.     ref_ui->x_PubUI();
  407.     // If user data is set, issue a Show to resize 
  408.     //  and redraw the window.
  409.     // The Show will be issued if the call back was 
  410.     //  triggered by a Pub Class menu change. The redraw
  411.     //  is not issued if called from the constructor.
  412.     if (u) {
  413.         ref_ui->Show();
  414.     }
  415. }
  416. void CReferenceEntryForm::x_PubUI()
  417. {
  418.     string data = " ";
  419.     string remark;
  420.     x_Clear();
  421.     CPubdesc* pubdesc = m_FlatPub.m_Pubdesc;
  422.     auto_ptr<CEntryFormTable> 
  423.         t(new CEntryFormTable(GetFormWidget()->GetFormWidth(), 5));
  424.     t->AddTitleRow ("Publication Information");
  425.     if (m_FlatPub.m_Title) {
  426.         try {
  427.             data = m_FlatPub.m_Title->GetTitle();
  428.         } 
  429.         catch (...) {
  430.             data = " ";
  431.         }
  432.     }
  433.     m_Title = t->AddInputRow("Title", data.c_str());
  434.     m_Remark = t->AddInputRow("Remark", " ");
  435.     if (pubdesc->IsSetComment() && m_Remark) {
  436.         m_Remark->value(pubdesc->GetComment().c_str());
  437.     }
  438.     m_StandardRemark = t->AddMenuRow("Use Standard Remark", 
  439.                                             SStandardRemarkMenu, 0, this); 
  440.     t->End();
  441.     AddEditWidget(t.release());
  442. //    SEditorFlatPub::EPubClass pub_class;
  443.     int pub_class = RefClassEntries[m_Class->value()].m_Value;
  444.     switch (pub_class) {
  445.         case  SEditorFlatPub::eJournal:
  446.             x_AuthUI(m_FlatPub);
  447.             x_JournalUI();
  448.             x_DateUI(m_FlatPub);
  449.             break;
  450.         default:
  451.             break;
  452.     }
  453. }
  454. void CReferenceEntryForm::x_JournalUI()
  455. {
  456.     string data;
  457.     string title    = " ";
  458.     string volume   = " ";
  459.     string issue    = " ";
  460.     string pages    = " ";
  461.     string muid     = " ";
  462.     string pmid     = " ";
  463.     auto_ptr<CEntryFormTable> 
  464.         t(new CEntryFormTable(GetFormWidget()->GetFormWidth(), 5));
  465.     t->AddTitleRow ("Journal Information");
  466.     if (m_FlatPub.m_FromTitle) {
  467.         try {
  468.             title = m_FlatPub.m_FromTitle->GetTitle();
  469.         } 
  470.         catch (...) {
  471.             title = " ";
  472.         }
  473.     }
  474.     CImprint* imp = m_FlatPub.m_Imprint;
  475.     if (imp) {
  476.         if (imp->IsSetVolume()) {
  477.             volume = imp->GetVolume();
  478.         }
  479.         if (imp->IsSetIssue()) {
  480.             issue = imp->GetIssue();
  481.         }
  482.         if (imp->IsSetPages()) {
  483.             pages = imp->GetPages();
  484.         }
  485.     }
  486.     if (m_FlatPub.m_Muid) {
  487.         muid = NStr::IntToString(m_FlatPub.m_Muid);
  488.     }
  489.     if (m_FlatPub.m_Pmid) {
  490.         pmid = NStr::IntToString(m_FlatPub.m_Pmid);
  491.     }
  492.     m_Title = t->AddInputRow("Title", title.c_str(),
  493.                               CEntryFormTable::eSingleLine);
  494.     m_Volume = t->AddInputRow("Volume", volume.c_str(), 
  495.                               CEntryFormTable::eSingleLine);
  496.     m_Issue = t->AddInputRow("Issue", issue.c_str(),
  497.                              CEntryFormTable::eSingleLine);
  498.     m_Pages = t->AddInputRow("Pages", pages.c_str(),
  499.                              CEntryFormTable::eSingleLine);
  500.     m_Muid = t->AddInputRow("muid", muid.c_str(), CEntryFormTable::eInteger);
  501.     m_Pmid = t->AddInputRow("pmid", pmid.c_str(), CEntryFormTable::eInteger);
  502.     t->End();
  503.     AddEditWidget(t.release());
  504. }
  505. void  CReferenceEntryForm::cb_StandardRemark (Fl_Widget* w, void *u) 
  506. {
  507.        
  508.     CReferenceEntryForm *ref_ui = (CReferenceEntryForm *) (w->user_data());
  509.     
  510.     Fl_Choice* menu = ref_ui->m_StandardRemark;
  511.     const char* std_remark = menu->menu()[menu->value()].label();
  512.     Fl_Input* input = ref_ui->m_Remark;
  513.     CNcbiStrstream new_remark;
  514.     new_remark << input->value() << " " << std_remark;
  515.     input->value(new_remark.str());
  516. }
  517. SMenuEntryInfo DateMonthEntries [] = {
  518.     { " ",          0 },
  519.     { "January",    1 },
  520.     { "February",   2 },
  521.     { "March",      3 },
  522.     { "April",      4 },
  523.     { "May",        5 },
  524.     { "June",       6 },
  525.     { "July",       7 },
  526.     { "August",     8 },
  527.     { "September",  9 },
  528.     { "October",   10 },
  529.     { "November",  11 },
  530.     { "December",  12 },
  531.     { 0,            0 }
  532. };
  533. CEntryFormMenu SDateMonthMenu(DateMonthEntries);
  534. void CReferenceEntryForm::x_DateUI(SEditorFlatPub& flatpub)
  535. {
  536.     CDate* date = flatpub.m_Date;
  537.     auto_ptr<CEntryFormTable> t
  538.         (new CEntryFormTable(GetFormWidget()->GetFormWidth(), 5));
  539.     t->AddTitleRow("Date");
  540.     m_Year  = t->AddInputRow("Year", " ", CEntryFormTable::eInteger);
  541.     m_Month = t->AddMenuRow("Month", SDateMonthMenu, 0);
  542.     m_Day   = t->AddInputRow("Day", " ", CEntryFormTable::eInteger);
  543.     t->End();
  544.     AddEditWidget(t.release());
  545.     
  546.     if (date == 0) return;
  547.     if (date->IsStd()) {
  548.         const CDate_std& std_date = date->GetStd();
  549.         m_Year->value(NStr::IntToString(std_date.GetYear()).c_str());
  550.         if (std_date.IsSetMonth()) {
  551.             m_Month->value(std_date.GetMonth());
  552.         }
  553.         if (std_date.IsSetDay()) {
  554.             m_Day->value(NStr::IntToString(std_date.GetDay()).c_str());
  555.         }
  556.     }
  557. }
  558. void CReferenceEntryForm::x_AuthUI(SEditorFlatPub& flatpub)
  559. {
  560.     CAuth_list* auth_list = flatpub.m_Auth_list;
  561.     auto_ptr<CAuthEntryFormTable> 
  562.         t(new CAuthEntryFormTable(GetFormWidget()->GetFormWidth(), 5));
  563.     t->AddTitleRow("Authors");
  564.     if (auth_list && auth_list->GetNames().IsStd()) {
  565.         
  566.         ITERATE (CAuth_list::C_Names::TStd, iter, 
  567.                  auth_list->GetNames().GetStd()) {
  568.             const CPerson_id& id = (*iter)->GetName();
  569.             if (id.IsName()) {
  570.                 const CName_std& name = id.GetName();
  571.                 Fl_Group* row = t->AddAuthRow();
  572.                 if (name.IsSetFirst()) {
  573.                     t->FirstName(row, name.GetFirst().c_str());
  574.                     if (name.IsSetMiddle()) {
  575.                         t->MiddleName(row, name.GetMiddle().c_str());
  576.                     }
  577.                 } else if (name.IsSetInitials()) {
  578.                     const char* initials = name.GetInitials().c_str();
  579.                     int         len = name.GetInitials().size(); 
  580.                     char    letter[2] = " ";
  581.                     if (len) {
  582.                         *letter = *initials;
  583.                         t->FirstName(row, letter);
  584.                         if (len == 2 && initials[1] == '.') {
  585.                             *letter = initials[1];
  586.                             t->MiddleName(row, letter);
  587.                         } else if (len >= 3) {
  588.                             *letter = initials[2];
  589.                             t->MiddleName(row, letter);
  590.                         }
  591.                     }
  592.                 }
  593.                 t->LastName(row, name.GetLast().c_str());
  594.             }
  595.         }
  596.     }
  597.     t->AddButtonRow();
  598.     t->End();
  599.     m_Auth_list = t.get();
  600.     AddEditWidget(t.release());
  601. }
  602.                 
  603. void CReferenceEntryForm::x_Clear()
  604. {
  605.     while (GetFormWidget()->GetNumEntries() > 1) {
  606.         GetFormWidget()->RemoveWidget(1);
  607.     }
  608.     /**
  609.     Fl_Pack* edit_pack = GetEditPack();
  610.     // remove and delete all the form tables in the entry form
  611.     //  except the Publication type (the first form table).
  612.     while (edit_pack->children() > 1) {
  613.         Fl_Widget* w = edit_pack->child(1);
  614.         edit_pack->remove(w);
  615.         delete w;
  616.     }
  617.     **/
  618. }
  619.         
  620.                 
  621. END_NCBI_SCOPE