Re: SetGadgetState for EditorGadget [Resolved]
Posted: Wed Nov 14, 2012 12:42 pm
I have taken luis' code, modified it slightly and added the necessary API functions for Linux and MacOS (both Carbon and Cocoa framework). Now this code example can be run in Windows, Linux and MacOS X . MacOS users with PB 5 using the default subsystem (Cocoa) should notice that wilbert's CocoaMessage userlib must have been installed before they can execute this code!Ulix wrote:Y does the same code for linux?
Code: Select all
EnableExplicit
CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
CompilerIf #PB_Compiler_Version < 500 Or (#PB_Compiler_Version >= 500 And Subsystem("Carbon"))
ImportC ""
GetControlProperty(ControlRef.L, PropertyCreator.L, PropertyTag.L, BufferSize.L, *ActualSize, *PropertyBuffer)
TXNSetSelection(TXNObject.L, StartOffset.L, EndOffset.L)
TXNShowSelection(TXNObject.L, ShowEnd.L)
EndImport
CompilerEndIf
CompilerEndIf
Procedure SelectEditorLine(EditorID.I, LineNumber.I)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Protected EndOfLine.GtkTextIter
Protected StartOfLine.GtkTextIter
Protected *TextBuffer.GtkTextBuffer
*TextBuffer = gtk_text_view_get_buffer_(GadgetID(EditorID))
gtk_text_buffer_get_iter_at_line_(*TextBuffer, @StartOfLine, LineNumber)
gtk_text_view_scroll_to_iter_(GadgetID(EditorID), StartOfLine, 0.0, #False, 0.0, 0.0)
EndOfLine = StartOfLine
gtk_text_iter_forward_to_line_end_(EndOfLine)
gtk_text_buffer_select_range_(*TextBuffer, StartOfLine, EndOfLine)
CompilerCase #PB_OS_MacOS
CompilerIf #PB_Compiler_Version < 470 Or (#PB_Compiler_Version >= 500 And Subsystem("Carbon"))
Protected EndOfLine.L
Protected StartOfLine.L
Protected TXNObject.L
If GetControlProperty(GadgetID(EditorID), $50555245, $54584F42, 4, 0, @TXNObject) = 0
StartOfLine = FindString(GetGadgetText(EditorID), GetGadgetItemText(EditorID, LineNumber)) - 1
EndOfLine = StartOfLine + Len(GetGadgetItemText(EditorID, LineNumber))
TXNSetSelection(TXNObject, StartOfLine, EndOfLine)
TXNShowSelection(TXNObject, #True)
EndIf
CompilerElse
Protected Range.NSRange
Range\location = FindString(GetGadgetText(EditorID), GetGadgetItemText(EditorID, LineNumber)) - 1
Range\length = Len(GetGadgetItemText(EditorID, LineNumber))
CocoaMessage(0, GadgetID(EditorID), "setSelectedRange:@", @Range)
CocoaMessage(0, GadgetID(EditorID), "scrollRangeToVisible:@", @Range)
CompilerEndIf
CompilerCase #PB_OS_Windows
Protected Selection.CHARRANGE
Protected StartOfLine.I
StartOfLine = SendMessage_(GadgetID(EditorID), #EM_LINEINDEX, LineNumber, 0)
Selection.CHARRANGE\cpMin = StartOfLine
Selection.CHARRANGE\cpMax = StartOfLine + Len(GetGadgetItemText(EditorID, LineNumber)) + 1
SendMessage_(GadgetID(EditorID), #EM_EXSETSEL, 0, @Selection)
CompilerEndSelect
EndProcedure
Define i.I
OpenWindow(0, 270, 100, 200, 154, "Select line by line", #PB_Window_SystemMenu)
EditorGadget(0, 5, 5, 190, 144)
For i = 1 To 15
AddGadgetItem(0, - 1, "Line number " + Trim(Str(i)))
Next
For i = 0 To CountGadgetItems(0) - 1
SelectEditorLine(0, i)
Delay(400)
Repeat
Select WindowEvent()
Case 0
Break
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Next i
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Update 2: In the Linux part the code line
Code: Select all
gtk_text_view_scroll_to_iter_(GadgetID(EditorID), StartOfLine, 0.0, #False, 0.0, 0.0)
Update 3: The Mac part has been extended to also run with PB 4 or PB 5 with subsystem Carbon.