X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/733f486aac7f5d92f902d6041338cd6e1bc7d99d..17808a759627b03c2acbe7333dd2386557e1b804:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 8fb7e5197b..0fba2b3829 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -642,21 +642,27 @@ void wxGridCellTextEditor::Create(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler) { + DoCreate(parent, id, evtHandler); +} + +void wxGridCellTextEditor::DoCreate(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler, + long style) +{ + style |= wxTE_PROCESS_ENTER | + wxTE_PROCESS_TAB | + wxTE_AUTO_SCROLL | + wxNO_BORDER; + m_control = new wxTextCtrl(parent, id, wxEmptyString, - wxDefaultPosition, wxDefaultSize -#if defined(__WXMSW__) - , - wxTE_PROCESS_ENTER | - wxTE_PROCESS_TAB | - wxTE_AUTO_SCROLL | - wxNO_BORDER -#endif - ); + wxDefaultPosition, wxDefaultSize, + style); // set max length allowed in the textctrl, if the parameter was set - if (m_maxChars != 0) + if ( m_maxChars != 0 ) { - ((wxTextCtrl*)m_control)->SetMaxLength(m_maxChars); + Text()->SetMaxLength(m_maxChars); } wxGridCellEditor::Create(parent, id, evtHandler); @@ -1514,10 +1520,12 @@ void wxGridCellChoiceEditor::Create(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler) { + int style = wxBORDER_NONE; + if (!m_allowOthers) + style |= wxCB_READONLY; m_control = new wxComboBox(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, - m_choices, - m_allowOthers ? 0 : wxCB_READONLY); + m_choices, style ); wxGridCellEditor::Create(parent, id, evtHandler); } @@ -1552,8 +1560,9 @@ void wxGridCellChoiceEditor::BeginEdit(int row, int col, wxGrid* grid) if (m_allowOthers) { Combo()->SetValue(m_startValue); + Combo()->SetInsertionPointEnd(); } - else + else // the combobox is read-only { // find the right position, or default to the first if not found int pos = Combo()->FindString(m_startValue); @@ -1562,7 +1571,6 @@ void wxGridCellChoiceEditor::BeginEdit(int row, int col, wxGrid* grid) Combo()->SetSelection(pos); } - Combo()->SetInsertionPointEnd(); Combo()->SetFocus(); if (evtHandler) @@ -2198,8 +2206,7 @@ wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid, wxSize size = checkbox->GetBestSize(); wxCoord checkSize = size.y + 2 * wxGRID_CHECKMARK_MARGIN; - // FIXME wxGTK::wxCheckBox::GetBestSize() gives "wrong" result -#if defined(__WXGTK__) || defined(__WXMOTIF__) +#if defined(__WXMOTIF__) checkSize -= size.y / 2; #endif @@ -2228,7 +2235,7 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid, if ( size.x >= minSize || size.y >= minSize ) { // and even leave (at least) 1 pixel margin - size.x = size.y = minSize - 2; + size.x = size.y = minSize; } // draw a border around checkmark @@ -2269,26 +2276,11 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid, value = wxGridCellBoolEditor::IsTrueValue(cellval); } - if ( value ) - { - wxRect rectMark = rectBorder; - -#ifdef __WXMSW__ - // MSW DrawCheckMark() is weird (and should probably be changed...) - rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN / 2); - rectMark.x++; - rectMark.y++; -#else - rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN); -#endif - - dc.SetTextForeground(attr.GetTextColour()); - dc.DrawCheckMark(rectMark); - } - - dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.SetPen(wxPen(attr.GetTextColour(), 1, wxSOLID)); - dc.DrawRectangle(rectBorder); + int flags = 0; + if (value) + flags |= wxCONTROL_CHECKED; + + wxRendererNative::Get().DrawCheckBox( &grid, dc, rectBorder, flags ); } // ---------------------------------------------------------------------------- @@ -2717,7 +2709,7 @@ int wxGridCellAttrData::FindIndex(int row, int col) const wxGridRowOrColAttrData::~wxGridRowOrColAttrData() { - size_t count = m_attrs.Count(); + size_t count = m_attrs.GetCount(); for ( size_t n = 0; n < count; n++ ) { m_attrs[n]->DecRef(); @@ -2743,9 +2735,13 @@ void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol) int i = m_rowsOrCols.Index(rowOrCol); if ( i == wxNOT_FOUND ) { - // add the attribute - m_rowsOrCols.Add(rowOrCol); - m_attrs.Add(attr); + if ( attr ) + { + // add the attribute + m_rowsOrCols.Add(rowOrCol); + m_attrs.Add(attr); + } + // nothing to remove } else { @@ -2958,7 +2954,7 @@ void wxGridCellAttrProvider::UpdateAttrCols( size_t pos, int numCols ) wxGridTypeRegistry::~wxGridTypeRegistry() { - size_t count = m_typeinfo.Count(); + size_t count = m_typeinfo.GetCount(); for ( size_t i = 0; i < count; i++ ) delete m_typeinfo[i]; } @@ -4213,6 +4209,7 @@ bool wxGrid::Create(wxWindow *parent, wxWindowID id, Create(); SetInitialSize(size); + CalcDimensions(); return true; } @@ -4518,6 +4515,7 @@ void wxGrid::Init() m_dragRowOrCol = -1; m_isDragging = false; m_startDragPos = wxDefaultPosition; + m_nativeColumnLabels = false; m_waitForSlowClick = false; @@ -6285,7 +6283,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) { if ( CanDragRowSize() && CanDragGridSize() ) - ChangeCursorMode(WXGRID_CURSOR_RESIZE_ROW); + ChangeCursorMode(WXGRID_CURSOR_RESIZE_ROW, NULL, false); } } else if ( dragCol >= 0 ) @@ -6295,7 +6293,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) { if ( CanDragColSize() && CanDragGridSize() ) - ChangeCursorMode(WXGRID_CURSOR_RESIZE_COL); + ChangeCursorMode(WXGRID_CURSOR_RESIZE_COL, NULL, false); } } else // Neither on a row or col edge @@ -6945,8 +6943,11 @@ void wxGrid::Refresh(bool eraseb, const wxRect* rect) void wxGrid::OnSize(wxSizeEvent& WXUNUSED(event)) { - // update our children window positions and scrollbars - CalcDimensions(); + if (m_targetWindow != this) // check whether initialisation has been done + { + // update our children window positions and scrollbars + CalcDimensions(); + } } void wxGrid::OnKeyDown( wxKeyEvent& event ) @@ -7202,7 +7203,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) return; } -#if !(defined(__WXMAC__) && wxMAC_USE_CORE_GRAPHICS) +#if !defined(__WXMAC__) wxClientDC dc( m_gridWin ); PrepareDC( dc ); #endif @@ -7228,7 +7229,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) // Otherwise refresh redraws the highlight! m_currentCellCoords = coords; -#if defined(__WXMAC__) && wxMAC_USE_CORE_GRAPHICS +#if defined(__WXMAC__) m_gridWin->Refresh(true /*, & r */); #else DrawGridCellArea( dc, cells ); @@ -7240,7 +7241,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) m_currentCellCoords = coords; wxGridCellAttr *attr = GetCellAttr( coords ); -#if !(defined(__WXMAC__) && wxMAC_USE_CORE_GRAPHICS) +#if !defined(__WXMAC__) DrawCellHighlight( dc, attr ); #endif attr->DecRef(); @@ -7813,7 +7814,6 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & WXUNUSED(reg) ) int rightCol = GetColPos( internalXToCol(right) ); int bottomRow = internalYToRow(bottom); -#if !defined(__WXMAC__) || wxMAC_USE_CORE_GRAPHICS wxRegion clippedcells(0, 0, cw, ch); int i, j, cell_rows, cell_cols; @@ -7841,30 +7841,6 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & WXUNUSED(reg) ) } } } -#else - wxRegion clippedcells( left, top, right - left, bottom - top ); - - int i, j, cell_rows, cell_cols; - wxRect rect; - - for (j=topRow; j<=bottomRow; j++) - { - for (i=leftCol; i<=rightCol; i++) - { - GetCellSize( j, i, &cell_rows, &cell_cols ); - if ((cell_rows > 1) || (cell_cols > 1)) - { - rect = CellToRect(j, i); - clippedcells.Subtract(rect); - } - else if ((cell_rows < 0) || (cell_cols < 0)) - { - rect = CellToRect(j + cell_rows, i + cell_cols); - clippedcells.Subtract(rect); - } - } - } -#endif dc.SetClippingRegion( clippedcells ); @@ -7937,19 +7913,6 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row ) wxRect rect; -#if 0 -def __WXGTK20__ - rect.SetX( 1 ); - rect.SetY( GetRowTop(row) + 1 ); - rect.SetWidth( m_rowLabelWidth - 2 ); - rect.SetHeight( GetRowHeight(row) - 2 ); - - CalcScrolledPosition( 0, rect.y, NULL, &rect.y ); - - wxWindowDC *win_dc = (wxWindowDC*) &dc; - - wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 ); -#else int rowTop = GetRowTop(row), rowBottom = GetRowBottom(row) - 1; @@ -7961,7 +7924,6 @@ def __WXGTK20__ dc.SetPen( *wxWHITE_PEN ); dc.DrawLine( 1, rowTop, 1, rowBottom ); dc.DrawLine( 1, rowTop, m_rowLabelWidth - 1, rowTop ); -#endif dc.SetBackgroundMode( wxTRANSPARENT ); dc.SetTextForeground( GetLabelTextColour() ); @@ -7977,6 +7939,18 @@ def __WXGTK20__ DrawTextRectangle( dc, GetRowLabelValue( row ), rect, hAlign, vAlign ); } +void wxGrid::SetUseNativeColLabels( bool native ) +{ + m_nativeColumnLabels = native; + if (native) + { + int height = wxRendererNative::Get().GetHeaderButtonHeight( this ); + SetColLabelSize( height ); + } + + m_colLabelWin->Refresh(); +} + void wxGrid::DrawColLabels( wxDC& dc,const wxArrayInt& cols ) { if ( !m_numCols ) @@ -8000,29 +7974,30 @@ void wxGrid::DrawColLabel( wxDC& dc, int col ) wxRect rect; -#if 0 -def __WXGTK20__ - rect.SetX( colLeft + 1 ); - rect.SetY( 1 ); - rect.SetWidth( GetColWidth(col) - 2 ); - rect.SetHeight( m_colLabelHeight - 2 ); - - wxWindowDC *win_dc = (wxWindowDC*) &dc; + if (m_nativeColumnLabels) + { + rect.SetX( colLeft); + rect.SetY( 0 ); + rect.SetWidth( GetColWidth(col)); + rect.SetHeight( m_colLabelHeight ); - wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 ); -#else - int colRight = GetColRight(col) - 1; + wxWindowDC *win_dc = (wxWindowDC*) &dc; + wxRendererNative::Get().DrawHeaderButton( win_dc->GetWindow(), dc, rect, 0 ); + } + else + { + int colRight = GetColRight(col) - 1; - dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) ); - dc.DrawLine( colRight, 0, colRight, m_colLabelHeight - 1 ); - dc.DrawLine( colLeft, 0, colRight, 0 ); - dc.DrawLine( colLeft, m_colLabelHeight - 1, + dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) ); + dc.DrawLine( colRight, 0, colRight, m_colLabelHeight - 1 ); + dc.DrawLine( colLeft, 0, colRight, 0 ); + dc.DrawLine( colLeft, m_colLabelHeight - 1, colRight + 1, m_colLabelHeight - 1 ); - dc.SetPen( *wxWHITE_PEN ); - dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight - 1 ); - dc.DrawLine( colLeft, 1, colRight, 1 ); -#endif + dc.SetPen( *wxWHITE_PEN ); + dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight - 1 ); + dc.DrawLine( colLeft, 1, colRight, 1 ); + } dc.SetBackgroundMode( wxTRANSPARENT ); dc.SetTextForeground( GetLabelTextColour() ); @@ -8120,7 +8095,7 @@ void wxGrid::DrawTextRectangle(wxDC& dc, continue; } - long lineWidth = 0, + wxCoord lineWidth = 0, lineHeight = 0; dc.GetTextExtent(line, &lineWidth, &lineHeight); @@ -8201,9 +8176,9 @@ void wxGrid::GetTextBoxSize( const wxDC& dc, const wxArrayString& lines, long *width, long *height ) const { - long w = 0; - long h = 0; - long lineW = 0, lineH = 0; + wxCoord w = 0; + wxCoord h = 0; + wxCoord lineW = 0, lineH = 0; size_t i; for ( i = 0; i < lines.GetCount(); i++ ) @@ -8459,7 +8434,7 @@ void wxGrid::ShowCellEditControl() if (rect.GetRight() > client_right) rect.SetRight( client_right - 1 ); } - + editor->SetCellAttr( attr ); editor->SetSize( rect ); if (nXMove != 0) @@ -9662,7 +9637,7 @@ void wxGrid::SetCellHighlightPenWidth(int width) // make any visible change if the the thickness is getting smaller. int row = m_currentCellCoords.GetRow(); int col = m_currentCellCoords.GetCol(); - if ( GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 ) + if ( row == -1 || col == -1 || GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 ) return; wxRect rect = CellToRect(row, col); @@ -10268,10 +10243,7 @@ wxGridCellEditor * wxGrid::GetDefaultEditorForType(const wxString& typeName) con int index = m_typeRegistry->FindOrCloneDataType(typeName); if ( index == wxNOT_FOUND ) { - wxString errStr; - - errStr.Printf(wxT("Unknown data type name [%s]"), typeName.c_str()); - wxFAIL_MSG(errStr.c_str()); + wxFAIL_MSG(wxString::Format(wxT("Unknown data type name [%s]"), typeName.c_str())); return NULL; } @@ -10284,10 +10256,7 @@ wxGridCellRenderer * wxGrid::GetDefaultRendererForType(const wxString& typeName) int index = m_typeRegistry->FindOrCloneDataType(typeName); if ( index == wxNOT_FOUND ) { - wxString errStr; - - errStr.Printf(wxT("Unknown data type name [%s]"), typeName.c_str()); - wxFAIL_MSG(errStr.c_str()); + wxFAIL_MSG(wxString::Format(wxT("Unknown data type name [%s]"), typeName.c_str())); return NULL; } @@ -10568,6 +10537,12 @@ wxGrid::AutoSizeColOrRow(int colOrRow, bool setAsMin, wxGridDirection direction) if ( column ) { + // Ensure automatic width is not less than minimal width. See the + // comment in SetColSize() for explanation of why this isn't done + // in SetColSize(). + if ( !setAsMin ) + extentMax = wxMax(extentMax, GetColMinimalWidth(col)); + SetColSize( col, extentMax ); if ( !GetBatchCount() ) { @@ -10583,6 +10558,12 @@ wxGrid::AutoSizeColOrRow(int colOrRow, bool setAsMin, wxGridDirection direction) } else { + // Ensure automatic width is not less than minimal height. See the + // comment in SetColSize() for explanation of why this isn't done + // in SetRowSize(). + if ( !setAsMin ) + extentMax = wxMax(extentMax, GetRowMinimalHeight(row)); + SetRowSize(row, extentMax); if ( !GetBatchCount() ) { @@ -10629,9 +10610,10 @@ wxCoord wxGrid::CalcColOrRowLabelAreaMinSize(wxGridDirection direction) for ( int rowOrCol = 0; rowOrCol < numRowsOrCols; rowOrCol++ ) { lines.Clear(); - StringToLines(calcRows ? GetRowLabelValue(rowOrCol) - : GetColLabelValue(rowOrCol), - lines); + + wxString label = calcRows ? GetRowLabelValue(rowOrCol) + : GetColLabelValue(rowOrCol); + StringToLines(label, lines); long w, h; GetTextBoxSize(dc, lines, &w, &h);