// set the size of the window: if the dimensions are positive, just use them, // but if any of them is equal to -1, it means that we must find the value for // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in // which case -1 is a valid value for x and y) // // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate // the width/height to best suit our contents, otherwise we reuse the current // width/height void wxWindowPalm::DoSetSize(int x, int y, int width, int height, int sizeFlags) { // get the current size and position... int currentX, currentY; GetPosition(¤tX, ¤tY); int currentW,currentH; GetSize(¤tW, ¤tH); // ... and don't do anything (avoiding flicker) if it's already ok if ( x == currentX && y == currentY && width == currentW && height == currentH ) { return; } if ( x == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) x = currentX; if ( y == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) y = currentY; AdjustForParentClientOrigin(x, y, sizeFlags); wxSize size = wxDefaultSize; if ( width == wxDefaultCoord ) { if ( sizeFlags & wxSIZE_AUTO_WIDTH ) { size = DoGetBestSize(); width = size.x; } else { // just take the current one width = currentW; } } if ( height == wxDefaultCoord ) { if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) { if ( size.x == wxDefaultCoord ) { size = DoGetBestSize(); } //else: already called DoGetBestSize() above height = size.y; } else { // just take the current one height = currentH; } } DoMoveWindow(x, y, width, height); }
bool wxControl::QtCreateControl( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxValidator &validator, const wxString &name ) { // The Qt widget has been created without a position/size so move/resize it: wxSize bestSize = GetBestSize(); int width = ( size.GetWidth() == wxDefaultCoord ) ? bestSize.GetWidth() : size.GetWidth(); int height = ( size.GetHeight() == wxDefaultCoord ) ? bestSize.GetHeight() : size.GetHeight(); DoMoveWindow( pos.x, pos.y, width, height ); // Let Qt handle the background: SetBackgroundStyle(wxBG_STYLE_SYSTEM); PostCreation(false); return CreateControl( parent, id, pos, size, style, validator, name ); }
void wxWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags) { // wxLogDebug("DoSetSize: %s (%ld) %d, %d %dx%d", GetClassInfo()->GetClassName(), GetId(), x, y, width, height); Window xwindow = (Window) m_mainWindow; wxCHECK_RET( xwindow, wxT("invalid window") ); XWindowAttributes attr; Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr ); wxCHECK_RET( status, wxT("invalid window attributes") ); int new_x = attr.x; int new_y = attr.y; int new_w = attr.width; int new_h = attr.height; if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) { int yy = 0; AdjustForParentClientOrigin( x, yy, sizeFlags); new_x = x; } if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) { int xx = 0; AdjustForParentClientOrigin( xx, y, sizeFlags); new_y = y; } if (width != -1) { new_w = width; if (new_w <= 0) new_w = 20; } if (height != -1) { new_h = height; if (new_h <= 0) new_h = 20; } DoMoveWindow( new_x, new_y, new_w, new_h ); }
bool wxWindowQt::Create( wxWindowQt * parent, wxWindowID id, const wxPoint & pos, const wxSize & size, long style, const wxString &name ) { // If the underlying control hasn't been created then this most probably means // that a generic control, like wxPanel, is being created, so we need a very // simple control as a base: if ( GetHandle() == NULL ) { if ( style & (wxHSCROLL | wxVSCROLL) ) { m_qtContainer = new wxQtScrollArea( parent, this ); m_qtWindow = m_qtContainer; // Create the scroll bars if needed: if ( style & wxHSCROLL ) QtSetScrollBar( wxHORIZONTAL ); if ( style & wxVSCROLL ) QtSetScrollBar( wxVERTICAL ); } else { m_qtWindow = new wxQtWidget( parent, this ); } GetHandle()->setMouseTracking(true); } if ( !wxWindowBase::CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) return false; parent->AddChild( this ); wxPoint p; if(pos != wxDefaultPosition) p = pos; DoMoveWindow( p.x, p.y, size.GetWidth(), size.GetHeight() ); PostCreation(); return ( true ); }
void wxWindowBeOS::DoSetSize(int x, int y, int width, int height, int sizeFlags) { wxLogDebug("DoSetSize: %s (%ld) %d, %d %dx%d", GetClassInfo()->GetClassName(), GetId(), x, y, width, height); BRect bounds; if(m_view) bounds = m_view->bounds(); else bounds = BRect(0, 0, 0, 0); int new_x = (int)bounds.left; int new_y = (int)bounds.top; int new_w = bounds.IntegerWidth(); int new_h = bounds.IntegerHeight(); if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) { int yy = 0; AdjustForParentClientOrigin( x, yy, sizeFlags); new_x = x; } if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) { int xx = 0; AdjustForParentClientOrigin( xx, y, sizeFlags); new_y = y; } if (width != -1) { new_w = width; if (new_w <= 0) new_w = 20; } if (height != -1) { new_h = height; if (new_h <= 0) new_h = 20; } DoMoveWindow( new_x, new_y, new_w, new_h ); }
bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, int n, const wxString *choices, int majorDim, long style, const wxValidator& wxVALIDATOR_PARAM(val), const wxString& name) { if ( !(style & (wxRA_SPECIFY_ROWS | wxRA_SPECIFY_COLS)) ) style |= wxRA_SPECIFY_COLS; if ( !wxStaticBox::Create(parent, id, title, pos, size, style, name) ) return false; #if wxUSE_VALIDATORS SetValidator(val); #endif // wxUSE_VALIDATORS Append(n, choices); // majorDim default value is 0 which means make one row/column SetMajorDim(majorDim == 0 ? n : majorDim, style); if ( size == wxDefaultSize ) { SetClientSize(DoGetBestClientSize()); } // Need to move the radiobox in order to move the radio buttons wxPoint actualPos = GetPosition(); wxSize actualSize = GetSize(); DoMoveWindow(actualPos.x, actualPos.y, actualSize.x, actualSize.y); // radiobox should already have selection so select at least one item SetSelection(0); return true; }
void wxWindowQt::DoSetSize(int x, int y, int width, int height, int sizeFlags ) { int currentX, currentY; GetPosition( ¤tX, ¤tY ); if ( x == wxDefaultCoord && !( sizeFlags & wxSIZE_ALLOW_MINUS_ONE )) x = currentX; if ( y == wxDefaultCoord && !( sizeFlags & wxSIZE_ALLOW_MINUS_ONE )) y = currentY; // Should we use the best size: if (( width == wxDefaultCoord && ( sizeFlags & wxSIZE_AUTO_WIDTH )) || ( height == wxDefaultCoord && ( sizeFlags & wxSIZE_AUTO_HEIGHT ))) { const wxSize BEST_SIZE = GetBestSize(); if ( width == wxDefaultCoord && ( sizeFlags & wxSIZE_AUTO_WIDTH )) width = BEST_SIZE.x; if ( height == wxDefaultCoord && ( sizeFlags & wxSIZE_AUTO_HEIGHT )) height = BEST_SIZE.y; } DoMoveWindow( x, y, width, height ); }
void wxWindowQt::DoSetSize(int x, int y, int width, int height, int sizeFlags ) { int currentX, currentY; GetPosition( ¤tX, ¤tY ); if ( x == wxDefaultCoord && !( sizeFlags & wxSIZE_ALLOW_MINUS_ONE )) x = currentX; if ( y == wxDefaultCoord && !( sizeFlags & wxSIZE_ALLOW_MINUS_ONE )) y = currentY; // Should we use the best size: if (( width == wxDefaultCoord && ( sizeFlags & wxSIZE_AUTO_WIDTH )) || ( height == wxDefaultCoord && ( sizeFlags & wxSIZE_AUTO_HEIGHT ))) { const wxSize BEST_SIZE = GetBestSize(); if ( width == wxDefaultCoord && ( sizeFlags & wxSIZE_AUTO_WIDTH )) width = BEST_SIZE.x; if ( height == wxDefaultCoord && ( sizeFlags & wxSIZE_AUTO_HEIGHT )) height = BEST_SIZE.y; } int w, h; GetSize(&w, &h); if (width == -1) width = w; if (height == -1) height = h; DoMoveWindow( x, y, width, height ); // An annoying feature of Qt // if a control is created with size of zero, it is set as hidden by qt // if it is then resized, in some cases it remains hidden, so it // needs to be shown here if (m_qtWindow && !m_qtWindow->isVisible() && IsShown()) m_qtWindow->show(); }
// set the size of the window: if the dimensions are positive, just use them, // but if any of them is equal to -1, it means that we must find the value for // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in // which case -1 is a valid value for x and y) // // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate // the width/height to best suit our contents, otherwise we reuse the current // width/height void wxWindowDFB::DoSetSize(int x, int y, int width, int height, int sizeFlags) { // get the current size and position... int currentX, currentY; GetPosition(¤tX, ¤tY); int currentW,currentH; GetSize(¤tW, ¤tH); if ( x == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) x = currentX; if ( y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) y = currentY; // ... and don't do anything (avoiding flicker) if it's already ok if ( x == currentX && y == currentY && width == currentW && height == currentH ) { return; } wxSize size(-1, -1); if ( width == -1 ) { if ( sizeFlags & wxSIZE_AUTO_WIDTH ) { size = DoGetBestSize(); width = size.x; } else { // just take the current one width = currentW; } } if ( height == -1 ) { if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) { if ( size.x == -1 ) { size = DoGetBestSize(); } //else: already called DoGetBestSize() above height = size.y; } else { // just take the current one height = currentH; } } int maxWidth = GetMaxWidth(), minWidth = GetMinWidth(), maxHeight = GetMaxHeight(), minHeight = GetMinHeight(); if ( minWidth != -1 && width < minWidth ) width = minWidth; if ( maxWidth != -1 && width > maxWidth ) width = maxWidth; if ( minHeight != -1 && height < minHeight ) height = minHeight; if ( maxHeight != -1 && height > maxHeight ) height = maxHeight; if ( m_rect.x != x || m_rect.y != y || m_rect.width != width || m_rect.height != height ) { AdjustForParentClientOrigin(x, y, sizeFlags); DoMoveWindow(x, y, width, height); wxSize newSize(width, height); wxSizeEvent event(newSize, GetId()); event.SetEventObject(this); HandleWindowEvent(event); } }
// 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; } } }
bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, int n, const wxString *choices, int majorDim, long style, const wxValidator& wxVALIDATOR_PARAM(val), const wxString& name) { // for compatibility with the other ports which don't handle (yet?) // wxRA_LEFTTORIGHT and wxRA_TOPTOBOTTOM flags, we add them ourselves if // not specified if ( !(style & (wxRA_LEFTTORIGHT | wxRA_TOPTOBOTTOM)) ) { // horizontal radiobox use left to right layout if ( style & wxRA_HORIZONTAL ) { style |= wxRA_LEFTTORIGHT; } else if ( style & wxRA_VERTICAL ) { style |= wxRA_TOPTOBOTTOM; } else { wxFAIL_MSG( _T("you must specify wxRA_XXX style!") ); // use default style = wxRA_HORIZONTAL | wxRA_LEFTTORIGHT; } } if ( !wxStaticBox::Create(parent, id, title, pos, size, style, name) ) return false; #if wxUSE_VALIDATORS SetValidator(val); #endif // wxUSE_VALIDATORS Append(n, choices); // majorDim default value is 0 which means make one row/column SetMajorDim(majorDim == 0 ? n : majorDim); if ( size == wxDefaultSize ) { SetClientSize(DoGetBestClientSize()); } // Need to move the radiobox in order to move the radio buttons wxPoint actualPos = GetPosition(); wxSize actualSize = GetSize(); DoMoveWindow(actualPos.x, actualPos.y, actualSize.x, actualSize.y); // radiobox should already have selection so select at least one item SetSelection(0); return true; }