X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/844adaa47ae9928450affcaaee0209cb36b9c30a..fbb67d0e5247da88d7c403dc61b95244dcc6c7dc:/src/generic/splitter.cpp diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index 0c04fde000..5ba2ae92b8 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -9,24 +9,23 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "splitter.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#if wxUSE_SPLITTER - #ifdef __BORLANDC__ #pragma hdrstop #endif +#if wxUSE_SPLITTER + +#include "wx/splitter.h" + #ifndef WX_PRECOMP #include "wx/string.h" #include "wx/utils.h" #include "wx/log.h" + #include "wx/dcclient.h" #include "wx/dcscreen.h" #include "wx/window.h" @@ -36,14 +35,8 @@ #include "wx/settings.h" #endif -#ifdef __WXMAC__ - #include "wx/mac/private.h" -#endif - #include "wx/renderer.h" -#include "wx/splitter.h" - #include DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED) @@ -76,7 +69,7 @@ BEGIN_EVENT_TABLE(wxSplitterWindow, wxWindow) WX_EVENT_TABLE_CONTROL_CONTAINER(wxSplitterWindow) END_EVENT_TABLE() -WX_DELEGATE_TO_CONTROL_CONTAINER(wxSplitterWindow); +WX_DELEGATE_TO_CONTROL_CONTAINER(wxSplitterWindow) bool wxSplitterWindow::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, @@ -94,6 +87,11 @@ bool wxSplitterWindow::Create(wxWindow *parent, wxWindowID id, if ( !wxWindow::Create(parent, id, pos, size, style, name) ) return false; + if (size.x >= 0) + m_lastSize.x = size.x; + if (size.y >= 0) + m_lastSize.y = size.y; + m_permitUnsplitAlways = (style & wxSP_PERMIT_UNSPLIT) != 0; // FIXME: with this line the background is not erased at all under GTK1, @@ -291,9 +289,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) m_windowOne = m_windowTwo; m_windowTwo = (wxWindow *) NULL; OnUnsplit(removedWindow); - wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); - event.m_data.win = removedWindow; - (void)DoSendEvent(event); + wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); + eventUnsplit.m_data.win = removedWindow; + (void)DoSendEvent(eventUnsplit); SetSashPositionAndNotify(0); } else if ( posSashNew == GetWindowSize() ) @@ -302,9 +300,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) wxWindow *removedWindow = m_windowTwo; m_windowTwo = (wxWindow *) NULL; OnUnsplit(removedWindow); - wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); - event.m_data.win = removedWindow; - (void)DoSendEvent(event); + wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); + eventUnsplit.m_data.win = removedWindow; + (void)DoSendEvent(eventUnsplit); SetSashPositionAndNotify(0); } else @@ -383,7 +381,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) } else { - SetSashPositionAndNotify(posSashNew); + DoSetSashPosition(posSashNew); m_needUpdating = true; } } @@ -573,8 +571,6 @@ int wxSplitterWindow::GetWindowSize() const int wxSplitterWindow::AdjustSashPosition(int sashPos) const { - int window_size = GetWindowSize(); - wxWindow *win; win = GetWindow1(); @@ -603,8 +599,8 @@ int wxSplitterWindow::AdjustSashPosition(int sashPos) const if ( minSize == -1 || m_minimumPaneSize > minSize ) minSize = m_minimumPaneSize; - int maxSize = window_size - minSize - GetBorderSize() - GetSashSize(); - if ( sashPos > maxSize ) + int maxSize = GetWindowSize() - minSize - GetBorderSize() - GetSashSize(); + if ( maxSize > 0 && sashPos > maxSize ) sashPos = maxSize; } @@ -631,13 +627,15 @@ void wxSplitterWindow::SetSashPositionAndNotify(int sashPos) // SetSashPosition(): m_requestedSashPosition = INT_MAX; - if ( DoSetSashPosition(sashPos) ) - { - wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, this); - event.m_data.pos = m_sashPosition; + // note that we must send the event in any case, i.e. even if the sash + // position hasn't changed and DoSetSashPosition() returns false because we + // must generate a CHANGED event at the end of resizing + DoSetSashPosition(sashPos); - (void)DoSendEvent(event); - } + wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, this); + event.m_data.pos = m_sashPosition; + + (void)DoSendEvent(event); } // Position and size subwindows. @@ -698,8 +696,8 @@ void wxSplitterWindow::SizeWindows() y2 = size2; } - GetWindow1()->SetSize(border, border, w1, h1); GetWindow2()->SetSize(x2, y2, w2, h2); + GetWindow1()->SetSize(border, border, w1, h1); } wxClientDC dc(this); @@ -714,7 +712,7 @@ void wxSplitterWindow::Initialize(wxWindow *window) wxASSERT_MSG( (!window || (window && window->GetParent() == this)), _T("windows in the splitter should have it as parent!") ); - if (! window->IsShown()) + if (window && !window->IsShown()) window->Show(); m_windowOne = window;