text: /////////////////////////////////////////////////////////////////////////////
  // Program:     wxWidgets Widgets Sample
  // Name:        searchctrl.cpp
  // Purpose:     Shows wxSearchCtrl
  // Author:      Robin Dunn
  // Created:     9-Dec-2006
  // Copyright:   (c) 2006
  // Licence:     wxWindows licence
  /////////////////////////////////////////////////////////////////////////////
  
  // ============================================================================
  // declarations
  // ============================================================================
  
  // ----------------------------------------------------------------------------
  // headers
  // ----------------------------------------------------------------------------
  
  // for compilers that support precompilation, includes "wx/wx.h".
  #include "wx/wxprec.h"
  
  #ifdef __BORLANDC__
      #pragma hdrstop
  #endif
  
  #if wxUSE_SEARCHCTRL
  
  // for all others, include the necessary headers
  #ifndef WX_PRECOMP
      #include "wx/app.h"
      #include "wx/log.h"
      #include "wx/radiobox.h"
      #include "wx/statbox.h"
  #endif
  
  #include "wx/artprov.h"
  #include "wx/sizer.h"
  #include "wx/stattext.h"
  #include "wx/checkbox.h"
  #include "wx/menu.h"
  
  #include "wx/srchctrl.h"
  
  #include "widgets.h"
  
  #include "icons/text.xpm"
  
  // ----------------------------------------------------------------------------
  // constants
  // ----------------------------------------------------------------------------
  
  // control ids
  enum
  {
       ID_SEARCH_CB = wxID_HIGHEST,
       ID_CANCEL_CB,
       ID_MENU_CB,
  
       ID_SEARCHMENU
  };
  
  
  // ----------------------------------------------------------------------------
  // ColourPickerWidgetsPage
  // ----------------------------------------------------------------------------
  
  class SearchCtrlWidgetsPage : public WidgetsPage
  {
  public:
      SearchCtrlWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
      virtual ~SearchCtrlWidgetsPage(){};
  
      virtual wxControl *GetWidget() const { return m_srchCtrl; }
      virtual wxTextEntryBase *GetTextEntry() const { return m_srchCtrl; }
      virtual void RecreateWidget();
  
      // lazy creation of the content
      virtual void CreateContent();
  
  protected:
  
      void OnToggleSearchButton(wxCommandEvent&);
      void OnToggleCancelButton(wxCommandEvent&);
      void OnToggleSearchMenu(wxCommandEvent&);
  
      void OnSearch(wxCommandEvent& event);
      void OnSearchCancel(wxCommandEvent& event);
  
      wxMenu* CreateTestMenu();
  
      // (re)create the control
      void CreateControl();
  
  
      wxSearchCtrl*       m_srchCtrl;
      wxCheckBox*         m_searchBtnCheck;
      wxCheckBox*         m_cancelBtnCheck;
      wxCheckBox*         m_menuBtnCheck;
  
  private:
      wxDECLARE_EVENT_TABLE();
      DECLARE_WIDGETS_PAGE(SearchCtrlWidgetsPage)
  };
  
  // ----------------------------------------------------------------------------
  // event tables
  // ----------------------------------------------------------------------------
  
  wxBEGIN_EVENT_TABLE(SearchCtrlWidgetsPage, WidgetsPage)
      EVT_CHECKBOX(ID_SEARCH_CB, SearchCtrlWidgetsPage::OnToggleSearchButton)
      EVT_CHECKBOX(ID_CANCEL_CB, SearchCtrlWidgetsPage::OnToggleCancelButton)
      EVT_CHECKBOX(ID_MENU_CB, SearchCtrlWidgetsPage::OnToggleSearchMenu)
  
      EVT_SEARCHCTRL_SEARCH_BTN(wxID_ANY, SearchCtrlWidgetsPage::OnSearch)
      EVT_SEARCHCTRL_CANCEL_BTN(wxID_ANY, SearchCtrlWidgetsPage::OnSearchCancel)
  wxEND_EVENT_TABLE()
  
  // ============================================================================
  // implementation
  // ============================================================================
  
  #if defined(__WXMAC__)
      #define FAMILY_CTRLS NATIVE_CTRLS
  #else
      #define FAMILY_CTRLS GENERIC_CTRLS
  #endif
  
  IMPLEMENT_WIDGETS_PAGE(SearchCtrlWidgetsPage, wxT("SearchCtrl"),
                         FAMILY_CTRLS | EDITABLE_CTRLS | ALL_CTRLS);
  
  SearchCtrlWidgetsPage::SearchCtrlWidgetsPage(WidgetsBookCtrl *book,
                                       wxImageList *imaglist)
                    : WidgetsPage(book, imaglist, text_xpm)
  {
  }
  
  void SearchCtrlWidgetsPage::CreateContent()
  {
      m_srchCtrl = NULL;
  
      CreateControl();
  
  
      wxSizer* box = new wxStaticBoxSizer(
          new wxStaticBox(this, -1, wxT("Options")),
          wxVERTICAL);
  
      m_searchBtnCheck = new wxCheckBox(this, ID_SEARCH_CB, wxT("Search button"));
      m_cancelBtnCheck = new wxCheckBox(this, ID_CANCEL_CB, wxT("Cancel button"));
      m_menuBtnCheck   = new wxCheckBox(this, ID_MENU_CB,   wxT("Search menu"));
  
      m_searchBtnCheck->SetValue(true);
  
      box->Add(m_searchBtnCheck, 0, wxALL, 5);
      box->Add(m_cancelBtnCheck, 0, wxALL, 5);
      box->Add(m_menuBtnCheck,   0, wxALL, 5);
  
      wxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
      sizer->Add(box, 0,  wxALL|wxEXPAND, 15);
      sizer->Add(m_srchCtrl, 0, wxALL|wxALIGN_CENTER, 15);
  
      SetSizer(sizer);
  }
  
  void SearchCtrlWidgetsPage::CreateControl()
  {
      if (m_srchCtrl)
          m_srchCtrl->Destroy();
  
      int style = 0;
  
      m_srchCtrl = new wxSearchCtrl(this, -1, wxEmptyString, wxDefaultPosition,
                                    wxSize(150, -1), style);
  }
  
  void SearchCtrlWidgetsPage::RecreateWidget()
  {
      CreateControl();
  
      GetSizer()->Add(m_srchCtrl, wxSizerFlags().Centre().TripleBorder());
  
      Layout();
  }
  
  wxMenu* SearchCtrlWidgetsPage::CreateTestMenu()
  {
      wxMenu* menu = new wxMenu;
      const int SEARCH_MENU_SIZE = 5;
      wxMenuItem* menuItem = menu->Append(wxID_ANY, wxT("Recent Searches"), wxT(""), wxITEM_NORMAL);
      menuItem->Enable(false);
      for ( int i = 0; i < SEARCH_MENU_SIZE; i++ )
      {
          wxString itemText = wxString::Format(wxT("item %i"),i);
          wxString tipText = wxString::Format(wxT("tip %i"),i);
          menu->Append(ID_SEARCHMENU+i, itemText, tipText, wxITEM_NORMAL);
      }
  //     target->Connect(
  //         ID_SEARCHMENU,
  //         ID_SEARCHMENU+SEARCH_MENU_SIZE,
  //         wxEVT_MENU,
  //         wxCommandEventHandler(MySearchCtrl::OnSearchMenu)
  //         );
      return menu;
  }
  
  
  // ----------------------------------------------------------------------------
  // event handlers
  // ----------------------------------------------------------------------------
  
  void SearchCtrlWidgetsPage::OnToggleSearchButton(wxCommandEvent&)
  {
      m_srchCtrl->ShowSearchButton( m_searchBtnCheck->GetValue() );
  }
  
  void SearchCtrlWidgetsPage::OnToggleCancelButton(wxCommandEvent&)
  {
      m_srchCtrl->ShowCancelButton( m_cancelBtnCheck->GetValue() );
  
  }
  
  void SearchCtrlWidgetsPage::OnToggleSearchMenu(wxCommandEvent&)
  {
      if ( m_menuBtnCheck->GetValue() )
          m_srchCtrl->SetMenu( CreateTestMenu() );
      else
          m_srchCtrl->SetMenu(NULL);
  }
  
  void SearchCtrlWidgetsPage::OnSearch(wxCommandEvent& event)
  {
      wxLogMessage("Search button: search for \"%s\".", event.GetString());
  }
  
  void SearchCtrlWidgetsPage::OnSearchCancel(wxCommandEvent& event)
  {
      wxLogMessage("Cancel button pressed.");
  
      event.Skip();
  }
  
  #endif  //  wxUSE_SEARCHCTRL
  