From a4ebf7ba6189c29469eaa8c43717b18d1f61b973 Mon Sep 17 00:00:00 2001 From: Stefan Neis Date: Fri, 6 Jan 2006 23:43:45 +0000 Subject: [PATCH] Integrated fixes for sizing/positioning; cleanup; removal of handle/window association in dtor. (All according to patch #1396667). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36745 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/os2/radiobox.h | 12 -- src/os2/radiobox.cpp | 274 +++++++------------------------------- 2 files changed, 45 insertions(+), 241 deletions(-) diff --git a/include/wx/os2/radiobox.h b/include/wx/os2/radiobox.h index 5ec9adffae..5255f389c3 100644 --- a/include/wx/os2/radiobox.h +++ b/include/wx/os2/radiobox.h @@ -126,22 +126,12 @@ public: virtual int GetCount(void) const; - inline int GetNumberOfRowsOrCols(void) const { return m_nNoRowsOrCols; } - void GetPosition( int* pnX - ,int* pnY - ) const; inline WXHWND* GetRadioButtons(void) const { return m_ahRadioButtons; } int GetSelection(void) const; void GetSize( int* pnX ,int* pnY ) const; inline int GetSizeFlags(void) const { return m_nSizeFlags; } - void AdjustButtons( int nX - ,int nY - ,int nWidth - ,int nHeight - ,int nSizeFlags - ); wxString GetString(int nIndex) const; virtual wxString GetStringSelection(void) const; @@ -149,7 +139,6 @@ public: void SetFocus(void); virtual bool SetFont(const wxFont& rFont); inline void SetLabelFont(const wxFont& WXUNUSED(font)) {}; - inline void SetNumberOfRowsOrCols(int nNum) { m_nNoRowsOrCols = nNum; } void SetSelection(int nIndex); virtual void SetString( int nNum ,const wxString& rsLabel @@ -182,7 +171,6 @@ protected: int* m_pnRadioWidth; // for bitmaps int* m_pnRadioHeight; int m_nNoItems; - int m_nNoRowsOrCols; int m_nSelectedButton; int m_nSizeFlags; diff --git a/src/os2/radiobox.cpp b/src/os2/radiobox.cpp index 0893aa63b4..3b93efcba8 100644 --- a/src/os2/radiobox.cpp +++ b/src/os2/radiobox.cpp @@ -46,10 +46,11 @@ MRESULT EXPENTRY wxRadioBoxWndProc( HWND hWnd // global vars // --------------------------------------------------------------------------- -// the pointer to standard radio button wnd proc extern void wxAssociateWinWithHandle( HWND hWnd ,wxWindowOS2* pWin ); +extern void wxRemoveHandleAssociation( wxWindowOS2 *pWin ); +// the pointer to standard radio button & box wnd procs static WXFARPROC fnWndProcRadioBtn = NULL; static WXFARPROC fnWndProcRadioBox = NULL; @@ -66,7 +67,6 @@ wxRadioBox::wxRadioBox() { m_nSelectedButton = -1; m_nNoItems = 0; - m_nNoRowsOrCols = 0; m_ahRadioButtons = NULL; m_pnRadioWidth = NULL; m_pnRadioHeight = NULL; @@ -76,11 +76,17 @@ wxRadioBox::~wxRadioBox() { m_isBeingDeleted = true; + if (m_hWnd) + wxRemoveHandleAssociation(this); if (m_ahRadioButtons) { - int i; - for (i = 0; i < m_nNoItems; i++) + for (int i = 0; i < m_nNoItems; i++) + { + wxWindow* pWin = wxFindWinFromHandle((WXHWND)m_ahRadioButtons[i]); + wxRemoveHandleAssociation(pWin); + ::WinDestroyWindow((HWND)m_ahRadioButtons[i]); + } delete[] m_ahRadioButtons; } if (m_pnRadioWidth) @@ -89,143 +95,6 @@ wxRadioBox::~wxRadioBox() delete[] m_pnRadioHeight; } // end of wxRadioBox::~wxRadioBox -void wxRadioBox::AdjustButtons( int nX, - int nY, - int nWidth, - int nHeight, - int WXUNUSED(nSizeFlags) ) -{ - wxSize vMaxSize; - int nXOffset = nX; - int nYOffset = nY + nHeight; - int nCx1; - int nCy1; - int nStartX; - int nStartY; - int nMaxWidth; - int nMaxHeight; - wxFont vFont = GetFont(); - - wxGetCharSize( m_hWnd - ,&nCx1 - ,&nCy1 - ,&vFont - ); - vMaxSize = GetMaxButtonSize(); - nMaxWidth = vMaxSize.x; - nMaxHeight = vMaxSize.y; - - nXOffset += nCx1; - nYOffset -= (nMaxHeight + ((3*nCy1)/2)); - - nStartX = nXOffset; - nStartY = nYOffset; - - for (int i = 0; i < m_nNoItems; i++) - { - // - // The last button in the row may be wider than the other ones as the - // radiobox may be wider than the sum of the button widths (as it - // happens, for example, when the radiobox label is very long) - // - bool bIsLastInTheRow; - - if (m_windowStyle & wxRA_SPECIFY_COLS) - { - // - // Item is the last in its row if it is a multiple of the number of - // columns or if it is just the last item - // - int n = i + 1; - - bIsLastInTheRow = ((n % GetMajorDim()) == 0) || (n == m_nNoItems); - } - else // winRA_SPECIFY_ROWS - { - // - // Item is the last in the row if it is in the last columns - // - bIsLastInTheRow = i >= (m_nNoItems/GetMajorDim()) * GetMajorDim(); - } - - // - // Is this the start of new row/column? - // - if (i && (i % GetMajorDim() == 0)) - { - if (m_windowStyle & wxRA_SPECIFY_ROWS) - { - - // - // Start of new column - // - nYOffset = nStartY; - nXOffset += nMaxWidth + nCx1; - } - else // start of new row - { - nXOffset = nStartX; - nYOffset -= nMaxHeight; - if (m_pnRadioWidth[0] > 0L) - nYOffset -= nCy1/2; - } - } - - int nWidthBtn; - - if (bIsLastInTheRow) - { - // - // Make the button go to the end of radio box - // - nWidthBtn = nStartX + nWidth - nXOffset - (2 * nCx1); - if (nWidthBtn < nMaxWidth) - nWidthBtn = nMaxWidth; - } - else - { - // - // Normal button, always of the same size - // - nWidthBtn = nMaxWidth; - } - - // - // Make all buttons of the same, maximal size - like this they - // cover the radiobox entirely and the radiobox tooltips are always - // shown (otherwise they are not when the mouse pointer is in the - // radiobox part not belonging to any radiobutton) - // - ::WinSetWindowPos( (HWND)m_ahRadioButtons[i] - ,HWND_BOTTOM - ,(LONG)nXOffset - ,(LONG)nYOffset - ,(LONG)nWidthBtn - ,(LONG)nMaxHeight - ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW - ); - // - // Where do we put the next button? - // - if (m_windowStyle & wxRA_SPECIFY_ROWS) - { - // - // Below this one - // - nYOffset -= nMaxHeight; - if (m_pnRadioWidth[0] > 0) - nYOffset -= nCy1/2; - } - else - { - // - // To the right of this one - // - nXOffset += nWidthBtn + nCx1; - } - } -} // end of wxRadioBox::AdjustButtons - void wxRadioBox::Command ( wxCommandEvent& rEvent ) @@ -284,6 +153,7 @@ bool wxRadioBox::Create( { wxColour vColour; LONG lColor; + HWND hWndParent = GetHwndOf(pParent); vColour.Set(wxString(wxT("BLACK"))); m_backgroundColour = pParent->GetBackgroundColour(); @@ -317,12 +187,7 @@ bool wxRadioBox::Create( // m_nNoItems = nNum; SetMajorDim(nMajorDim == 0 ? nNum : nMajorDim, lStyle); - m_nNoRowsOrCols = nMajorDim; - // - // Some radio boxes test consecutive id. - // - (void)NewControlId(); m_ahRadioButtons = new WXHWND[nNum]; m_pnRadioWidth = new int[nNum]; m_pnRadioHeight = new int[nNum]; @@ -330,41 +195,42 @@ bool wxRadioBox::Create( for (int i = 0; i < nNum; i++) { m_pnRadioWidth[i] = m_pnRadioHeight[i] = -1; - - long lStyleBtn = BS_AUTORADIOBUTTON | WS_TABSTOP | WS_VISIBLE; + long lStyleBtn = BS_AUTORADIOBUTTON | WS_VISIBLE; int nNewId = NewControlId(); if (i == 0) - lStyleBtn |= WS_GROUP; - - HWND hWndBtn = (WXHWND)::WinCreateWindow ( GetHwndOf(pParent) - ,WC_BUTTON - ,::wxPMTextToLabel(asChoices[i]) - ,lStyleBtn - ,0, 0, 0, 0 - ,GetWinHwnd(pParent) - ,HWND_BOTTOM - ,(HMENU)nNewId - ,NULL - ,NULL + lStyleBtn |= WS_GROUP | WS_TABSTOP; + + wxString sLabel = ::wxPMTextToLabel(asChoices[i]); + + HWND hWndBtn = (WXHWND)::WinCreateWindow ( hWndParent, + WC_BUTTON, + sLabel.c_str(), + lStyleBtn, + 0, 0, 0, 0, + hWndParent, + HWND_BOTTOM, + (HMENU)nNewId, + NULL, + NULL ); + if (!hWndBtn) + { + return false; + } lColor = (LONG)vColour.GetPixel(); ::WinSetPresParam( hWndBtn ,PP_FOREGROUNDCOLOR ,sizeof(LONG) ,(PVOID)&lColor ); - lColor = (LONG)m_backgroundColour.GetPixel(); + lColor = (LONG)m_backgroundColour.GetPixel(); ::WinSetPresParam( hWndBtn ,PP_BACKGROUNDCOLOR ,sizeof(LONG) ,(PVOID)&lColor ); - if (!hWndBtn) - { - return false; - } m_ahRadioButtons[i] = (WXHWND)hWndBtn; SubclassRadioButton((WXHWND)hWndBtn); wxAssociateWinWithHandle(hWndBtn, this); @@ -378,18 +244,17 @@ bool wxRadioBox::Create( // // Create a dummy control to end the group. // - (void)::WinCreateWindow ( GetHwndOf(pParent), + (void)::WinCreateWindow ( hWndParent, WC_BUTTON, "", WS_GROUP, 0, 0, 0, 0, - GetWinHwnd(pParent), + hWndParent, HWND_TOP, (HMENU)NewControlId(), NULL, NULL ); - SetFont(*wxSMALL_FONT); fnWndProcRadioBox = (WXFARPROC)::WinSubclassWindow( GetHwnd() ,(PFNWP)wxRadioBoxWndProc ); @@ -421,7 +286,7 @@ bool wxRadioBox::Create( wxSize wxRadioBox::DoGetBestSize() const { return (GetTotalButtonSize(GetMaxButtonSize())); -} // end of WinGuiBase_CRadioBox::DoGetBestSize +} // end of wxRadioBox::DoGetBestSize void wxRadioBox::DoSetSize( int nX @@ -431,6 +296,9 @@ void wxRadioBox::DoSetSize( , int nSizeFlags ) { + // + // Input parameters assume wxWidgets coordinate system + // int nCurrentX; int nCurrentY; int nWidthOld; @@ -505,22 +373,19 @@ void wxRadioBox::DoSetSize( nHeight = nHeightOld; } + // + // Now convert to OS/2 coordinate system + // wxWindowOS2* pParent = (wxWindowOS2*)GetParent(); - if (pParent) - { - int nOS2Height = GetOS2ParentHeight(pParent); - - nYy = nOS2Height - (nYy + nHeight); - nYOffset = nYy + nHeight; - } + nYy = GetOS2ParentHeight(pParent) - nYy - nHeight; else { RECTL vRect; - ::WinQueryWindowRect(HWND_DESKTOP, &vRect); - nYy = vRect.yTop - (nYy + nHeight); + nYy = vRect.yTop - nYy - nHeight; } + nYOffset = nYy + nHeight; ::WinSetWindowPos( GetHwnd() ,HWND_TOP ,(LONG)nXx @@ -582,7 +447,6 @@ void wxRadioBox::DoSetSize( { if (m_windowStyle & wxRA_SPECIFY_ROWS) { - // // Start of new column // @@ -724,53 +588,6 @@ wxSize wxRadioBox::GetMaxButtonSize() const return maxsize; } // end of wxRadioBox::GetMaxButtonSize -void wxRadioBox::GetPosition( int* pnX, - int* WXUNUSED(pnY) ) const -{ - wxWindowOS2* pParent = GetParent(); - RECT vRect = { -1, -1, -1, -1 }; - POINTL vPoint; - int i; - - for (i = 0; i < m_nNoItems; i++) - wxFindMaxSize( m_ahRadioButtons[i] - ,&vRect - ); - if (m_hWnd) - wxFindMaxSize( m_hWnd - ,&vRect - ); - - // - // Since we now have the absolute screen coords, if there's a parent we - // must subtract its top left corner - // - vPoint.x = vRect.xLeft; - vPoint.y = vRect.yTop; - if (pParent) - { - SWP vSwp; - - ::WinQueryWindowPos((HWND)pParent->GetHWND(), &vSwp); - vPoint.x = vSwp.x; - vPoint.y = vSwp.y; - } - - // - // 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()) - { - wxPoint vPt(GetParent()->GetClientAreaOrigin()); - - vPoint.x = vPt.x; - vPoint.y = vPt.y; - } - if (pnX) - *pnX = vPoint.y; -} // end of wxRadioBox::GetPosition - // Get single selection, for single choice list items int wxRadioBox::GetSelection() const { @@ -780,7 +597,6 @@ int wxRadioBox::GetSelection() const void wxRadioBox::GetSize( int* pnWidth, int* pnHeight ) const { RECT vRect; - int i; vRect.xLeft = -1; vRect.xRight = -1; @@ -792,7 +608,7 @@ void wxRadioBox::GetSize( int* pnWidth, int* pnHeight ) const ,&vRect ); - for (i = 0; i < m_nNoItems; i++) + for (int i = 0; i < m_nNoItems; i++) wxFindMaxSize( m_ahRadioButtons[i] ,&vRect ); @@ -808,6 +624,7 @@ wxString wxRadioBox::GetString( int nNum ) const { + wxCHECK_MSG( IsValid(nNum), wxString(""), wxT("invalid radiobox index") ); return wxGetWindowText(m_ahRadioButtons[nNum]); } // end of wxRadioBox::GetString @@ -887,7 +704,6 @@ bool wxRadioBox::OS2Command( WXUINT uCmd, if (wId == GetId()) return true; - for (int i = 0; i < m_nNoItems; i++) { if (wId == wxGetWindowId(m_ahRadioButtons[i])) -- 2.45.2