Seite 1 von 1

EditorGadget - Befehlssammlung [Windows]

Verfasst: 11.11.2009 14:28
von Josef Sniatecki
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.

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
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

Re: Editorgadget - Befehlssammlung

Verfasst: 11.11.2009 15:50
von Rings
schreib doch bitte dabei das es nur unter windows funktioniert.

Re: EditorGadget - Befehlssammlung [Windows]

Verfasst: 13.11.2009 17:19
von Andesdaf
sehr schöne Codes! Danke dafür.

Verfasst: 13.11.2009 18:34
von Josef Sniatecki
Bitte. Im Prinzip ist das ganze wirklich nur eine Sammlung. Denn die meisten Codes sind ursprünglich aus dem Codearchiv, oder aus dem Forum. Natürlich habe ich aber auch selbst Arbeit hineingesteckt (in Prozeduren-gepackt und die bevorzugte PB-Notation verwendet).

Re: EditorGadget - Befehlssammlung [Windows]

Verfasst: 13.11.2009 19:07
von Andesdaf
da hat man alles schön geballt, da kann ich mal schnell nachgucken ohne das dicke
Codearchiv durchforsten zu müssen. :wink: