X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b21f4960b13ad92398975de63e3a3f1de8536e52..855f31ebe72bef834a32df2c274b41fb282ad265:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 66570d7882..41c8a455bd 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -251,8 +251,12 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, // generate a new id if the user doesn't care about it m_windowId = id == wxID_ANY ? NewControlId() : id; + // don't use SetWindowStyleFlag() here, this function should only be called + // to change the flag after creation as it tries to reflect the changes in + // flags by updating the window dynamically and we don't need this here + m_windowStyle = style; + SetName(name); - SetWindowStyleFlag(style); SetParent(parent); #if wxUSE_VALIDATORS @@ -270,6 +274,28 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, return true; } +bool wxWindowBase::ToggleWindowStyle(int flag) +{ + wxASSERT_MSG( flag, _T("flags with 0 value can't be toggled") ); + + bool rc; + long style = GetWindowStyleFlag(); + if ( style & flag ) + { + style &= ~flag; + rc = false; + } + else // currently off + { + style |= flag; + rc = true; + } + + SetWindowStyleFlag(style); + + return rc; +} + // ---------------------------------------------------------------------------- // destruction // ---------------------------------------------------------------------------- @@ -297,7 +323,7 @@ wxWindowBase::~wxWindowBase() { wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent((wxWindow*)this), wxTopLevelWindow); - + if ( tlw && tlw->GetDefaultItem() == this ) tlw->SetDefaultItem(NULL); if ( tlw && tlw->GetTmpDefaultItem() == this ) @@ -351,6 +377,14 @@ wxWindowBase::~wxWindowBase() #endif } +void wxWindowBase::SendDestroyEvent() +{ + wxWindowDestroyEvent event; + event.SetEventObject(this); + event.SetId(GetId()); + GetEventHandler()->ProcessEvent(event); +} + bool wxWindowBase::Destroy() { delete this; @@ -463,7 +497,18 @@ wxSize wxWindowBase::DoGetBestSize() const if ( m_windowSizer ) { - best = GetWindowSizeForVirtualSize(m_windowSizer->GetMinSize()); + // Adjust to window size, since the return value of GetWindowSizeForVirtualSize is + // expressed in window and not client size + wxSize minSize = m_windowSizer->GetMinSize(); + wxSize size(GetSize()); + wxSize clientSize(GetClientSize()); + + wxSize minWindowSize(minSize.x + size.x - clientSize.x, + minSize.y + size.y - clientSize.y); + + best = GetWindowSizeForVirtualSize(minWindowSize); + + return best; } #if wxUSE_CONSTRAINTS else if ( m_constraints ) @@ -579,6 +624,76 @@ wxSize wxWindowBase::DoGetBestSize() const return best; } +// helper of GetWindowBorderSize(): as many ports don't implement support for +// wxSYS_BORDER/EDGE_X/Y metrics in their wxSystemSettings, use hard coded +// fallbacks in this case +static int wxGetMetricOrDefault(wxSystemMetric what) +{ + int rc = wxSystemSettings::GetMetric(what); + if ( rc == -1 ) + { + switch ( what ) + { + case wxSYS_BORDER_X: + case wxSYS_BORDER_Y: + // 2D border is by default 1 pixel wide + rc = 1; + break; + + case wxSYS_EDGE_X: + case wxSYS_EDGE_Y: + // 3D borders are by default 2 pixels + rc = 2; + break; + + default: + wxFAIL_MSG( _T("unexpected wxGetMetricOrDefault() argument") ); + rc = 0; + } + } + + return rc; +} + +wxSize wxWindowBase::GetWindowBorderSize() const +{ + wxSize size; + + switch ( GetBorder() ) + { + case wxBORDER_NONE: + // nothing to do, size is already (0, 0) + break; + + case wxBORDER_SIMPLE: + case wxBORDER_STATIC: + size.x = wxGetMetricOrDefault(wxSYS_BORDER_X); + size.y = wxGetMetricOrDefault(wxSYS_BORDER_Y); + break; + + case wxBORDER_SUNKEN: + case wxBORDER_RAISED: + size.x = wxMax(wxGetMetricOrDefault(wxSYS_EDGE_X), + wxGetMetricOrDefault(wxSYS_BORDER_X)); + size.y = wxMax(wxGetMetricOrDefault(wxSYS_EDGE_Y), + wxGetMetricOrDefault(wxSYS_BORDER_Y)); + break; + + case wxBORDER_DOUBLE: + size.x = wxGetMetricOrDefault(wxSYS_EDGE_X) + + wxGetMetricOrDefault(wxSYS_BORDER_X); + size.y = wxGetMetricOrDefault(wxSYS_EDGE_Y) + + wxGetMetricOrDefault(wxSYS_BORDER_Y); + break; + + default: + wxFAIL_MSG(_T("Unknown border style.")); + break; + } + + // we have borders on both sides + return size*2; +} wxSize wxWindowBase::GetEffectiveMinSize() const { @@ -662,7 +777,7 @@ void wxWindowBase::DoSetWindowVariant( wxWindowVariant variant ) void wxWindowBase::DoSetSizeHints( int minW, int minH, int maxW, int maxH, - int incW, int incH ) + int WXUNUSED(incW), int WXUNUSED(incH) ) { wxCHECK_RET( (minW == wxDefaultCoord || maxW == wxDefaultCoord || minW <= maxW) && (minH == wxDefaultCoord || maxH == wxDefaultCoord || minH <= maxH), @@ -1516,7 +1631,7 @@ void wxWindowBase::OnHelp(wxHelpEvent& event) #endif // wxUSE_HELP // ---------------------------------------------------------------------------- -// tooltipsroot.Replace("\\", "/"); +// tooltips // ---------------------------------------------------------------------------- #if wxUSE_TOOLTIPS @@ -2000,7 +2115,7 @@ void wxWindowBase::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) co } // ---------------------------------------------------------------------------- -// do Update UI processing for child controls +// Update UI processing // ---------------------------------------------------------------------------- void wxWindowBase::UpdateWindowUI(long flags) @@ -2035,23 +2150,6 @@ void wxWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event) Show(event.GetShown()); } -#if 0 -// call internal idle recursively -// may be obsolete (wait until OnIdle scheme stabilises) -void wxWindowBase::ProcessInternalIdle() -{ - OnInternalIdle(); - - wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); - while (node) - { - wxWindow *child = node->GetData(); - child->ProcessInternalIdle(); - node = node->GetNext(); - } -} -#endif - // ---------------------------------------------------------------------------- // dialog units translations // ---------------------------------------------------------------------------- @@ -2199,7 +2297,7 @@ void wxWindowBase::OnMiddleClick( wxMouseEvent& event ) msg.Printf(_T("wxWidgets Library (%s port)\n") _T("Version %d.%d.%d%s%s, compiled at %s %s\n") _T("Runtime version of toolkit used is %d.%d.%s\n") - _T("Copyright (c) 1995-2006 wxWidgets team"), + _T("Copyright (c) 1995-2007 wxWidgets team"), wxPlatformInfo::Get().GetPortIdName().c_str(), wxMAJOR_VERSION, wxMINOR_VERSION, @@ -2275,14 +2373,14 @@ wxAccessible* wxWindowBase::CreateAccessible() #include "wx/listimpl.cpp" WX_DEFINE_LIST(wxWindowList) -#else +#else // !wxUSE_STL void wxWindowListNode::DeleteData() { delete (wxWindow *)GetData(); } -#endif +#endif // wxUSE_STL/!wxUSE_STL // ---------------------------------------------------------------------------- // borders @@ -2400,6 +2498,10 @@ static void DoNotifyWindowAboutCaptureLost(wxWindow *win) event.SetEventObject(win); if ( !win->GetEventHandler()->ProcessEvent(event) ) { + // windows must handle this event, otherwise the app wouldn't behave + // correctly if it loses capture unexpectedly; see the discussion here: + // http://sourceforge.net/tracker/index.php?func=detail&aid=1153662&group_id=9863&atid=109863 + // http://article.gmane.org/gmane.comp.lib.wxwidgets.devel/82376 wxFAIL_MSG( _T("window that captured the mouse didn't process wxEVT_MOUSE_CAPTURE_LOST") ); } } @@ -2451,14 +2553,6 @@ bool wxWindowBase::UnregisterHotKey(int WXUNUSED(hotkeyId)) #endif // wxUSE_HOTKEY -void wxWindowBase::SendDestroyEvent() -{ - wxWindowDestroyEvent event; - event.SetEventObject(this); - event.SetId(GetId()); - GetEventHandler()->ProcessEvent(event); -} - // ---------------------------------------------------------------------------- // event processing // ----------------------------------------------------------------------------