wxWidgets/samples/widgets/filepicker.cpp

336 lines
10 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Program: wxWidgets Widgets Sample
// Name: filepicker.cpp
// Purpose: Part of the widgets sample showing wx*PickerCtrl
// Author: Francesco Montorsi
// Created: 20/6/2006
// Copyright: (c) 2006 Francesco Montorsi
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// for compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#if wxUSE_FILEPICKERCTRL
// for all others, include the necessary headers
#ifndef WX_PRECOMP
#include "wx/app.h"
#include "wx/log.h"
#include "wx/radiobox.h"
#include "wx/textctrl.h"
#endif
#include "wx/artprov.h"
#include "wx/sizer.h"
#include "wx/stattext.h"
#include "wx/checkbox.h"
#include "wx/imaglist.h"
#include "wx/filepicker.h"
#include "widgets.h"
#include "icons/filepicker.xpm"
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
enum
{
FilePickerMode_Open = 0,
FilePickerMode_Save
};
// control ids
enum
{
PickerPage_Reset = wxID_HIGHEST,
PickerPage_File,
PickerPage_SetDir,
PickerPage_CurrentPath
};
// ----------------------------------------------------------------------------
// FilePickerWidgetsPage
// ----------------------------------------------------------------------------
class FilePickerWidgetsPage : public WidgetsPage
{
public:
FilePickerWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
virtual wxWindow *GetWidget() const wxOVERRIDE { return m_filePicker; }
virtual void RecreateWidget() wxOVERRIDE { RecreatePicker(); }
// lazy creation of the content
virtual void CreateContent() wxOVERRIDE;
protected:
// called only once at first construction
void CreatePicker();
// called to recreate an existing control
void RecreatePicker();
// restore the checkboxes state to the initial values
void Reset();
// update filepicker radiobox
void UpdateFilePickerMode();
// the pickers and the relative event handlers
void OnFileChange(wxFileDirPickerEvent &ev);
void OnCheckBox(wxCommandEvent &ev);
void OnButtonReset(wxCommandEvent &ev);
void OnButtonSetDir(wxCommandEvent &ev);
void OnUpdatePath(wxUpdateUIEvent &ev);
// the picker
wxFilePickerCtrl *m_filePicker;
// other controls
// --------------
wxCheckBox *m_chkFileTextCtrl,
*m_chkFileOverwritePrompt,
*m_chkFileMustExist,
*m_chkFileChangeDir,
*m_chkSmall;
wxRadioBox *m_radioFilePickerMode;
wxStaticText *m_labelPath;
wxTextCtrl *m_textInitialDir;
wxBoxSizer *m_sizer;
private:
wxDECLARE_EVENT_TABLE();
DECLARE_WIDGETS_PAGE(FilePickerWidgetsPage)
};
// ----------------------------------------------------------------------------
// event tables
// ----------------------------------------------------------------------------
wxBEGIN_EVENT_TABLE(FilePickerWidgetsPage, WidgetsPage)
EVT_BUTTON(PickerPage_Reset, FilePickerWidgetsPage::OnButtonReset)
EVT_BUTTON(PickerPage_SetDir, FilePickerWidgetsPage::OnButtonSetDir)
EVT_FILEPICKER_CHANGED(PickerPage_File, FilePickerWidgetsPage::OnFileChange)
EVT_CHECKBOX(wxID_ANY, FilePickerWidgetsPage::OnCheckBox)
EVT_RADIOBOX(wxID_ANY, FilePickerWidgetsPage::OnCheckBox)
EVT_UPDATE_UI(PickerPage_CurrentPath, FilePickerWidgetsPage::OnUpdatePath)
wxEND_EVENT_TABLE()
// ============================================================================
// implementation
// ============================================================================
#if defined(__WXGTK20__)
#define FAMILY_CTRLS NATIVE_CTRLS
#else
#define FAMILY_CTRLS GENERIC_CTRLS
#endif
IMPLEMENT_WIDGETS_PAGE(FilePickerWidgetsPage, "FilePicker",
PICKER_CTRLS | FAMILY_CTRLS);
FilePickerWidgetsPage::FilePickerWidgetsPage(WidgetsBookCtrl *book,
wxImageList *imaglist)
: WidgetsPage(book, imaglist, filepicker_xpm)
{
}
void FilePickerWidgetsPage::CreateContent()
{
// left pane
wxSizer *boxleft = new wxBoxSizer(wxVERTICAL);
static const wxString mode[] = { "open", "save" };
m_radioFilePickerMode = new wxRadioBox(this, wxID_ANY, "wxFilePicker mode",
wxDefaultPosition, wxDefaultSize,
WXSIZEOF(mode), mode);
boxleft->Add(m_radioFilePickerMode, 0, wxALL|wxGROW, 5);
wxStaticBoxSizer *filebox = new wxStaticBoxSizer(wxVERTICAL, this, "&FilePicker style");
m_chkFileTextCtrl = CreateCheckBoxAndAddToSizer(filebox, "With textctrl");
m_chkFileOverwritePrompt = CreateCheckBoxAndAddToSizer(filebox, "Overwrite prompt");
m_chkFileMustExist = CreateCheckBoxAndAddToSizer(filebox, "File must exist");
m_chkFileChangeDir = CreateCheckBoxAndAddToSizer(filebox, "Change working dir");
m_chkSmall = CreateCheckBoxAndAddToSizer(filebox, "&Small version");
boxleft->Add(filebox, 0, wxALL|wxGROW, 5);
boxleft->Add(CreateSizerWithTextAndButton
(
PickerPage_SetDir,
"&Initial directory",
wxID_ANY,
&m_textInitialDir
), wxSizerFlags().Expand().Border());
boxleft->AddSpacer(10);
boxleft->Add(new wxButton(this, PickerPage_Reset, "&Reset"),
0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
Reset(); // set checkboxes state
// create the picker and the static text displaying its current value
m_labelPath = new wxStaticText(this, PickerPage_CurrentPath, "");
m_filePicker = NULL;
CreatePicker();
// right pane
m_sizer = new wxBoxSizer(wxVERTICAL);
m_sizer->AddStretchSpacer();
m_sizer->Add(m_filePicker, wxSizerFlags().Expand().Border());
m_sizer->AddStretchSpacer();
m_sizer->Add(m_labelPath, wxSizerFlags().Expand().Border());
m_sizer->AddStretchSpacer();
// global pane
wxSizer *sz = new wxBoxSizer(wxHORIZONTAL);
sz->Add(boxleft, 0, wxGROW|wxALL, 5);
sz->Add(m_sizer, 1, wxGROW|wxALL, 5);
SetSizer(sz);
}
void FilePickerWidgetsPage::CreatePicker()
{
delete m_filePicker;
long style = GetAttrs().m_defaultFlags;
if ( m_chkFileTextCtrl->GetValue() )
style |= wxFLP_USE_TEXTCTRL;
if ( m_chkFileOverwritePrompt->GetValue() )
style |= wxFLP_OVERWRITE_PROMPT;
if ( m_chkFileMustExist->GetValue() )
style |= wxFLP_FILE_MUST_EXIST;
if ( m_chkFileChangeDir->GetValue() )
style |= wxFLP_CHANGE_DIR;
if ( m_chkSmall->GetValue() )
style |= wxFLP_SMALL;
if (m_radioFilePickerMode->GetSelection() == FilePickerMode_Open)
style |= wxFLP_OPEN;
else
style |= wxFLP_SAVE;
// pass an empty string as initial file
m_filePicker = new wxFilePickerCtrl(this, PickerPage_File,
wxEmptyString,
"Hello!", "*",
wxDefaultPosition, wxDefaultSize,
style);
}
void FilePickerWidgetsPage::RecreatePicker()
{
m_sizer->Remove(1);
CreatePicker();
m_sizer->Insert(1, m_filePicker, 0, wxEXPAND|wxALL, 5);
m_sizer->Layout();
}
void FilePickerWidgetsPage::Reset()
{
m_radioFilePickerMode->SetSelection((wxFLP_DEFAULT_STYLE & wxFLP_OPEN) ?
FilePickerMode_Open : FilePickerMode_Save);
m_chkFileTextCtrl->SetValue((wxFLP_DEFAULT_STYLE & wxFLP_USE_TEXTCTRL) != 0);
m_chkFileOverwritePrompt->SetValue((wxFLP_DEFAULT_STYLE & wxFLP_OVERWRITE_PROMPT) != 0);
m_chkFileMustExist->SetValue((wxFLP_DEFAULT_STYLE & wxFLP_FILE_MUST_EXIST) != 0);
m_chkFileChangeDir->SetValue((wxFLP_DEFAULT_STYLE & wxFLP_CHANGE_DIR) != 0);
m_chkSmall->SetValue((wxFLP_DEFAULT_STYLE & wxFLP_SMALL) != 0);
UpdateFilePickerMode();
}
void FilePickerWidgetsPage::UpdateFilePickerMode()
{
switch (m_radioFilePickerMode->GetSelection())
{
case FilePickerMode_Open:
m_chkFileOverwritePrompt->SetValue(false);
m_chkFileOverwritePrompt->Disable();
m_chkFileMustExist->Enable();
break;
case FilePickerMode_Save:
m_chkFileMustExist->SetValue(false);
m_chkFileMustExist->Disable();
m_chkFileOverwritePrompt->Enable();
break;
}
}
// ----------------------------------------------------------------------------
// event handlers
// ----------------------------------------------------------------------------
void FilePickerWidgetsPage::OnButtonSetDir(wxCommandEvent& WXUNUSED(event))
{
const wxString& dir = m_textInitialDir->GetValue();
m_filePicker->SetInitialDirectory(dir);
wxLogMessage("Initial directory set to \"%s\"", dir);
}
void FilePickerWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
{
Reset();
RecreatePicker();
}
void FilePickerWidgetsPage::OnFileChange(wxFileDirPickerEvent& event)
{
wxLogMessage("The file changed to '%s' ! The current working directory is '%s'",
event.GetPath(), wxGetCwd());
}
void FilePickerWidgetsPage::OnCheckBox(wxCommandEvent &event)
{
if (event.GetEventObject() == m_chkFileTextCtrl ||
event.GetEventObject() == m_chkFileOverwritePrompt ||
event.GetEventObject() == m_chkFileMustExist ||
event.GetEventObject() == m_chkFileChangeDir ||
event.GetEventObject() == m_chkSmall)
RecreatePicker();
if (event.GetEventObject() == m_radioFilePickerMode)
{
UpdateFilePickerMode();
RecreatePicker();
}
}
void FilePickerWidgetsPage::OnUpdatePath(wxUpdateUIEvent& ev)
{
ev.SetText( "Current path: " + m_filePicker->GetPath() );
}
#endif // wxUSE_FILEPICKERCTRL