X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f4322df68b099e5e983acc0a3dad4ad5841b57b5..03a126c68c940c13a7a6c9ee183fa88e9b575a21:/src/gtk/stattext.cpp?ds=sidebyside diff --git a/src/gtk/stattext.cpp b/src/gtk/stattext.cpp index 6fe31c64c6..a10e98f85b 100644 --- a/src/gtk/stattext.cpp +++ b/src/gtk/stattext.cpp @@ -41,7 +41,7 @@ wxStaticText::wxStaticText(wxWindow *parent, long style, const wxString &name) { - Create( parent, id, label, pos, size, style, name ); + Create( parent, id, label, pos, size, style, name ); } bool wxStaticText::Create(wxWindow *parent, @@ -52,18 +52,14 @@ bool wxStaticText::Create(wxWindow *parent, long style, const wxString &name ) { - m_needParent = TRUE; - if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) { wxFAIL_MSG( wxT("wxStaticText creation failed") ); - return FALSE; + return false; } - const wxString labelGTK = GTKConvertMnemonics(label); - m_label = label; - m_widget = gtk_label_new_with_mnemonic(wxGTK_CONV(labelGTK)); + m_widget = gtk_label_new(NULL); GtkJustification justify; if ( style & wxALIGN_CENTER ) @@ -89,6 +85,24 @@ bool wxStaticText::Create(wxWindow *parent, gtk_label_set_line_wrap( GTK_LABEL(m_widget), TRUE ); +#ifdef __WXGTK26__ + if (!gtk_check_version(2,6,0)) + { + // set ellipsize mode + PangoEllipsizeMode ellipsizeMode = PANGO_ELLIPSIZE_NONE; + if ( style & wxST_ELLIPSIZE_START ) + ellipsizeMode = PANGO_ELLIPSIZE_START; + else if ( style & wxST_ELLIPSIZE_MIDDLE ) + ellipsizeMode = PANGO_ELLIPSIZE_MIDDLE; + else if ( style & wxST_ELLIPSIZE_END ) + ellipsizeMode = PANGO_ELLIPSIZE_END; + + gtk_label_set_ellipsize( GTK_LABEL(m_widget), ellipsizeMode ); + } +#endif // __WXGTK26__ + + SetLabel(label); + m_parent->DoAddChild( this ); PostCreation(size); @@ -110,20 +124,39 @@ bool wxStaticText::Create(wxWindow *parent, wxString wxStaticText::GetLabel() const { - GtkLabel *label = GTK_LABEL(m_widget); - wxString str = wxGTK_CONV_BACK( gtk_label_get_text( label ) ); - - return wxString(str); + // we need to return the label just like it was passed to the last call + // to SetLabel(): i.e. with wx-style mnemonics and with markup + return wxControl::GetLabel(); } -void wxStaticText::SetLabel( const wxString &label ) +void wxStaticText::SetLabel( const wxString& str ) { wxCHECK_RET( m_widget != NULL, wxT("invalid static text") ); - GTKSetLabelForLabel(GTK_LABEL(m_widget), label); + // save the label inside m_labelOrig in case user calls GetLabel() later + m_labelOrig = str; + + wxString label(str); + if (gtk_check_version(2,6,0) && + IsEllipsized()) + { + // GTK+ < 2.6 does not support ellipsization: + // since we need to use our generic code for ellipsization (which does not + // behaves well in conjunction with markup; i.e. it may break the markup + // validity erasing portions of the string), we also need to strip out + // the markup (if present) from the label. + + label = GetEllipsizedLabelWithoutMarkup(); + } + + if ( HasFlag(wxST_MARKUP) ) + GTKSetLabelWithMarkupForLabel(GTK_LABEL(m_widget), label); + else + GTKSetLabelForLabel(GTK_LABEL(m_widget), label); // adjust the label size to the new label unless disabled - if ( !HasFlag(wxST_NO_AUTORESIZE) ) + if ( !HasFlag(wxST_NO_AUTORESIZE) && + !IsEllipsized() ) // if ellipsize is ON, then we don't want to get resized! SetSize( GetBestSize() ); } @@ -171,6 +204,13 @@ void wxStaticText::DoSetSize(int x, int y, int sizeFlags ) { wxControl::DoSetSize( x, y, width, height, sizeFlags ); + + if (gtk_check_version(2,6,0)) + { + // GTK+ < 2.6 does not support ellipsization - we need to run our + // generic code (actually it will be run only if IsEllipsized() == true) + UpdateLabel(); + } } wxSize wxStaticText::DoGetBestSize() const @@ -178,8 +218,11 @@ wxSize wxStaticText::DoGetBestSize() const // Do not return any arbitrary default value... wxASSERT_MSG( m_widget, wxT("wxStaticText::DoGetBestSize called before creation") ); - // GetBestSize is supposed to return unwrapped size - gtk_label_set_line_wrap( GTK_LABEL(m_widget), FALSE ); + // GetBestSize is supposed to return unwrapped size but calling + // gtk_label_set_line_wrap() from here is a bad idea as it queues another + // size request by calling gtk_widget_queue_resize() and we end up in + // infinite loop sometimes (notably when the control is in a toolbar) + GTK_LABEL(m_widget)->wrap = FALSE; GtkRequisition req; req.width = -1; @@ -187,7 +230,7 @@ wxSize wxStaticText::DoGetBestSize() const (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(m_widget) )->size_request ) (m_widget, &req ); - gtk_label_set_line_wrap( GTK_LABEL(m_widget), TRUE ); + GTK_LABEL(m_widget)->wrap = TRUE; // restore old value // Adding 1 to width to workaround GTK sometimes wrapping the text needlessly return wxSize (req.width+1, req.height); @@ -212,6 +255,20 @@ void wxStaticText::GTKWidgetDoSetMnemonic(GtkWidget* w) gtk_label_set_mnemonic_widget(GTK_LABEL(m_widget), w); } + +// These functions should be used only when GTK+ < 2.6 by wxStaticTextBase::UpdateLabel() + +wxString wxStaticText::DoGetLabel() const +{ + GtkLabel *label = GTK_LABEL(m_widget); + return wxGTK_CONV_BACK( gtk_label_get_text( label ) ); +} + +void wxStaticText::DoSetLabel(const wxString& str) +{ + GTKSetLabelForLabel(GTK_LABEL(m_widget), str); +} + // static wxVisualAttributes wxStaticText::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))