EditorGadget - Befehlssammlung [Windows]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

EditorGadget - Befehlssammlung [Windows]

Beitrag 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
Zuletzt geändert von Josef Sniatecki am 13.11.2009 20:36, insgesamt 2-mal geändert.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Re: Editorgadget - Befehlssammlung

Beitrag von Rings »

schreib doch bitte dabei das es nur unter windows funktioniert.
Rings hat geschrieben:ziert sich nich beim zitieren
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: EditorGadget - Befehlssammlung [Windows]

Beitrag von Andesdaf »

sehr schöne Codes! Danke dafür.
Win11 x64 | PB 6.20
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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).
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: EditorGadget - Befehlssammlung [Windows]

Beitrag von Andesdaf »

da hat man alles schön geballt, da kann ich mal schnell nachgucken ohne das dicke
Codearchiv durchforsten zu müssen. :wink:
Win11 x64 | PB 6.20
Antworten