EditorGadget - Befehlssammlung [Windows]
Verfasst: 11.11.2009 14:28
Hallo an alle,
Ich stelle mal hier meine Sammlung aller EditorGadget-Befehle aus, die ich im Laufe der Zeit zusammenprogrammiert habe. Darunter gehören Befehle zum Formatieren (Schriftfarbe, Schriftart usw.), Selektieren und "Find&Replace"-Befehle, die ich eben hinzugefügt habe.
Im Code ist auch ein Beispiel für die Find&Replace-Befehle vorhanden.
Ich hoffe ihr könnt damit etwas anfangen.
Kommentare, Bugs und Erweiterungsvorschläge sind natürlich wie immer erwünscht.
Gruß Josef
Ich stelle mal hier meine Sammlung aller EditorGadget-Befehle aus, die ich im Laufe der Zeit zusammenprogrammiert habe. Darunter gehören Befehle zum Formatieren (Schriftfarbe, Schriftart usw.), Selektieren und "Find&Replace"-Befehle, die ich eben hinzugefügt habe.
Code: Alles auswählen
;**************************************************************
; Editor
;
; Autor: Josef Sniatecki
; Date: 11.09.2009
; Josef Sniatecki 2009 (c)
;**************************************************************
;******************************************
; Constants
;******************************************
#PB_EditorGadget_Bold = #CFM_BOLD
#PB_EditorGadget_Italic = #CFM_ITALIC
#PB_EditorGadget_Underline = #CFM_UNDERLINE
#PB_EditorGadget_Strikeout = #CFM_STRIKEOUT
#PB_FindText_CaseSensitive = #FR_MATCHCASE
#PB_FindText_WholeWord = #FR_WHOLEWORD
;******************************************
; Functions
;******************************************
Procedure.i EditorGadgetSelect(Gadget.i, StartIndex.i, EndIndex.i)
Protected Range.CHARRANGE
Range\cpMin = StartIndex
Range\cpMax = EndIndex
SendMessage_(GadgetID(Gadget), #EM_EXSETSEL, 0, @Range)
EndProcedure
Procedure.i EditorGadgetSelectXY(Gadget.i, StartLine.i, StartChar.i = 0, EndLine.i = -1, EndChar.i = -1)
Protected Range.CHARRANGE, GadgetID.i = GadgetID(Gadget)
Range\cpMin = SendMessage_(GadgetID, #EM_LINEINDEX, StartLine, 0) + StartChar - 1
If EndLine = -1
EndLine = SendMessage_(GadgetID, #EM_GETLINECOUNT, 0, 0) - 1
EndIf
Range\cpMax = SendMessage_(GadgetID, #EM_LINEINDEX, EndLine, 0)
If EndChar = -1
Range\cpMax + SendMessage_(GadgetID, #EM_LINELENGTH, Range\cpMax, 0)
Else
Range\cpMax + EndChar - 1
EndIf
SendMessage_(GadgetID, #EM_EXSETSEL, 0, @Range)
EndProcedure
Procedure.i EditorGadgetSelectAll(Gadget.i) ;Select the whole content of the editor gadget.
Protected Range.CHARRANGE
Range\cpMin = 0
Range\cpMax = -1
SendMessage_(GadgetID(Gadget), #EM_EXSETSEL, 0, @Range)
EndProcedure
Procedure.i EditorGadgetGetSelection(Gadget.i, *Selection.CHARRANGE) ;Get the range of the current selection.
SendMessage_(GadgetID(Gadget), #EM_EXGETSEL, 0, *Selection)
EndProcedure
Procedure.s EditorGadgetGetSelectedText(Gadget.i) ;Get the selected text.
Protected Text.s, Range.CHARRANGE, GadgetID.i = GadgetID(Gadget)
SendMessage_(GadgetID, #EM_EXGETSEL, 0, @Range)
Text = Space(Range\cpMax - Range\cpMin)
SendMessage_(GadgetID, #EM_GETSELTEXT, 0, @Text)
ProcedureReturn Text
EndProcedure
Procedure.i EditorGadgetReplaceSelection(Gadget.i, Text.s)
SendMessage_(GadgetID(Gadget), #EM_REPLACESEL, 0, @Text)
EndProcedure
Procedure.i EditorGadgetCursorX(Gadget.i)
Protected GadgetID.i = GadgetID(Gadget), Range.CHARRANGE
SendMessage_(GadgetID, #EM_EXGETSEL, 0, @Range)
ProcedureReturn (Range\cpMax - (SendMessage_(GadgetID, #EM_LINEINDEX, SendMessage_(GadgetID, #EM_EXLINEFROMCHAR, 0, Range\cpMin), 0)) + 1)
EndProcedure
Procedure.i EditorGadgetCursorY(Gadget.i)
Protected GadgetID.i = GadgetID(Gadget), Range.CHARRANGE
SendMessage_(GadgetID, #EM_EXGETSEL, 0, @Range)
ProcedureReturn SendMessage_(GadgetID, #EM_EXLINEFROMCHAR, 0, Range\cpMin) + 1
EndProcedure
Procedure.i EditorGadgetLines(Gadget.i)
ProcedureReturn SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)
EndProcedure
Procedure.i EditorGadgetSetStyle(Gadget.i, Style.i) ;Modify the font style of the selection.
Protected Format.CHARFORMAT
Format\cbSize = SizeOf(CHARFORMAT)
Format\dwMask = #CFM_ITALIC|#CFM_BOLD|#CFM_STRIKEOUT|#CFM_UNDERLINE
Format\dwEffects = Style
SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
EndProcedure
Procedure.i EditorGadgetSetColor(Gadget.i, Color.i) ;Set the foreground color of the current selection.
Protected Format.CHARFORMAT
Format\cbSize = SizeOf(CHARFORMAT)
Format\dwMask = #CFM_COLOR
Format\crTextColor = Color
SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
EndProcedure
Procedure.i EditorGadgetSetFont(Gadget.i, Name.s) ;Change the font family of the current selection.
Protected Format.CHARFORMAT
Format\cbSize = SizeOf(CHARFORMAT)
Format\dwMask = #CFM_FACE
PokeS(@Format\szFaceName, Name)
SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
EndProcedure
Procedure.i EditorGadgetSetFontSize(Gadget.i, Size.i) ;Change the font size of the current selection.
Protected Format.CHARFORMAT
Format\cbSize = SizeOf(CHARFORMAT)
Format\dwMask = #CFM_SIZE
Format\yHeight = Size * 20
SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
EndProcedure
Procedure.i EditorGadgetInsertText(Gadget.i, Text.s) ;Insert a text in the current position/selection.
SendMessage_(GadgetID(Gadget), #EM_REPLACESEL, 1 , @Text)
EndProcedure
Procedure.i EditorGadgetAppendText(Gadget.i, Text.s) ;Insert a text at the end of the whole text.
Protected GadgetID.i = GadgetID(Gadget)
SendMessage_(GadgetID, #EM_SETSEL , -1, -1)
SendMessage_(GadgetID, #EM_REPLACESEL, 1, @Text)
EndProcedure
Procedure.i EditorGadgetFindText(Gadget.i, Text.s, *Info.FINDTEXT, Flags.i = 0, Selection.i = #True)
Protected GadgetID.i = GadgetID(Gadget), Found.i, Info.FINDTEXT
If Not *Info
*Info = @Info
EndIf
*Info\lpstrText = @Text
If *Info\chrg\cpMin = 0
*Info\chrg\cpMax = -1
EndIf
SendMessage_(GadgetID, #EM_SETSEL, 0, 0)
Found = SendMessage_(GadgetID, #EM_FINDTEXT, Flags|#FR_DOWN, *Info)
If Found > -1
*Info\chrg\cpMin = Found + 1
If Selection
SendMessage_(GadgetID, #EM_SETSEL, Found, Found + Len(Text))
EndIf
EndIf
ProcedureReturn Found
EndProcedure
Procedure.i ResetFindTextPosition(*Info.FINDTEXT)
*Info\lpstrText = #Null
*Info\chrg\cpMin = 0
*Info\chrg\cpMax = -1
EndProcedure
Procedure.i EditorGadgetReplaceAll(Gadget.i, ToReplace.s, Text.s, Flags.i = 0)
Protected GadgetID.i = GadgetID(Gadget), Info.FINDTEXT, TextLength.i = Len(ToReplace)
Protected Count.i, Range.CHARRANGE
Info\lpstrText = @ToReplace
Info\chrg\cpMin = 0
Info\chrg\cpMax = -1
Flags|#FR_DOWN
SendMessage_(GadgetID, #EM_SETSEL, 0, 0)
Repeat
Found = SendMessage_(GadgetID, #EM_FINDTEXT, Flags, @Info)
If Found > -1
Info\chrg\cpMin = Found + 1
Range\cpMin = Found
Range\cpMax = Found + TextLength
SendMessage_(GadgetID, #EM_EXSETSEL, 0, @Range)
SendMessage_(GadgetID, #EM_REPLACESEL, 0, @Text)
Count + 1
Else
ProcedureReturn Count
EndIf
ForEver
EndProcedure
;******************************************
; Example
;******************************************
OpenWindow(0, 0, 0, 200, 200, "Find & Replace", #PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EditorGadget(0, 0, 0, 200, 180)
ButtonGadget(1, 0, 180, 200, 20, "Action")
SetGadgetText(0, "Hello world!")
AddGadgetItem(0, -1, "ABC abc")
AddGadgetItem(0, -1, "Blablabla")
AddGadgetItem(0, -1, "x, x, x")
Global Event.i, Window.i, Gadget.i
Global CurrentPosition.FINDTEXT, Time.i
Repeat
Event = WaitWindowEvent()
Window = EventWindow()
Gadget = EventGadget()
Select Window
Case 0
Select Event
Case #PB_Event_Gadget
Select Gadget
Case 1
Debug Time
Select Time
Case 0
EditorGadgetFindText(0, "world", #Null)
Case 1
; Auf Groß- und Kleinschreibung achten:
EditorGadgetFindText(0, "abc", #Null, #PB_FindText_CaseSensitive)
Case 2
EditorGadgetFindText(0, "abc", #Null)
Case 3, 4, 5, 6
; Nun wird die aktuelle Position gespeichert und
; wiederholt verwendet:
EditorGadgetFindText(0, "a", @CurrentPosition)
Case 7
; Jedes "x" durch "Pure Power" ersetzen:
EditorGadgetReplaceAll(0, "x", "Pure Power")
Case 8
; Das erste "l" im Text durch drei "l"s ersetzen:
EditorGadgetFindText(0, "l", #Null)
EditorGadgetReplaceSelection(0, "lll")
Case 9
Break
EndSelect
Time + 1
EndSelect
Case #PB_Event_CloseWindow
Break
EndSelect
EndSelect
ForEver
CloseWindow(0)
End
Ich hoffe ihr könnt damit etwas anfangen.
Kommentare, Bugs und Erweiterungsvorschläge sind natürlich wie immer erwünscht.
Gruß Josef