X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5340966638dba7bcbd960913a0fc010dd1de4883..7ddb15416407390de67cc26b04e91ea99a521f57:/include/wx/generic/splitter.h diff --git a/include/wx/generic/splitter.h b/include/wx/generic/splitter.h index f53efc311a..ad319e44df 100644 --- a/include/wx/generic/splitter.h +++ b/include/wx/generic/splitter.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: wx/splitter.h +// Name: wx/generic/splitter.h // Purpose: wxSplitterWindow class // Author: Julian Smart // Modified by: @@ -9,17 +9,13 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef __SPLITTERH_G__ -#define __SPLITTERH_G__ - -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #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 @@ -53,7 +49,7 @@ enum // 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 wxNavigationEnabled { public: @@ -95,13 +91,13 @@ 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); @@ -123,7 +119,7 @@ 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) @@ -137,14 +133,17 @@ public: // Is the window split? bool IsSplit() const { return (m_windowTwo != NULL); } - // Sets the sash size - void SetSashSize(int WXUNUSED(width)) { } - // Sets the border size void SetBorderSize(int WXUNUSED(width)) { } - // Gets the sash size + // Hide or show the sash and test whether it's currently hidden. + void SetSashInvisible(bool invisible = true); + bool IsSashInvisible() const { return HasFlag(wxSP_NOSASH); } + + // Gets the current sash size which may be 0 if it's hidden and the default + // sash size. int GetSashSize() const; + int GetDefaultSashSize() const; // Gets the border size int GetBorderSize() const; @@ -155,6 +154,12 @@ public: // 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; } @@ -191,6 +196,9 @@ public: // Handles mouse events void OnMouseEvent(wxMouseEvent& ev); + // Aborts dragging mode + void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); + // Adjusts the panes void OnSize(wxSizeEvent& event); @@ -204,17 +212,19 @@ public: virtual void DrawSashTracker(int x, int y); // Tests for x, y over sash - virtual bool SashHitTest(int x, int y, int tolerance = 5); + virtual bool SashHitTest(int x, int y); // Resizes subwindows virtual void SizeWindows(); - void SetNeedUpdating(bool needUpdating) { m_needUpdating = needUpdating; } - bool GetNeedUpdating() const { return m_needUpdating ; } - #ifdef __WXMAC__ - virtual bool MacClipGrandChildren() const { return true ; } + virtual bool MacClipGrandChildren() const { return true ; } #endif + + // Sets the sash size: this doesn't do anything and shouldn't be used at + // all any more. + wxDEPRECATED_INLINE( void SetSashSize(int WXUNUSED(width)), return; ) + protected: // event handlers #if defined(__WXMSW__) || defined(__WXMAC__) @@ -223,9 +233,8 @@ protected: // 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(); @@ -264,17 +273,24 @@ protected: // 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; wxWindow* m_windowOne; wxWindow* m_windowTwo; int m_dragMode; - int m_oldX; - int m_oldY; + 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; + 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; @@ -284,14 +300,11 @@ protected: 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() - DECLARE_NO_COPY_CLASS(wxSplitterWindow) + wxDECLARE_NO_COPY_CLASS(wxSplitterWindow); }; // ---------------------------------------------------------------------------- @@ -302,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 @@ -319,16 +334,16 @@ public: // all void SetSashPosition(int pos) { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED - || GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING); + wxASSERT( GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGING); m_data.pos = pos; } int GetSashPosition() const { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED - || GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING); + wxASSERT( GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_SPLITTER_SASH_POS_CHANGING); return m_data.pos; } @@ -336,7 +351,7 @@ public: // UNSPLIT event methods wxWindow *GetWindowBeingRemoved() const { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_UNSPLIT ); + wxASSERT( GetEventType() == wxEVT_SPLITTER_UNSPLIT ); return m_data.win; } @@ -344,20 +359,22 @@ public: // DCLICK event methods int GetX() const { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_DOUBLECLICKED ); + wxASSERT( GetEventType() == wxEVT_SPLITTER_DOUBLECLICKED ); return m_data.pt.x; } int GetY() const { - wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_DOUBLECLICKED ); + wxASSERT( GetEventType() == wxEVT_SPLITTER_DOUBLECLICKED ); 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 @@ -370,45 +387,34 @@ private: } pt; // position of double click for DCLICK event } m_data; - DECLARE_DYNAMIC_CLASS_NO_COPY(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, \ - wxID_ANY, \ - (wxObjectEventFunction)(wxEventFunction) wxStaticCastEvent( wxSplitterEventFunction, &fn ), \ - NULL \ - ), - -#define EVT_SPLITTER_SASH_POS_CHANGING(id, fn) \ - DECLARE_EVENT_TABLE_ENTRY( \ - wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, \ - id, \ - wxID_ANY, \ - (wxObjectEventFunction)(wxEventFunction) wxStaticCastEvent( wxSplitterEventFunction, &fn ), \ - NULL \ - ), - -#define EVT_SPLITTER_DCLICK(id, fn) \ - DECLARE_EVENT_TABLE_ENTRY( \ - wxEVT_COMMAND_SPLITTER_DOUBLECLICKED, \ - id, \ - wxID_ANY, \ - (wxObjectEventFunction)(wxEventFunction) wxStaticCastEvent( wxSplitterEventFunction, &fn ), \ - NULL \ - ), - -#define EVT_SPLITTER_UNSPLIT(id, fn) \ - DECLARE_EVENT_TABLE_ENTRY( \ - wxEVT_COMMAND_SPLITTER_UNSPLIT, \ - id, \ - wxID_ANY, \ - (wxObjectEventFunction)(wxEventFunction) wxStaticCastEvent( 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_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) + + +// old wxEVT_COMMAND_* constants +#define wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED wxEVT_SPLITTER_SASH_POS_CHANGED +#define wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING wxEVT_SPLITTER_SASH_POS_CHANGING +#define wxEVT_COMMAND_SPLITTER_DOUBLECLICKED wxEVT_SPLITTER_DOUBLECLICKED +#define wxEVT_COMMAND_SPLITTER_UNSPLIT wxEVT_SPLITTER_UNSPLIT + +#endif // _WX_GENERIC_SPLITTER_H_