]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/datavgen.cpp
Fix discrepancy between different ways of measuring text extents under Mac.
[wxWidgets.git] / src / generic / datavgen.cpp
index 7eccd2768250e4ee1f2644f3365271e42c0625d3..04924b89dd768188e34d234c48c71ee703d739e2 100644 (file)
@@ -612,6 +612,7 @@ wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype,
     m_dc = NULL;
     m_align = align;
     m_mode = mode;
+    m_ellipsizeMode = wxELLIPSIZE_MIDDLE;
 }
 
 wxDataViewRenderer::~wxDataViewRenderer()
@@ -634,22 +635,35 @@ wxDataViewRenderer::RenderWithAttr(wxDC& dc,
     {
         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);
@@ -713,11 +727,14 @@ wxDataViewCustomRenderer::RenderText(wxDC& dc,
                                      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 ( attr && attr->HasColour() )
-        col = attr->GetColour();
-    else if ( state & wxDATAVIEW_CELL_SELECTED )
+    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();
 
@@ -739,7 +756,22 @@ wxDataViewCustomRenderer::RenderText(wxDC& dc,
     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);
 }
 
 // ---------------------------------------------------------
@@ -904,10 +936,7 @@ bool wxDataViewToggleRenderer::Activate( wxRect WXUNUSED(cell),
                                         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;
 }
 
@@ -1022,10 +1051,7 @@ END_EVENT_TABLE()
 
 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();
 }