combobox.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Program: wxWidgets Widgets Sample
  3. // Name: combobox.cpp
  4. // Purpose: Part of the widgets sample showing wxComboBox
  5. // Author: Vadim Zeitlin
  6. // Created: 27.03.01
  7. // Copyright: (c) 2001 Vadim Zeitlin
  8. // Licence: wxWindows licence
  9. /////////////////////////////////////////////////////////////////////////////
  10. // ============================================================================
  11. // declarations
  12. // ============================================================================
  13. // ----------------------------------------------------------------------------
  14. // headers
  15. // ----------------------------------------------------------------------------
  16. // for compilers that support precompilation, includes "wx/wx.h".
  17. #include "wx/wxprec.h"
  18. #ifdef __BORLANDC__
  19. #pragma hdrstop
  20. #endif
  21. #if wxUSE_COMBOBOX
  22. // for all others, include the necessary headers
  23. #ifndef WX_PRECOMP
  24. #include "wx/log.h"
  25. #include "wx/bitmap.h"
  26. #include "wx/button.h"
  27. #include "wx/checkbox.h"
  28. #include "wx/combobox.h"
  29. #include "wx/radiobox.h"
  30. #include "wx/statbox.h"
  31. #include "wx/textctrl.h"
  32. #endif
  33. #include "wx/sizer.h"
  34. #include "itemcontainer.h"
  35. #include "widgets.h"
  36. #include "icons/combobox.xpm"
  37. // ----------------------------------------------------------------------------
  38. // constants
  39. // ----------------------------------------------------------------------------
  40. // control ids
  41. enum
  42. {
  43. ComboPage_Reset = wxID_HIGHEST,
  44. ComboPage_Popup,
  45. ComboPage_Dismiss,
  46. ComboPage_SetCurrent,
  47. ComboPage_CurText,
  48. ComboPage_InsertionPointText,
  49. ComboPage_Insert,
  50. ComboPage_InsertText,
  51. ComboPage_Add,
  52. ComboPage_AddText,
  53. ComboPage_SetFirst,
  54. ComboPage_SetFirstText,
  55. ComboPage_AddSeveral,
  56. ComboPage_AddMany,
  57. ComboPage_Clear,
  58. ComboPage_Change,
  59. ComboPage_ChangeText,
  60. ComboPage_Delete,
  61. ComboPage_DeleteText,
  62. ComboPage_DeleteSel,
  63. ComboPage_SetValue,
  64. ComboPage_SetValueText,
  65. ComboPage_Combo,
  66. ComboPage_ContainerTests
  67. };
  68. // kinds of comboboxes
  69. enum
  70. {
  71. ComboKind_Default,
  72. ComboKind_Simple,
  73. ComboKind_DropDown
  74. };
  75. // ----------------------------------------------------------------------------
  76. // ComboboxWidgetsPage
  77. // ----------------------------------------------------------------------------
  78. class ComboboxWidgetsPage : public ItemContainerWidgetsPage
  79. {
  80. public:
  81. ComboboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
  82. virtual wxControl *GetWidget() const { return m_combobox; }
  83. virtual wxTextEntryBase *GetTextEntry() const { return m_combobox; }
  84. virtual wxItemContainer* GetContainer() const { return m_combobox; }
  85. virtual void RecreateWidget() { CreateCombo(); }
  86. // lazy creation of the content
  87. virtual void CreateContent();
  88. protected:
  89. // event handlers
  90. void OnButtonReset(wxCommandEvent& event);
  91. void OnButtonPopup(wxCommandEvent&) { m_combobox->Popup(); }
  92. void OnButtonDismiss(wxCommandEvent&) { m_combobox->Dismiss(); }
  93. void OnButtonChange(wxCommandEvent& event);
  94. void OnButtonDelete(wxCommandEvent& event);
  95. void OnButtonDeleteSel(wxCommandEvent& event);
  96. void OnButtonClear(wxCommandEvent& event);
  97. void OnButtonInsert(wxCommandEvent &event);
  98. void OnButtonAdd(wxCommandEvent& event);
  99. void OnButtonSetFirst(wxCommandEvent& event);
  100. void OnButtonAddSeveral(wxCommandEvent& event);
  101. void OnButtonAddMany(wxCommandEvent& event);
  102. void OnButtonSetValue(wxCommandEvent& event);
  103. void OnButtonSetCurrent(wxCommandEvent& event);
  104. void OnDropdown(wxCommandEvent& event);
  105. void OnCloseup(wxCommandEvent& event);
  106. void OnComboBox(wxCommandEvent& event);
  107. void OnComboText(wxCommandEvent& event);
  108. void OnComboTextPasted(wxClipboardTextEvent& event);
  109. void OnCheckOrRadioBox(wxCommandEvent& event);
  110. void OnUpdateUIInsertionPointText(wxUpdateUIEvent& event);
  111. void OnUpdateUIInsert(wxUpdateUIEvent& event);
  112. void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
  113. void OnUpdateUIClearButton(wxUpdateUIEvent& event);
  114. void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
  115. void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
  116. void OnUpdateUIResetButton(wxUpdateUIEvent& event);
  117. void OnUpdateUISetCurrent(wxUpdateUIEvent& event);
  118. // reset the combobox parameters
  119. void Reset();
  120. // (re)create the combobox
  121. void CreateCombo();
  122. // the controls
  123. // ------------
  124. // the sel mode radiobox
  125. wxRadioBox *m_radioKind;
  126. // the checkboxes for styles
  127. wxCheckBox *m_chkSort,
  128. *m_chkReadonly,
  129. *m_chkProcessEnter;
  130. // the combobox itself and the sizer it is in
  131. wxComboBox *m_combobox;
  132. wxSizer *m_sizerCombo;
  133. // the text entries for "Add/change string" and "Delete" buttons
  134. wxTextCtrl *m_textInsert,
  135. *m_textAdd,
  136. *m_textSetFirst,
  137. *m_textChange,
  138. *m_textSetValue,
  139. *m_textDelete,
  140. *m_textCur;
  141. private:
  142. wxDECLARE_EVENT_TABLE();
  143. DECLARE_WIDGETS_PAGE(ComboboxWidgetsPage)
  144. };
  145. // ----------------------------------------------------------------------------
  146. // event tables
  147. // ----------------------------------------------------------------------------
  148. wxBEGIN_EVENT_TABLE(ComboboxWidgetsPage, WidgetsPage)
  149. EVT_BUTTON(ComboPage_Reset, ComboboxWidgetsPage::OnButtonReset)
  150. EVT_BUTTON(ComboPage_Popup, ComboboxWidgetsPage::OnButtonPopup)
  151. EVT_BUTTON(ComboPage_Dismiss, ComboboxWidgetsPage::OnButtonDismiss)
  152. EVT_BUTTON(ComboPage_Change, ComboboxWidgetsPage::OnButtonChange)
  153. EVT_BUTTON(ComboPage_Delete, ComboboxWidgetsPage::OnButtonDelete)
  154. EVT_BUTTON(ComboPage_DeleteSel, ComboboxWidgetsPage::OnButtonDeleteSel)
  155. EVT_BUTTON(ComboPage_Clear, ComboboxWidgetsPage::OnButtonClear)
  156. EVT_BUTTON(ComboPage_Insert, ComboboxWidgetsPage::OnButtonInsert)
  157. EVT_BUTTON(ComboPage_Add, ComboboxWidgetsPage::OnButtonAdd)
  158. EVT_BUTTON(ComboPage_SetFirst, ComboboxWidgetsPage::OnButtonSetFirst)
  159. EVT_BUTTON(ComboPage_AddSeveral, ComboboxWidgetsPage::OnButtonAddSeveral)
  160. EVT_BUTTON(ComboPage_AddMany, ComboboxWidgetsPage::OnButtonAddMany)
  161. EVT_BUTTON(ComboPage_SetValue, ComboboxWidgetsPage::OnButtonSetValue)
  162. EVT_BUTTON(ComboPage_SetCurrent, ComboboxWidgetsPage::OnButtonSetCurrent)
  163. EVT_BUTTON(ComboPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer)
  164. EVT_TEXT_ENTER(ComboPage_InsertText, ComboboxWidgetsPage::OnButtonInsert)
  165. EVT_TEXT_ENTER(ComboPage_AddText, ComboboxWidgetsPage::OnButtonAdd)
  166. EVT_TEXT_ENTER(ComboPage_DeleteText, ComboboxWidgetsPage::OnButtonDelete)
  167. EVT_UPDATE_UI(ComboPage_InsertionPointText, ComboboxWidgetsPage::OnUpdateUIInsertionPointText)
  168. EVT_UPDATE_UI(ComboPage_Reset, ComboboxWidgetsPage::OnUpdateUIResetButton)
  169. EVT_UPDATE_UI(ComboPage_Insert, ComboboxWidgetsPage::OnUpdateUIInsert)
  170. EVT_UPDATE_UI(ComboPage_AddSeveral, ComboboxWidgetsPage::OnUpdateUIAddSeveral)
  171. EVT_UPDATE_UI(ComboPage_Clear, ComboboxWidgetsPage::OnUpdateUIClearButton)
  172. EVT_UPDATE_UI(ComboPage_DeleteText, ComboboxWidgetsPage::OnUpdateUIClearButton)
  173. EVT_UPDATE_UI(ComboPage_Delete, ComboboxWidgetsPage::OnUpdateUIDeleteButton)
  174. EVT_UPDATE_UI(ComboPage_Change, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
  175. EVT_UPDATE_UI(ComboPage_ChangeText, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
  176. EVT_UPDATE_UI(ComboPage_DeleteSel, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
  177. EVT_UPDATE_UI(ComboPage_SetCurrent, ComboboxWidgetsPage::OnUpdateUISetCurrent)
  178. EVT_COMBOBOX(ComboPage_Combo, ComboboxWidgetsPage::OnComboBox)
  179. EVT_COMBOBOX_DROPDOWN(ComboPage_Combo, ComboboxWidgetsPage::OnDropdown)
  180. EVT_COMBOBOX_CLOSEUP(ComboPage_Combo, ComboboxWidgetsPage::OnCloseup)
  181. EVT_TEXT(ComboPage_Combo, ComboboxWidgetsPage::OnComboText)
  182. EVT_TEXT_ENTER(ComboPage_Combo, ComboboxWidgetsPage::OnComboText)
  183. EVT_TEXT_PASTE(ComboPage_Combo, ComboboxWidgetsPage::OnComboTextPasted)
  184. EVT_CHECKBOX(wxID_ANY, ComboboxWidgetsPage::OnCheckOrRadioBox)
  185. EVT_RADIOBOX(wxID_ANY, ComboboxWidgetsPage::OnCheckOrRadioBox)
  186. wxEND_EVENT_TABLE()
  187. // ============================================================================
  188. // implementation
  189. // ============================================================================
  190. #if defined(__WXUNIVERSAL__)
  191. #define FAMILY_CTRLS UNIVERSAL_CTRLS
  192. #else
  193. #define FAMILY_CTRLS NATIVE_CTRLS
  194. #endif
  195. IMPLEMENT_WIDGETS_PAGE(ComboboxWidgetsPage, wxT("Combobox"),
  196. FAMILY_CTRLS | WITH_ITEMS_CTRLS | COMBO_CTRLS
  197. );
  198. ComboboxWidgetsPage::ComboboxWidgetsPage(WidgetsBookCtrl *book,
  199. wxImageList *imaglist)
  200. : ItemContainerWidgetsPage(book, imaglist, combobox_xpm)
  201. {
  202. // init everything
  203. m_chkSort =
  204. m_chkReadonly =
  205. m_chkProcessEnter = (wxCheckBox *)NULL;
  206. m_combobox = (wxComboBox *)NULL;
  207. m_sizerCombo = (wxSizer *)NULL;
  208. }
  209. void ComboboxWidgetsPage::CreateContent()
  210. {
  211. /*
  212. What we create here is a frame having 3 panes: style pane is the
  213. leftmost one, in the middle the pane with buttons allowing to perform
  214. miscellaneous combobox operations and the pane containing the combobox
  215. itself to the right
  216. */
  217. wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
  218. // upper left pane
  219. // should be in sync with ComboKind_XXX values
  220. static const wxString kinds[] =
  221. {
  222. wxT("default"),
  223. wxT("simple"),
  224. wxT("drop down"),
  225. };
  226. m_radioKind = new wxRadioBox(this, wxID_ANY, wxT("Combobox &kind:"),
  227. wxDefaultPosition, wxDefaultSize,
  228. WXSIZEOF(kinds), kinds,
  229. 1, wxRA_SPECIFY_COLS);
  230. wxSizer *sizerLeftTop = new wxStaticBoxSizer(wxVERTICAL, this, "&Set style");
  231. m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("&Sort items"));
  232. m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("&Read only"));
  233. m_chkProcessEnter = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("Process &Enter"));
  234. sizerLeftTop->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
  235. sizerLeftTop->Add(m_radioKind, 0, wxGROW | wxALL, 5);
  236. wxButton *btn = new wxButton(this, ComboPage_Reset, wxT("&Reset"));
  237. sizerLeftTop->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
  238. // lower left pane
  239. wxSizer *sizerLeftBottom = new wxStaticBoxSizer(wxVERTICAL, this, "&Popup");
  240. sizerLeftBottom->Add(new wxButton(this, ComboPage_Popup, "&Show"),
  241. wxSizerFlags().Border().Centre());
  242. sizerLeftBottom->Add(new wxButton(this, ComboPage_Dismiss, "&Hide"),
  243. wxSizerFlags().Border().Centre());
  244. wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL);
  245. sizerLeft->Add(sizerLeftTop);
  246. sizerLeft->AddSpacer(10);
  247. sizerLeft->Add(sizerLeftBottom, wxSizerFlags().Expand());
  248. // middle pane
  249. wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY,
  250. wxT("&Change combobox contents"));
  251. wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
  252. wxSizer *sizerRow;
  253. sizerRow = CreateSizerWithTextAndButton(ComboPage_SetCurrent,
  254. wxT("Current &selection"),
  255. ComboPage_CurText,
  256. &m_textCur);
  257. sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
  258. wxTextCtrl *text;
  259. sizerRow = CreateSizerWithTextAndLabel(wxT("Insertion Point"),
  260. ComboPage_InsertionPointText,
  261. &text);
  262. text->SetEditable(false);
  263. sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
  264. sizerRow = CreateSizerWithTextAndButton(ComboPage_Insert,
  265. wxT("&Insert this string"),
  266. ComboPage_InsertText,
  267. &m_textInsert);
  268. sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
  269. sizerRow = CreateSizerWithTextAndButton(ComboPage_Add,
  270. wxT("&Add this string"),
  271. ComboPage_AddText,
  272. &m_textAdd);
  273. sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
  274. sizerRow = CreateSizerWithTextAndButton(ComboPage_SetFirst,
  275. wxT("Change &1st string"),
  276. ComboPage_SetFirstText,
  277. &m_textSetFirst);
  278. sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
  279. btn = new wxButton(this, ComboPage_AddSeveral, wxT("&Append a few strings"));
  280. sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
  281. btn = new wxButton(this, ComboPage_AddMany, wxT("Append &many strings"));
  282. sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
  283. sizerRow = CreateSizerWithTextAndButton(ComboPage_Change,
  284. wxT("C&hange current"),
  285. ComboPage_ChangeText,
  286. &m_textChange);
  287. sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
  288. sizerRow = CreateSizerWithTextAndButton(ComboPage_Delete,
  289. wxT("&Delete this item"),
  290. ComboPage_DeleteText,
  291. &m_textDelete);
  292. sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
  293. btn = new wxButton(this, ComboPage_DeleteSel, wxT("Delete &selection"));
  294. sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
  295. btn = new wxButton(this, ComboPage_Clear, wxT("&Clear"));
  296. sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
  297. sizerRow = CreateSizerWithTextAndButton(ComboPage_SetValue,
  298. wxT("SetValue"),
  299. ComboPage_SetValueText,
  300. &m_textSetValue);
  301. sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
  302. btn = new wxButton(this, ComboPage_ContainerTests, wxT("Run &tests"));
  303. sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
  304. // right pane
  305. wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL);
  306. m_combobox = new wxComboBox(this, ComboPage_Combo, wxEmptyString,
  307. wxDefaultPosition, wxDefaultSize,
  308. 0, NULL,
  309. 0);
  310. sizerRight->Add(m_combobox, 0, wxGROW | wxALL, 5);
  311. sizerRight->SetMinSize(150, 0);
  312. m_sizerCombo = sizerRight; // save it to modify it later
  313. // the 3 panes panes compose the window
  314. sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
  315. sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
  316. sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
  317. // final initializations
  318. Reset();
  319. SetSizer(sizerTop);
  320. }
  321. // ----------------------------------------------------------------------------
  322. // operations
  323. // ----------------------------------------------------------------------------
  324. void ComboboxWidgetsPage::Reset()
  325. {
  326. m_chkSort->SetValue(false);
  327. m_chkReadonly->SetValue(false);
  328. m_chkProcessEnter->SetValue(false);
  329. }
  330. void ComboboxWidgetsPage::CreateCombo()
  331. {
  332. int flags = ms_defaultFlags;
  333. if ( m_chkSort->GetValue() )
  334. flags |= wxCB_SORT;
  335. if ( m_chkReadonly->GetValue() )
  336. flags |= wxCB_READONLY;
  337. if ( m_chkProcessEnter->GetValue() )
  338. flags |= wxTE_PROCESS_ENTER;
  339. switch ( m_radioKind->GetSelection() )
  340. {
  341. default:
  342. wxFAIL_MSG( wxT("unknown combo kind") );
  343. // fall through
  344. case ComboKind_Default:
  345. break;
  346. case ComboKind_Simple:
  347. flags |= wxCB_SIMPLE;
  348. break;
  349. case ComboKind_DropDown:
  350. flags = wxCB_DROPDOWN;
  351. break;
  352. }
  353. wxArrayString items;
  354. if ( m_combobox )
  355. {
  356. unsigned int count = m_combobox->GetCount();
  357. for ( unsigned int n = 0; n < count; n++ )
  358. {
  359. items.Add(m_combobox->GetString(n));
  360. }
  361. m_sizerCombo->Detach( m_combobox );
  362. delete m_combobox;
  363. }
  364. m_combobox = new wxComboBox(this, ComboPage_Combo, wxEmptyString,
  365. wxDefaultPosition, wxDefaultSize,
  366. 0, NULL,
  367. flags);
  368. unsigned int count = items.GetCount();
  369. for ( unsigned int n = 0; n < count; n++ )
  370. {
  371. m_combobox->Append(items[n]);
  372. }
  373. m_sizerCombo->Add(m_combobox, 0, wxGROW | wxALL, 5);
  374. m_sizerCombo->Layout();
  375. }
  376. // ----------------------------------------------------------------------------
  377. // event handlers
  378. // ----------------------------------------------------------------------------
  379. void ComboboxWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
  380. {
  381. Reset();
  382. CreateCombo();
  383. }
  384. void ComboboxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
  385. {
  386. int sel = m_combobox->GetSelection();
  387. if ( sel != wxNOT_FOUND )
  388. {
  389. m_combobox->SetString(sel, m_textChange->GetValue());
  390. }
  391. }
  392. void ComboboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
  393. {
  394. unsigned long n;
  395. if ( !m_textDelete->GetValue().ToULong(&n) ||
  396. (n >= m_combobox->GetCount()) )
  397. {
  398. return;
  399. }
  400. m_combobox->Delete(n);
  401. }
  402. void ComboboxWidgetsPage::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event))
  403. {
  404. int sel = m_combobox->GetSelection();
  405. if ( sel != wxNOT_FOUND )
  406. {
  407. m_combobox->Delete(sel);
  408. }
  409. }
  410. void ComboboxWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event))
  411. {
  412. wxString value = m_textSetValue->GetValue();
  413. m_combobox->SetValue( value );
  414. }
  415. void ComboboxWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
  416. {
  417. m_combobox->Clear();
  418. }
  419. void ComboboxWidgetsPage::OnButtonInsert(wxCommandEvent& WXUNUSED(event))
  420. {
  421. static unsigned int s_item = 0;
  422. wxString s = m_textInsert->GetValue();
  423. if ( !m_textInsert->IsModified() )
  424. {
  425. // update the default string
  426. m_textInsert->SetValue(wxString::Format(wxT("test item %u"), ++s_item));
  427. }
  428. if (m_combobox->GetSelection() >= 0)
  429. m_combobox->Insert(s, m_combobox->GetSelection());
  430. }
  431. void ComboboxWidgetsPage::OnButtonAdd(wxCommandEvent& WXUNUSED(event))
  432. {
  433. static unsigned int s_item = 0;
  434. wxString s = m_textAdd->GetValue();
  435. if ( !m_textAdd->IsModified() )
  436. {
  437. // update the default string
  438. m_textAdd->SetValue(wxString::Format(wxT("test item %u"), ++s_item));
  439. }
  440. m_combobox->Append(s);
  441. }
  442. void ComboboxWidgetsPage::OnButtonSetFirst(wxCommandEvent& WXUNUSED(event))
  443. {
  444. if ( m_combobox->IsListEmpty() )
  445. {
  446. wxLogWarning("No string to change.");
  447. return;
  448. }
  449. m_combobox->SetString(0, m_textSetFirst->GetValue());
  450. }
  451. void ComboboxWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event))
  452. {
  453. // "many" means 1000 here
  454. for ( unsigned int n = 0; n < 1000; n++ )
  455. {
  456. m_combobox->Append(wxString::Format(wxT("item #%u"), n));
  457. }
  458. }
  459. void ComboboxWidgetsPage::OnButtonSetCurrent(wxCommandEvent& WXUNUSED(event))
  460. {
  461. long n;
  462. if ( !m_textCur->GetValue().ToLong(&n) )
  463. return;
  464. m_combobox->SetSelection(n);
  465. }
  466. void ComboboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event))
  467. {
  468. m_combobox->Append(wxT("First"));
  469. m_combobox->Append(wxT("another one"));
  470. m_combobox->Append(wxT("and the last (very very very very very very very very very very long) one"));
  471. }
  472. void ComboboxWidgetsPage::OnUpdateUIInsertionPointText(wxUpdateUIEvent& event)
  473. {
  474. if (m_combobox)
  475. event.SetText( wxString::Format(wxT("%ld"), m_combobox->GetInsertionPoint()) );
  476. }
  477. void ComboboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
  478. {
  479. event.Enable( m_chkSort->GetValue() ||
  480. m_chkReadonly->GetValue() ||
  481. m_chkProcessEnter->GetValue() );
  482. }
  483. void ComboboxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent& event)
  484. {
  485. if (m_combobox)
  486. {
  487. bool enable = !(m_combobox->GetWindowStyle() & wxCB_SORT) &&
  488. (m_combobox->GetSelection() >= 0);
  489. event.Enable(enable);
  490. }
  491. }
  492. void ComboboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
  493. {
  494. if (m_combobox)
  495. {
  496. unsigned long n;
  497. event.Enable(m_textDelete->GetValue().ToULong(&n) &&
  498. (n < (unsigned)m_combobox->GetCount()));
  499. }
  500. }
  501. void ComboboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
  502. {
  503. if (m_combobox)
  504. event.Enable(m_combobox->GetSelection() != wxNOT_FOUND);
  505. }
  506. void ComboboxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
  507. {
  508. if (m_combobox)
  509. event.Enable(m_combobox->GetCount() != 0);
  510. }
  511. void ComboboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
  512. {
  513. if (m_combobox)
  514. event.Enable(!(m_combobox->GetWindowStyle() & wxCB_SORT));
  515. }
  516. void ComboboxWidgetsPage::OnUpdateUISetCurrent(wxUpdateUIEvent& event)
  517. {
  518. long n;
  519. event.Enable( m_textCur->GetValue().ToLong(&n) &&
  520. (n == wxNOT_FOUND ||
  521. (n >= 0 && (unsigned)n < m_combobox->GetCount())) );
  522. }
  523. void ComboboxWidgetsPage::OnComboText(wxCommandEvent& event)
  524. {
  525. if (!m_combobox)
  526. return;
  527. wxString s = event.GetString();
  528. wxASSERT_MSG( s == m_combobox->GetValue(),
  529. wxT("event and combobox values should be the same") );
  530. if (event.GetEventType() == wxEVT_TEXT_ENTER)
  531. {
  532. wxLogMessage(wxT("Combobox enter pressed (now '%s')"), s.c_str());
  533. }
  534. else
  535. {
  536. wxLogMessage(wxT("Combobox text changed (now '%s')"), s.c_str());
  537. }
  538. }
  539. void ComboboxWidgetsPage::OnComboTextPasted(wxClipboardTextEvent& event)
  540. {
  541. wxLogMessage("Text pasted from clipboard.");
  542. event.Skip();
  543. }
  544. void ComboboxWidgetsPage::OnComboBox(wxCommandEvent& event)
  545. {
  546. long sel = event.GetInt();
  547. const wxString selstr = wxString::Format(wxT("%ld"), sel);
  548. m_textDelete->SetValue(selstr);
  549. m_textCur->SetValue(selstr);
  550. wxLogMessage(wxT("Combobox item %ld selected"), sel);
  551. wxLogMessage(wxT("Combobox GetValue(): %s"), m_combobox->GetValue().c_str() );
  552. if ( event.GetString() != m_combobox->GetValue() )
  553. {
  554. wxLogMessage("ERROR: Event has different string \"%s\"",
  555. event.GetString());
  556. }
  557. }
  558. void ComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
  559. {
  560. CreateCombo();
  561. }
  562. void ComboboxWidgetsPage::OnDropdown(wxCommandEvent& WXUNUSED(event))
  563. {
  564. wxLogMessage(wxT("Combobox dropped down"));
  565. }
  566. void ComboboxWidgetsPage::OnCloseup(wxCommandEvent& WXUNUSED(event))
  567. {
  568. wxLogMessage(wxT("Combobox closed up"));
  569. }
  570. #endif // wxUSE_COMBOBOX