///////////////////////////////////////////////////////////////////////////// // Name: scrollingdialog.h // Purpose: wxScrollingDialog // Author: Julian Smart // Modified by: Jens Lody // Created: 2007-12-11 // RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_SCROLLINGDIALOG_H_ #define _WX_SCROLLINGDIALOG_H_ #include "wx/dialog.h" #include "wx/propdlg.h" /*! * Base class for layout adapters - code that, for example, turns a dialog into a * scrolling dialog if there isn't enough screen space. You can derive further * adapter classes to do any other kind of adaptation, such as applying a watermark, or adding * a help mechanism. */ class wxScrollingDialog; class wxDialogHelper; class wxBoxSizer; class wxButton; class wxScrolledWindow; #if !wxCHECK_VERSION(2,9,0) class wxDialogLayoutAdapter: public wxObject { DECLARE_CLASS(wxDialogLayoutAdapter) public: wxDialogLayoutAdapter() {} /// Override this function to indicate that adaptation should be done virtual bool CanDoLayoutAdaptation(wxDialogHelper* dialog) = 0; /// Override this function to do the adaptation virtual bool DoLayoutAdaptation(wxDialogHelper* dialog) = 0; }; /*! * Standard adapter. Does scrolling adaptation for paged and regular dialogs. * */ class wxStandardDialogLayoutAdapter: public wxDialogLayoutAdapter { DECLARE_CLASS(wxStandardDialogLayoutAdapter) public: wxStandardDialogLayoutAdapter() {} // Overrides /// Indicate that adaptation should be done virtual bool CanDoLayoutAdaptation(wxDialogHelper* dialog); /// Do layout adaptation virtual bool DoLayoutAdaptation(wxDialogHelper* dialog); // Implementation /// Find a standard or horizontal box sizer virtual wxSizer* FindButtonSizer(bool stdButtonSizer, wxDialogHelper* dialog, wxSizer* sizer, int& retBorder, int accumlatedBorder = 0); /// Check if this sizer contains standard buttons, and so can be repositioned in the dialog virtual bool IsOrdinaryButtonSizer(wxDialogHelper* dialog, wxBoxSizer* sizer); /// Check if this is a standard button virtual bool IsStandardButton(wxDialogHelper* dialog, wxButton* button); /// Find 'loose' main buttons in the existing layout and add them to the standard dialog sizer virtual bool FindLooseButtons(wxDialogHelper* dialog, wxStdDialogButtonSizer* buttonSizer, wxSizer* sizer, int& count); /// Reparent the controls to the scrolled window, except those in buttonSizer virtual void ReparentControls(wxWindow* parent, wxWindow* reparentTo, wxSizer* buttonSizer = NULL); /// A function to fit the dialog around its contents, and then adjust for screen size. /// If scrolled windows are passed, scrolling is enabled in the required orientation(s). virtual bool FitWithScrolling(wxDialog* dialog, wxScrolledWindow* scrolledWindow); virtual bool FitWithScrolling(wxDialog* dialog, wxWindowList& windows); /// Find whether scrolling will be necessary for the dialog, returning wxVERTICAL, wxHORIZONTAL or both virtual int MustScroll(wxDialog* dialog, wxSize& windowSize, wxSize& displaySize); }; /*! * A base class for dialogs that have adaptation. In wxWidgets 3.0, this will not * be needed since the new functionality will be implemented in wxDialogBase. */ class wxDialogHelper { public: wxDialogHelper(wxDialog* dialog = NULL) { Init(); m_dialog = dialog; } virtual ~wxDialogHelper() {} void Init(); void SetDialog(wxDialog* dialog) { m_dialog = dialog; } wxDialog* GetDialog() const { return m_dialog; } /// Do the adaptation virtual bool DoLayoutAdaptation(); /// Can we do the adaptation? virtual bool CanDoLayoutAdaptation(); /// Returns a content window if there is one virtual wxWindow* GetContentWindow() const { return NULL; } /// Add an id to the list of custom button identifiers that should be in the button sizer void AddButtonId(wxWindowID id) { m_buttonIds.Add((int) id); } wxArrayInt& GetButtonIds() { return m_buttonIds; } /// Is this id in the custom button id array? bool IsUserButtonId(wxWindowID id) { return (m_buttonIds.Index((int) id) != wxNOT_FOUND); } // ACCESSORS /// Level of adaptation, from none (Level 0) to full (Level 3). To disable adaptation, /// set level 0, for example in your dialog constructor. You might /// do this if you know that you are displaying on a large screen and you don't want the /// dialog changed. void SetLayoutAdaptationLevel(int level) { m_layoutAdaptationLevel = level; } /// Get level of adaptation int GetLayoutAdaptationLevel() const { return m_layoutAdaptationLevel; } /// Returns true if the adaptation has been done void SetLayoutAdaptationDone(bool adaptationDone) { m_layoutLayoutAdaptationDone = adaptationDone; } bool GetLayoutAdaptationDone() const { return m_layoutLayoutAdaptationDone; } /// Set layout adapter class, returning old adapter static wxDialogLayoutAdapter* SetLayoutAdapter(wxDialogLayoutAdapter* adapter); static wxDialogLayoutAdapter* GetLayoutAdapter() { return sm_layoutAdapter; } /// Global switch for layout adaptation static bool GetLayoutAdaptation() { return sm_layoutAdaptation; } static void SetLayoutAdaptation(bool enable) { sm_layoutAdaptation = enable; } protected: wxDialog* m_dialog; bool m_layoutLayoutAdaptationDone; wxArrayInt m_buttonIds; int m_layoutAdaptationLevel; static wxDialogLayoutAdapter* sm_layoutAdapter; static bool sm_layoutAdaptation; }; #endif //#if !wxCHECK_VERSION(2,9,0) /*! * A class that makes its content scroll if necessary */ class wxScrollingDialog: public wxDialog #if !wxCHECK_VERSION(2,9,0) , public wxDialogHelper #endif { DECLARE_CLASS(wxScrollingDialog) public: wxScrollingDialog() { #if !wxCHECK_VERSION(2,9,0) Init(); #else SetLayoutAdaptationMode(wxDIALOG_ADAPTATION_MODE_ENABLED); #endif } wxScrollingDialog(wxWindow *parent, int id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = _("dialogBox")) { #if !wxCHECK_VERSION(2,9,0) Init(); #else SetLayoutAdaptationMode(wxDIALOG_ADAPTATION_MODE_ENABLED); #endif Create(parent, id, title, pos, size, style, name); } #if !wxCHECK_VERSION(2,9,0) bool Create(wxWindow *parent, int id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = _("dialogBox")); void Init(); /// Override Show to rejig the control and sizer hierarchy if necessary virtual bool Show(bool show = true); /// Override ShowModal to rejig the control and sizer hierarchy if necessary virtual int ShowModal(); #endif }; /*! * A wxPropertySheetDialog class that makes its content scroll if necessary. */ class wxScrollingPropertySheetDialog : public wxPropertySheetDialog #if !wxCHECK_VERSION(2,9,0) , public wxDialogHelper #endif { public: wxScrollingPropertySheetDialog() : wxPropertySheetDialog() { #if !wxCHECK_VERSION(2,9,0) Init(); #else SetLayoutAdaptationMode(wxDIALOG_ADAPTATION_MODE_ENABLED); #endif } wxScrollingPropertySheetDialog(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = wxDialogNameStr) { #if !wxCHECK_VERSION(2,9,0) Init(); #else SetLayoutAdaptationMode(wxDIALOG_ADAPTATION_MODE_ENABLED); #endif Create(parent, id, title, pos, sz, style, name); } #if !wxCHECK_VERSION(2,9,0) //// Accessors /// Returns the content window virtual wxWindow* GetContentWindow() const; /// Operations /// Override Show to rejig the control and sizer hierarchy if necessary virtual bool Show(bool show = true); /// Override ShowModal to rejig the control and sizer hierarchy if necessary virtual int ShowModal(); private: void Init(); #endif protected: DECLARE_DYNAMIC_CLASS(wxScrollingPropertySheetDialog) }; #endif // _WX_SCROLLINGDIALOG_H_