X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/795dac4c866d89804e625fa1d04cb70aba320183..f050bdbd5b69ed1a6752102f0c4c13bc7cb4ed3c:/src/generic/datavgen.cpp diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 74aba29bd9..3a929e97fc 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -607,66 +607,17 @@ IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer, wxDataViewRendererBase) wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, wxDataViewCellMode mode, int align) : - wxDataViewRendererBase( varianttype, mode, align ) + wxDataViewCustomRendererBase( varianttype, mode, align ) { - m_dc = NULL; m_align = align; m_mode = mode; m_ellipsizeMode = wxELLIPSIZE_MIDDLE; + m_dc = NULL; } wxDataViewRenderer::~wxDataViewRenderer() { - if (m_dc) - delete m_dc; -} - -bool -wxDataViewRenderer::RenderWithAttr(wxDC& dc, - const wxRect& cell_rect, - int align, - const wxDataViewItemAttr *WXUNUSED(attr), - int state) -{ - // adjust the rectangle ourselves to account for the alignment - - wxRect item_rect = cell_rect; - if ( align ) - { - const wxSize size = GetSize(); - - // take alignment into account only if there is enough space, otherwise - // show as much contents as possible - // - // notice that many existing renderers (e.g. wxDataViewSpinRenderer) - // return hard-coded size which can be more than they need and if we - // trusted their GetSize() we'd draw the text out of cell bounds - // entirely - - if ( size.x < cell_rect.width ) - { - if (align & wxALIGN_CENTER_HORIZONTAL) - item_rect.x += (cell_rect.width - size.x)/2; - else if (align & wxALIGN_RIGHT) - item_rect.x += cell_rect.width - size.x; - // else: wxALIGN_LEFT is the default - - item_rect.width = size.x; - } - - if ( size.y < cell_rect.height ) - { - if (align & wxALIGN_CENTER_VERTICAL) - item_rect.y += (cell_rect.height - size.y)/2; - else if (align & wxALIGN_BOTTOM) - item_rect.y += cell_rect.height - size.y; - // else: wxALIGN_TOP is the default - - item_rect.height = size.y; - } - } - - return Render(item_rect, &dc, state); + delete m_dc; } wxDC *wxDataViewRenderer::GetDC() @@ -693,19 +644,6 @@ int wxDataViewRenderer::GetAlignment() const return m_align; } -int wxDataViewRenderer::CalculateAlignment() const -{ - if (m_align == wxDVR_DEFAULT_ALIGNMENT) - { - if (GetOwner() == NULL) - return wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL; - - return GetOwner()->GetAlignment() | wxALIGN_CENTRE_VERTICAL; - } - - return m_align; -} - // --------------------------------------------------------- // wxDataViewCustomRenderer // --------------------------------------------------------- @@ -718,68 +656,15 @@ wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype, { } -void -wxDataViewCustomRenderer::RenderText(wxDC& dc, - const wxRect& rect, - int align, - const wxString& text, - const wxDataViewItemAttr *attr, - int state, - int xoffset) -{ - wxColour col; - if ( attr && attr->HasColour() ) - col = attr->GetColour(); - else if ( state & wxDATAVIEW_CELL_SELECTED ) - col = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); - else // use default foreground - col = GetOwner()->GetOwner()->GetForegroundColour(); - - wxDCTextColourChanger changeFg(dc, col); - - wxDCFontChanger changeFont(dc); - if ( attr && attr->HasFont() ) - { - wxFont font(dc.GetFont()); - if ( attr->GetBold() ) - font.MakeBold(); - if ( attr->GetItalic() ) - font.MakeItalic(); - - changeFont.Set(font); - } - - wxRect rectText = rect; - rectText.x += xoffset; - rectText.width -= xoffset; - - // check if we want to ellipsize the text if it doesn't fit - wxString ellipsizedText; - if ( GetEllipsizeMode() != wxELLIPSIZE_NONE ) - { - ellipsizedText = wxControl::Ellipsize - ( - text, - dc, - GetEllipsizeMode(), - rect.width, - wxELLIPSIZE_FLAGS_NONE - ); - } - - dc.DrawLabel(ellipsizedText.empty() ? text : ellipsizedText, - rectText, align); -} - // --------------------------------------------------------- // wxDataViewTextRenderer // --------------------------------------------------------- -IMPLEMENT_CLASS(wxDataViewTextRenderer, wxDataViewCustomRenderer) +IMPLEMENT_CLASS(wxDataViewTextRenderer, wxDataViewRenderer) wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxDataViewCellMode mode, int align ) : - wxDataViewCustomRenderer( varianttype, mode, align ) + wxDataViewRenderer( varianttype, mode, align ) { } @@ -821,14 +706,9 @@ bool wxDataViewTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVarian return true; } -bool -wxDataViewTextRenderer::RenderWithAttr(wxDC& dc, - const wxRect& rect, - int align, - const wxDataViewItemAttr *attr, - int state) +bool wxDataViewTextRenderer::Render(wxRect rect, wxDC *dc, int state) { - RenderText(dc, rect, align, m_text, attr, state); + RenderText(m_text, 0, rect, dc, state); return true; } @@ -844,11 +724,11 @@ wxSize wxDataViewTextRenderer::GetSize() const // wxDataViewBitmapRenderer // --------------------------------------------------------- -IMPLEMENT_CLASS(wxDataViewBitmapRenderer, wxDataViewCustomRenderer) +IMPLEMENT_CLASS(wxDataViewBitmapRenderer, wxDataViewRenderer) wxDataViewBitmapRenderer::wxDataViewBitmapRenderer( const wxString &varianttype, wxDataViewCellMode mode, int align ) : - wxDataViewCustomRenderer( varianttype, mode, align ) + wxDataViewRenderer( varianttype, mode, align ) { } @@ -891,11 +771,11 @@ wxSize wxDataViewBitmapRenderer::GetSize() const // wxDataViewToggleRenderer // --------------------------------------------------------- -IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer, wxDataViewCustomRenderer) +IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer, wxDataViewRenderer) wxDataViewToggleRenderer::wxDataViewToggleRenderer( const wxString &varianttype, wxDataViewCellMode mode, int align ) : - wxDataViewCustomRenderer( varianttype, mode, align ) + wxDataViewRenderer( varianttype, mode, align ) { m_toggle = false; } @@ -948,11 +828,11 @@ wxSize wxDataViewToggleRenderer::GetSize() const // wxDataViewProgressRenderer // --------------------------------------------------------- -IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer, wxDataViewCustomRenderer) +IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer, wxDataViewRenderer) wxDataViewProgressRenderer::wxDataViewProgressRenderer( const wxString &label, const wxString &varianttype, wxDataViewCellMode mode, int align ) : - wxDataViewCustomRenderer( varianttype, mode, align ) + wxDataViewRenderer( varianttype, mode, align ) { m_label = label; m_value = 0; @@ -974,24 +854,23 @@ bool wxDataViewProgressRenderer::GetValue( wxVariant &value ) const return true; } -bool wxDataViewProgressRenderer::RenderWithAttr(wxDC& dc, - const wxRect& rect, - int WXUNUSED(align), - const wxDataViewItemAttr *attr, - int WXUNUSED(state)) +bool +wxDataViewProgressRenderer::Render(wxRect rect, wxDC *dc, int WXUNUSED(state)) { - // deflat the rect to leave a small border between bars in adjacent rows + // deflate the rect to leave a small border between bars in adjacent rows wxRect bar = rect.Deflate(0, 1); - dc.SetBrush( *wxTRANSPARENT_BRUSH ); - dc.SetPen( *wxBLACK_PEN ); - dc.DrawRectangle( bar ); + dc->SetBrush( *wxTRANSPARENT_BRUSH ); + dc->SetPen( *wxBLACK_PEN ); + dc->DrawRectangle( bar ); bar.width = (int)(bar.width * m_value / 100.); - dc.SetPen( *wxTRANSPARENT_PEN ); - dc.SetBrush( attr && attr->HasColour() ? wxBrush(attr->GetColour()) - : *wxBLUE_BRUSH ); - dc.DrawRectangle( bar ); + dc->SetPen( *wxTRANSPARENT_PEN ); + + const wxDataViewItemAttr& attr = GetAttr(); + dc->SetBrush( attr.HasColour() ? wxBrush(attr.GetColour()) + : *wxBLUE_BRUSH ); + dc->DrawRectangle( bar ); return true; } @@ -1054,11 +933,11 @@ void wxDataViewDateRendererPopupTransient::OnCalendar( wxCalendarEvent &event ) #endif // wxUSE_DATE_RENDERER_POPUP -IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer, wxDataViewCustomRenderer) +IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer, wxDataViewRenderer) wxDataViewDateRenderer::wxDataViewDateRenderer( const wxString &varianttype, wxDataViewCellMode mode, int align ) : - wxDataViewCustomRenderer( varianttype, mode, align ) + wxDataViewRenderer( varianttype, mode, align ) { } @@ -1115,11 +994,11 @@ bool wxDataViewDateRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewModel *m // wxDataViewIconTextRenderer // --------------------------------------------------------- -IMPLEMENT_CLASS(wxDataViewIconTextRenderer, wxDataViewCustomRenderer) +IMPLEMENT_CLASS(wxDataViewIconTextRenderer, wxDataViewRenderer) wxDataViewIconTextRenderer::wxDataViewIconTextRenderer( const wxString &varianttype, wxDataViewCellMode mode, int align ) : - wxDataViewCustomRenderer( varianttype, mode, align ) + wxDataViewRenderer( varianttype, mode, align ) { SetMode(mode); SetAlignment(align); @@ -1136,23 +1015,18 @@ bool wxDataViewIconTextRenderer::GetValue( wxVariant& WXUNUSED(value) ) const return false; } -bool -wxDataViewIconTextRenderer::RenderWithAttr(wxDC& dc, - const wxRect& rect, - int align, - const wxDataViewItemAttr *attr, - int state) +bool wxDataViewIconTextRenderer::Render(wxRect rect, wxDC *dc, int state) { int xoffset = 0; const wxIcon& icon = m_value.GetIcon(); if ( icon.IsOk() ) { - dc.DrawIcon(icon, rect.x, rect.y + (rect.height - icon.GetHeight())/2); + dc->DrawIcon(icon, rect.x, rect.y + (rect.height - icon.GetHeight())/2); xoffset = icon.GetWidth()+4; } - RenderText(dc, rect, align, m_value.GetText(), attr, state, xoffset); + RenderText(m_value.GetText(), xoffset, rect, dc, state); return true; } @@ -1638,15 +1512,15 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent ) model->GetValue( value, item, column->GetModelColumn()); cell->SetValue( value ); + wxDataViewItemAttr attr; + model->GetAttr(item, column->GetModelColumn(), attr); + cell->SetAttr(attr); + wxRect item_rect(x, 0, width, height); item_rect.Deflate(PADDING_RIGHTLEFT, 0); // dc.SetClippingRegion( item_rect ); - wxDataViewItemAttr attr; - const bool - hasAttr = model->GetAttr(item, column->GetModelColumn(), attr); - cell->RenderWithAttr(dc, item_rect, cell->CalculateAlignment(), - hasAttr ? &attr : NULL, 0); + cell->WXCallRender(item_rect, &dc, 0); // dc.DestroyClippingRegion(); x += width; @@ -1838,6 +1712,10 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) model->GetValue( value, dataitem, col->GetModelColumn()); cell->SetValue( value ); + wxDataViewItemAttr attr; + model->GetAttr(dataitem, col->GetModelColumn(), attr); + cell->SetAttr(attr); + // update cell_rect cell_rect.y = GetLineStart( item ); cell_rect.height = GetLineHeight( item ); @@ -1908,11 +1786,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // make its own renderer and thus we cannot be sure of that. wxDCClipper clip(dc, item_rect); - wxDataViewItemAttr attr; - const bool - hasAttr = model->GetAttr(dataitem, col->GetModelColumn(), attr); - cell->RenderWithAttr(dc, item_rect, cell->CalculateAlignment(), - hasAttr ? &attr : NULL, state); + cell->WXCallRender(item_rect, &dc, state); } cell_rect.x += cell_rect.width; @@ -2180,6 +2054,7 @@ bool wxDataViewMainWindow::Cleared() void wxDataViewMainWindow::UpdateDisplay() { m_dirty = true; + m_underMouse = NULL; } void wxDataViewMainWindow::OnInternalIdle() @@ -3662,12 +3537,15 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) { if ((!ignore_other_columns) && (cell->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE)) { - wxVariant value; - model->GetValue( value, item, col->GetModelColumn() ); - cell->SetValue( value ); - wxRect cell_rect( xpos, GetLineStart( current ), - col->GetWidth(), GetLineHeight( current ) ); - cell->Activate( cell_rect, model, item, col->GetModelColumn() ); + if ( wxDataViewCustomRenderer *custom = cell->WXGetAsCustom() ) + { + wxVariant value; + model->GetValue( value, item, col->GetModelColumn() ); + custom->SetValue( value ); + wxRect cell_rect( xpos, GetLineStart( current ), + col->GetWidth(), GetLineHeight( current ) ); + custom->Activate( cell_rect, model, item, col->GetModelColumn() ); + } } else { @@ -3836,14 +3714,17 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) // Call LeftClick after everything else as under GTK+ if (cell->GetMode() & wxDATAVIEW_CELL_ACTIVATABLE) { - // notify cell about right click - wxVariant value; - model->GetValue( value, item, col->GetModelColumn() ); - cell->SetValue( value ); - wxRect cell_rect( xpos, GetLineStart( current ), - col->GetWidth(), GetLineHeight( current ) ); - /* ignore ret */ cell->LeftClick( event.GetPosition(), cell_rect, - model, item, col->GetModelColumn()); + if ( wxDataViewCustomRenderer *custom = cell->WXGetAsCustom() ) + { + // notify cell about click + wxVariant value; + model->GetValue( value, item, col->GetModelColumn() ); + custom->SetValue( value ); + wxRect cell_rect( xpos, GetLineStart( current ), + col->GetWidth(), GetLineHeight( current ) ); + /* ignore ret */ custom->LeftClick( event.GetPosition(), cell_rect, + model, item, col->GetModelColumn()); + } } } } @@ -4225,7 +4106,12 @@ void wxDataViewCtrl::Select( const wxDataViewItem & item ) // Unselect all rows before select another in the single select mode if (m_clientArea->IsSingleSel()) m_clientArea->SelectAllRows(false); + m_clientArea->SelectRow(row, true); + + // Also reset focus + if (m_clientArea->IsSingleSel()) + m_clientArea->ChangeCurrentRow( row ); } }