X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f40f9976fd085fd6d2099de861159bb1062a8f46..7052b16dedae79bec878ce41e4607a39a969610c:/src/generic/grid.cpp?ds=sidebyside diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index f60e2bced6..ef6fddb7e0 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") ) { @@ -3738,13 +3745,13 @@ void wxGridWindow::OnEraseBackground( wxEraseEvent& WXUNUSED(event) ) static int CoordToRowOrCol(int coord, int defaultDist, int minDist, const wxArrayInt& BorderArray, int nMax, - bool maxOnOverflow); + 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) ///////////////////////////////////////////////////////////////////// @@ -3971,6 +3978,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 @@ -4791,7 +4801,11 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) if ( row < 0 ) { row = YToRow(y); - SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, row, -1, event ); + if ( row >=0 && + !SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, row, -1, event ) ) + { + // no default action at the moment + } } else { @@ -4828,7 +4842,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) else if ( event.RightDown() ) { row = YToRow(y); - if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, row, -1, event ) ) + if ( row >=0 && + !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, row, -1, event ) ) { // no default action at the moment } @@ -4840,7 +4855,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) else if ( event.RightDClick() ) { row = YToRow(y); - if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, row, -1, event ) ) + if ( row >= 0 && + !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, row, -1, event ) ) { // no default action at the moment } @@ -5006,7 +5022,11 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) if ( col < 0 ) { col = XToCol(x); - SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, col, event ); + if ( col >= 0 && + ! SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, col, event ) ) + { + // no default action at the moment + } } else { @@ -5043,7 +5063,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) else if ( event.RightDown() ) { col = XToCol(x); - if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, -1, col, event ) ) + if ( col >= 0 && + !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, -1, col, event ) ) { // no default action at the moment } @@ -5055,7 +5076,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) else if ( event.RightDClick() ) { col = XToCol(x); - if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, col, event ) ) + if ( col >= 0 && + !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, col, event ) ) { // no default action at the moment } @@ -5412,7 +5434,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 ) @@ -5434,21 +5469,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 ) { @@ -5587,7 +5607,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() ) { @@ -5604,10 +5624,9 @@ void wxGrid::DoEndDragResizeRow() { int i, cell_rows, cell_cols, subtract_rows = 0; int leftCol = XToCol(left); - int rightCol = XToCol(left+cw); + int rightCol = internalXToCol(left+cw); if (leftCol >= 0) { - if (rightCol < 0) rightCol = m_numCols; for (i=leftCol; i= 0) { - if (bottomRow < 0) bottomRow = m_numRows; for (i=topRow; i= 0) && (topRow >= 0)) - { - if (rightCol < 0) rightCol = m_numCols; - if (bottomRow < 0) bottomRow = m_numRows; - int i, j, cell_rows, cell_cols; - wxRect rect; + int i, j, cell_rows, cell_cols; + wxRect rect; - for (j=topRow; j 1) || (cell_cols > 1)) { - GetCellSize( j, i, &cell_rows, &cell_cols ); - if ((cell_rows > 1) || (cell_cols > 1)) - { - rect = CellToRect(j,i); - CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); - clippedcells.Subtract(rect); - } - else if ((cell_rows < 0) || (cell_cols < 0)) - { - rect = CellToRect(j+cell_rows, i+cell_cols); - CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); - clippedcells.Subtract(rect); - } + rect = CellToRect(j,i); + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + clippedcells.Subtract(rect); + } + else if ((cell_rows < 0) || (cell_cols < 0)) + { + rect = CellToRect(j+cell_rows, i+cell_cols); + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + clippedcells.Subtract(rect); } } } @@ -6953,7 +6966,7 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & WXUNUSED(reg) ) // horizontal grid lines // - int i; + // already declared above - int i; for ( i = internalYToRow(top); i < m_numRows; i++ ) { int bot = GetRowBottom(i) - 1; @@ -7098,10 +7111,10 @@ void wxGrid::DrawTextRectangle( wxDC& dc, int textOrientation ) { wxArrayString lines; - + StringToLines( value, lines ); - - + + //Forward to new API. DrawTextRectangle( dc, lines, @@ -7109,7 +7122,7 @@ void wxGrid::DrawTextRectangle( wxDC& dc, horizAlign, vertAlign, textOrientation ); - + } void wxGrid::DrawTextRectangle( wxDC& dc, @@ -7122,20 +7135,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: @@ -7144,14 +7157,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 ) @@ -7160,12 +7173,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: @@ -7174,14 +7187,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 ) @@ -7190,7 +7203,7 @@ void wxGrid::DrawTextRectangle( wxDC& dc, y = rect.y + rect.height - 1; break; } - + if( textOrientation == wxHORIZONTAL ) { dc.DrawText( lines[l], (int)x, (int)y ); @@ -7594,10 +7607,16 @@ void wxGrid::XYToCell( int x, int y, wxGridCellCoords& coords ) static int CoordToRowOrCol(int coord, int defaultDist, int minDist, const wxArrayInt& BorderArray, int nMax, - bool maxOnOverflow) + bool clipToMinMax) { + + if (coord < 0) + return clipToMinMax && (nMax > 0) ? 0 : -1; + + if (!defaultDist) defaultDist = 1; + size_t i_max = coord / defaultDist, i_min = 0; @@ -7605,7 +7624,7 @@ static int CoordToRowOrCol(int coord, int defaultDist, int minDist, { if((int) i_max < nMax) return i_max; - return maxOnOverflow ? nMax - 1 : -1; + return clipToMinMax ? nMax - 1 : -1; } if ( i_max >= BorderArray.GetCount()) @@ -7621,7 +7640,7 @@ static int CoordToRowOrCol(int coord, int defaultDist, int minDist, i_max = BorderArray.GetCount() - 1; } if ( coord >= BorderArray[i_max]) - return maxOnOverflow ? (int)i_max : -1; + return clipToMinMax ? (int)i_max : -1; if ( coord < BorderArray[0] ) return 0; @@ -7645,14 +7664,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); } @@ -7997,13 +8016,11 @@ bool wxGrid::MovePageUp() m_gridWin->GetClientSize( &cw, &ch ); int y = GetRowTop(row); - int newRow = YToRow( y - ch + 1 ); - if ( newRow < 0 ) - { - newRow = 0; - } - else if ( newRow == row ) + int newRow = internalYToRow( y - ch + 1 ); + + if ( newRow == row ) { + //row > 0 , so newrow can never be less than 0 here. newRow = row - 1; } @@ -8021,20 +8038,17 @@ 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 ); int y = GetRowTop(row); - int newRow = YToRow( y + ch ); - if ( newRow == -1 ) + int newRow = internalYToRow( y + ch ); + if ( newRow == row ) { - newRow = m_numRows - 1; - } - else if ( newRow == row ) - { - newRow = row + 1; + // row < m_numRows , so newrow can't overflow here. + newRow = row + 1; } MakeCellVisible( newRow, m_currentCellCoords.GetCol() ); @@ -9236,7 +9250,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 ) { @@ -9255,6 +9269,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 @@ -9276,7 +9293,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 ) { @@ -9296,7 +9313,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 @@ -9330,24 +9355,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; } // ---------------------------------------------------------------------------- @@ -9947,8 +10000,6 @@ wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft, return rect; } - - // // ------ Grid event classes //