; Module/File: Editor_AddHyperLink.pb ; Function: Add HyperLink to text in a EditorGadget - Linux gtk2/gtk3 ; Author: Omi ; Date: Jul. 11, 2017 ; Version: 0.1 ; Target Compiler: PureBasic 5.22/5.31/5.40/5.50/5.60 ; Target OS: Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni ;-------------------------------------------------------------- EnableExplicit ImportC "" gtk_link_button_get_uri(*link_button) gtk_label_set_markup(*label.GtkWidget, markup.p-utf8) g_markup_escape_text(text.p-utf8, length) gtk_link_button_new_with_label(uri.p-utf8, label.p-utf8) gtk_text_buffer_insert(*buffer.GtkTextBuffer, *iter, text.p-utf8, len) g_signal_connect(*instance, detailed_signal.p-utf8, *c_handler, *data, destroy= 0, flags= 0) As "g_signal_connect_data" gtk_widget_set_tooltip_text(*widget.GtkWidget, text.p-utf8) gtk_widget_set_has_tooltip(*widget.GtkWidget, has_tooltip) EndImport ; Object constants #Win_Main = 0 #Edt1 = 0 Global.i gEvent, gQuit Global *gBuffer ProcedureC Callback_EditorButtonClicked(*link_button.GtkButton, user_data) Debug "GtkLinkButton clicked. Widget: " + Str(*link_button) + " with URI: " + PeekS(gtk_link_button_get_uri(*link_button), -1, #PB_UTF8) + " at anchor " + Str(user_data) EndProcedure ProcedureC Callback_EditorLinkLabelClicked(*widget, *uri, user_data) Debug "GtkLabel as link clicked. Widget: " + Str(*widget) + " with URI: " + PeekS(*uri, -1, #PB_UTF8) + " at anchor " + Str(user_data) EndProcedure Procedure Editor_FindAnchor(*iter.GtkTextIter) While gtk_text_iter_forward_char_(*iter) If gtk_text_iter_get_child_anchor_(*iter) ProcedureReturn #True EndIf Wend ProcedureReturn #False EndProcedure Procedure Editor_InsertText(buffer) Protected.GtkTextIter iter Protected.s S Protected *anchor.GtkTextChildAnchor S= "A little text to demonstrate how a HyperLink can be placed to the text in the Pure-Basic EditorGadget. " + #LF$ + #LF$ + "There are several options:" + #LF$ + #LF$ + "One way is to place a LinkButton like this ..." + #LF$ + " " gtk_text_buffer_get_iter_at_offset_(buffer, @iter, 0) gtk_text_buffer_insert(buffer, @iter, S, -1) *anchor= gtk_text_buffer_create_child_anchor_(buffer, @iter); Place 1. anchor for 1. link gtk_text_buffer_insert(buffer, @iter, #LF$ + #LF$ + "Another way is to misuse a TextGadget (GtkLabel) as HyperLink like this..." + #LF$, -1) *anchor= gtk_text_buffer_create_child_anchor_(buffer, @iter); Place 2. anchor for 2. link gtk_text_buffer_insert(buffer, @iter, #LF$ + #LF$ + "So try it.", -1) EndProcedure Procedure Editor_AttachWidgets(Gadget) Protected iter.GtkTextIter Protected *anchor.GtkTextChildAnchor Protected *buffer.GtkTextBuffer= gtk_text_view_get_buffer_(GadgetID(Gadget)) Protected *widget.GtkWidget Protected.i I gtk_text_buffer_get_start_iter_(*buffer, @iter) While Editor_FindAnchor(@iter) *anchor= gtk_text_iter_get_child_anchor_(@iter) If I = 0; 1. anchor: place 1. *widget with URL *widget= gtk_link_button_new_with_label ("http://www.chabba.de/", "A GtkLinkButton"); A GtkLinkButton g_signal_connect(*widget, "clicked", @Callback_EditorButtonClicked(), 0) ElseIf I = 1; 2. anchor: place 2. *widget with URL *widget= gtk_label_new_(""); A GtkLabel with markup gtk_label_set_markup(*widget, " A link to a PureBasic forums thread: http://www.purebasic.fr/english/....") gtk_label_set_use_markup_(*widget, #True) ;tooltips don't work at a 1. trial ; gtk_widget_set_tooltip_text(*widget, "text") ; gtk_widget_set_has_tooltip(*widget, #True) g_signal_connect(*widget, "activate-link", @Callback_EditorLinkLabelClicked(), 1) EndIf gtk_text_view_add_child_at_anchor_(GadgetID(Gadget), *widget, *anchor); add widget at anchor gtk_widget_show_all_(*widget) I+ 1 Wend EndProcedure If OpenWindow(#Win_Main, 0, 0, 500, 235, "Editor - Add hyperlinks", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) EditorGadget(#Edt1, 5, 5, 490, 225, #PB_Editor_ReadOnly | #PB_Editor_WordWrap) *gBuffer= gtk_text_view_get_buffer_(GadgetID(#Edt1)) Editor_InsertText(*gBuffer) Editor_AttachWidgets(#Edt1) Repeat gEvent= WaitWindowEvent() Select gEvent Case #PB_Event_CloseWindow gQuit= #True Case #PB_Event_Gadget Select EventGadget() EndSelect EndSelect Until gQuit EndIf ; IDE Options = PureBasic 5.46 LTS Beta 2 (Linux - x86) ; CursorPosition = 75 ; FirstLine = 37 ; Folding = - ; EnableUnicode ; EnableXP ; Executable = EditorLink