column autosizing added

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6213 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-02-22 16:03:54 +00:00
parent 33d0e17c11
commit 65e4e78efb
3 changed files with 223 additions and 51 deletions

View File

@@ -961,6 +961,25 @@ void wxGridCellStringRenderer::SetTextColoursAndFont(wxGrid& grid,
dc.SetFont( attr.GetFont() );
}
wxSize wxGridCellStringRenderer::DoGetBestSize(wxGridCellAttr& attr,
wxDC& dc,
const wxString& text)
{
wxCoord x, y;
dc.SetFont(attr.GetFont());
dc.GetTextExtent(text, &x, &y);
return wxSize(x, y);
}
wxSize wxGridCellStringRenderer::GetBestSize(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
int row, int col)
{
return DoGetBestSize(attr, dc, grid.GetCellValue(row, col));
}
void wxGridCellStringRenderer::Draw(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
@@ -983,6 +1002,23 @@ void wxGridCellStringRenderer::Draw(wxGrid& grid,
rect, hAlign, vAlign);
}
// ----------------------------------------------------------------------------
// wxGridCellNumberRenderer
// ----------------------------------------------------------------------------
wxString wxGridCellNumberRenderer::GetString(wxGrid& grid, int row, int col)
{
wxGridTableBase *table = grid.GetTable();
wxString text;
if ( table->CanGetValueAs(row, col, wxGRID_VALUE_NUMBER) )
{
text.Printf(_T("%ld"), table->GetValueAsLong(row, col));
}
//else: leave the string empty or put 0 into it?
return text;
}
void wxGridCellNumberRenderer::Draw(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
@@ -1002,15 +1038,15 @@ void wxGridCellNumberRenderer::Draw(wxGrid& grid,
wxRect rect = rectCell;
rect.Inflate(-1);
wxGridTableBase *table = grid.GetTable();
wxString text;
if ( table->CanGetValueAs(row, col, wxGRID_VALUE_NUMBER) )
{
text.Printf(_T("%ld"), table->GetValueAsLong(row, col));
}
//else: leave the string empty or put 0 into it?
grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign);
}
grid.DrawTextRectangle(dc, text, rect, hAlign, vAlign);
wxSize wxGridCellNumberRenderer::GetBestSize(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
int row, int col)
{
return DoGetBestSize(attr, dc, GetString(grid, row, col));
}
// ----------------------------------------------------------------------------
@@ -1023,6 +1059,24 @@ wxGridCellFloatRenderer::wxGridCellFloatRenderer(int width, int precision)
SetPrecision(precision);
}
wxString wxGridCellFloatRenderer::GetString(wxGrid& grid, int row, int col)
{
wxGridTableBase *table = grid.GetTable();
wxString text;
if ( table->CanGetValueAs(row, col, wxGRID_VALUE_FLOAT) )
{
if ( !m_format )
{
m_format.Printf(_T("%%%d.%d%%f"), m_width, m_precision);
}
text.Printf(m_format, table->GetValueAsDouble(row, col));
}
//else: leave the string empty or put 0 into it?
return text;
}
void wxGridCellFloatRenderer::Draw(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
@@ -1042,26 +1096,54 @@ void wxGridCellFloatRenderer::Draw(wxGrid& grid,
wxRect rect = rectCell;
rect.Inflate(-1);
wxGridTableBase *table = grid.GetTable();
wxString text;
if ( table->CanGetValueAs(row, col, wxGRID_VALUE_FLOAT) )
{
if ( !m_format )
{
m_format.Printf(_T("%%%d.%d%%f"), m_width, m_precision);
}
grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign);
}
text.Printf(m_format, table->GetValueAsDouble(row, col));
}
//else: leave the string empty or put 0 into it?
grid.DrawTextRectangle(dc, text, rect, hAlign, vAlign);
wxSize wxGridCellFloatRenderer::GetBestSize(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
int row, int col)
{
return DoGetBestSize(attr, dc, GetString(grid, row, col));
}
// ----------------------------------------------------------------------------
// wxGridCellBoolRenderer
// ----------------------------------------------------------------------------
wxSize wxGridCellBoolRenderer::ms_sizeCheckMark;
// between checkmark and box
static const wxCoord wxGRID_CHECKMARK_MARGIN = 4;
wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid,
wxGridCellAttr& WXUNUSED(attr),
wxDC& WXUNUSED(dc),
int WXUNUSED(row),
int WXUNUSED(col))
{
// compute it only once (no locks for MT safeness in GUI thread...)
if ( !ms_sizeCheckMark.x )
{
// get checkbox size
wxCoord checkSize = 0;
wxCheckBox *checkbox = new wxCheckBox(&grid, -1, wxEmptyString);
wxSize size = checkbox->GetBestSize();
checkSize = size.y + wxGRID_CHECKMARK_MARGIN;
// FIXME wxGTK::wxCheckBox::GetBestSize() gives "wrong" result
#ifdef __WXGTK__
checkSize -= size.y / 2;
#endif
delete checkbox;
ms_sizeCheckMark.x = ms_sizeCheckMark.y = checkSize;
}
return ms_sizeCheckMark;
}
void wxGridCellBoolRenderer::Draw(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
@@ -1071,37 +1153,19 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid,
{
wxGridCellRenderer::Draw(grid, attr, dc, rect, row, col, isSelected);
// between checkmark and box
static const wxCoord margin = 4;
// get checkbox size
static wxCoord s_checkSize = 0;
if ( s_checkSize == 0 )
{
// compute it only once (no locks for MT safeness in GUI thread...)
wxCheckBox *checkbox = new wxCheckBox(&grid, -1, wxEmptyString);
wxSize size = checkbox->GetBestSize();
s_checkSize = size.y + margin;
// FIXME wxGTK::wxCheckBox::GetBestSize() is really weird...
#ifdef __WXGTK__
s_checkSize -= size.y / 2;
#endif
delete checkbox;
}
// draw a check mark in the centre (ignoring alignment - TODO)
wxSize size = GetBestSize(grid, attr, dc, row, col);
wxRect rectMark;
rectMark.x = rect.x + rect.width/2 - s_checkSize/2;
rectMark.y = rect.y + rect.height/2 - s_checkSize/2;
rectMark.width = rectMark.height = s_checkSize;
rectMark.x = rect.x + rect.width/2 - size.x/2;
rectMark.y = rect.y + rect.height/2 - size.y/2;
rectMark.width = size.x;
rectMark.height = size.y;
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.SetPen(wxPen(attr.GetTextColour(), 1, wxSOLID));
dc.DrawRectangle(rectMark);
rectMark.Inflate(-margin);
rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN);
bool value;
if (grid.GetTable()->CanGetValueAs(row, col, wxT("bool")))
@@ -6599,6 +6663,62 @@ int wxGrid::GetColMinimalWidth(int col) const
return obj ? (int)obj : WXGRID_MIN_COL_WIDTH;
}
void wxGrid::AutoSizeColumn( int col, bool setAsMin )
{
wxClientDC dc(m_gridWin);
wxCoord width, widthMax = 0;
for ( int row = 0; row < m_numRows; row++ )
{
wxGridCellAttr* attr = GetCellAttr(row, col);
wxGridCellRenderer* renderer = attr->GetRenderer(GetDefaultRendererForCell(row,col));
if ( renderer )
{
width = renderer->GetBestSize(*this, *attr, dc, row, col).x;
if ( width > widthMax )
{
widthMax = width;
}
}
attr->DecRef();
}
// now also compare with the column label width
dc.SetFont( GetLabelFont() );
dc.GetTextExtent( GetColLabelValue(col), &width, NULL );
if ( width > widthMax )
{
widthMax = width;
}
if ( !widthMax )
{
// empty column - give default width (notice that if widthMax is less
// than default width but != 0, it's ok)
widthMax = m_defaultColWidth;
}
else
{
// leave some space around text
widthMax += 10;
}
SetColSize(col, widthMax);
if ( setAsMin )
{
SetColMinimalWidth(col, widthMax);
}
}
void wxGrid::AutoSizeColumns( bool setAsMin )
{
for ( int col = 0; col < m_numCols; col++ )
{
AutoSizeColumn(col, setAsMin);
}
}
//
// ------ cell value accessor functions
//