]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/datavgen.cpp
Fix crash when editing wxDVC items in place in wxOSX/Cocoa.
[wxWidgets.git] / src / generic / datavgen.cpp
index 7eccd2768250e4ee1f2644f3365271e42c0625d3..1eeff556add8542d14ee731d34e542a971cf091e 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;
+        }
+
+        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.SetSize(size);
+            item_rect.height = size.y;
+        }
     }
 
     return Render(item_rect, &dc, state);
@@ -739,7 +753,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);
 }
 
 // ---------------------------------------------------------