[Module] EditorEx (Custom Editor Gadget)

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
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

[Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Für ein plattformübergreifendes Projekt musste ich für die erweiterten Funktionen die Windows API-Befehle umgehen.
Die einzige wirklich praktikable Lösung war ein eigenes Editor Gadget zu erstellen:

Extended EditorGadget Module
  • Automatischer Zeilenumbruch & Silbentrennung
  • 'Weiches' Trennzeichen bzw. bedingter Trennstrich
  • Manueller Zeilenumbruch für WordWrap/Silbentrennung (Return bzw. Ctrl-Return bei vorhandenem automatischen Umbruch)
  • Fließtext für automatische Silbentrennung und WordWrap
  • Undo / Redo
  • Einfache Syntax-Hervorhebung (z.B. für Rechtschreibkontrolle)
  • (Automatische) Rechtschreibkontrolle (Highlighting u./o. Liste mit falschen Wörtern)
  • Automatisches Ausblenden der Scrollbars

Code: Alles auswählen

  ; EditEx::AddItem()                - Add text row at 'Position' (or #FirstRow / #LastRow)
  ; EditEx::AddToUserDictionary()    - Add a new word to user dictionary
  ; EditEx::AddWord()                - Add word to syntax highlighting
  ; EditEx::AttachPopup()            - Attach 'PopUpMenu' to gadget
  ; EditEx::ClearWords()             - Delete the list with the words for syntax highlighting
  ; EditEx::ClearUndo()              - Delete the list with Undo/Redo steps
  ; EditEx::Copy()                   - Copy selected text to clipboard
  ; EditEx::Cut()                    - Cut the selected text and copy it to the clipboard
  ; EditEx::DeleteSelection()        - Delete selected text (Remove selection: #True/#False)
  ; EditEx::DeleteWord()             - Delete word from syntax highlighting
  ; EditEx::EnableAutoSpellCheck()   - Activate automatic spelling correction
  ; EditEx::EnableSyntaxHighlight()  - Enable syntax highlighting (#False/#CaseSensitiv/#NoCase)
  ; EditEx::EnableUndoRedo()         - Enable 'Undo/Redo' function (#True/#False)
  ; EditEx::FreeDictionary()         - Removes the loaded dictionary from memory
  ; EditEx::GetAttribute()           - Returns value of attribute (#ReadOnly/#WordWrap/#Hyphenation/#AutoHide/#Border/#CtrlChars)
  ; EditEx::GetColor()               - Returns color of attribute (#FrontColor/#BackColor/#SyntaxColor/#SelectionColor)
  ; EditEx::GetItemText()            - Returns text row at 'Position'
  ; EditEx::GetSelection()           - Returns selected text (Remove selection: #True/#False)
  ; EditEx::GetText()                - Returns all text rows seperated by 'Seperator'
  ; EditEx::InsertText()             - Insert text at cursor position (or replace selection)
  ; EditEx::IsRedo()                 - Checks if an redo is possible
  ; EditEx::IsSelected()             - Returns whether a selection exists
  ; EditEx::IsUndo()                 - Checks if an undo is possible
  ; EditEx::LoadDictionary()         - Load the dictionary for spell checking
  ; EditEx::LoadHyphenationPattern() - Load hyphenation pattern for selected language (#Deutsch/#English/#French)
  ; EditEx::Redo()                   - Perform Redo
  ; EditEx::ReDraw()                 - Redraw the gadget
  ; EditEx::RemoveGadget()           - Releases the used memory and deletes the cursor thread
  ; EditEx::Paste()                  - Inserting text from the clipboard
  ; EditEx::SaveUserDictionary()     - Save user dictionary
  ; EditEx::SetAttribute()           - Enable/Disable attribute (#ReadOnly/#WordWrap/#Hyphenation/#AutoHide/#Border/#CtrlChars)
  ; EditEx::SetColor()               - Set or change color of attribute (#FrontColor/#BackColor/#SyntaxColor/#SelectionColor)
  ; EditEx::SetFont()                - Set or change font FontID(#Font)
  ; EditEx::SetItemText()            - Replace text row at 'Position'
  ; EditEx::SetText()                - Set or replace all text rows
  ; EditEx::SpellCheck()             - Checks the spelling of the word (returns: #True/#False)
  ; EditEx::SpellChecking()          - Check the spelling in the editor gadget (#Highlight/#WrongWords)
  ; EditEx::Undo()                   - Perform Undo
  ; -----------------------
  ; EditEx::Gadget()                 - Creates an editor gadget
  ; -----------------------
Download: EditorEx.pbi (mit Hyphen-Pattern & Wörterbuch)
Zuletzt geändert von Thorsten1867 am 23.11.2019 12:17, insgesamt 17-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von HeX0R »

Puuh ein EditorGadget mit einem CanvasGadget... darüber hatte ich auch mal (kurz) nachgedacht, aber da gab es mir ehrlich gesagt viel zu viele Stolpersteine.
Mit Deiner Version hier sind mir bei einem kurzen Test die folgenden Merkwürdigkeiten aufgefallen:
  • Setze den Cursor hinter das letzte Zeichen einer Zeile (mit der Maus!), und drücke "DEL" ->die ganze Zeile wird gelöscht, anstatt das letzte Zeichen
  • Setze den Cursor an die letzte Stelle hinter "Affenschar" mit der Maus und drücke Enter -> keine neue Zeile, der Cursor springt an den Anfang besagter Zeile
  • Wenn ich ein paar Leerzeilen am Ende habe und den Cursor in die letzte (leere) Zeile bewege, kann ich per Enter keine neuen Zeilen mehr erzeugen
  • Diese Fehler hier hatte ich auch mal, weiss gerade nicht mehr, wie ich sie heraufbeschworen habe:
    [20:07:02] [ERROR] EditorEx.pbi (Zeile: 1889)
    [20:07:02] [ERROR] SelectElement(): SelectElement(): Index-Wert kann nicht negativ sein.
    und
    [20:11:00] [ERROR] EditorEx.pbi (Zeile: 1719)
    [20:11:00] [ERROR] Die Liste hat kein aktuelles Element.
  • Doppelklicke unterhalb der letzten Zeile mit "Affenschar" ->
    [20:24:17] [ERROR] EditorEx.pbi (Zeile: 1936)
    [20:24:17] [ERROR] Die Liste hat kein aktuelles Element.
  • Füge ein paar Leerzeilen ans Ende dazu (bis sie ausserhalb des sichtbaren sind), dann gehe per Cursor-Up mit dem Cursor nach oben -> Da ist kein Cursor mehr
    (übrigens sollte der Text hier auch nach oben herausscrollen)
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Du hast völlig recht, so ein Editor Gadget ist wirklich tückisch und hat mich schon einige Nerven gekostet mit plötzlich auftretenden seltsamen Phänomen.

Ich versuche deinen Beobachtungen auf den Grund zu gehen.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Ich hoffe, ich habe alle Bugs erwischt:

Code: Alles auswählen

;{ ----- History -----
  ; [15/11/18] Bugfixes (Linked List/Return/Cursor)
;} -------------------
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von HeX0R »

Wird besser!
Damit Dir nicht langweilig wird:
  • Schiebe (in Deinem Beispiel) die Scrollbar ganz nach rechts, um das letzte Wort zu sehen, platziere den Cursor mit der Maus ganz hinten und drücke Enter -> Die Scrollbar sollte wieder nach links rücken und der Text sich entsprechend verschieben
    Bewege ich danach den Cursor mit Pfeil-Links, bewegt er sich aus dem Sichtfeld.
  • Setze den Cursor mit der Maus nach Affen, drücke Enter. -> Erst mal der Effekt von oben, das "schar" sieht man nicht. Aber ich würde erwarten einmal "Entf" zu drücken, würde die "schar" wieder herholen, ich muss aber zweimal drücken
  • Füge einige Leerzeilen ans untere Ende ein, und klicke in eine beliebige leere Zeile -> Der Cursor ist ein Zeichen zu weit rechts, und ich muss auch wieder zweimal Pfeil links drücken, um an den Rand zu kommen.
  • Selbes Beispiel, diesmal doppelklicken auf eine beliebige leere Zeile -> der Cursor verschwindet, bei einem Editor sollte der Cursor eigentlich nie verschwinden oder aus dem sichtbaren Bereich entschwinden
  • Kopiere die ersten beiden Zeilen und füge sie ans Ende ein -> Der Zeilenumbruch ist verschwunden.
Wenn's Dich nervt höre ich auf, im Moment würde ich das eh nicht brauchen, aber hier und da hätte ich sicherlich Verwendung dafür.
Aber dann sollte es sich schon wie ein "echter" Editor anfühlen und verhalten.
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Nachdem ich mich tagelang mit der Selektion mittels Cursor-Tasten (v.a. hoch/runter) herumgeschlagen habe und "nur knapp dem Wahnsinn entronnen bin", hier ein neues Update zum Testen.
(Wer weiß, vielleicht gibt es ja noch eine Ausnahme bei der Selektion, die mir bisher entgangen ist. Also bitte gründlich testen.)

Code: Alles auswählen

;{ ----- History -----
; [22/11/18] Syntax highlighting improved / Selection and cursor routines completely revised / Problems with unvisible control characters fixed
;} -------------------

; EditEx::EnableSyntaxHighlight() - Enable syntax highlighting (#False/#CaseSensitiv/#NoCase)
; EditEx::AddWord()               - Add word To syntax highlighting
; EditEx::DeleteWord()            - Delete word from syntax highlighting
; EditEx::ClearWords()            - Delete the list with the words for syntax highlighting
; EditEx::SetColor()              - Set or change color of attribute (#FrontColor/#BackColor/#SelectionColor/#SyntaxColor)
; EditEx::GetColor()              - Returns color of attribute (#FrontColor/#BackColor/#SelectionColor/#SyntaxColor)
Kopiere die ersten beiden Zeilen und füge sie ans Ende ein -> Der Zeilenumbruch ist verschwunden.
Das ist beabsichtigt (wg. WordWrap). Man kann nachträglich aber einen 'manuelle Zeilenumbruch' (Return bzw. Ctrl-Return) einfügen, die mitkopiert werden sollten.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Rechtschreibkontrolle hinzugefügt

Code: Alles auswählen

; EditEx::LoadDictionary()         - Load the dictionary for spell checking
; EditEx::SpellCheck()             - Checks the spelling of the word (returns: #True/#False)
; EditEx::SpellChecking()          - Check the spelling in the editor gadget (#Highlight/#WrongWords)
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Code: Alles auswählen

; [24/11/18] WordWrap and Hyphenation revised & Bugfixes
Benutzer-Wörterbuch:

Code: Alles auswählen

; EditEx::AddToUserDictionary()    - Add a new word to user dictionary
; EditEx::SaveUserDictionary()     - Save user dictionary
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Update:
  • Fließtext für automatische Silbentrennung und WordWrap
  • ResizeHandler (z.B. automatische Anpassung der Scrollbars)
  • zahlreiche Bugfixes

Code: Alles auswählen

[02/12/18] Continuous text for hyphenation and wordwrap & many Bugfixes[02/12/18] Continuous text for hyphenation and wordwrap & Resize Handler & many Bugfixes
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Code: Alles auswählen

[03/12/18] Syntax highlighting revised & Bugfixes
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Antworten