]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/statusbr.cpp
Allow passing multi-line strings to wxDC::DrawText(), even under MSW.
[wxWidgets.git] / src / generic / statusbr.cpp
index bd1f98f4b271832b8353d6a2b0e33ad475d66c3a..4c24ee5c35eaadb261930f1d340cc1204d294e46 100644 (file)
 #if GTK_CHECK_VERSION(2,12,0)
 extern "C" {
 static
 #if GTK_CHECK_VERSION(2,12,0)
 extern "C" {
 static
-gboolean statusbar_query_tooltip(GtkWidget  *widget,
+gboolean statusbar_query_tooltip(GtkWidget*   WXUNUSED(widget),
                                  gint        x,
                                  gint        y,
                                  gint        x,
                                  gint        y,
-                                 gboolean    keyboard_mode,
+                                 gboolean     WXUNUSED(keyboard_mode),
                                  GtkTooltip *tooltip,
                                  wxStatusBar* statbar)
 {
                                  GtkTooltip *tooltip,
                                  wxStatusBar* statbar)
 {
@@ -72,7 +72,11 @@ gboolean statusbar_query_tooltip(GtkWidget  *widget,
     if (!statbar->GetField(n).IsEllipsized())
         return FALSE;   // no, it's not useful
 
     if (!statbar->GetField(n).IsEllipsized())
         return FALSE;   // no, it's not useful
 
-    gtk_tooltip_set_text(tooltip, wxGTK_CONV_SYS(statbar->GetStatusText(n)));
+    const wxString& str = statbar->GetStatusText(n);
+    if (str.empty())
+        return FALSE;
+
+    gtk_tooltip_set_text(tooltip, wxGTK_CONV_SYS(str));
     return TRUE;
 }
 }
     return TRUE;
 }
 }
@@ -125,14 +129,14 @@ bool wxStatusBarGeneric::Create(wxWindow *parent,
     SetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, height);
 
     SetFieldsCount(1);
     SetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, height);
 
     SetFieldsCount(1);
-    
+
 #if defined( __WXGTK20__ )
 #if GTK_CHECK_VERSION(2,12,0)
 #if defined( __WXGTK20__ )
 #if GTK_CHECK_VERSION(2,12,0)
-    if (HasFlag(wxST_SHOW_TIPS) && !gtk_check_version(2,12,0))
+    if (HasFlag(wxSTB_SHOW_TIPS) && !gtk_check_version(2,12,0))
     {
     {
-        g_object_set(m_widget, "has-tooltip", TRUE, NULL); 
-        g_signal_connect(m_widget, "query-tooltip",  
-                         G_CALLBACK(statusbar_query_tooltip), this); 
+        g_object_set(m_widget, "has-tooltip", TRUE, NULL);
+        g_signal_connect(m_widget, "query-tooltip",
+                         G_CALLBACK(statusbar_query_tooltip), this);
     }
 #endif
 #endif
     }
 #endif
 #endif
@@ -156,41 +160,23 @@ wxSize wxStatusBarGeneric::DoGetBestSize() const
     return wxSize(width, height);
 }
 
     return wxSize(width, height);
 }
 
-void wxStatusBarGeneric::SetFieldsCount(int number, const int *widths)
+void wxStatusBarGeneric::DoUpdateStatusText(int number)
 {
 {
-    wxASSERT_MSG( number >= 0, _T("negative number of fields in wxStatusBar?") );
-
-    // this will result in a call to SetStatusWidths() and thus an update to our
-    // m_widthsAbs cache
-    wxStatusBarBase::SetFieldsCount(number, widths);
-}
-
-void wxStatusBarGeneric::SetStatusText(const wxString& text, int number)
-{
-    wxCHECK_RET( (number >= 0) && ((size_t)number < m_panes.GetCount()),
-                 _T("invalid status bar field index") );
-
-    wxString oldText = GetStatusText(number);
-    if (oldText != text)
-    {
-        wxStatusBarBase::SetStatusText(text, number);
-
-        wxRect rect;
-        GetFieldRect(number, rect);
+    wxRect rect;
+    GetFieldRect(number, rect);
 
 
-        Refresh(true, &rect);
+    Refresh(true, &rect);
 
 
-        // it's common to show some text in the status bar before starting a
-        // relatively lengthy operation, ensure that the text is shown to the
-        // user immediately and not after the lengthy operation end
-        Update();
-    }
+    // it's common to show some text in the status bar before starting a
+    // relatively lengthy operation, ensure that the text is shown to the
+    // user immediately and not after the lengthy operation end
+    Update();
 }
 
 void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[])
 {
     // only set status widths when n == number of statuswindows
 }
 
 void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[])
 {
     // only set status widths when n == number of statuswindows
-    wxCHECK_RET( (size_t)n == m_panes.GetCount(), _T("status bar field count mismatch") );
+    wxCHECK_RET( (size_t)n == m_panes.GetCount(), wxT("status bar field count mismatch") );
 
     wxStatusBarBase::SetStatusWidths(n, widths_field);
 
 
     wxStatusBarBase::SetStatusWidths(n, widths_field);
 
@@ -202,7 +188,7 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[])
 
 bool wxStatusBarGeneric::ShowsSizeGrip() const
 {
 
 bool wxStatusBarGeneric::ShowsSizeGrip() const
 {
-    if ( !HasFlag(wxST_SIZEGRIP) )
+    if ( !HasFlag(wxSTB_SIZEGRIP) )
         return false;
 
     wxTopLevelWindow * const
         return false;
 
     wxTopLevelWindow * const
@@ -242,16 +228,34 @@ void wxStatusBarGeneric::DrawFieldText(wxDC& dc, const wxRect& rect, int i, int
     }
 
     // eventually ellipsize the text so that it fits the field width
     }
 
     // eventually ellipsize the text so that it fits the field width
-    text = wxControl::Ellipsize(
-        text, dc,
-        GetLayoutDirection() == wxLayout_RightToLeft ? wxELLIPSIZE_START : wxELLIPSIZE_END,
-        maxWidth,
-        wxELLIPSIZE_EXPAND_TAB);
-        // Ellipsize() will do something only if necessary
 
 
-    // update the ellipsization status for this pane; this is used to decide
-    // whether a tooltip should be shown or not for this pane
-    SetEllipsizedFlag(i, text != GetStatusText(i));
+    wxEllipsizeMode ellmode = (wxEllipsizeMode)-1;
+    if (HasFlag(wxSTB_ELLIPSIZE_START)) ellmode = wxELLIPSIZE_START;
+    else if (HasFlag(wxSTB_ELLIPSIZE_MIDDLE)) ellmode = wxELLIPSIZE_MIDDLE;
+    else if (HasFlag(wxSTB_ELLIPSIZE_END)) ellmode = wxELLIPSIZE_END;
+
+    if (ellmode == (wxEllipsizeMode)-1)
+    {
+        // if we have the wxSTB_SHOW_TIPS we must set the ellipsized flag even if
+        // we don't ellipsize the text but just truncate it
+        if (HasFlag(wxSTB_SHOW_TIPS))
+            SetEllipsizedFlag(i, dc.GetTextExtent(text).GetWidth() > maxWidth);
+
+        dc.SetClippingRegion(rect);
+    }
+    else
+    {
+        text = wxControl::Ellipsize(text, dc,
+                                    ellmode,
+                                    maxWidth,
+                                    wxELLIPSIZE_FLAGS_EXPAND_TABS);
+            // Ellipsize() will do something only if necessary
+
+        // update the ellipsization status for this pane; this is used later to
+        // decide whether a tooltip should be shown or not for this pane
+        // (if we have wxSTB_SHOW_TIPS)
+        SetEllipsizedFlag(i, text != GetStatusText(i));
+    }
 
 #if defined( __WXGTK__ ) || defined(__WXMAC__)
     xpos++;
 
 #if defined( __WXGTK__ ) || defined(__WXMAC__)
     xpos++;
@@ -260,6 +264,9 @@ void wxStatusBarGeneric::DrawFieldText(wxDC& dc, const wxRect& rect, int i, int
 
     // draw the text
     dc.DrawText(text, xpos, ypos);
 
     // draw the text
     dc.DrawText(text, xpos, ypos);
+
+    if (ellmode == (wxEllipsizeMode)-1)
+        dc.DestroyClippingRegion();
 }
 
 void wxStatusBarGeneric::DrawField(wxDC& dc, int i, int textHeight)
 }
 
 void wxStatusBarGeneric::DrawField(wxDC& dc, int i, int textHeight)
@@ -316,7 +323,7 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i, int textHeight)
 bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const
 {
     wxCHECK_MSG( (n >= 0) && ((size_t)n < m_panes.GetCount()), false,
 bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const
 {
     wxCHECK_MSG( (n >= 0) && ((size_t)n < m_panes.GetCount()), false,
-                 _T("invalid status bar field index") );
+                 wxT("invalid status bar field index") );
 
     if (m_widthsAbs.IsEmpty())
         return false;
 
     if (m_widthsAbs.IsEmpty())
         return false;
@@ -340,7 +347,7 @@ int wxStatusBarGeneric::GetFieldFromPoint(const wxPoint& pt) const
 
     // NOTE: we explicitely don't take in count the borders since they are only
     //       useful when rendering the status text, not for hit-test computations
 
     // NOTE: we explicitely don't take in count the borders since they are only
     //       useful when rendering the status text, not for hit-test computations
-    
+
     if (pt.y <= 0 || pt.y >= m_lastClientHeight)
         return wxNOT_FOUND;
 
     if (pt.y <= 0 || pt.y >= m_lastClientHeight)
         return wxNOT_FOUND;
 
@@ -349,7 +356,7 @@ int wxStatusBarGeneric::GetFieldFromPoint(const wxPoint& pt) const
     {
         if (pt.x > x && pt.x < x+m_widthsAbs[i])
             return i;
     {
         if (pt.x > x && pt.x < x+m_widthsAbs[i])
             return i;
-        
+
         x += m_widthsAbs[i];
     }
 
         x += m_widthsAbs[i];
     }