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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: combobox.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:52:05  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_FL___COMBOBOX__HPP
  10. #define GUI_WIDGETS_FL___COMBOBOX__HPP
  11. /*  $Id: combobox.hpp,v 1000.2 2004/06/01 19:52:05 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: Philip Johnson
  37. *
  38. * File Description: combobox.hpp -- dropdown combobox widget for FLTK
  39. *
  40. * ---------------------------------------------------------------------------
  41. */
  42. #include <corelib/ncbistd.hpp>
  43. #include <gui/gui.hpp>
  44. #include <FL/Fl.H>
  45. #include <FL/Fl_Hold_Browser.H>
  46. #include <FL/Fl_Menu_Window.H>
  47. #include <FL/Fl_Input.H>
  48. #include <string>
  49. #include <vector>
  50. #include <map>
  51. #include <memory>
  52. class Fl_Button;
  53. class Fl_Box;
  54. /** @addtogroup GUI_FltkWidgets
  55.  *
  56.  * @{
  57.  */
  58. BEGIN_NCBI_SCOPE
  59. /// CComboBox widget -- combination input box & drop-down list box
  60. /// 
  61. /// callback conditions:
  62. ///
  63. /// FL_WHEN_CHANGED --> executes when ENTER/UNFOCUS/CLOSE DROPDOWN,
  64. ///                     matches an entry in the list, and
  65. ///                     value has changed.
  66. /// FL_WHEN_NOT_CHANGED --> executes when ENTER/UNFOCUS/CLOSE DROPDOWN  and
  67. ///                         matches an entry in the list
  68. /// FL_WHEN_RELEASE_ALWAYS --> executes when ENTER/UNFOCUS/CLOSE DROPDOWN
  69. class NCBI_GUIWIDGETS_FL_EXPORT CComboBox : public Fl_Group
  70. {
  71. public:
  72.     enum ETypeFlags {
  73.         eRestrictToEntries = 0x1, //only allow input of the specified type
  74.         eCaseSensitive     = 0x2
  75.     };
  76.     CComboBox(int x, int y, int w, int h, const char* label = NULL);
  77.     int popup_height(void) const { return m_Browser->h(); }
  78.     void popup_height(int h) { m_Browser->size(m_Browser->w(), h); }
  79.     /// Add an entry to the browser, plus an optional abbreviation for that
  80.     /// entry
  81.     void Add(const char* entry, const char* abbrev = NULL);
  82.     /// Clear all entries from browser
  83.     void clear(void);
  84.     /// Set type using ETypeFlags above
  85.     void type(unsigned char t);
  86.     unsigned char type(void) const { return Fl_Widget::type(); }
  87.     void value(const char*);
  88.     const char* value(void) const;
  89.     int value_index(void) const;//< returns -1 if value not in list of options
  90. public:
  91.     class CMap : public map<string, int> {
  92.     public:
  93.         const_iterator FindExact(const char*, bool caseSense = false) const;
  94.         const_iterator FindInitial(const char*, bool caseSense = false) const;
  95.         pair<iterator, bool> Add(const char*, int, bool caseSense = false);
  96.     };
  97. protected:
  98.     typedef vector<string>   TEntries;
  99.     /// Popupwin class makes up for deficiencies of Fl::grab() function
  100.     class CPopupWin : public Fl_Menu_Window {
  101.     public:
  102.         CPopupWin(int x, int y, int w, int h);
  103.         virtual int handle(int event);
  104.     private:
  105.         Fl_Widget *m_MouseOver;
  106.     };
  107.     /// Modified version of Fl_Input that:
  108.     /// 1) has an undo feature
  109.     /// 2) if ctrl key combination is pressed, checks parent window for
  110.     ///    shortcuts; iff none is found, then Fl_Input is passed the key
  111.     class CInput : public Fl_Input {
  112.     public:
  113.         CInput(int x, int y, int w, int h) :
  114.             Fl_Input(x,y,w,h), m_Mark(0), m_Position(0) {}
  115.         virtual int handle(int e);
  116.         void Undo(void);
  117.     private:
  118.         string m_Value;
  119.         int m_Mark, m_Position;
  120.     };
  121.     /// Modified version of Fl_Hold_Browser that will (initially) select
  122.     /// the first entry upon receiving a down arrow instead of jumping to the
  123.     /// second
  124.     class CBrowser : public Fl_Hold_Browser {
  125.     public:
  126.         CBrowser(int x, int y, int w, int h) : Fl_Hold_Browser(x,y,w,h) {}
  127.         virtual int handle(int e);
  128.     };
  129. protected:
  130.     virtual int handle(int event);
  131.     void x_OpenBrowser(void);
  132.     void x_CloseBrowser(void);
  133. private:
  134.     static void s_ButtonCB(Fl_Widget *, CComboBox* c) {
  135.         c->x_ButtonClicked();
  136.     }
  137.     static void s_CloseCB(Fl_Widget *, CComboBox* c) {
  138.         c->x_CloseBrowser();
  139.     }
  140.     static void s_InputCB(Fl_Widget *, CComboBox* c) {
  141.         c->x_Keypressed();
  142.     }
  143.     static void s_BrowserCB(Fl_Widget *, CComboBox* c) {
  144.         c->x_ItemSelected();
  145.     }
  146.     void x_MaybeCallback(void);
  147.     void x_ButtonClicked(void);
  148.     void x_Keypressed(void);
  149.     void x_ItemSelected(void);
  150.     CPopupWin  *m_PopupWin;
  151.     Fl_Box     *m_ResizeBox;
  152.     Fl_Box     *m_Box;
  153.     CInput     *m_Input;
  154.     Fl_Button  *m_Button;
  155.     CBrowser   *m_Browser;
  156.     string      m_PrevValue;
  157.     bool        m_InKeypressed; //recursive call guard
  158.     TEntries       m_Entries;
  159.     auto_ptr<CMap> m_EntryMap;
  160. };
  161. //////////// inline methods //////////////
  162. //-----------------------------------------------------------------------------
  163. //PRE : c string; whether or not we should pay attention to case
  164. //POST: iterator pointing to the entry that equals 'k' (if any)
  165. inline 
  166. CComboBox::CMap::const_iterator
  167. CComboBox::CMap::FindExact(const char* k, bool caseSensitive) const
  168. {
  169.     if (caseSensitive) {
  170.         return find(k);
  171.     } else {
  172.         string up(k);
  173.         return find(NStr::ToUpper(up));
  174.     }
  175. }
  176. //-----------------------------------------------------------------------------
  177. //PRE : c string; whether or not we should pay attention to case
  178. //POST: iterator pointing to the entry that begins with 'k' (if any)
  179. inline 
  180. CComboBox::CMap::const_iterator
  181. CComboBox::CMap::FindInitial(const char* k, bool caseSensitive) const
  182. {
  183.     string up;
  184.     if (!caseSensitive) {
  185.         up = k;
  186.         NStr::ToUpper(up);
  187.         k = up.c_str();
  188.     };
  189.     const_iterator i = lower_bound(k);
  190.     if (i == end()  ||  i->first.find(k) == string::npos) {
  191.         return end();
  192.     } else {
  193.         return i;
  194.     }
  195. }
  196. //-----------------------------------------------------------------------------
  197. //PRE : c string; whether or not we should pay attention to case
  198. //POST: <'k',x> added, with k capitalized if we're ignoring case
  199. inline 
  200. pair<CComboBox::CMap::iterator, bool>
  201. CComboBox::CMap::Add(const char* k, int x, bool caseSense)
  202. {
  203.     if (!caseSense) {
  204.         string up(k);
  205.         return insert(value_type(NStr::ToUpper(up), x));
  206.     } else {
  207.         return insert(value_type(k, x));
  208.     }
  209. }
  210. END_NCBI_SCOPE
  211. /* @} */
  212. /*
  213. * ===========================================================================
  214. * $Log: combobox.hpp,v $
  215. * Revision 1000.2  2004/06/01 19:52:05  gouriano
  216. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  217. *
  218. * Revision 1.15  2004/05/11 18:55:14  dicuccio
  219. * Added doxygen modules info
  220. *
  221. * Revision 1.14  2004/05/03 12:47:08  dicuccio
  222. * Added #include for gui/gui.hpp.  gui/utils ->gui/objutils where needed.
  223. *
  224. * Revision 1.13  2004/02/09 16:49:57  johnson
  225. * added popup_height get/set methods
  226. *
  227. * Revision 1.12  2004/01/21 23:55:39  johnson
  228. * fix to get popup working correctly after resize
  229. *
  230. * Revision 1.11  2004/01/13 21:15:29  johnson
  231. * made popup a top-level window so it will appear even if combobox is at the
  232. * bottom of the parent window
  233. *
  234. * Revision 1.10  2003/12/12 17:59:45  ivanov
  235. * Made CComboBox::CMap public to avoid compilation error on MSVC 7
  236. *
  237. * Revision 1.9  2003/10/14 22:50:30  johnson
  238. * added method to clear browser
  239. *
  240. * Revision 1.8  2003/09/24 18:21:09  dicuccio
  241. * Rearranged #include statements to avoid a compiler warning on MSVC
  242. *
  243. * Revision 1.7  2003/09/16 14:37:14  dicuccio
  244. * Cleaned up and clarified export specifiers - added a new specifier for each
  245. * library
  246. *
  247. * Revision 1.6  2003/08/30 16:40:37  dicuccio
  248. * Minor fixes: #include guard to top, fixed return value of accessor in internal
  249. * class to meet MSVC's requirements
  250. *
  251. * Revision 1.5  2003/08/30 15:06:18  ucko
  252. * +<memory> for auto_ptr<>
  253. *
  254. * Revision 1.4  2003/08/29 18:29:38  johnson
  255. * Numerous tweaks & adjustments: replaced Fl_Input with class that does *not*
  256. * automatically swallows ctrl key shortcuts; case in/sensitive matching;
  257. * multiple abbreviations for a given entry; smoothed internal access to map
  258. *
  259. * Revision 1.3  2003/08/26 13:19:05  johnson
  260. * added value set function
  261. *
  262. * Revision 1.2  2003/08/21 12:24:00  dicuccio
  263. * Changed #include guard.  Minor formatting changes.  Added to ncbi namespace.
  264. *
  265. * Revision 1.1  2003/08/19 18:16:41  johnson
  266. * initial revision
  267. *
  268. * ===========================================================================
  269. */
  270. #endif // GUI_WIDGETS_FL___COMBOBOX__HPP