X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a967f0480b8297a4bc6378fe3c919f20170a5ccf..4ab107d7f1ba10926224887341e4c9c50515f9d7:/src/generic/grid.cpp?ds=sidebyside diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index d0d1412abf..511bed5c93 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -458,7 +458,7 @@ void wxGridCellEditor::PaintBackground(const wxRect& rectCell, 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); @@ -575,7 +575,11 @@ void wxGridCellTextEditor::Create(wxWindow* parent, #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); } @@ -2061,7 +2065,7 @@ void wxGridCellAttr::Init(wxGridCellAttr *attrDefault) m_attrkind = wxGridCellAttr::Cell; m_sizeRows = m_sizeCols = 1; - m_overflow = TRUE; + m_overflow = UnsetOverflow; SetDefAttr(attrDefault); } @@ -2133,6 +2137,9 @@ void wxGridCellAttr::MergeWith(wxGridCellAttr *mergefrom) if ( !HasReadWriteMode() && mergefrom->HasReadWriteMode() ) SetReadOnly(mergefrom->IsReadOnly()); + if (!HasOverflowMode() && mergefrom->HasOverflowMode() ) + SetOverflow(mergefrom->GetOverflow()); + SetDefAttr(mergefrom->m_defGridAttr); } @@ -3459,7 +3466,7 @@ END_EVENT_TABLE() 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; } @@ -3525,7 +3532,7 @@ END_EVENT_TABLE() 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; } @@ -3590,7 +3597,7 @@ END_EVENT_TABLE() 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; } @@ -3660,7 +3667,7 @@ wxGridWindow::wxGridWindow( wxGrid *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") ) { @@ -3741,10 +3748,10 @@ static int CoordToRowOrCol(int coord, int defaultDist, int minDist, 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) ///////////////////////////////////////////////////////////////////// @@ -3906,16 +3913,18 @@ bool wxGrid::SetTable( wxGridTableBase *table, bool takeOwnership, { 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(); @@ -3971,6 +3980,9 @@ void wxGrid::Init() 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 @@ -4832,7 +4844,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) 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 @@ -5424,7 +5436,20 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) 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 ) @@ -5446,21 +5471,6 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // 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 ) { @@ -5599,7 +5609,7 @@ void wxGrid::DoEndDragResizeRow() int rowTop = GetRowTop(m_dragRowOrCol); SetRowSize( m_dragRowOrCol, - wxMax( m_dragLastPos - rowTop, WXGRID_MIN_ROW_HEIGHT ) ); + wxMax( m_dragLastPos - rowTop, m_minAcceptableRowHeight ) ); if ( !GetBatchCount() ) { @@ -5759,7 +5769,9 @@ bool wxGrid::InsertRows( int pos, int numRows, bool WXUNUSED(updateLabels) ) 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 @@ -5778,9 +5790,15 @@ bool wxGrid::AppendRows( int numRows, bool WXUNUSED(updateLabels) ) 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; } @@ -5799,7 +5817,9 @@ bool wxGrid::DeleteRows( int pos, int numRows, bool WXUNUSED(updateLabels) ) 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 } @@ -5822,7 +5842,9 @@ bool wxGrid::InsertCols( int pos, int numCols, bool WXUNUSED(updateLabels) ) 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 } @@ -5840,9 +5862,15 @@ bool wxGrid::AppendCols( int numCols, bool WXUNUSED(updateLabels) ) 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; } @@ -5861,7 +5889,9 @@ bool wxGrid::DeleteCols( int pos, int numCols, bool WXUNUSED(updateLabels) ) 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 } @@ -7103,10 +7133,10 @@ void wxGrid::DrawTextRectangle( wxDC& dc, int textOrientation ) { wxArrayString lines; - + StringToLines( value, lines ); - - + + //Forward to new API. DrawTextRectangle( dc, lines, @@ -7114,7 +7144,7 @@ void wxGrid::DrawTextRectangle( wxDC& dc, horizAlign, vertAlign, textOrientation ); - + } void wxGrid::DrawTextRectangle( wxDC& dc, @@ -7127,20 +7157,20 @@ 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: @@ -7149,14 +7179,14 @@ void wxGrid::DrawTextRectangle( wxDC& dc, 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 ) @@ -7165,12 +7195,12 @@ void wxGrid::DrawTextRectangle( wxDC& dc, 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: @@ -7179,14 +7209,14 @@ void wxGrid::DrawTextRectangle( wxDC& dc, 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 ) @@ -7195,7 +7225,7 @@ void wxGrid::DrawTextRectangle( wxDC& dc, y = rect.y + rect.height - 1; break; } - + if( textOrientation == wxHORIZONTAL ) { dc.DrawText( lines[l], (int)x, (int)y ); @@ -7605,7 +7635,7 @@ static int CoordToRowOrCol(int coord, int defaultDist, int minDist, if (coord < 0) return clipToMinMax && (nMax > 0) ? 0 : -1; - + if (!defaultDist) defaultDist = 1; @@ -7656,14 +7686,14 @@ static int CoordToRowOrCol(int coord, int defaultDist, int minDist, 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); } @@ -8009,10 +8039,10 @@ bool wxGrid::MovePageUp() 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; } @@ -8030,7 +8060,7 @@ bool wxGrid::MovePageDown() 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 ); @@ -8039,7 +8069,7 @@ bool wxGrid::MovePageDown() 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; } @@ -9242,7 +9272,7 @@ void wxGrid::EnableDragGridSize( bool enable ) void wxGrid::SetDefaultRowSize( int height, bool resizeExistingRows ) { - m_defaultRowHeight = wxMax( height, WXGRID_MIN_ROW_HEIGHT ); + m_defaultRowHeight = wxMax( height, m_minAcceptableRowHeight ); if ( resizeExistingRows ) { @@ -9261,6 +9291,9 @@ void wxGrid::SetRowSize( int row, int height ) { 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 @@ -9282,7 +9315,7 @@ void wxGrid::SetRowSize( int row, int height ) void wxGrid::SetDefaultColSize( int width, bool resizeExistingCols ) { - m_defaultColWidth = wxMax( width, WXGRID_MIN_COL_WIDTH ); + m_defaultColWidth = wxMax( width, m_minAcceptableColWidth ); if ( resizeExistingCols ) { @@ -9302,7 +9335,15 @@ void wxGrid::SetColSize( int col, int width ) 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 @@ -9336,24 +9377,52 @@ void wxGrid::SetColSize( int col, int width ) 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; } // ---------------------------------------------------------------------------- @@ -9953,8 +10022,6 @@ wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft, return rect; } - - // // ------ Grid event classes //