1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) 1998 Robert Roebling 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  10 // For compilers that support precompilation, includes "wx.h". 
  11 #include "wx/wxprec.h" 
  15 #include "wx/stattext.h" 
  16 #include "wx/gtk/private.h" 
  18 //----------------------------------------------------------------------------- 
  20 //----------------------------------------------------------------------------- 
  22 IMPLEMENT_DYNAMIC_CLASS(wxStaticText
,wxControl
) 
  24 wxStaticText::wxStaticText() 
  28 wxStaticText::wxStaticText(wxWindow 
*parent
, 
  30                            const wxString 
&label
, 
  36     Create( parent
, id
, label
, pos
, size
, style
, name 
); 
  39 bool wxStaticText::Create(wxWindow 
*parent
, 
  41                           const wxString 
&label
, 
  45                           const wxString 
&name 
) 
  47     if (!PreCreation( parent
, pos
, size 
) || 
  48         !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name 
)) 
  50         wxFAIL_MSG( wxT("wxStaticText creation failed") ); 
  54     m_widget 
= gtk_label_new(NULL
); 
  55     g_object_ref(m_widget
); 
  57     GtkJustification justify
; 
  58     if ( style 
& wxALIGN_CENTER_HORIZONTAL 
) 
  59       justify 
= GTK_JUSTIFY_CENTER
; 
  60     else if ( style 
& wxALIGN_RIGHT 
) 
  61       justify 
= GTK_JUSTIFY_RIGHT
; 
  63       justify 
= GTK_JUSTIFY_LEFT
; 
  65     if (GetLayoutDirection() == wxLayout_RightToLeft
) 
  67         if (justify 
== GTK_JUSTIFY_RIGHT
) 
  68             justify 
= GTK_JUSTIFY_LEFT
; 
  69         else if (justify 
== GTK_JUSTIFY_LEFT
) 
  70             justify 
= GTK_JUSTIFY_RIGHT
; 
  73     gtk_label_set_justify(GTK_LABEL(m_widget
), justify
); 
  76     if (!gtk_check_version(2,6,0)) 
  79         PangoEllipsizeMode ellipsizeMode 
= PANGO_ELLIPSIZE_NONE
; 
  80         if ( style 
& wxST_ELLIPSIZE_START 
) 
  81             ellipsizeMode 
= PANGO_ELLIPSIZE_START
; 
  82         else if ( style 
& wxST_ELLIPSIZE_MIDDLE 
) 
  83             ellipsizeMode 
= PANGO_ELLIPSIZE_MIDDLE
; 
  84         else if ( style 
& wxST_ELLIPSIZE_END 
) 
  85             ellipsizeMode 
= PANGO_ELLIPSIZE_END
; 
  87         gtk_label_set_ellipsize( GTK_LABEL(m_widget
), ellipsizeMode 
); 
  91     // GTK_JUSTIFY_LEFT is 0, RIGHT 1 and CENTER 2 
  92     static const float labelAlignments
[] = { 0.0, 1.0, 0.5 }; 
  93     gtk_misc_set_alignment(GTK_MISC(m_widget
), labelAlignments
[justify
], 0.0); 
  95     gtk_label_set_line_wrap( GTK_LABEL(m_widget
), TRUE 
); 
  99     m_parent
->DoAddChild( this ); 
 106 void wxStaticText::SetLabel( const wxString
& str 
) 
 108     wxCHECK_RET( m_widget 
!= NULL
, wxT("invalid static text") ); 
 110     // save the label inside m_labelOrig in case user calls GetLabel() later 
 113     InvalidateBestSize(); 
 116     if (gtk_check_version(2,6,0) && 
 119         // GTK+ < 2.6 does not support ellipsization: 
 120         // since we need to use our generic code for ellipsization (which does not 
 121         // behaves well in conjunction with markup; i.e. it may break the markup 
 122         // validity erasing portions of the string), we also need to strip out 
 123         // the markup (if present) from the label. 
 125         label 
= GetEllipsizedLabelWithoutMarkup(); 
 128     if ( HasFlag(wxST_MARKUP
) ) 
 129         GTKSetLabelWithMarkupForLabel(GTK_LABEL(m_widget
), label
); 
 131         GTKSetLabelForLabel(GTK_LABEL(m_widget
), label
); 
 133     // adjust the label size to the new label unless disabled 
 134     if ( !HasFlag(wxST_NO_AUTORESIZE
) && 
 135          !IsEllipsized() )  // if ellipsization is ON, then we don't want to get resized! 
 136         SetSize( GetBestSize() ); 
 139 bool wxStaticText::SetFont( const wxFont 
&font 
) 
 141     const bool wasUnderlined 
= GetFont().GetUnderlined(); 
 143     bool ret 
= wxControl::SetFont(font
); 
 145     if ( font
.GetUnderlined() != wasUnderlined 
) 
 147         // the underlines for mnemonics are incompatible with using attributes 
 148         // so turn them off when setting underlined font and restore them when 
 150         gtk_label_set_use_underline(GTK_LABEL(m_widget
), wasUnderlined
); 
 154             // it's not underlined any more, remove the attributes we set 
 155             gtk_label_set_attributes(GTK_LABEL(m_widget
), NULL
); 
 157         else // the text is underlined now 
 159             PangoAttrList 
*attrs 
= pango_attr_list_new(); 
 160             PangoAttribute 
*a 
= pango_attr_underline_new(PANGO_UNDERLINE_SINGLE
); 
 162             a
->end_index 
= (guint
)-1; 
 163             pango_attr_list_insert(attrs
, a
); 
 164             gtk_label_set_attributes(GTK_LABEL(m_widget
), attrs
); 
 165             pango_attr_list_unref(attrs
); 
 169     // adjust the label size to the new label unless disabled 
 170     if (!HasFlag(wxST_NO_AUTORESIZE
)) 
 172         SetSize( GetBestSize() ); 
 177 void wxStaticText::DoSetSize(int x
, int y
, 
 178                              int width
, int height
, 
 181     wxStaticTextBase::DoSetSize(x
, y
, width
, height
, sizeFlags
); 
 183     if (gtk_check_version(2,6,0)) 
 185         // GTK+ < 2.6 does not support ellipsization - we need to run our 
 186         // generic code (actually it will be run only if IsEllipsized() == true) 
 191 wxSize 
wxStaticText::DoGetBestSize() const 
 193     // Do not return any arbitrary default value... 
 194     wxASSERT_MSG( m_widget
, wxT("wxStaticText::DoGetBestSize called before creation") ); 
 196     // GetBestSize is supposed to return unwrapped size but calling 
 197     // gtk_label_set_line_wrap() from here is a bad idea as it queues another 
 198     // size request by calling gtk_widget_queue_resize() and we end up in 
 199     // infinite loop sometimes (notably when the control is in a toolbar) 
 200     GTK_LABEL(m_widget
)->wrap 
= FALSE
; 
 202     wxSize size 
= wxStaticTextBase::DoGetBestSize(); 
 204     GTK_LABEL(m_widget
)->wrap 
= TRUE
; // restore old value 
 206     // Adding 1 to width to workaround GTK sometimes wrapping the text needlessly 
 212 bool wxStaticText::GTKWidgetNeedsMnemonic() const 
 217 void wxStaticText::GTKWidgetDoSetMnemonic(GtkWidget
* w
) 
 219     gtk_label_set_mnemonic_widget(GTK_LABEL(m_widget
), w
); 
 223 // These functions should be used only when GTK+ < 2.6 by wxStaticTextBase::UpdateLabel() 
 225 wxString 
wxStaticText::DoGetLabel() const 
 227     GtkLabel 
*label 
= GTK_LABEL(m_widget
); 
 228     return wxGTK_CONV_BACK( gtk_label_get_text( label 
) ); 
 231 void wxStaticText::DoSetLabel(const wxString
& str
) 
 233     // this function looks like GTKSetLabelForLabel() but here we just want to modify 
 234     // the GTK control without altering any internal wxStaticText variable 
 236     const wxString labelGTK 
= GTKConvertMnemonics(str
); 
 237     gtk_label_set_text_with_mnemonic(GTK_LABEL(m_widget
), wxGTK_CONV(labelGTK
)); 
 242 wxStaticText::GetClassDefaultAttributes(wxWindowVariant 
WXUNUSED(variant
)) 
 244     return GetDefaultAttributesFromGTKWidget(gtk_label_new
); 
 247 #endif // wxUSE_STATTEXT