wxSize wxRadioBox::DoGetBestSize() const { if ( !m_radioButtons ) { // if we're not fully initialized yet, we can't meaningfully compute // our best size, we'll do it later return wxSize(1, 1); } return GetTotalButtonSize(GetMaxButtonSize()); }
void wxRadioBox::DoMoveWindow(int x0, int y0, int width, int height) { wxStaticBox::DoMoveWindow(x0, y0, width, height); wxSize sizeBtn = GetMaxButtonSize(); wxPoint ptOrigin = GetBoxAreaOrigin(); wxPoint clientOrigin = GetParent() ? GetParent()->GetClientAreaOrigin() : wxPoint(0,0); x0 += ptOrigin.x + BOX_BORDER_X - clientOrigin.x; y0 += ptOrigin.y + BOX_BORDER_Y - clientOrigin.y; int x = x0, y = y0; int count = GetCount(); for ( int n = 0; n < count; n++ ) { m_buttons[n]->SetSize(x, y, sizeBtn.x, sizeBtn.y); if ( GetWindowStyle() & wxRA_TOPTOBOTTOM ) { // from top to bottom if ( (n + 1) % m_numRows ) { // continue in this column y += sizeBtn.y; } else { // start a new column x += sizeBtn.x; y = y0; } } else // wxRA_LEFTTORIGHT: mirror the code above { // from left to right if ( (n + 1) % m_numCols ) { // continue in this row x += sizeBtn.x; } else { // start a new row y += sizeBtn.y; x = x0; } } } }
wxSize wxRadioBox::DoGetBestClientSize() const { wxSize sizeBtn = GetMaxButtonSize(); sizeBtn.x *= m_numCols; sizeBtn.y *= m_numRows; // add a border around all buttons sizeBtn.x += 2*BOX_BORDER_X; sizeBtn.y += 2*BOX_BORDER_Y; // account for the area taken by static box wxRect rect = GetBorderGeometry(); sizeBtn.x += rect.x + rect.width; sizeBtn.y += rect.y + rect.height; return sizeBtn; }
void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) { if ( (width == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_WIDTH)) || (height == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_HEIGHT)) ) { // Attempt to have a look coherent with other platforms: We compute the // biggest toggle dim, then we align all items according this value. const wxSize totSize = GetTotalButtonSize(GetMaxButtonSize()); // only change our width/height if asked for if ( width == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_WIDTH) ) width = totSize.x; if ( height == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_HEIGHT) ) height = totSize.y; } wxStaticBox::DoSetSize(x, y, width, height); }
void wxRadioBox::PositionAllButtons(int x, int y, int width, int WXUNUSED(height)) { wxSize maxSize = GetMaxButtonSize(); int maxWidth = maxSize.x, maxHeight = maxSize.y; // Now position all the buttons: the current button will be put at // wxPoint(x_offset, y_offset) and the new row/column will start at // startX/startY. The size of all buttons will be the same wxSize(maxWidth, // maxHeight) except for the buttons in the last column which should extend // to the right border of radiobox and thus can be wider than this. // Also, remember that wxRA_SPECIFY_COLS means that we arrange buttons in // left to right order and GetMajorDim() is the number of columns while // wxRA_SPECIFY_ROWS means that the buttons are arranged top to bottom and // GetMajorDim() is the number of rows. int cx1, cy1; wxGetCharSize(m_hWnd, &cx1, &cy1, GetFont()); int x_offset = x + cx1; int y_offset = y + cy1; // Add extra space under the label, if it exists. if (!wxControl::GetLabel().empty()) y_offset += cy1/2; int startX = x_offset; int startY = y_offset; const unsigned int count = GetCount(); for (unsigned int i = 0; i < count; 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 isLastInTheRow; 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 unsigned int n = i + 1; isLastInTheRow = ((n % GetMajorDim()) == 0) || (n == count); } else // wxRA_SPECIFY_ROWS { // item is the last in the row if it is in the last columns isLastInTheRow = i >= (count/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 y_offset = startY; x_offset += maxWidth + cx1; } else // start of new row { x_offset = startX; y_offset += maxHeight; if (m_radioWidth[0]>0) y_offset += cy1/2; } } int widthBtn; if ( isLastInTheRow ) { // make the button go to the end of radio box widthBtn = startX + width - x_offset - 2*cx1; if ( widthBtn < maxWidth ) widthBtn = maxWidth; } else { // normal button, always of the same size widthBtn = maxWidth; } // 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) DoMoveSibling((*m_radioButtons)[i], x_offset, y_offset, widthBtn, maxHeight); // where do we put the next button? if ( m_windowStyle & wxRA_SPECIFY_ROWS ) { // below this one y_offset += maxHeight; if (m_radioWidth[0]>0) y_offset += cy1/2; } else { // to the right of this one x_offset += widthBtn + cx1; } } }
// Restored old code. void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) { int currentX, currentY; GetPosition(¤tX, ¤tY); int widthOld, heightOld; GetSize(&widthOld, &heightOld); int xx = x; int yy = y; if (x == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) xx = currentX; if (y == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) yy = currentY; int y_offset = 0; int x_offset = 0; int cx1, cy1; wxGetCharSize(m_hWnd, &cx1, &cy1, GetFont()); // Attempt to have a look coherent with other platforms: We compute the // biggest toggle dim, then we align all items according this value. wxSize maxSize = GetMaxButtonSize(); int maxWidth = maxSize.x, maxHeight = maxSize.y; wxSize totSize = GetTotalButtonSize(maxSize); int totWidth = totSize.x, totHeight = totSize.y; // only change our width/height if asked for if ( width == wxDefaultCoord ) { if ( sizeFlags & wxSIZE_AUTO_WIDTH ) width = totWidth; else width = widthOld; } if ( height == wxDefaultCoord ) { if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) height = totHeight; else height = heightOld; } DoMoveWindow(xx, yy, width, height); // Now position all the buttons: the current button will be put at // wxPoint(x_offset, y_offset) and the new row/column will start at // startX/startY. The size of all buttons will be the same wxSize(maxWidth, // maxHeight) except for the buttons in the last column which should extend // to the right border of radiobox and thus can be wider than this. // Also, remember that wxRA_SPECIFY_COLS means that we arrange buttons in // left to right order and m_majorDim is the number of columns while // wxRA_SPECIFY_ROWS means that the buttons are arranged top to bottom and // m_majorDim is the number of rows. x_offset += cx1; y_offset += cy1; // Add extra space under the label, if it exists. if (!wxControl::GetLabel().empty()) y_offset += cy1/2; int startX = x_offset; int startY = y_offset; const int count = GetCount(); for ( int i = 0; i < count; 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 isLastInTheRow; 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; isLastInTheRow = ((n % m_majorDim) == 0) || (n == count); } else // wxRA_SPECIFY_ROWS { // item is the last in the row if it is in the last columns isLastInTheRow = i >= (count/m_majorDim)*m_majorDim; } // is this the start of new row/column? if ( i && (i % m_majorDim == 0) ) { if ( m_windowStyle & wxRA_SPECIFY_ROWS ) { // start of new column y_offset = startY; x_offset += maxWidth + cx1; } else // start of new row { x_offset = startX; y_offset += maxHeight; if (m_radioWidth[0]>0) y_offset += cy1/2; } } int widthBtn; if ( isLastInTheRow ) { // make the button go to the end of radio box widthBtn = startX + width - x_offset - 2*cx1; if ( widthBtn < maxWidth ) widthBtn = maxWidth; } else { // normal button, always of the same size widthBtn = maxWidth; } // 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) ::MoveWindow((*m_radioButtons)[i], x_offset, y_offset, widthBtn, maxHeight, TRUE); // where do we put the next button? if ( m_windowStyle & wxRA_SPECIFY_ROWS ) { // below this one y_offset += maxHeight; if (m_radioWidth[0]>0) y_offset += cy1/2; } else { // to the right of this one x_offset += widthBtn + cx1; } } }
wxSize wxRadioBox::DoGetBestSize() const { wxSize best = GetTotalButtonSize(GetMaxButtonSize()); CacheBestSize(best); return best; }
void wxRadioBox::DoSetSize( int nX , int nY , int nWidth , int nHeight , int nSizeFlags ) { // // Input parameters assume wxWidgets coordinate system // int nCurrentX; int nCurrentY; int nWidthOld; int nHeightOld; int nXx = nX; int nYy = nY; int nXOffset = nXx; int nYOffset = nYy; int nCx1; int nCy1; wxSize vMaxSize = GetMaxButtonSize(); int nMaxWidth; int nMaxHeight; wxSize vTotSize; int nTotWidth; int nTotHeight; int nStartX; int nStartY; wxFont vFont = GetFont(); m_nSizeFlags = nSizeFlags; GetPosition( &nCurrentX ,&nCurrentY ); GetSize( &nWidthOld ,&nHeightOld ); if (nX == wxDefaultCoord && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE)) nXx = nCurrentX; 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 ,&vFont ); // // Attempt to have a look coherent with other platforms: We compute the // biggest toggle dim, then we align all items according this value. // vMaxSize = GetMaxButtonSize(); nMaxWidth = vMaxSize.x; nMaxHeight = vMaxSize.y; vTotSize = GetTotalButtonSize(vMaxSize); nTotWidth = vTotSize.x; nTotHeight = vTotSize.y; // // Only change our width/height if asked for // if (nWidth == -1) { if (nSizeFlags & wxSIZE_AUTO_WIDTH ) nWidth = nTotWidth; else nWidth = nWidthOld; } if (nHeight == -1) { if (nSizeFlags & wxSIZE_AUTO_HEIGHT) nHeight = nTotHeight; else nHeight = nHeightOld; } // // Now convert to OS/2 coordinate system // wxWindowOS2* pParent = (wxWindowOS2*)GetParent(); if (pParent) nYy = GetOS2ParentHeight(pParent) - nYy - nHeight; else { RECTL vRect; ::WinQueryWindowRect(HWND_DESKTOP, &vRect); nYy = vRect.yTop - nYy - nHeight; } nYOffset = nYy + nHeight; ::WinSetWindowPos( GetHwnd() ,HWND_TOP ,(LONG)nXx ,(LONG)nYy ,(LONG)nWidth ,(LONG)nHeight ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW ); // // Now position all the buttons: the current button will be put at // wxPoint(x_offset, y_offset) and the new row/column will start at // startX/startY. The size of all buttons will be the same wxSize(maxWidth, // maxHeight) except for the buttons in the last column which should extend // to the right border of radiobox and thus can be wider than this. // // Also, remember that wxRA_SPECIFY_COLS means that we arrange buttons in // left to right order and m_majorDim is the number of columns while // wxRA_SPECIFY_ROWS means that the buttons are arranged top to bottom and // m_majorDim is the number of rows. // nXOffset += nCx1; nYOffset -= (nMaxHeight + ((3*nCy1)/2)); nStartX = nXOffset; nStartY = nYOffset; 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; 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 == (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/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::DoSetSize
wxSize wxRadioBox::DoGetBestSize() const { return (GetTotalButtonSize(GetMaxButtonSize())); } // end of wxRadioBox::DoGetBestSize