///////////////////////////////////////////////////////////////////////////////
// Name: wx/filedlgcustomize.h
// Purpose: Classes for wxFileDialog customization.
// Author: Vadim Zeitlin
// Created: 2022-05-26
// Copyright: (c) 2022 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_FILEDLGCUSTOMIZE_H_
#define _WX_FILEDLGCUSTOMIZE_H_
#include "wx/vector.h"
class wxFileDialogCustomControlImpl;
class wxFileDialogButtonImpl;
class wxFileDialogCheckBoxImpl;
class wxFileDialogRadioButtonImpl;
class wxFileDialogChoiceImpl;
class wxFileDialogTextCtrlImpl;
class wxFileDialogStaticTextImpl;
class wxFileDialogCustomizeImpl;
// ----------------------------------------------------------------------------
// wxFileDialog custom controls
// ----------------------------------------------------------------------------
// All these controls support a very limited set of functions, but use the same
// names for the things that they do support as the corresponding "normal" wx
// classes and also generate some (but not all) of the same events.
// The base class for all wxFileDialog custom controls.
class WXDLLIMPEXP_CORE wxFileDialogCustomControl : public wxEvtHandler
{
public:
void Show(bool show = true);
void Hide() { Show(false); }
void Enable(bool enable = true);
void Disable() { Enable(false); }
~wxFileDialogCustomControl();
protected:
explicit wxFileDialogCustomControl(wxFileDialogCustomControlImpl* impl)
: m_impl(impl)
{
}
// By default custom controls don't generate any events, but some of them
// override this function to allow connecting to the selected events.
virtual bool OnDynamicBind(wxDynamicEventTableEntry& entry) wxOVERRIDE;
wxFileDialogCustomControlImpl* const m_impl;
wxDECLARE_NO_COPY_CLASS(wxFileDialogCustomControl);
};
// A class representing a custom button.
class WXDLLIMPEXP_CORE wxFileDialogButton : public wxFileDialogCustomControl
{
public:
// Ctor is only used by wxWidgets itself.
explicit wxFileDialogButton(wxFileDialogButtonImpl* impl);
protected:
virtual bool OnDynamicBind(wxDynamicEventTableEntry& entry) wxOVERRIDE;
private:
wxFileDialogButtonImpl* GetImpl() const;
wxDECLARE_NO_COPY_CLASS(wxFileDialogButton);
};
// A class representing a custom checkbox.
class WXDLLIMPEXP_CORE wxFileDialogCheckBox : public wxFileDialogCustomControl
{
public:
bool GetValue() const;
void SetValue(bool value);
// Ctor is only used by wxWidgets itself.
explicit wxFileDialogCheckBox(wxFileDialogCheckBoxImpl* impl);
protected:
virtual bool OnDynamicBind(wxDynamicEventTableEntry& entry) wxOVERRIDE;
private:
wxFileDialogCheckBoxImpl* GetImpl() const;
wxDECLARE_NO_COPY_CLASS(wxFileDialogCheckBox);
};
// A class representing a custom radio button.
class WXDLLIMPEXP_CORE wxFileDialogRadioButton : public wxFileDialogCustomControl
{
public:
bool GetValue() const;
void SetValue(bool value);
// Ctor is only used by wxWidgets itself.
explicit wxFileDialogRadioButton(wxFileDialogRadioButtonImpl* impl);
protected:
virtual bool OnDynamicBind(wxDynamicEventTableEntry& entry) wxOVERRIDE;
private:
wxFileDialogRadioButtonImpl* GetImpl() const;
wxDECLARE_NO_COPY_CLASS(wxFileDialogRadioButton);
};
// A class representing a custom combobox button.
class WXDLLIMPEXP_CORE wxFileDialogChoice : public wxFileDialogCustomControl
{
public:
int GetSelection() const;
void SetSelection(int n);
// Ctor is only used by wxWidgets itself.
explicit wxFileDialogChoice(wxFileDialogChoiceImpl* impl);
protected:
virtual bool OnDynamicBind(wxDynamicEventTableEntry& entry) wxOVERRIDE;
private:
wxFileDialogChoiceImpl* GetImpl() const;
wxDECLARE_NO_COPY_CLASS(wxFileDialogChoice);
};
// A class representing a custom text control.
class WXDLLIMPEXP_CORE wxFileDialogTextCtrl : public wxFileDialogCustomControl
{
public:
wxString GetValue() const;
void SetValue(const wxString& text);
// Ctor is only used by wxWidgets itself.
explicit wxFileDialogTextCtrl(wxFileDialogTextCtrlImpl* impl);
private:
wxFileDialogTextCtrlImpl* GetImpl() const;
wxDECLARE_NO_COPY_CLASS(wxFileDialogTextCtrl);
};
// A class representing a custom static text.
class WXDLLIMPEXP_CORE wxFileDialogStaticText : public wxFileDialogCustomControl
{
public:
void SetLabelText(const wxString& text);
// Ctor is only used by wxWidgets itself.
explicit wxFileDialogStaticText(wxFileDialogStaticTextImpl* impl);
private:
wxFileDialogStaticTextImpl* GetImpl() const;
wxDECLARE_NO_COPY_CLASS(wxFileDialogStaticText);
};
// ----------------------------------------------------------------------------
// wxFileDialogCustomizer is used by wxFileDialogCustomizeHook
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxFileDialogCustomize
{
public:
wxFileDialogButton* AddButton(const wxString& label);
wxFileDialogCheckBox* AddCheckBox(const wxString& label);
wxFileDialogRadioButton* AddRadioButton(const wxString& label);
wxFileDialogChoice* AddChoice(size_t n, const wxString* strings);
wxFileDialogTextCtrl* AddTextCtrl(const wxString& label = wxString());
wxFileDialogStaticText* AddStaticText(const wxString& label);
~wxFileDialogCustomize();
protected:
// Ctor is only used by wxWidgets itself.
//
// Note that we don't take ownership of the implementation pointer here,
// see the comment in the dtor for more details.
explicit wxFileDialogCustomize(wxFileDialogCustomizeImpl* impl)
: m_impl(impl)
{
}
wxVector<wxFileDialogCustomControl*> m_controls;
private:
template <typename T> T* StoreAndReturn(T* control);
wxFileDialogCustomizeImpl* const m_impl;
wxDECLARE_NO_COPY_CLASS(wxFileDialogCustomize);
};
// ----------------------------------------------------------------------------
// wxFileDialogCustomizeHook: used by wxFileDialog itself
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxFileDialogCustomizeHook
{
public:
// This method must be overridden to add custom controls to the dialog
// using the provided customizer object.
virtual void AddCustomControls(wxFileDialogCustomize& customizer) = 0;
// This method may be overridden to update the custom controls whenever
// something changes in the dialog.
virtual void UpdateCustomControls() { }
// This method should typically be overridden to save the values of the
// custom controls when the dialog is accepted.
virtual void TransferDataFromCustomControls() { }
virtual ~wxFileDialogCustomizeHook();
};
#endif // _WX_FILEDLGCUSTOMIZE_H_