X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/153b7996e59cbc85c6c4016a00dd3e99635a74aa..143712733086515ee6ed40bbd9b7f11ce7f9d2e8:/include/wx/generic/splitter.h diff --git a/include/wx/generic/splitter.h b/include/wx/generic/splitter.h index 3667538fda..7244535737 100644 --- a/include/wx/generic/splitter.h +++ b/include/wx/generic/splitter.h @@ -5,21 +5,17 @@ // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef __SPLITTERH_G__ -#define __SPLITTERH_G__ - -#ifdef __GNUG__ - #pragma interface "splitter.h" -#endif +#ifndef _WX_GENERIC_SPLITTER_H_ +#define _WX_GENERIC_SPLITTER_H_ #include "wx/window.h" // base class declaration #include "wx/containr.h" // wxControlContainer -class WXDLLEXPORT wxSplitterEvent; +class WXDLLIMPEXP_FWD_CORE wxSplitterEvent; // --------------------------------------------------------------------------- // splitter constants @@ -49,11 +45,11 @@ enum // The MFC splitter window manages scrollbars as well so is able to // put sash buttons on the scrollbars, but we probably don't want to go down // this path. -// 2) for wxWindows 2.0, we must find a way to set the WS_CLIPCHILDREN style +// 2) for wxWidgets 2.0, we must find a way to set the WS_CLIPCHILDREN style // to prevent flickering. (WS_CLIPCHILDREN doesn't work in all cases so can't be // standard). -class WXDLLEXPORT wxSplitterWindow: public wxWindow +class WXDLLIMPEXP_CORE wxSplitterWindow: public wxWindow { public: @@ -67,11 +63,11 @@ public: } // Normal constructor - wxSplitterWindow(wxWindow *parent, wxWindowID id = -1, + wxSplitterWindow(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxSP_3D, - const wxString& name = "splitter") + const wxString& name = wxT("splitter")) { Init(); Create(parent, id, pos, size, style, name); @@ -79,11 +75,11 @@ public: virtual ~wxSplitterWindow(); - bool Create(wxWindow *parent, wxWindowID id = -1, + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxSP_3D, - const wxString& name = "splitter"); + const wxString& name = wxT("splitter")); // Gets the only or left/top pane wxWindow *GetWindow1() const { return m_windowOne; } @@ -95,20 +91,20 @@ public: void SetSplitMode(int mode) { wxASSERT_MSG( mode == wxSPLIT_VERTICAL || mode == wxSPLIT_HORIZONTAL, - _T("invalid split mode") ); + wxT("invalid split mode") ); m_splitMode = (wxSplitMode)mode; } // Gets the split mode - wxSplitMode GetSplitMode() const { return m_splitMode; }; + wxSplitMode GetSplitMode() const { return m_splitMode; } // Initialize with one window void Initialize(wxWindow *window); // Associates the given window with window 2, drawing the appropriate sash // and changing the split mode. - // Does nothing and returns FALSE if the window is already split. + // Does nothing and returns false if the window is already split. // A sashPosition of 0 means choose a default sash position, // negative sashPosition specifies the size of right/lower pane as it's // absolute value rather than the size of left/upper pane. @@ -123,12 +119,17 @@ public: // Removes the specified (or second) window from the view // Doesn't actually delete the window. - bool Unsplit(wxWindow *toRemove = (wxWindow *) NULL); + bool Unsplit(wxWindow *toRemove = NULL); // Replaces one of the windows with another one (neither old nor new // parameter should be NULL) bool ReplaceWindow(wxWindow *winOld, wxWindow *winNew); + // Make sure the child window sizes are updated. This is useful + // for reducing flicker by updating the sizes before a + // window is shown, if you know the overall size is correct. + void UpdateSize(); + // Is the window split? bool IsSplit() const { return (m_windowTwo != NULL); } @@ -136,20 +137,26 @@ public: void SetSashSize(int width) { m_sashSize = width; } // Sets the border size - void SetBorderSize(int width) { m_borderSize = width; } + void SetBorderSize(int WXUNUSED(width)) { } // Gets the sash size - int GetSashSize() const { return m_sashSize; } + int GetSashSize() const; // Gets the border size - int GetBorderSize() const { return m_borderSize; } + int GetBorderSize() const; // Set the sash position - void SetSashPosition(int position, bool redraw = TRUE); + void SetSashPosition(int position, bool redraw = true); // Gets the sash position int GetSashPosition() const { return m_sashPosition; } + // Set the sash gravity + void SetSashGravity(double gravity); + + // Gets the sash gravity + double GetSashGravity() const { return m_sashGravity; } + // If this is zero, we can remove panes by dragging the sash. void SetMinimumPaneSize(int min); int GetMinimumPaneSize() const { return m_minimumPaneSize; } @@ -162,7 +169,7 @@ public: 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. + // 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 newSashPosition); @@ -186,14 +193,14 @@ public: // Handles mouse events void OnMouseEvent(wxMouseEvent& ev); + // Aborts dragging mode + void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); + // Adjusts the panes void OnSize(wxSizeEvent& event); // In live mode, resize child windows in idle time - void OnIdle(wxIdleEvent& event); - - // Draws borders - virtual void DrawBorders(wxDC& dc); + void OnInternalIdle(); // Draws the sash virtual void DrawSash(wxDC& dc); @@ -202,28 +209,28 @@ public: virtual void DrawSashTracker(int x, int y); // Tests for x, y over sash - virtual bool SashHitTest(int x, int y, int tolerance = 2); + virtual bool SashHitTest(int x, int y, int tolerance = 5); // Resizes subwindows virtual void SizeWindows(); - // Initialize colours - void InitColours(); - void SetNeedUpdating(bool needUpdating) { m_needUpdating = needUpdating; } bool GetNeedUpdating() const { return m_needUpdating ; } +#ifdef __WXMAC__ + virtual bool MacClipGrandChildren() const { return true ; } +#endif + protected: // event handlers -#ifdef __WXMSW__ +#if defined(__WXMSW__) || defined(__WXMAC__) void OnSetCursor(wxSetCursorEvent& event); #endif // wxMSW - // send the given event, return FALSE if the event was processed and vetoed + // send the given event, return false if the event was processed and vetoed // by the user code - inline bool DoSendEvent(wxSplitterEvent& event); + bool DoSendEvent(wxSplitterEvent& event); -protected: // common part of all ctors void Init(); @@ -244,42 +251,60 @@ protected: int ConvertSashPosition(int sashPos) const; // set the real sash position, sashPos here must be positive - void DoSetSashPosition(int sashPos); + // + // returns true if the sash position has been changed, false otherwise + bool DoSetSashPosition(int sashPos); + + // set the sash position and send an event about it having been changed + void SetSashPositionAndNotify(int sashPos); + + // callbacks executed when we detect that the mouse has entered or left + // the sash + virtual void OnEnterSash(); + virtual void OnLeaveSash(); // set the cursor appropriate for the current split mode void SetResizeCursor(); + // redraw the splitter if its "hotness" changed if necessary + void RedrawIfHotSensitive(bool isHot); + + // return the best size of the splitter equal to best sizes of its + // subwindows + virtual wxSize DoGetBestSize() const; + + 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; - int m_oldX; - int m_oldY; - int m_borderSize; - int m_sashSize; // Sash width or height + int m_oldX; // current tracker position if not live mode + int m_oldY; // current tracker position if not live mode int m_sashPosition; // Number of pixels from left or top + double m_sashGravity; + int m_sashSize; + wxSize m_lastSize; int m_requestedSashPosition; int m_sashPositionCurrent; // while dragging - int m_firstX; - int m_firstY; + wxPoint m_ptStart; // mouse position when dragging started + int m_sashStart; // sash position when dragging started int m_minimumPaneSize; wxCursor m_sashCursorWE; wxCursor m_sashCursorNS; - wxPen* m_sashTrackerPen; - wxPen* m_lightShadowPen; - wxPen* m_mediumShadowPen; - wxPen* m_darkShadowPen; - wxPen* m_hilightPen; - wxBrush* m_faceBrush; - wxPen* m_facePen; + wxPen *m_sashTrackerPen; + + // when in live mode, set this to true to resize children in idle + bool m_needUpdating:1; + bool m_permitUnsplitAlways:1; + bool m_isHot:1; + bool m_checkRequestedSashPosition:1; private: WX_DECLARE_CONTROL_CONTAINER(); DECLARE_DYNAMIC_CLASS(wxSplitterWindow) DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxSplitterWindow); }; // ---------------------------------------------------------------------------- @@ -290,16 +315,18 @@ 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 wxNotifyEvent +class WXDLLIMPEXP_CORE wxSplitterEvent : public wxNotifyEvent { public: wxSplitterEvent(wxEventType type = wxEVT_NULL, - wxSplitterWindow *splitter = (wxSplitterWindow *)NULL) + wxSplitterWindow *splitter = NULL) : wxNotifyEvent(type) { SetEventObject(splitter); if (splitter) m_id = splitter->GetId(); } + wxSplitterEvent(const wxSplitterEvent& event) + : wxNotifyEvent(event), m_data(event.m_data) { } // SASH_POS_CHANGED methods @@ -344,8 +371,10 @@ public: return m_data.pt.y; } + virtual wxEvent *Clone() const { return new wxSplitterEvent(*this); } + private: - friend class WXDLLEXPORT wxSplitterWindow; + friend class WXDLLIMPEXP_FWD_CORE wxSplitterWindow; // data for the different types of event union @@ -358,45 +387,27 @@ private: } pt; // position of double click for DCLICK event } m_data; - DECLARE_DYNAMIC_CLASS(wxSplitterEvent) + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSplitterEvent) }; 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) \ - 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__ +#define wxSplitterEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxSplitterEventFunction, func) + +#define wx__DECLARE_SPLITTEREVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_SPLITTER_ ## evt, id, wxSplitterEventHandler(fn)) + +#define EVT_SPLITTER_SASH_POS_CHANGED(id, fn) \ + wx__DECLARE_SPLITTEREVT(SASH_POS_CHANGED, id, fn) + +#define EVT_SPLITTER_SASH_POS_CHANGING(id, fn) \ + wx__DECLARE_SPLITTEREVT(SASH_POS_CHANGING, id, fn) + +#define EVT_SPLITTER_DCLICK(id, fn) \ + wx__DECLARE_SPLITTEREVT(DOUBLECLICKED, id, fn) + +#define EVT_SPLITTER_UNSPLIT(id, fn) \ + wx__DECLARE_SPLITTEREVT(UNSPLIT, id, fn) + +#endif // _WX_GENERIC_SPLITTER_H_