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()
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
// ---------------------------------------------------------
{
}
-void
-wxDataViewCustomRenderer::RenderText(wxDC& dc,
- const wxRect& rect,
- int align,
- const wxString& text,
- const wxDataViewItemAttr *attr,
- int state,
- int xoffset)
-{
- // override custom foreground with the standard one for the selected items
- // because we currently don't allow changing the selection background and
- // custom colours may be unreadable on it
- wxColour col;
- if ( state & wxDATAVIEW_CELL_SELECTED )
- col = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
- else if ( attr && attr->HasColour() )
- col = attr->GetColour();
- 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 )
{
}
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;
}
// 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 )
{
}
// 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;
}
// 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;
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;
}
#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 )
{
}
// 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);
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;
}
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;
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 );
// 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;
void wxDataViewMainWindow::UpdateDisplay()
{
m_dirty = true;
+ m_underMouse = NULL;
}
void wxDataViewMainWindow::OnInternalIdle()
{
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
{
// 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());
+ }
}
}
}
// 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 set focus to the selected item
+ m_clientArea->ChangeCurrentRow( row );
}
}