X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d8a3f66ca7773885b7d396b86e49457abfccd6a9..f2fec40d2c3533e112e6d673fb113b77e65bfd66:/src/os2/radiobox.cpp diff --git a/src/os2/radiobox.cpp b/src/os2/radiobox.cpp index fa32d2ccad..19ff8a2bac 100644 --- a/src/os2/radiobox.cpp +++ b/src/os2/radiobox.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: radiobox.cpp +// Name: src/os2/radiobox.cpp // Purpose: wxRadioBox // Author: David Webster // Modified by: @@ -12,14 +12,16 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#if wxUSE_RADIOBOX + +#include "wx/radiobox.h" + #ifndef WX_PRECOMP #include - #include "wx/setup.h" - #include "wx/wxchar.h" + #include "wx/crt.h" #include "wx/string.h" #include "wx/bitmap.h" #include "wx/brush.h" - #include "wx/radiobox.h" #endif #include "wx/os2/private.h" @@ -36,13 +38,23 @@ MRESULT EXPENTRY wxRadioBtnWndProc( HWND hWnd ,MPARAM wParam ,MPARAM lParam ); +MRESULT EXPENTRY wxRadioBoxWndProc( HWND hWnd + ,UINT uMessage + ,MPARAM wParam + ,MPARAM lParam + ); // --------------------------------------------------------------------------- // 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; // =========================================================================== // implementation @@ -57,22 +69,26 @@ wxRadioBox::wxRadioBox() { m_nSelectedButton = -1; m_nNoItems = 0; - m_nNoRowsOrCols = 0; m_ahRadioButtons = NULL; - m_nMajorDim = 0; m_pnRadioWidth = NULL; m_pnRadioHeight = NULL; } // end of wxRadioBox::wxRadioBox wxRadioBox::~wxRadioBox() { - m_isBeingDeleted = TRUE; + SendDestroyEvent(); + if (m_hWnd) + wxRemoveHandleAssociation(this); if (m_ahRadioButtons) { - int i; - for (i = 0; i < m_nNoItems; i++) + for (unsigned 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) @@ -81,317 +97,189 @@ wxRadioBox::~wxRadioBox() delete[] m_pnRadioHeight; } // end of wxRadioBox::~wxRadioBox -void wxRadioBox::AdjustButtons( - int nX -, int nY -, int nWidth -, int nHeight -, int nSizeFlags -) -{ - wxSize vMaxSize; - int nXOffset = nX; - int nYOffset = nY + nHeight; - int nCx1; - int nCy1; - int nStartX; - int nStartY; - int nMaxWidth; - int nMaxHeight; - int nTotWidth; - int nTotHeight; - - wxGetCharSize( m_hWnd - ,&nCx1 - ,&nCy1 - ,&GetFont() - ); - 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 % m_nMajorDim) == 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/m_nMajorDim) * m_nMajorDim; - } - - // - // Is this the start of new row/column? - // - if (i && (i % m_nMajorDim == 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 beYInt32ing to any radiobutton) - // - ::WinSetWindowPos( (HWND)m_ahRadioButtons[i] - ,HWND_TOP - ,(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 -) +void wxRadioBox::Command ( wxCommandEvent& rEvent ) { SetSelection (rEvent.GetInt()); ProcessCommand(rEvent); } // end of wxRadioBox::Command -bool wxRadioBox::ContainsHWND( - WXHWND hWnd -) const +bool wxRadioBox::ContainsHWND( WXHWND hWnd ) const { - size_t nCount = GetCount(); - size_t i; + unsigned int nCount = GetCount(); + unsigned int i; for (i = 0; i < nCount; i++) { if (GetRadioButtons()[i] == hWnd) - return TRUE; + return true; } - return FALSE; + return false; } // end of wxRadioBox::ContainsHWND -bool wxRadioBox::Create( - wxWindow* pParent -, wxWindowID vId -, const wxString& rsTitle -, const wxPoint& rPos -, const wxSize& rSize -, int nNum -, const wxString asChoices[] -, int nMajorDim -, long lStyle -#if wxUSE_VALIDATORS -, const wxValidator& rVal -#endif -, const wxString& rsName -) -{ - // - // System fonts are too big in OS/2 and they are blue - // We want smaller fonts and black by default. - // - wxFont& rFont = *wxSMALL_FONT; - wxColour vColour; - LONG lColor; - - vColour.Set(wxString("BLACK")); - lColor = (LONG)vColour.GetPixel(); +bool wxRadioBox::Create( wxWindow* pParent, + wxWindowID vId, + const wxString& rsTitle, + const wxPoint& rPos, + const wxSize& rSize, + const wxArrayString& asChoices, + int nMajorDim, + long lStyle, + const wxValidator& rVal, + const wxString& rsName ) +{ + wxCArrayString chs(asChoices); + + return Create(pParent, vId, rsTitle, rPos, rSize, chs.GetCount(), + chs.GetStrings(), nMajorDim, lStyle, rVal, rsName); +} + +bool wxRadioBox::Create( wxWindow* pParent, + wxWindowID vId, + const wxString& rsTitle, + const wxPoint& rPos, + const wxSize& rSize, + int nNum, + const wxString asChoices[], + int nMajorDim, + long lStyle, + const wxValidator& rVal, + const wxString& rsName ) +{ + wxColour vColour(*wxBLACK); + LONG lColor; + HWND hWndParent = GetHwndOf(pParent); + + m_backgroundColour = pParent->GetBackgroundColour(); m_nSelectedButton = -1; - m_nNoItems = nNum; - - m_nMajorDim = nMajorDim == 0 ? nNum : nMajorDim; - m_nNoRowsOrCols = nMajorDim; + m_nNoItems = 0; // // Common initialization // - if (!OS2CreateControl( pParent - ,vId - ,rPos - ,rSize - ,lStyle -#if wxUSE_VALIDATORS - ,rVal -#endif - ,rsName - )) - - - - - if (!OS2CreateControl( "STATIC" - ,SS_GROUPBOX | WS_GROUP + if (!CreateControl( pParent + ,vId + ,rPos + ,rSize + ,lStyle + ,rVal + ,rsName + )) + return false; + if (!OS2CreateControl( wxT("STATIC") + ,SS_GROUPBOX ,rPos ,rSize ,rsTitle )) + return false; -#if RADIOBTN_PARENT_IS_RADIOBOX - HWND hWndParent = GetHwnd(); -#else - HWND hWndParent = GetHwndOf(pParent); -#endif - HFONT hFont; + wxAssociateWinWithHandle(m_hWnd, this); // - // Some radio boxes test consecutive id. + // Now we can set m_nNoItems and let SetMajorDim set m_numCols/m_numRows // - (void)NewControlId(); + m_nNoItems = (unsigned int)nNum; + SetMajorDim(nMajorDim == 0 ? nNum : nMajorDim, lStyle); + m_ahRadioButtons = new WXHWND[nNum]; m_pnRadioWidth = new int[nNum]; m_pnRadioHeight = new int[nNum]; - if (rFont.Ok()) - { - hFont = rFont.GetResourceHandle(); - } - 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 && lStyle == 0) - lStyleBtn |= WS_GROUP; - - HWND hWndBtn = (WXHWND)::WinCreateWindow ( GetHwndOf(pParent) - ,WC_BUTTON - ,asChoices[i] - ,lStyleBtn - ,0, 0, 0, 0 - ,GetWinHwnd(pParent) - ,HWND_TOP - ,(HMENU)nNewId - ,NULL - ,NULL + if (i == 0) + 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 ); - if (!hWndBtn) - { - return FALSE; - } + + lColor = (LONG)m_backgroundColour.GetPixel(); + ::WinSetPresParam( hWndBtn + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); m_ahRadioButtons[i] = (WXHWND)hWndBtn; SubclassRadioButton((WXHWND)hWndBtn); + wxAssociateWinWithHandle(hWndBtn, this); wxOS2SetFont( hWndBtn - ,rFont + ,*wxSMALL_FONT ); ::WinSetWindowULong(hWndBtn, QWL_USER, (ULONG)this); m_aSubControls.Add(nNewId); } // - // Create a dummy radio control to end the group. + // Create a dummy control to end the group. // - (void)::WinCreateWindow ( GetHwndOf(pParent) - ,WC_BUTTON - ,"" - ,WS_GROUP | BS_AUTORADIOBUTTON - ,0, 0, 0, 0 - ,GetWinHwnd(pParent) - ,HWND_TOP - ,(HMENU)NewControlId() - ,NULL - ,NULL + (void)::WinCreateWindow ( hWndParent, + WC_BUTTON, + "", + WS_GROUP, + 0, 0, 0, 0, + hWndParent, + HWND_TOP, + (HMENU)NewControlId(), + NULL, + NULL ); - SetFont(*wxSMALL_FONT); + fnWndProcRadioBox = (WXFARPROC)::WinSubclassWindow( GetHwnd() + ,(PFNWP)wxRadioBoxWndProc + ); + ::WinSetWindowULong(GetHwnd(), QWL_USER, (ULONG)this); + lColor = (LONG)vColour.GetPixel(); ::WinSetPresParam( m_hWnd ,PP_FOREGROUNDCOLOR ,sizeof(LONG) ,(PVOID)&lColor ); + + lColor = (LONG)m_backgroundColour.GetPixel(); + ::WinSetPresParam( m_hWnd + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); + SetXComp(0); + SetYComp(0); SetSelection(0); SetSize( rPos.x ,rPos.y ,rSize.x ,rSize.y ); - return TRUE; + return true; } // end of wxRadioBox::Create wxSize wxRadioBox::DoGetBestSize() const { return (GetTotalButtonSize(GetMaxButtonSize())); -} // end of WinGuiBase_CRadioBox::DoGetBestSize +} // end of wxRadioBox::DoGetBestSize void wxRadioBox::DoSetSize( int nX @@ -401,19 +289,17 @@ void wxRadioBox::DoSetSize( , int nSizeFlags ) { + // + // Input parameters assume wxWidgets coordinate system + // int nCurrentX; int nCurrentY; int nWidthOld; int nHeightOld; int nXx = nX; int nYy = nY; -#if RADIOBTN_PARENT_IS_RADIOBOX - int nXOffset = 0; - int nYOffset = 0; -#else int nXOffset = nXx; int nYOffset = nYy; -#endif int nCx1; int nCy1; wxSize vMaxSize = GetMaxButtonSize(); @@ -424,6 +310,7 @@ void wxRadioBox::DoSetSize( int nTotHeight; int nStartX; int nStartY; + wxFont vFont = GetFont(); m_nSizeFlags = nSizeFlags; GetPosition( &nCurrentX @@ -433,16 +320,19 @@ void wxRadioBox::DoSetSize( ,&nHeightOld ); - if (nX == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + if (nX == wxDefaultCoord && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE)) nXx = nCurrentX; - if (nY == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + if (nY == wxDefaultCoord && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE)) nYy = nCurrentY; - + if (nYy < 0) + nYy = 0; + if (nXx < 0) + nXx = 0; wxGetCharSize( m_hWnd ,&nCx1 ,&nCy1 - ,&GetFont() + ,&vFont ); // @@ -476,22 +366,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 @@ -519,14 +406,14 @@ void wxRadioBox::DoSetSize( nStartX = nXOffset; nStartY = nYOffset; - for (int i = 0; i < m_nNoItems; i++) + for (unsigned 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; + bool bIsLastInTheRow; if (m_windowStyle & wxRA_SPECIFY_COLS) { @@ -536,24 +423,23 @@ void wxRadioBox::DoSetSize( // int n = i + 1; - bIsLastInTheRow = ((n % m_nMajorDim) == 0) || (n == m_nNoItems); + bIsLastInTheRow = ((n % GetMajorDim()) == 0) || (n == (int)m_nNoItems); } else // winRA_SPECIFY_ROWS { // // Item is the last in the row if it is in the last columns // - bIsLastInTheRow = i >= (m_nNoItems/m_nMajorDim) * m_nMajorDim; + bIsLastInTheRow = i >= (m_nNoItems/GetMajorDim()) * GetMajorDim(); } // // Is this the start of new row/column? // - if (i && (i % m_nMajorDim == 0)) + if (i && (i % GetMajorDim() == 0)) { if (m_windowStyle & wxRA_SPECIFY_ROWS) { - // // Start of new column // @@ -592,10 +478,10 @@ void wxRadioBox::DoSetSize( // 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 beinting to any radiobutton) + // radiobox part not belonging to any radiobutton) // ::WinSetWindowPos( (HWND)m_ahRadioButtons[i] - ,HWND_TOP + ,HWND_BOTTOM ,(LONG)nXOffset ,(LONG)nYOffset ,(LONG)nWidthBtn @@ -624,68 +510,45 @@ void wxRadioBox::DoSetSize( } } // end of wxRadioBox::DoSetSize -void wxRadioBox::Enable( - int nItem -, bool bEnable -) +bool wxRadioBox::Enable(unsigned int nItem, bool bEnable) { - wxCHECK_RET( nItem >= 0 && nItem < m_nNoItems, + wxCHECK_MSG( IsValid(nItem), false, wxT("invalid item in wxRadioBox::Enable()") ); ::WinEnableWindow((HWND) m_ahRadioButtons[nItem], bEnable); + return true; } // end of wxRadioBox::Enable -bool wxRadioBox::Enable( - bool bEnable -) +bool wxRadioBox::Enable(bool bEnable) { if ( !wxControl::Enable(bEnable) ) - return FALSE; - for (int i = 0; i < m_nNoItems; i++) + return false; + for (unsigned int i = 0; i < m_nNoItems; i++) ::WinEnableWindow((HWND)m_ahRadioButtons[i], bEnable); - return TRUE; + return true; } // end of wxRadioBox::Enable -int wxRadioBox::FindString( - const wxString& rsStr -) const -{ - for (int i = 0; i < m_nNoItems; i++) - { - if (rsStr == wxGetWindowText(m_ahRadioButtons[i]) ) - return i; - } - return wxNOT_FOUND; -} // end of wxRadioBox::FindString - -int wxRadioBox::GetColumnCount() const -{ - return GetNumHor(); -} // end of wxRadioBox::GetColumnCount - -int wxRadioBox::GetCount() const +unsigned int wxRadioBox::GetCount() const { return m_nNoItems; } // end of wxRadioBox::GetCount -wxString wxRadioBox::GetLabel( - int nItem -) const +wxString wxRadioBox::GetLabel(int nItem) const { - wxCHECK_MSG(nItem >= 0 && nItem < m_nNoItems, wxT(""), wxT("invalid radiobox index") ); + wxCHECK_MSG( IsValid(nItem), wxEmptyString, wxT("invalid radiobox index") ); return wxGetWindowText(m_ahRadioButtons[nItem]); } // end of wxRadioBox::GetLabel wxSize wxRadioBox::GetMaxButtonSize() const { - int nWidthMax = 0; - int nHeightMax = 0; + int nWidthMax = 0; + int nHeightMax = 0; - for (int i = 0 ; i < m_nNoItems; i++) + for (unsigned int i = 0 ; i < m_nNoItems; i++) { - int nWidth; - int nHeight; + int nWidth; + int nHeight; if (m_pnRadioWidth[i] < 0L) { @@ -712,103 +575,19 @@ wxSize wxRadioBox::GetMaxButtonSize() const if (nHeightMax < nHeight ) nHeightMax = nHeight; } - return(wxSize( nWidthMax - ,nHeightMax - ) - ); + wxSize maxsize( nWidthMax, nHeightMax); + return maxsize; } // end of wxRadioBox::GetMaxButtonSize -int wxRadioBox::GetNumHor() const -{ - if ( m_windowStyle & wxRA_SPECIFY_ROWS ) - { - return (m_nNoItems + m_nMajorDim - 1)/m_nMajorDim; - } - else - { - return m_nMajorDim; - } -} // end of wxRadioBox::GetNumHor - -int wxRadioBox::GetNumVer() const -{ - if ( m_windowStyle & wxRA_SPECIFY_ROWS ) - { - return m_nMajorDim; - } - else - { - return (m_nNoItems + m_nMajorDim - 1)/m_nMajorDim; - } -} // end of wxRadioBox::GetNumVer - -void wxRadioBox::GetPosition( - int* pnX -, int* 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; - } - *pnX = vPoint.x; - *pnX = vPoint.y; -} // end of wxRadioBox::GetPosition - -int wxRadioBox::GetRowCount() const -{ - return GetNumVer(); -} // end of wxRadioBox::GetRowCount - // Get single selection, for single choice list items int wxRadioBox::GetSelection() const { return m_nSelectedButton; } // end of wxRadioBox::GetSelection -void wxRadioBox::GetSize( - int* pnWidth -, int* pnHeight -) const +void wxRadioBox::GetSize( int* pnWidth, int* pnHeight ) const { - RECT vRect; - int i; + RECT vRect; vRect.xLeft = -1; vRect.xRight = -1; @@ -816,118 +595,102 @@ void wxRadioBox::GetSize( vRect.yBottom = -1; if (m_hWnd) - wxFindMaxSize( m_hWnd - ,&vRect - ); + wxFindMaxSize( m_hWnd, &vRect ); - for (i = 0; i < m_nNoItems; i++) - wxFindMaxSize( m_ahRadioButtons[i] - ,&vRect - ); + for (unsigned int i = 0; i < m_nNoItems; i++) + wxFindMaxSize( m_ahRadioButtons[i], &vRect ); - *pnWidth = vRect.xRight - vRect.xLeft; - *pnHeight = vRect.yBottom - vRect.yTop; + if (pnWidth) + *pnWidth = vRect.xRight - vRect.xLeft; + if (pnHeight) + *pnHeight = vRect.yTop - vRect.yBottom; } // end of wxRadioBox::GetSize // Find string for position -wxString wxRadioBox::GetString( - int nNum -) const +wxString wxRadioBox::GetString(unsigned int nNum) const { + wxCHECK_MSG( IsValid(nNum), wxEmptyString, wxT("invalid radiobox index") ); return wxGetWindowText(m_ahRadioButtons[nNum]); } // end of wxRadioBox::GetString // For single selection items only wxString wxRadioBox::GetStringSelection() const { - wxString sResult; - int nSel = GetSelection(); + wxString sResult; + int nSel = GetSelection(); - if (nSel > -1) + if (nSel != wxNOT_FOUND) sResult = GetString(nSel); + return sResult; } // end of wxRadioBox::GetStringSelection -wxSize wxRadioBox::GetTotalButtonSize( - const wxSize& rSizeBtn -) const +wxSize wxRadioBox::GetTotalButtonSize( const wxSize& rSizeBtn ) const { - int nCx1; - int nCy1; - int nExtraHeight; - int nHeight; - int nWidth; - int nWidthLabel; + int nCx1; + int nCy1; + int nHeight; + int nWidth; + int nWidthLabel = 0; - wxGetCharSize( m_hWnd - ,&nCx1 - ,&nCy1 - ,(wxFont*)&GetFont() - ); - nExtraHeight = nCy1; - - nHeight = GetNumVer() * rSizeBtn.y + (2 * nCy1); - nWidth = GetNumHor() * (rSizeBtn.x + nCx1) + nCx1; + nCx1 = GetCharWidth(); + nCy1 = GetCharHeight(); + nHeight = GetRowCount() * rSizeBtn.y + (2 * nCy1); + nWidth = GetColumnCount() * (rSizeBtn.x + nCx1) + nCx1; // // And also wide enough for its label // - GetTextExtent( GetTitle() - ,&nWidthLabel - ,NULL - ); - nWidthLabel += RADIO_SIZE; + wxString sStr = wxGetWindowText(GetHwnd()); + if (!sStr.empty()) + { + GetTextExtent( sStr + ,&nWidthLabel + ,NULL + ); + nWidthLabel += 2*nCx1; + } if (nWidthLabel > nWidth) nWidth = nWidthLabel; - return(wxSize( nWidth - ,nHeight - ) - ); + wxSize total( nWidth, nHeight ); + return total; } // end of wxRadioBox::GetTotalButtonSize -WXHBRUSH wxRadioBox::OnCtlColor( - WXHDC hwinDC -, WXHWND hWnd -, WXUINT uCtlColor -, WXUINT uMessage -, WXWPARAM wParam -, WXLPARAM lParam -) +WXHBRUSH wxRadioBox::OnCtlColor( WXHDC hwinDC, + WXHWND WXUNUSED(hWnd), + WXUINT WXUNUSED(uCtlColor), + WXUINT WXUNUSED(uMessage), + WXWPARAM WXUNUSED(wParam), + WXLPARAM WXUNUSED(lParam) ) { - HPS hPS = (HPS)hwinDC; // pass in a PS handle in OS/2 + HPS hPS = (HPS)hwinDC; // pass in a PS handle in OS/2 if (GetParent()->GetTransparentBackground()) ::GpiSetBackMix(hPS, BM_LEAVEALONE); else ::GpiSetBackMix(hPS, BM_OVERPAINT); - wxColour vColBack = GetBackgroundColour(); + wxColour vColBack = GetBackgroundColour(); ::GpiSetBackColor(hPS, vColBack.GetPixel()); ::GpiSetColor(hPS, vColBack.GetPixel()); - - wxBrush* pBrush = wxTheBrushList->FindOrCreateBrush( vColBack - ,wxSOLID - ); + wxBrush* pBrush = wxTheBrushList->FindOrCreateBrush( vColBack, wxSOLID ); return ((WXHBRUSH)pBrush->GetResourceHandle()); } // end of wxRadioBox::OnCtlColor -bool wxRadioBox::OS2Command( - WXUINT uCmd -, WXWORD wId -) +bool wxRadioBox::OS2Command( WXUINT uCmd, + WXWORD wId) { - int nSelectedButton = -1; + int nSelectedButton = -1; if (uCmd == BN_CLICKED) { if (wId == GetId()) - return TRUE; + return true; - - for (int i = 0; i < m_nNoItems; i++) + for (unsigned int i = 0; i < m_nNoItems; i++) { if (wId == wxGetWindowId(m_ahRadioButtons[i])) { @@ -938,28 +701,27 @@ bool wxRadioBox::OS2Command( if (nSelectedButton == -1) { // - // Just ignore it - due to a hack with WM_NCHITTEST handling in our - // wnd proc, we can receive dummy click messages when we click near - // the radiobox edge (this is ugly but Julian wouldn't let me get - // rid of this...) - return FALSE; + // Just ignore it + // + return false; } if (nSelectedButton != m_nSelectedButton) { m_nSelectedButton = nSelectedButton; SendNotificationEvent(); } - return TRUE; + return true; } else - return FALSE; + return false; } // end of wxRadioBox::OS2Command void wxRadioBox::SendNotificationEvent() { - wxCommandEvent vEvent( wxEVT_COMMAND_RADIOBOX_SELECTED - ,m_windowId - ); + wxCommandEvent vEvent( + wxEVT_COMMAND_RADIOBOX_SELECTED, + m_windowId + ); vEvent.SetInt( m_nSelectedButton ); vEvent.SetString( GetString(m_nSelectedButton) ); @@ -978,41 +740,35 @@ void wxRadioBox::SetFocus() } } // end of wxRadioBox::SetFocus -bool wxRadioBox::SetFont( - const wxFont& rFont -) +bool wxRadioBox::SetFont(const wxFont& rFont) { if (!wxControl::SetFont(rFont)) { // // Nothing to do // - return FALSE; + return false; } // // Also set the font of our radio buttons // - WXHFONT hFont = wxFont(rFont).GetResourceHandle(); - - for (int n = 0; n < (int)m_nNoItems; n++) + for (unsigned int n = 0; n < m_nNoItems; n++) { - HWND hWndBtn = (HWND)m_ahRadioButtons[n]; + HWND hWndBtn = (HWND)m_ahRadioButtons[n]; - wxOS2SetFont( hWndBtn - ,rFont - ); + wxOS2SetFont( hWndBtn, rFont ); ::WinInvalidateRect(hWndBtn, NULL, FALSE); } - return TRUE; + return true; } // end of wxRadioBox::SetFont void wxRadioBox::SetSelection( int nNum ) { - wxCHECK_RET( (nNum >= 0) && (nNum < m_nNoItems), wxT("invalid radiobox index") ); + wxCHECK_RET( IsValid(nNum), wxT("invalid radiobox index") ); - if (m_nSelectedButton >= 0 && m_nSelectedButton < m_nNoItems) + if ( IsValid(m_nSelectedButton) ) ::WinSendMsg((HWND)m_ahRadioButtons[m_nSelectedButton], BM_SETCHECK, (MPARAM)0, (MPARAM)0); ::WinSendMsg((HWND)m_ahRadioButtons[nNum], BM_SETCHECK, (MPARAM)1, (MPARAM)0); @@ -1020,66 +776,54 @@ void wxRadioBox::SetSelection( m_nSelectedButton = nNum; } // end of wxRadioBox::SetSelection -void wxRadioBox::SetString( - int nItem -, const wxString& rsLabel -) +void wxRadioBox::SetString(unsigned int nItem, const wxString& rsLabel) { - wxCHECK_RET( nItem >= 0 && nItem < m_nNoItems, wxT("invalid radiobox index") ); + wxCHECK_RET( IsValid(nItem), wxT("invalid radiobox index") ); m_pnRadioWidth[nItem] = m_pnRadioHeight[nItem] = -1; ::WinSetWindowText((HWND)m_ahRadioButtons[nItem], rsLabel.c_str()); } // end of wxRadioBox::SetString -bool wxRadioBox::SetStringSelection( - const wxString& rsStr -) +bool wxRadioBox::SetStringSelection(const wxString& rsStr) { - int nSel = FindString(rsStr); + int nSel = FindString(rsStr); if (nSel > -1) { SetSelection(nSel); - return TRUE; + return true; } else - return FALSE; + return false; } // end of wxRadioBox::SetStringSelection -bool wxRadioBox::Show( - bool bShow -) +bool wxRadioBox::Show(bool bShow) { - int nCmdShow = 0; - if (!wxControl::Show(bShow)) - return FALSE; + return false; - for (int i = 0; i < m_nNoItems; i++) + for (unsigned int i = 0; i < m_nNoItems; i++) { ::WinShowWindow((HWND)m_ahRadioButtons[i], (BOOL)bShow); } - return TRUE; + return true; } // end of wxRadioBox::Show // Show a specific button -void wxRadioBox::Show( - int nItem -, bool bShow -) +bool wxRadioBox::Show(unsigned int nItem, bool bShow) { - wxCHECK_RET( nItem >= 0 && nItem < m_nNoItems, + wxCHECK_MSG( IsValid(nItem), false, wxT("invalid item in wxRadioBox::Show()") ); ::WinShowWindow((HWND)m_ahRadioButtons[nItem], bShow); + + return true; } // end of wxRadioBox::Show void wxRadioBox::SubclassRadioButton( WXHWND hWndBtn ) { - HWND hwndBtn = (HWND)hWndBtn; - fnWndProcRadioBtn = (WXFARPROC)::WinSubclassWindow(hWndBtn, (PFNWP)wxRadioBtnWndProc); } // end of wxRadioBox::SubclassRadioButton @@ -1120,17 +864,17 @@ MRESULT wxRadioBtnWndProc( ,QWL_USER ); USHORT uVk = SHORT2FROMMP((MPARAM)lParam); - bool bProcessed = TRUE; + bool bProcessed = true; wxDirection eDir; switch(uVk) { case VK_LEFT: - eDir = wxDOWN; + eDir = wxLEFT; break; case VK_RIGHT: - eDir = wxDOWN; + eDir = wxRIGHT; break; case VK_DOWN: @@ -1142,7 +886,7 @@ MRESULT wxRadioBtnWndProc( break; default: - bProcessed = FALSE; + bProcessed = false; // // Just to suppress the compiler warning @@ -1182,3 +926,16 @@ MRESULT wxRadioBtnWndProc( ); } // end of wxRadioBtnWndProc +MRESULT EXPENTRY wxRadioBoxWndProc( HWND hWnd, + UINT uMessage, + MPARAM wParam, + MPARAM lParam ) +{ + return (fnWndProcRadioBox( hWnd, + (ULONG)uMessage, + (MPARAM)wParam, + (MPARAM)lParam ) + ); +} // end of wxRadioBoxWndProc + +#endif // wxUSE_RADIOBOX