wxSize ctlSQLGrid::GetBestSize(int row, int col) { wxSize size; wxGridCellAttr *attr = GetCellAttr(row, col); wxGridCellRenderer *renderer = attr->GetRenderer(this, row, col); if ( renderer ) { wxClientDC dc(GetGridWindow()); size = renderer->GetBestSize(*this, *attr, dc, row, col); renderer->DecRef(); } attr->DecRef(); return size; }
void wxGridCellBoolEditor::SetSize(const wxRect& r) { bool resize = false; wxSize size = m_control->GetSize(); wxCoord minSize = wxMin(r.width, r.height); // check if the checkbox is not too big/small for this cell wxSize sizeBest = m_control->GetBestSize(); if ( !(size == sizeBest) ) { // reset to default size if it had been made smaller size = sizeBest; resize = true; } if ( size.x >= minSize || size.y >= minSize ) { // leave 1 pixel margin size.x = size.y = minSize - 2; resize = true; } if ( resize ) { m_control->SetSize(size); } // position it in the centre of the rectangle (TODO: support alignment?) #if defined(__WXGTK__) || defined (__WXMOTIF__) // the checkbox without label still has some space to the right in wxGTK, // so shift it to the right size.x -= 8; #elif defined(__WXMSW__) // here too, but in other way size.x += 1; size.y -= 2; #endif int hAlign = wxALIGN_CENTRE; int vAlign = wxALIGN_CENTRE; if (GetCellAttr()) GetCellAttr()->GetAlignment(& hAlign, & vAlign); int x = 0, y = 0; if (hAlign == wxALIGN_LEFT) { x = r.x + 2; #ifdef __WXMSW__ x += 2; #endif y = r.y + r.height / 2 - size.y / 2; } else if (hAlign == wxALIGN_RIGHT) { x = r.x + r.width - size.x - 2; y = r.y + r.height / 2 - size.y / 2; } else if (hAlign == wxALIGN_CENTRE) { x = r.x + r.width / 2 - size.x / 2; y = r.y + r.height / 2 - size.y / 2; } m_control->Move(x, y); }