From: Vadim Zeitlin Date: Sat, 26 Jun 1999 11:10:50 +0000 (+0000) Subject: 1. serious bug in wxRegConfig corrected - deleting a value would delete the X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/92049cd473c81fbce934e71796b2d841d5e605fa 1. serious bug in wxRegConfig corrected - deleting a value would delete the key containing it if it didn't have any subkeys (i.e. would delete the sibling values) 2. wxRegKey::GetFirstValue() starts with first value, not the second one 3. typo in wxStaticText::DoSetSize() which prevented width.AsIs() from working fixed 4. adjustment for the parent client area offset not done for the top level windows (dialogs and frames) any more git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2904 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/registry.h b/include/wx/msw/registry.h index 3bdce82bca..693207b3fd 100644 --- a/include/wx/msw/registry.h +++ b/include/wx/msw/registry.h @@ -187,11 +187,15 @@ public: // query existence of a key/value // return true if value exists - bool HasValue(const wxChar *szKey) const; + bool HasValue(const wxChar *szKey) const; // return true if given subkey exists - bool HasSubKey(const wxChar *szKey) const; + bool HasSubKey(const wxChar *szKey) const; // return true if any subkeys exist - bool HasSubkeys() const; + bool HasSubkeys() const; + // return true if any values exist + bool HasValues() const; + // return true if the key is empty (nothing under this key) + bool IsEmpty() const { return !HasSubkeys() && !HasValues(); } // enumerate values and subkeys bool GetFirstValue(wxString& strValueName, long& lIndex); diff --git a/src/msw/regconf.cpp b/src/msw/regconf.cpp index 99cc9465dc..6ec17a61ff 100644 --- a/src/msw/regconf.cpp +++ b/src/msw/regconf.cpp @@ -531,7 +531,7 @@ bool wxRegConfig::DeleteEntry(const wxString& value, bool bGroupIfEmptyAlso) if ( !m_keyLocal.DeleteValue(path.Name()) ) return FALSE; - if ( !m_keyLocal.HasSubkeys() ) { + if ( m_keyLocal.IsEmpty() ) { wxString strKey = GetPath().AfterLast(wxCONFIG_PATH_SEPARATOR); SetPath(".."); // changes m_keyLocal return m_keyLocal.DeleteKey(strKey); diff --git a/src/msw/registry.cpp b/src/msw/registry.cpp index fbdb35b0e8..dca9790b5d 100644 --- a/src/msw/registry.cpp +++ b/src/msw/registry.cpp @@ -532,6 +532,18 @@ bool wxRegKey::HasValue(const wxChar *szValue) const #endif // WIN16/32 } +// returns TRUE if this key has any values +bool wxRegKey::HasValues() const +{ + // suppress possible messages from GetFirstValue() + wxLogNull nolog; + + // just call GetFirstValue with dummy parameters + wxString str; + long l; + return CONST_CAST GetFirstValue(str, l); +} + // returns TRUE if this key has any subkeys bool wxRegKey::HasSubkeys() const { @@ -718,8 +730,7 @@ bool wxRegKey::GetNextValue(wxString& strValueName, long& lIndex) const wxChar szValueName[1024]; // @@ use RegQueryInfoKey... DWORD dwValueLen = WXSIZEOF(szValueName); - lIndex++; - m_dwLastError = RegEnumValue((HKEY) m_hKey, lIndex, + m_dwLastError = RegEnumValue((HKEY) m_hKey, lIndex++, szValueName, &dwValueLen, RESERVED, NULL, // [out] type diff --git a/src/msw/stattext.cpp b/src/msw/stattext.cpp index afbb5f2ff2..da9906d988 100644 --- a/src/msw/stattext.cpp +++ b/src/msw/stattext.cpp @@ -121,7 +121,7 @@ void wxStaticText::DoSetSize(int x, int y, int width, int height, int sizeFlags) for ( const char *pc = text; ; pc++ ) { if ( *pc == '\n' || *pc == '\0' ) { GetTextExtent(curLine, &widthLine, &heightLine); - if ( width > widthTextMax ) + if ( widthLine > widthTextMax ) widthTextMax = widthLine; heightTextTotal += heightLine; diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 9e27c1d6aa..ac5c4cac6d 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -1082,30 +1082,38 @@ void wxWindow::DoGetSize(int *x, int *y) const void wxWindow::DoGetPosition(int *x, int *y) const { HWND hWnd = GetHwnd(); - HWND hParentWnd = 0; - if ( GetParent() ) - hParentWnd = (HWND) GetParent()->GetHWND(); RECT rect; GetWindowRect(hWnd, &rect); - // Since we now have the absolute screen coords, if there's a parent we - // must subtract its top left corner POINT point; point.x = rect.left; point.y = rect.top; - if ( hParentWnd ) - { - ::ScreenToClient(hParentWnd, &point); - } - // We may be faking the client origin. So a window that's really at (0, - // 30) may appear (to wxWin apps) to be at (0, 0). - if ( GetParent() ) + // we do the adjustments with respect to the parent only for the "real" + // children, not for the dialogs/frames + if ( !IsTopLevel() ) { - wxPoint pt(GetParent()->GetClientAreaOrigin()); - point.x -= pt.x; - point.y -= pt.y; + HWND hParentWnd = 0; + wxWindow *parent = GetParent(); + if ( parent ) + hParentWnd = GetWinHwnd(parent); + + // Since we now have the absolute screen coords, if there's a parent we + // must subtract its top left corner + if ( hParentWnd ) + { + ::ScreenToClient(hParentWnd, &point); + } + + // We may be faking the client origin. So a window that's really at (0, + // 30) may appear (to wxWin apps) to be at (0, 0). + if ( parent ) + { + wxPoint pt(parent->GetClientAreaOrigin()); + point.x -= pt.x; + point.y -= pt.y; + } } if ( x ) @@ -1240,10 +1248,16 @@ wxPoint wxWindow::GetClientAreaOrigin() const // a toolbar that it manages itself). void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) { - if ( ((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent() ) + // don't do it for the dialogs/frames - they float independently of their + // parent + if ( !IsTopLevel() ) { - wxPoint pt(GetParent()->GetClientAreaOrigin()); - x += pt.x; y += pt.y; + wxWindow *parent = GetParent(); + if ( !(sizeFlags & wxSIZE_NO_ADJUSTMENTS) && parent ) + { + wxPoint pt(parent->GetClientAreaOrigin()); + x += pt.x; y += pt.y; + } } }