m_dc = NULL;
m_align = align;
m_mode = mode;
+ m_ellipsizeMode = wxELLIPSIZE_MIDDLE;
}
wxDataViewRenderer::~wxDataViewRenderer()
{
const wxSize size = GetSize();
- // horizontal alignment:
- if (align & wxALIGN_CENTER_HORIZONTAL)
- item_rect.x = cell_rect.x + (cell_rect.width / 2) - (size.x / 2);
- else if (align & wxALIGN_RIGHT)
- item_rect.x = cell_rect.x + cell_rect.width - size.x;
- // else: wxALIGN_LEFT is the default
+ // 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
- // vertical alignment:
- item_rect.y = cell_rect.y;
- if (align & wxALIGN_CENTER_VERTICAL)
- item_rect.y = cell_rect.y + (cell_rect.height / 2) - (size.y / 2);
- else if (align & wxALIGN_BOTTOM)
- item_rect.y = cell_rect.y + cell_rect.height - size.y;
- // else: wxALIGN_TOP is the default
+ 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;
+ }
- item_rect.SetSize(size);
+ 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);
{
}
-void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset,
- wxRect cell, wxDC *dc, int state )
-{
- wxColour col = state & wxDATAVIEW_CELL_SELECTED
- ? wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)
- : GetOwner()->GetOwner()->GetForegroundColour();
-
- wxDataViewItemAttr attr;
- attr.SetColour(col);
- RenderText(*dc, cell, wxALIGN_NOT, text, &attr, state, xoffset);
-}
-
void
wxDataViewCustomRenderer::RenderText(wxDC& dc,
const wxRect& rect,
int align,
const wxString& text,
const wxDataViewItemAttr *attr,
- int WXUNUSED(state),
+ int state,
int xoffset)
{
- wxDCTextColourChanger changeFg(dc);
- if ( attr && attr->HasColour() )
- changeFg.Set(attr->GetColour());
+ // 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() )
rectText.x += xoffset;
rectText.width -= xoffset;
- dc.DrawLabel(text, rectText, align);
+ // 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);
}
// ---------------------------------------------------------
wxDataViewModel *model,
const wxDataViewItem & item, unsigned int col)
{
- bool value = !m_toggle;
- wxVariant variant = value;
- model->SetValue( variant, item, col);
- model->ValueChanged( item, col );
+ model->ChangeValue(!m_toggle, item, col);
return true;
}
void wxDataViewDateRendererPopupTransient::OnCalendar( wxCalendarEvent &event )
{
- wxDateTime date = event.GetDate();
- wxVariant value = date;
- m_model->SetValue( value, m_item, m_col );
- m_model->ValueChanged( m_item, m_col );
+ m_model->ChangeValue( event.GetDate(), m_item, m_col );
DismissAndNotify();
}