X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/42e69d6b435a4dd5415caf3750db62cf45b6f373..27e2d606626e9604141abe1ba8a536c507c314dc:/include/wx/generic/splitter.h diff --git a/include/wx/generic/splitter.h b/include/wx/generic/splitter.h index 55c7891908..3667538fda 100644 --- a/include/wx/generic/splitter.h +++ b/include/wx/generic/splitter.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: splitter.h +// Name: wx/splitter.h // Purpose: wxSplitterWindow class // Author: Julian Smart // Modified by: @@ -17,6 +17,7 @@ #endif #include "wx/window.h" // base class declaration +#include "wx/containr.h" // wxControlContainer class WXDLLEXPORT wxSplitterEvent; @@ -24,7 +25,7 @@ class WXDLLEXPORT wxSplitterEvent; // splitter constants // --------------------------------------------------------------------------- -enum +enum wxSplitMode { wxSPLIT_HORIZONTAL = 1, wxSPLIT_VERTICAL @@ -60,15 +61,29 @@ public: // Public API // Default constructor - wxSplitterWindow(); + wxSplitterWindow() + { + Init(); + } // Normal constructor wxSplitterWindow(wxWindow *parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxSP_3D|wxCLIP_CHILDREN, + long style = wxSP_3D, + const wxString& name = "splitter") + { + Init(); + Create(parent, id, pos, size, style, name); + } + + virtual ~wxSplitterWindow(); + + bool Create(wxWindow *parent, wxWindowID id = -1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_3D, const wxString& name = "splitter"); - ~wxSplitterWindow(); // Gets the only or left/top pane wxWindow *GetWindow1() const { return m_windowOne; } @@ -77,10 +92,16 @@ public: wxWindow *GetWindow2() const { return m_windowTwo; } // Sets the split mode - void SetSplitMode(int mode) { m_splitMode = mode; } + void SetSplitMode(int mode) + { + wxASSERT_MSG( mode == wxSPLIT_VERTICAL || mode == wxSPLIT_HORIZONTAL, + _T("invalid split mode") ); + + m_splitMode = (wxSplitMode)mode; + } // Gets the split mode - int GetSplitMode() const { return m_splitMode; }; + wxSplitMode GetSplitMode() const { return m_splitMode; }; // Initialize with one window void Initialize(wxWindow *window); @@ -93,10 +114,12 @@ public: // absolute value rather than the size of left/upper pane. virtual bool SplitVertically(wxWindow *window1, wxWindow *window2, - int sashPosition = 0); + int sashPosition = 0) + { return DoSplit(wxSPLIT_VERTICAL, window1, window2, sashPosition); } virtual bool SplitHorizontally(wxWindow *window1, wxWindow *window2, - int sashPosition = 0); + int sashPosition = 0) + { return DoSplit(wxSPLIT_HORIZONTAL, window1, window2, sashPosition); } // Removes the specified (or second) window from the view // Doesn't actually delete the window. @@ -128,25 +151,31 @@ public: int GetSashPosition() const { return m_sashPosition; } // If this is zero, we can remove panes by dragging the sash. - void SetMinimumPaneSize(int min) { m_minimumPaneSize = min; } + void SetMinimumPaneSize(int min); int GetMinimumPaneSize() const { return m_minimumPaneSize; } + // NB: the OnXXX() functions below are for backwards compatibility only, + // don't use them in new code but handle the events instead! + + // called when the sash position is about to change, may return a new value + // for the sash or -1 to prevent the change from happening at all + virtual int OnSashPositionChanging(int newSashPosition); + // Called when the sash position is about to be changed, return // FALSE from here to prevent the change from taking place. // Repositions sash to minimum position if pane would be too small. // newSashPosition here is always positive or zero. - virtual bool OnSashPositionChange(int WXUNUSED(newSashPosition)) - { return TRUE; } + virtual bool OnSashPositionChange(int newSashPosition); // If the sash is moved to an extreme position, a subwindow // is removed from the splitter window, and the app is // notified. The app should delete or hide the window. - virtual void OnUnsplit(wxWindow *WXUNUSED(removed)) { } + virtual void OnUnsplit(wxWindow *removed); // Called when the sash is double-clicked. // The default behaviour is to remove the sash if the // minimum pane size is zero. - virtual void OnDoubleClickSash(int WXUNUSED(x), int WXUNUSED(y)) { } + virtual void OnDoubleClickSash(int x, int y); //////////////////////////////////////////////////////////////////////////// // Implementation @@ -160,33 +189,69 @@ public: // Adjusts the panes void OnSize(wxSizeEvent& event); + // In live mode, resize child windows in idle time + void OnIdle(wxIdleEvent& event); + // Draws borders - void DrawBorders(wxDC& dc); + virtual void DrawBorders(wxDC& dc); // Draws the sash - void DrawSash(wxDC& dc); + virtual void DrawSash(wxDC& dc); // Draws the sash tracker (for whilst moving the sash) - void DrawSashTracker(int x, int y); + virtual void DrawSashTracker(int x, int y); // Tests for x, y over sash - bool SashHitTest(int x, int y, int tolerance = 2); + virtual bool SashHitTest(int x, int y, int tolerance = 2); // Resizes subwindows - void SizeWindows(); + virtual void SizeWindows(); // Initialize colours void InitColours(); + void SetNeedUpdating(bool needUpdating) { m_needUpdating = needUpdating; } + bool GetNeedUpdating() const { return m_needUpdating ; } + +protected: + // event handlers +#ifdef __WXMSW__ + void OnSetCursor(wxSetCursorEvent& event); +#endif // wxMSW + + // send the given event, return FALSE if the event was processed and vetoed + // by the user code + inline bool DoSendEvent(wxSplitterEvent& event); + protected: - // our event handlers - void OnSashPosChanged(wxSplitterEvent& event); - void OnDoubleClick(wxSplitterEvent& event); - void OnUnsplitEvent(wxSplitterEvent& event); + // common part of all ctors + void Init(); + + // common part of SplitVertically() and SplitHorizontally() + bool DoSplit(wxSplitMode mode, + wxWindow *window1, wxWindow *window2, + int sashPosition); + + // adjusts sash position with respect to min. pane and window sizes + int AdjustSashPosition(int sashPos) const; + + // get either width or height depending on the split mode + int GetWindowSize() const; + + // convert the user specified sash position which may be > 0 (as is), < 0 + // (specifying the size of the right pane) or 0 (use default) to the real + // position to be passed to DoSetSashPosition() + int ConvertSashPosition(int sashPos) const; - void SendUnsplitEvent(wxWindow *winRemoved); + // set the real sash position, sashPos here must be positive + void DoSetSashPosition(int sashPos); - int m_splitMode; + // set the cursor appropriate for the current split mode + void SetResizeCursor(); + + wxSplitMode m_splitMode; + bool m_permitUnsplitAlways; + bool m_needUpdating; // when in live mode, set this to TRUE to resize children in idle wxWindow* m_windowOne; wxWindow* m_windowTwo; int m_dragMode; @@ -195,11 +260,13 @@ protected: int m_borderSize; int m_sashSize; // Sash width or height int m_sashPosition; // Number of pixels from left or top + int m_requestedSashPosition; + int m_sashPositionCurrent; // while dragging int m_firstX; int m_firstY; int m_minimumPaneSize; - wxCursor* m_sashCursorWE; - wxCursor* m_sashCursorNS; + wxCursor m_sashCursorWE; + wxCursor m_sashCursorNS; wxPen* m_sashTrackerPen; wxPen* m_lightShadowPen; wxPen* m_mediumShadowPen; @@ -209,6 +276,8 @@ protected: wxPen* m_facePen; private: + WX_DECLARE_CONTROL_CONTAINER(); + DECLARE_DYNAMIC_CLASS(wxSplitterWindow) DECLARE_EVENT_TABLE() }; @@ -221,14 +290,15 @@ private: // usual wxWin convention, but the three event types have different kind of // data associated with them, so the accessors can be only used if the real // event type matches with the one for which the accessors make sense -class WXDLLEXPORT wxSplitterEvent : public wxCommandEvent +class WXDLLEXPORT wxSplitterEvent : public wxNotifyEvent { public: wxSplitterEvent(wxEventType type = wxEVT_NULL, wxSplitterWindow *splitter = (wxSplitterWindow *)NULL) - : wxCommandEvent(type) + : wxNotifyEvent(type) { SetEventObject(splitter); + if (splitter) m_id = splitter->GetId(); } // SASH_POS_CHANGED methods @@ -237,14 +307,16 @@ public: // all void SetSashPosition(int pos) { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED ); + wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING); m_data.pos = pos; } int GetSashPosition() const { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED ); + wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING); return m_data.pos; } @@ -273,7 +345,7 @@ public: } private: - friend wxSplitterWindow; + friend class WXDLLEXPORT wxSplitterWindow; // data for the different types of event union @@ -292,30 +364,39 @@ private: typedef void (wxEvtHandler::*wxSplitterEventFunction)(wxSplitterEvent&); #define EVT_SPLITTER_SASH_POS_CHANGED(id, fn) \ - { \ + DECLARE_EVENT_TABLE_ENTRY( \ wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, \ id, \ -1, \ (wxObjectEventFunction)(wxEventFunction)(wxSplitterEventFunction) &fn, \ NULL \ - }, + ), + +#define EVT_SPLITTER_SASH_POS_CHANGING(id, fn) \ + DECLARE_EVENT_TABLE_ENTRY( \ + wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, \ + id, \ + -1, \ + (wxObjectEventFunction)(wxEventFunction)(wxSplitterEventFunction) &fn, \ + NULL \ + ), -#define EVT_SPLITTER_DCLICK(id, fn) \ - { \ - wxEVT_COMMAND_SPLITTER_DOUBLECLICKED, \ +#define EVT_SPLITTER_DCLICK(id, fn) \ + DECLARE_EVENT_TABLE_ENTRY( \ + wxEVT_COMMAND_SPLITTER_DOUBLECLICKED, \ id, \ -1, \ (wxObjectEventFunction)(wxEventFunction)(wxSplitterEventFunction) &fn, \ NULL \ - }, + ), #define EVT_SPLITTER_UNSPLIT(id, fn) \ - { \ + DECLARE_EVENT_TABLE_ENTRY( \ wxEVT_COMMAND_SPLITTER_UNSPLIT, \ id, \ -1, \ (wxObjectEventFunction)(wxEventFunction)(wxSplitterEventFunction) &fn, \ NULL \ - }, + ), #endif // __SPLITTERH_G__