Code: Select all
; Place the cursor position in a text gadget
;
; Help from the PB forum user: mestnyi - https://www.purebasic.fr/english/viewtopic.php?f=13&t=72277
;
; V1.0 - 13/FEB/2019
Procedure ScrollToEnd(gadget) ;scrolls text window to last line
Protected end_mark,*buffer, end_iter.GtkTextIter
*buffer=gtk_text_view_get_buffer_(GadgetID(gadget))
gtk_text_buffer_get_end_iter_(*buffer,@end_iter)
end_mark=gtk_text_buffer_create_mark_(*buffer,"end_mark",@end_iter,#False)
gtk_text_view_scroll_mark_onscreen_(GadgetID(gadget),end_mark)
EndProcedure
Procedure SetCursorPos(Id.l,pos.l)
Protected mypointertoiteration.GtkTextIter, *buffer
*buffer = gtk_text_view_get_buffer_(GadgetID(Id))
gtk_text_buffer_get_iter_at_offset_(*buffer,@mypointertoiteration,pos)
gtk_text_buffer_place_cursor_(*buffer,@mypointertoiteration)
EndProcedure
Procedure.l GetCursorPos(Id.l)
Protected mypointertoiteration.GtkTextIter, *buffer,cursor.l
*buffer = gtk_text_view_get_buffer_(GadgetID(Id))
cursor = gtk_text_buffer_get_insert_(*buffer)
gtk_text_buffer_get_iter_at_mark_(*buffer, @mypointertoiteration, cursor)
ProcedureReturn gtk_text_iter_get_offset_(@mypointertoiteration)
EndProcedure
Procedure SetPos(Gadget, Position)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
If GadgetType( Gadget) = #PB_GadgetType_Editor
Protected PositionIter.GtkTextIter
Protected mark, *iter.GtkTextIter
Protected *buffer = gtk_text_view_get_buffer_(GadgetID(Gadget))
gtk_text_buffer_get_iter_at_offset_(*buffer, @PositionIter, Position)
gtk_text_buffer_place_cursor_(*buffer, PositionIter)
mark=gtk_text_buffer_create_mark_(*buffer,"cursor", PositionIter, #False);//create a mark in the buffer to scroll to
gtk_text_view_scroll_to_mark_(GadgetID(Gadget),mark,0,#False,0,0) ; //scroll to the mark
; gtk_text_view_scroll_to_iter_(GadgetID(gadget), PositionIter, 0,#False,0,0)
Else
gtk_editable_set_position_( GadgetID(Gadget), Position )
EndIf
CompilerCase #PB_OS_MacOS
Protected Range.NSRange : Range\location = Position
CocoaMessage(0, GadgetID(Gadget), "setSelectedRange:@", @Range)
CocoaMessage(0, GadgetID(Gadget), "scrollRangeToVisible:@", @Range)
CompilerCase #PB_OS_Windows
SendMessage_(GadgetID(Gadget), #EM_SETSEL, Position, Position)
CompilerEndSelect
EndProcedure
If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
EditorGadget(0, 8, 8, 306, 133)
For a = 0 To 15
AddGadgetItem(0, a, "Line "+Str(a))
Next
SetActiveGadget(0)
SetPos(0, 52)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf