1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk/hyperlink.cpp 
   3 // Purpose:     Hyperlink control 
   4 // Author:      Francesco Montorsi 
   7 // Copyright:   (c) 2007 Francesco Montorsi 
   8 // Licence:     wxWindows licence 
   9 ///////////////////////////////////////////////////////////////////////////// 
  11 // ============================================================================ 
  13 // ============================================================================ 
  15 // -------------------------------------------------------------------------- 
  17 // -------------------------------------------------------------------------- 
  19 // For compilers that support precompilation, includes "wx.h". 
  20 #include "wx/wxprec.h" 
  26 #if wxUSE_HYPERLINKCTRL && defined(__WXGTK210__) && !defined(__WXUNIVERSAL__) 
  28 #include "wx/hyperlink.h" 
  34 #include "wx/gtk/private.h" 
  36 // ---------------------------------------------------------------------------- 
  38 // ---------------------------------------------------------------------------- 
  40 static inline bool UseNative() 
  42     // native gtk_link_button widget is only available in GTK+ 2.10 and later 
  43     return !gtk_check_version(2, 10, 0); 
  46 // ============================================================================ 
  48 // ============================================================================ 
  50 // ---------------------------------------------------------------------------- 
  52 // ---------------------------------------------------------------------------- 
  55 static void gtk_hyperlink_clicked_callback( GtkWidget 
*WXUNUSED(widget
), 
  56                                             wxHyperlinkCtrl 
*linkCtrl 
) 
  59     linkCtrl
->SendEvent(); 
  63 // ---------------------------------------------------------------------------- 
  65 // ---------------------------------------------------------------------------- 
  67 bool wxHyperlinkCtrl::Create(wxWindow 
*parent
, wxWindowID id
, 
  68     const wxString
& label
, const wxString
& url
, const wxPoint
& pos
, 
  69     const wxSize
& size
, long style
, const wxString
& name
) 
  73         // do validation checks: 
  74         CheckParams(label
, url
, style
); 
  76         if (!PreCreation( parent
, pos
, size 
) || 
  77             !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name 
)) 
  79             wxFAIL_MSG( wxT("wxHyperlinkCtrl creation failed") ); 
  83         m_widget 
= gtk_link_button_new("asdfsaf asdfdsaf asdfdsa"); 
  84         g_object_ref(m_widget
); 
  85         gtk_widget_show(m_widget
); 
  88         float x_alignment 
= 0.5; 
  89         if (HasFlag(wxHL_ALIGN_LEFT
)) 
  91         else if (HasFlag(wxHL_ALIGN_RIGHT
)) 
  93         gtk_button_set_alignment(GTK_BUTTON(m_widget
), x_alignment
, 0.5); 
  95         // set to non empty strings both the url and the label 
  96         SetURL(url
.empty() ? label 
: url
); 
  97         SetLabel(label
.empty() ? url 
: label
); 
  99         // our signal handlers: 
 100         g_signal_connect_after (m_widget
, "clicked", 
 101                                 G_CALLBACK (gtk_hyperlink_clicked_callback
), 
 104         m_parent
->DoAddChild( this ); 
 108         // wxWindowGTK will connect to the enter_notify and leave_notify GTK+ signals 
 109         // thus overriding GTK+'s internal signal handlers which set the cursor of 
 110         // the widget - thus we need to manually set it here: 
 111         SetCursor(wxCursor(wxCURSOR_HAND
)); 
 114         return wxGenericHyperlinkCtrl::Create(parent
, id
, label
, url
, pos
, size
, style
, name
); 
 119 wxSize 
wxHyperlinkCtrl::DoGetBestSize() const 
 122         return wxControl::DoGetBestSize(); 
 123     return wxGenericHyperlinkCtrl::DoGetBestSize(); 
 126 void wxHyperlinkCtrl::SetLabel(const wxString 
&label
) 
 130         wxControl::SetLabel(label
); 
 131         const wxString labelGTK 
= GTKConvertMnemonics(label
); 
 132         gtk_button_set_label(GTK_BUTTON(m_widget
), wxGTK_CONV(labelGTK
)); 
 135         wxGenericHyperlinkCtrl::SetLabel(label
); 
 138 void wxHyperlinkCtrl::SetURL(const wxString 
&uri
) 
 141         gtk_link_button_set_uri(GTK_LINK_BUTTON(m_widget
), wxGTK_CONV(uri
)); 
 143         wxGenericHyperlinkCtrl::SetURL(uri
); 
 146 wxString 
wxHyperlinkCtrl::GetURL() const 
 150         const gchar 
*str 
= gtk_link_button_get_uri(GTK_LINK_BUTTON(m_widget
)); 
 151         return wxString::FromUTF8(str
); 
 154     return wxGenericHyperlinkCtrl::GetURL(); 
 157 void wxHyperlinkCtrl::SetNormalColour(const wxColour 
&colour
) 
 161         // simply do nothing: GTK+ does not allow us to change it :( 
 164         wxGenericHyperlinkCtrl::SetNormalColour(colour
); 
 167 wxColour 
wxHyperlinkCtrl::GetNormalColour() const 
 172         GdkColor 
*link_color 
= NULL
; 
 174         // convert GdkColor in wxColour 
 175         gtk_widget_style_get(m_widget
, "link-color", &link_color
, NULL
); 
 177             ret 
= wxColour(*link_color
); 
 178         gdk_color_free (link_color
); 
 181         ret 
= wxGenericHyperlinkCtrl::GetNormalColour(); 
 186 void wxHyperlinkCtrl::SetVisitedColour(const wxColour 
&colour
) 
 190         // simply do nothing: GTK+ does not allow us to change it :( 
 193         wxGenericHyperlinkCtrl::SetVisitedColour(colour
); 
 196 wxColour 
wxHyperlinkCtrl::GetVisitedColour() const 
 201         GdkColor 
*link_color 
= NULL
; 
 203         // convert GdkColor in wxColour 
 204         gtk_widget_style_get(m_widget
, "visited-link-color", &link_color
, NULL
); 
 206             ret 
= wxColour(*link_color
); 
 207         gdk_color_free (link_color
); 
 210         return wxGenericHyperlinkCtrl::GetVisitedColour(); 
 215 void wxHyperlinkCtrl::SetHoverColour(const wxColour 
&colour
) 
 219         // simply do nothing: GTK+ does not allow us to change it :( 
 222         wxGenericHyperlinkCtrl::SetHoverColour(colour
); 
 225 wxColour 
wxHyperlinkCtrl::GetHoverColour() const 
 229         // hover colour == normal colour for native GTK+ widget 
 230         return GetNormalColour(); 
 233     return wxGenericHyperlinkCtrl::GetHoverColour(); 
 236 GdkWindow 
*wxHyperlinkCtrl::GTKGetWindow(wxArrayGdkWindows
& windows
) const 
 238     return UseNative() ? GTK_BUTTON(m_widget
)->event_window
 
 239                        : wxGenericHyperlinkCtrl::GTKGetWindow(windows
); 
 242 #endif // wxUSE_HYPERLINKCTRL && GTK+ 2.10+