wxGridWindow* gridWindow = wxDynamicCast(m_control->GetParent(), wxGridWindow);
if (gridWindow)
gridWindow->GetOwner()->PrepareDC(dc);
-
+
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
dc.DrawRectangle(rectCell);
#endif
);
- // TODO: use m_maxChars
+ // set max length allowed in the textctrl, if the parameter was set
+ if (m_maxChars != 0)
+ {
+ ((wxTextCtrl*)m_control)->SetMaxLength(m_maxChars);
+ }
wxGridCellEditor::Create(parent, id, evtHandler);
}
m_attrkind = wxGridCellAttr::Cell;
m_sizeRows = m_sizeCols = 1;
- m_overflow = TRUE;
+ m_overflow = UnsetOverflow;
SetDefAttr(attrDefault);
}
if ( !HasReadWriteMode() && mergefrom->HasReadWriteMode() )
SetReadOnly(mergefrom->IsReadOnly());
+ if (!HasOverflowMode() && mergefrom->HasOverflowMode() )
+ SetOverflow(mergefrom->GetOverflow());
+
SetDefAttr(mergefrom->m_defGridAttr);
}
wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent,
wxWindowID id,
const wxPoint &pos, const wxSize &size )
- : wxWindow( parent, id, pos, size, wxWANTS_CHARS )
+ : wxWindow( parent, id, pos, size, wxWANTS_CHARS|wxBORDER_NONE )
{
m_owner = parent;
}
wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent,
wxWindowID id,
const wxPoint &pos, const wxSize &size )
- : wxWindow( parent, id, pos, size, wxWANTS_CHARS )
+ : wxWindow( parent, id, pos, size, wxWANTS_CHARS|wxBORDER_NONE )
{
m_owner = parent;
}
wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent,
wxWindowID id,
const wxPoint &pos, const wxSize &size )
- : wxWindow( parent, id, pos, size, wxWANTS_CHARS )
+ : wxWindow( parent, id, pos, size, wxWANTS_CHARS|wxBORDER_NONE )
{
m_owner = parent;
}
wxWindowID id,
const wxPoint &pos,
const wxSize &size )
- : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxCLIP_CHILDREN,
+ : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxCLIP_CHILDREN,
wxT("grid window") )
{
bool clipToMinMax);
#define internalXToCol(x) CoordToRowOrCol(x, m_defaultColWidth, \
- WXGRID_MIN_COL_WIDTH, \
+ m_minAcceptableColWidth, \
m_colRights, m_numCols, TRUE)
#define internalYToRow(y) CoordToRowOrCol(y, m_defaultRowHeight, \
- WXGRID_MIN_ROW_HEIGHT, \
+ m_minAcceptableRowHeight, \
m_rowBottoms, m_numRows, TRUE)
/////////////////////////////////////////////////////////////////////
{
if ( m_created )
{
- // RD: Actually, this should probably be allowed. I think it would be
- // nice to be able to switch multiple Tables in and out of a single
- // View at runtime. Is there anything in the implementation that
- // would prevent this?
-
- // At least, you now have to cope with m_selection
- wxFAIL_MSG( wxT("wxGrid::CreateGrid or wxGrid::SetTable called more than once") );
- return FALSE;
+ if (m_ownTable)
+ delete m_table;
+ delete m_selection;
+
+ // stop all processing
+ m_table=0;
+ m_selection=0;
+ m_created = FALSE;
+ m_numRows=0;
+ m_numCols=0;
}
- else
+ if (table)
{
m_numRows = table->GetNumberRows();
m_numCols = table->GetNumberCols();
m_defaultColWidth = WXGRID_DEFAULT_COL_WIDTH;
m_defaultRowHeight = m_gridWin->GetCharHeight();
+ m_minAcceptableColWidth = WXGRID_MIN_COL_WIDTH;
+ m_minAcceptableRowHeight = WXGRID_MIN_ROW_HEIGHT;
+
#if defined(__WXMOTIF__) || defined(__WXGTK__) // see also text ctrl sizing in ShowCellEditControl()
m_defaultRowHeight += 8;
#else
else if ( event.RightDown() )
{
row = YToRow(y);
- if ( row >=0 &&
+ if ( row >=0 &&
!SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, row, -1, event ) )
{
// no default action at the moment
m_winCapture = NULL;
}
- if ( m_selectingTopLeft != wxGridNoCellCoords &&
+ if ( coords == m_currentCellCoords && m_waitForSlowClick && CanEnableCellControl())
+ {
+ ClearSelection();
+ EnableCellEditControl();
+
+ wxGridCellAttr* attr = GetCellAttr(coords);
+ wxGridCellEditor *editor = attr->GetEditor(this, coords.GetRow(), coords.GetCol());
+ editor->StartingClick();
+ editor->DecRef();
+ attr->DecRef();
+
+ m_waitForSlowClick = FALSE;
+ }
+ else if ( m_selectingTopLeft != wxGridNoCellCoords &&
m_selectingBottomRight != wxGridNoCellCoords )
{
if ( m_selection )
// drag-shrinking.
ShowCellEditControl();
}
- else
- {
- if( m_waitForSlowClick && CanEnableCellControl())
- {
- EnableCellEditControl();
-
- wxGridCellAttr* attr = GetCellAttr(coords);
- wxGridCellEditor *editor = attr->GetEditor(this, coords.GetRow(), coords.GetCol());
- editor->StartingClick();
- editor->DecRef();
- attr->DecRef();
-
- m_waitForSlowClick = FALSE;
- }
- }
}
else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW )
{
int rowTop = GetRowTop(m_dragRowOrCol);
SetRowSize( m_dragRowOrCol,
- wxMax( m_dragLastPos - rowTop, WXGRID_MIN_ROW_HEIGHT ) );
+ wxMax( m_dragLastPos - rowTop, m_minAcceptableRowHeight ) );
if ( !GetBatchCount() )
{
if (IsCellEditControlEnabled())
DisableCellEditControl();
- return m_table->InsertRows( pos, numRows );
+ bool done = m_table->InsertRows( pos, numRows );
+ m_numRows = m_table->GetNumberRows();
+ return done;
// the table will have sent the results of the insert row
// operation to this view object as a grid table message
return FALSE;
}
- return ( m_table && m_table->AppendRows( numRows ) );
- // the table will have sent the results of the append row
- // operation to this view object as a grid table message
+ if ( m_table )
+ {
+ bool done = m_table && m_table->AppendRows( numRows );
+ m_numRows = m_table->GetNumberRows();
+ return done;
+ // the table will have sent the results of the append row
+ // operation to this view object as a grid table message
+ }
+ return FALSE;
}
if (IsCellEditControlEnabled())
DisableCellEditControl();
- return (m_table->DeleteRows( pos, numRows ));
+ bool done = m_table->DeleteRows( pos, numRows );
+ m_numRows = m_table->GetNumberRows();
+ return done;
// the table will have sent the results of the delete row
// operation to this view object as a grid table message
}
if (IsCellEditControlEnabled())
DisableCellEditControl();
- return m_table->InsertCols( pos, numCols );
+ bool done = m_table->InsertCols( pos, numCols );
+ m_numCols = m_table->GetNumberCols();
+ return done;
// the table will have sent the results of the insert col
// operation to this view object as a grid table message
}
return FALSE;
}
- return ( m_table && m_table->AppendCols( numCols ) );
- // the table will have sent the results of the append col
- // operation to this view object as a grid table message
+ if ( m_table )
+ {
+ bool done = m_table->AppendCols( numCols );
+ m_numCols = m_table->GetNumberCols();
+ return done;
+ // the table will have sent the results of the append col
+ // operation to this view object as a grid table message
+ }
+ return FALSE;
}
if (IsCellEditControlEnabled())
DisableCellEditControl();
- return ( m_table->DeleteCols( pos, numCols ) );
+ bool done = m_table->DeleteCols( pos, numCols );
+ m_numCols = m_table->GetNumberCols();
+ return done;
// the table will have sent the results of the delete col
// operation to this view object as a grid table message
}
int textOrientation )
{
wxArrayString lines;
-
+
StringToLines( value, lines );
-
-
+
+
//Forward to new API.
DrawTextRectangle( dc,
lines,
horizAlign,
vertAlign,
textOrientation );
-
+
}
void wxGrid::DrawTextRectangle( wxDC& dc,
long textWidth, textHeight;
long lineWidth, lineHeight;
int nLines;
-
+
dc.SetClippingRegion( rect );
-
+
nLines = lines.GetCount();
if( nLines > 0 )
{
int l;
float x = 0.0, y = 0.0;
-
+
if( textOrientation == wxHORIZONTAL )
GetTextBoxSize(dc, lines, &textWidth, &textHeight);
else
GetTextBoxSize( dc, lines, &textHeight, &textWidth );
-
+
switch( vertAlign )
{
case wxALIGN_BOTTOM:
else
x = rect.x + rect.width - textWidth;
break;
-
+
case wxALIGN_CENTRE:
if( textOrientation == wxHORIZONTAL )
y = rect.y + ((rect.height - textHeight)/2);
else
x = rect.x + ((rect.width - textWidth)/2);
break;
-
+
case wxALIGN_TOP:
default:
if( textOrientation == wxHORIZONTAL )
x = rect.x + 1;
break;
}
-
+
// Align each line of a multi-line label
for( l = 0; l < nLines; l++ )
{
dc.GetTextExtent(lines[l], &lineWidth, &lineHeight);
-
+
switch( horizAlign )
{
case wxALIGN_RIGHT:
else
y = rect.y + lineWidth + 1;
break;
-
+
case wxALIGN_CENTRE:
if( textOrientation == wxHORIZONTAL )
x = rect.x + ((rect.width - lineWidth)/2);
else
y = rect.y + rect.height - ((rect.height - lineWidth)/2);
break;
-
+
case wxALIGN_LEFT:
default:
if( textOrientation == wxHORIZONTAL )
y = rect.y + rect.height - 1;
break;
}
-
+
if( textOrientation == wxHORIZONTAL )
{
dc.DrawText( lines[l], (int)x, (int)y );
if (coord < 0)
return clipToMinMax && (nMax > 0) ? 0 : -1;
-
+
if (!defaultDist)
defaultDist = 1;
int wxGrid::YToRow( int y )
{
return CoordToRowOrCol(y, m_defaultRowHeight,
- WXGRID_MIN_ROW_HEIGHT, m_rowBottoms, m_numRows, FALSE);
+ m_minAcceptableRowHeight, m_rowBottoms, m_numRows, FALSE);
}
int wxGrid::XToCol( int x )
{
return CoordToRowOrCol(x, m_defaultColWidth,
- WXGRID_MIN_COL_WIDTH, m_colRights, m_numCols, FALSE);
+ m_minAcceptableColWidth, m_colRights, m_numCols, FALSE);
}
int y = GetRowTop(row);
int newRow = internalYToRow( y - ch + 1 );
-
+
if ( newRow == row )
{
- //row > 0 , so newrow can never be less than 0 here.
+ //row > 0 , so newrow can never be less than 0 here.
newRow = row - 1;
}
if ( m_currentCellCoords == wxGridNoCellCoords ) return FALSE;
int row = m_currentCellCoords.GetRow();
- if ( row < m_numRows )
+ if ( (row+1) < m_numRows )
{
int cw, ch;
m_gridWin->GetClientSize( &cw, &ch );
int newRow = internalYToRow( y + ch );
if ( newRow == row )
{
- // row < m_numRows , so newrow can't overflow here.
+ // row < m_numRows , so newrow can't overflow here.
newRow = row + 1;
}
void wxGrid::SetDefaultRowSize( int height, bool resizeExistingRows )
{
- m_defaultRowHeight = wxMax( height, WXGRID_MIN_ROW_HEIGHT );
+ m_defaultRowHeight = wxMax( height, m_minAcceptableRowHeight );
if ( resizeExistingRows )
{
{
wxCHECK_RET( row >= 0 && row < m_numRows, _T("invalid row index") );
+ // See comment in SetColSize
+ if ( height < GetRowMinimalAcceptableHeight()) { return; }
+
if ( m_rowHeights.IsEmpty() )
{
// need to really create the array
void wxGrid::SetDefaultColSize( int width, bool resizeExistingCols )
{
- m_defaultColWidth = wxMax( width, WXGRID_MIN_COL_WIDTH );
+ m_defaultColWidth = wxMax( width, m_minAcceptableColWidth );
if ( resizeExistingCols )
{
wxCHECK_RET( col >= 0 && col < m_numCols, _T("invalid column index") );
// should we check that it's bigger than GetColMinimalWidth(col) here?
-
+ // (VZ)
+ // No, because it is reasonable to assume the library user know's
+ // what he is doing. However whe should test against the weaker
+ // constariant of minimalAcceptableWidth, as this breaks rendering
+ //
+ // This test then fixes sf.net bug #645734
+
+ if ( width < GetColMinimalAcceptableWidth()) { return; }
+
if ( m_colWidths.IsEmpty() )
{
// need to really create the array
void wxGrid::SetColMinimalWidth( int col, int width )
{
- m_colMinWidths.Put(col, width);
+ if (width > GetColMinimalAcceptableWidth()) {
+ m_colMinWidths.Put(col, width);
+ }
}
void wxGrid::SetRowMinimalHeight( int row, int width )
{
- m_rowMinHeights.Put(row, width);
+ if (width > GetRowMinimalAcceptableHeight()) {
+ m_rowMinHeights.Put(row, width);
+ }
}
int wxGrid::GetColMinimalWidth(int col) const
{
long value = m_colMinWidths.Get(col);
- return value != wxNOT_FOUND ? (int)value : WXGRID_MIN_COL_WIDTH;
+ return value != wxNOT_FOUND ? (int)value : m_minAcceptableColWidth;
}
int wxGrid::GetRowMinimalHeight(int row) const
{
long value = m_rowMinHeights.Get(row);
- return value != wxNOT_FOUND ? (int)value : WXGRID_MIN_ROW_HEIGHT;
+ return value != wxNOT_FOUND ? (int)value : m_minAcceptableRowHeight;
+}
+
+void wxGrid::SetColMinimalAcceptableWidth( int width )
+{
+ if ( width<1 )
+ return;
+ m_minAcceptableColWidth = width;
+}
+
+void wxGrid::SetRowMinimalAcceptableHeight( int height )
+{
+ if ( height<1 )
+ return;
+ m_minAcceptableRowHeight = height;
+};
+
+int wxGrid::GetColMinimalAcceptableWidth() const
+{
+ return m_minAcceptableColWidth;
+}
+
+int wxGrid::GetRowMinimalAcceptableHeight() const
+{
+ return m_minAcceptableRowHeight;
}
// ----------------------------------------------------------------------------
return rect;
}
-
-
//
// ------ Grid event classes
//