| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- /////////////////////////////////////////////////////////////////////////////
- // Program: wxWidgets Widgets Sample
- // Name: dirctrl.cpp
- // Purpose: Part of the widgets sample showing wxGenericDirCtrl
- // Author: Wlodzimierz 'ABX' Skiba
- // Created: 4 Oct 2006
- // Copyright: (c) 2006 wxWindows team
- // 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_DIRDLG
- // for all others, include the necessary headers
- #ifndef WX_PRECOMP
- #include "wx/app.h"
- #include "wx/log.h"
- #include "wx/sizer.h"
- #include "wx/statbox.h"
- #include "wx/radiobox.h"
- #include "wx/checkbox.h"
- #include "wx/button.h"
- #include "wx/filedlg.h"
- #endif
- #include "wx/generic/dirctrlg.h"
- #include "wx/wupdlock.h"
- #include "wx/stdpaths.h"
- #include "wx/filename.h"
- #include "widgets.h"
- #include "icons/dirctrl.xpm"
- // ----------------------------------------------------------------------------
- // constants
- // ----------------------------------------------------------------------------
- // control ids
- enum
- {
- DirCtrlPage_Reset = wxID_HIGHEST,
- DirCtrlPage_SetPath,
- DirCtrlPage_Ctrl
- };
- static const wxString stdPaths[] =
- {
- wxT("&none"),
- wxT("&config"),
- wxT("&data"),
- wxT("&documents"),
- wxT("&local data"),
- wxT("&plugins"),
- wxT("&resources"),
- wxT("&user config"),
- wxT("&user data"),
- wxT("&user local data")
- };
- enum
- {
- stdPathUnknown = 0,
- stdPathConfig,
- stdPathData,
- stdPathDocuments,
- stdPathLocalData,
- stdPathPlugins,
- stdPathResources,
- stdPathUserConfig,
- stdPathUserData,
- stdPathUserLocalData,
- stdPathMax
- };
- // ----------------------------------------------------------------------------
- // CheckBoxWidgetsPage
- // ----------------------------------------------------------------------------
- class DirCtrlWidgetsPage : public WidgetsPage
- {
- public:
- DirCtrlWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
- virtual ~DirCtrlWidgetsPage() {}
- virtual wxControl *GetWidget() const { return m_dirCtrl; }
- virtual void RecreateWidget() { CreateDirCtrl(); }
- // lazy creation of the content
- virtual void CreateContent();
- protected:
- // event handlers
- void OnButtonSetPath(wxCommandEvent& event);
- void OnButtonReset(wxCommandEvent& event);
- void OnStdPath(wxCommandEvent& event);
- void OnCheckBox(wxCommandEvent& event);
- void OnRadioBox(wxCommandEvent& event);
- void OnSelChanged(wxTreeEvent& event);
- void OnFileActivated(wxTreeEvent& event);
- // reset the control parameters
- void Reset();
- // (re)create the m_dirCtrl
- void CreateDirCtrl();
- // the controls
- // ------------
- // the control itself and the sizer it is in
- wxGenericDirCtrl *m_dirCtrl;
- // the text entries for command parameters
- wxTextCtrl *m_path;
- wxRadioBox *m_radioStdPath;
- // flags
- wxCheckBox *m_chkDirOnly,
- *m_chk3D,
- *m_chkFirst,
- *m_chkFilters,
- *m_chkLabels,
- *m_chkMulti;
- // filters
- wxCheckBox *m_fltr[3];
- private:
- wxDECLARE_EVENT_TABLE();
- DECLARE_WIDGETS_PAGE(DirCtrlWidgetsPage)
- };
- // ----------------------------------------------------------------------------
- // event tables
- // ----------------------------------------------------------------------------
- wxBEGIN_EVENT_TABLE(DirCtrlWidgetsPage, WidgetsPage)
- EVT_BUTTON(DirCtrlPage_Reset, DirCtrlWidgetsPage::OnButtonReset)
- EVT_BUTTON(DirCtrlPage_SetPath, DirCtrlWidgetsPage::OnButtonSetPath)
- EVT_CHECKBOX(wxID_ANY, DirCtrlWidgetsPage::OnCheckBox)
- EVT_RADIOBOX(wxID_ANY, DirCtrlWidgetsPage::OnRadioBox)
- EVT_DIRCTRL_SELECTIONCHANGED(DirCtrlPage_Ctrl, DirCtrlWidgetsPage::OnSelChanged)
- EVT_DIRCTRL_FILEACTIVATED(DirCtrlPage_Ctrl, DirCtrlWidgetsPage::OnFileActivated)
- wxEND_EVENT_TABLE()
- // ============================================================================
- // implementation
- // ============================================================================
- IMPLEMENT_WIDGETS_PAGE(DirCtrlWidgetsPage, wxT("DirCtrl"),
- GENERIC_CTRLS
- );
- DirCtrlWidgetsPage::DirCtrlWidgetsPage(WidgetsBookCtrl *book,
- wxImageList *imaglist)
- :WidgetsPage(book, imaglist, dirctrl_xpm)
- {
- m_dirCtrl = NULL;
- }
- void DirCtrlWidgetsPage::CreateContent()
- {
- wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
- // left pane
- wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("Dir control details"));
- wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
- sizerLeft->Add( CreateSizerWithTextAndButton( DirCtrlPage_SetPath , wxT("Set &path"), wxID_ANY, &m_path ),
- 0, wxALL | wxALIGN_RIGHT , 5 );
- wxSizer *sizerUseFlags =
- new wxStaticBoxSizer(wxVERTICAL, this, wxT("&Flags"));
- m_chkDirOnly = CreateCheckBoxAndAddToSizer(sizerUseFlags, wxT("wxDIRCTRL_DIR_ONLY"));
- m_chk3D = CreateCheckBoxAndAddToSizer(sizerUseFlags, wxT("wxDIRCTRL_3D_INTERNAL"));
- m_chkFirst = CreateCheckBoxAndAddToSizer(sizerUseFlags, wxT("wxDIRCTRL_SELECT_FIRST"));
- m_chkFilters = CreateCheckBoxAndAddToSizer(sizerUseFlags, wxT("wxDIRCTRL_SHOW_FILTERS"));
- m_chkLabels = CreateCheckBoxAndAddToSizer(sizerUseFlags, wxT("wxDIRCTRL_EDIT_LABELS"));
- m_chkMulti = CreateCheckBoxAndAddToSizer(sizerUseFlags, wxT("wxDIRCTRL_MULTIPLE"));
- sizerLeft->Add(sizerUseFlags, wxSizerFlags().Expand().Border());
- wxSizer *sizerFilters =
- new wxStaticBoxSizer(wxVERTICAL, this, wxT("&Filters"));
- m_fltr[0] = CreateCheckBoxAndAddToSizer(sizerFilters, wxString::Format(wxT("all files (%s)|%s"),
- wxFileSelectorDefaultWildcardStr, wxFileSelectorDefaultWildcardStr));
- m_fltr[1] = CreateCheckBoxAndAddToSizer(sizerFilters, wxT("C++ files (*.cpp; *.h)|*.cpp;*.h"));
- m_fltr[2] = CreateCheckBoxAndAddToSizer(sizerFilters, wxT("PNG images (*.png)|*.png"));
- sizerLeft->Add(sizerFilters, wxSizerFlags().Expand().Border());
- wxButton *btn = new wxButton(this, DirCtrlPage_Reset, wxT("&Reset"));
- sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
- // keep consistency between enum and labels of radiobox
- wxCOMPILE_TIME_ASSERT( stdPathMax == WXSIZEOF(stdPaths), EnumForRadioBoxMismatch);
- // middle pane
- m_radioStdPath = new wxRadioBox(this, wxID_ANY, wxT("Standard path"),
- wxDefaultPosition, wxDefaultSize,
- WXSIZEOF(stdPaths), stdPaths, 1);
- // right pane
- m_dirCtrl = new wxGenericDirCtrl(
- this,
- DirCtrlPage_Ctrl,
- wxDirDialogDefaultFolderStr,
- wxDefaultPosition,
- wxDefaultSize,
- 0
- );
- // the 3 panes panes compose the window
- sizerTop->Add(sizerLeft, 0, (wxALL & ~wxLEFT), 10);
- sizerTop->Add(m_radioStdPath, 0, wxGROW | wxALL , 10);
- sizerTop->Add(m_dirCtrl, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
- // final initializations
- Reset();
- SetSizer(sizerTop);
- }
- void DirCtrlWidgetsPage::Reset()
- {
- m_path->SetValue(m_dirCtrl->GetPath());
- }
- void DirCtrlWidgetsPage::CreateDirCtrl()
- {
- wxWindowUpdateLocker noUpdates(this);
- wxGenericDirCtrl *dirCtrl = new wxGenericDirCtrl(
- this,
- DirCtrlPage_Ctrl,
- wxDirDialogDefaultFolderStr,
- wxDefaultPosition,
- wxDefaultSize,
- ( m_chkDirOnly->IsChecked() ? wxDIRCTRL_DIR_ONLY : 0 ) |
- ( m_chk3D->IsChecked() ? wxDIRCTRL_3D_INTERNAL : 0 ) |
- ( m_chkFirst->IsChecked() ? wxDIRCTRL_SELECT_FIRST : 0 ) |
- ( m_chkFilters->IsChecked() ? wxDIRCTRL_SHOW_FILTERS : 0 ) |
- ( m_chkLabels->IsChecked() ? wxDIRCTRL_EDIT_LABELS : 0 ) |
- ( m_chkMulti->IsChecked() ? wxDIRCTRL_MULTIPLE : 0)
- );
- wxString filter;
- for (int i = 0; i < 3; ++i)
- {
- if (m_fltr[i]->IsChecked())
- {
- if (!filter.IsEmpty())
- filter += wxT("|");
- filter += m_fltr[i]->GetLabel();
- }
- }
- dirCtrl->SetFilter(filter);
- // update sizer's child window
- GetSizer()->Replace(m_dirCtrl, dirCtrl, true);
- // update our pointer
- delete m_dirCtrl;
- m_dirCtrl = dirCtrl;
- // relayout the sizer
- GetSizer()->Layout();
- }
- // ----------------------------------------------------------------------------
- // event handlers
- // ----------------------------------------------------------------------------
- void DirCtrlWidgetsPage::OnButtonSetPath(wxCommandEvent& WXUNUSED(event))
- {
- m_dirCtrl->SetPath(m_path->GetValue());
- }
- void DirCtrlWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
- {
- Reset();
- CreateDirCtrl();
- }
- void DirCtrlWidgetsPage::OnCheckBox(wxCommandEvent& WXUNUSED(event))
- {
- CreateDirCtrl();
- }
- void DirCtrlWidgetsPage::OnRadioBox(wxCommandEvent& WXUNUSED(event))
- {
- wxString path;
- wxTheApp->SetAppName(wxT("widgets"));
- wxStandardPathsBase& stdp = wxStandardPaths::Get();
- switch ( m_radioStdPath->GetSelection() )
- {
- default:
- case stdPathUnknown:
- case stdPathMax:
- // leave path
- break;
- case stdPathConfig:
- path = stdp.GetConfigDir();
- break;
- case stdPathData:
- path = stdp.GetDataDir();
- break;
- case stdPathDocuments:
- path = stdp.GetDocumentsDir();
- break;
- case stdPathLocalData:
- path = stdp.GetLocalDataDir();
- break;
- case stdPathPlugins:
- path = stdp.GetPluginsDir();
- break;
- case stdPathResources:
- path = stdp.GetResourcesDir();
- break;
- case stdPathUserConfig:
- path = stdp.GetUserConfigDir();
- break;
- case stdPathUserData:
- path = stdp.GetUserDataDir();
- break;
- case stdPathUserLocalData:
- path = stdp.GetUserLocalDataDir();
- break;
- }
- m_dirCtrl->SetPath(path);
- // Notice that we must use wxFileName comparison instead of simple wxString
- // comparison as the paths returned may differ by case only.
- if ( wxFileName(m_dirCtrl->GetPath()) != path )
- {
- wxLogMessage("Failed to go to \"%s\", the current path is \"%s\".",
- path, m_dirCtrl->GetPath());
- }
- }
- void DirCtrlWidgetsPage::OnSelChanged(wxTreeEvent& event)
- {
- if ( m_dirCtrl )
- {
- wxLogMessage("Selection changed to \"%s\"",
- m_dirCtrl->GetPath(event.GetItem()));
- }
- event.Skip();
- }
- void DirCtrlWidgetsPage::OnFileActivated(wxTreeEvent& event)
- {
- if ( m_dirCtrl )
- {
- wxLogMessage("File activated \"%s\"",
- m_dirCtrl->GetPath(event.GetItem()));
- }
- event.Skip();
- }
- #endif // wxUSE_DIRDLG
|