[dll] ajout d'un contrôle richedit scintilla sur les dialogbox mirc


Description

Bonjour,
Ne sachant pas trop quoi faire pour ma première DLL, je me suis dit qu'il pouvait être bon d'offrir la possibilité aux scripteurs d'utiliser un nouveau contrôle sur leurs dialogboxes : il s'agit d'une sorte de richedit conçu spécialement pour les éditeurs de texte. Il peut être utile pour "remplacer" l'éditeur de scripts de mIRC ou créer des addons, et peut combler le manque de DCX.dll quant aux richedits.
Ce projet est une simple adaptation pour mIRC du projet Scintilla, libre et open source, utilisé pour la programmation compilée de parsers et éditeurs.
Je sais que la programmation d'un tel contrôle n'est déjà pas évidente pour un programmeur C/C++, alors j'ai voulu faire quelque chose de très simple pour les scripteurs.
En bref, ce contrôle permet :
- coloration syntaxique du texte selon le lexique de mIRC ou un lexique prédéfini par le scripteur
- surbrillance des accolades et balises ouverts
- folding (affichage/masquage de blocs)
- affichage des numéros de lignes
- modification de la sélection
- zoom de la zone de texte
- guides d'indentation
- affichage de caractères invisibles (fins de lignes, tabulations, espaces, etc)
et bien d'autres fonctions utiles à un éditeur de texte :
- ajout de texte
- rechercher avancée de texte (sélection automatique ou fenêtre d'information, comme dans le bloc note)
- annuler/refaire dernière action
- remplacement de la sélection
- retrouver une ligne en fonction d'une position ou l'inverse
- retrouver un caractère selon la position
- sélectionner du texte
etc...

Pour faciliter le scripting, ce contrôle renvoit des notifications au travers d'une alias callback. Il est donc possible de détecter :
- ajout de caractère
- clic de souris (pour le folding)
- double-clic
- mise en surbrillance
- zoom
- modification du texte (insertion ou suppression de texte)

Un fichier d'aide au format xhtml est disponible dans le zip, ainsi que 3 exemples (niveaux débutant, intermédiaire et initié), également visibles ci-dessous.
L'aide, bien que peu ergonomique (désolé, le xhtml n'est pas mon fort) est également visible en ligne sur http://uaipcreations.ovh.org/Aide_Scintilla_mIRC.htm

Attention, c'est une version d'essai, il m'est arrivé parfois de faire planter mIRC, je ne sais pas pourquoi. J'attends vos commentaires pour éventuellement corriger. De plus, la vérification syntaxique des procédures envoyées à la DLL est assez succinte, donc mettre du texte à la place d'un chiffre peut éventuellement poser problème (cette DLL a été codée en 1 jour ^^).

Source / Exemple :


/*

  • Aliases de racourci
  • /
;Alias d'appel alias -l b { if ($isid) return $dll(Scintilla_mIRC.dll,$1,$2-) else echo -a $dll(Scintilla_mIRC.dll,$1,$2-) } ;Alias de déchargement de la DLL alias unload_Scintilla dll -u Scintilla_mIRC.dll /*
  • Test 1 (niveau débutant)
  • /
;Alias d'ouverture du dialog alias test_1 dialog -m test_Scintilla1 test_Scintilla1 ;Boite de dialogue dialog test_Scintilla1 { title "Test Scintilla (niveau débutant)" option dbu size -1 -1 300 180 button "Insérer du texte", 2, 80 155 60 20 button "Rechercher du texte", 3, 156 155 60 20 } ;Gestion d'événement "normaux" on *:dialog:test_Scintilla1:*:*:{ if ($devent == init) { ;Création du contrôle Scintilla d'id "1", de fonction callback "callback1" et de style "clientedge" b SciCreate $dialog($dname).hwnd > 1 > callback1 > staticedge ;Redimentionnement du contrôle b SciSetPos -s 300 150 ;Affichage des numéros de lignes b SciSetMarge -l 35 } ;Clic sur un bouton elseif ($devent == sclick) { ;Bouton d'insertion de texte if ($did == 2) { ;Demande de saisie du texte à insérer var %a = $?"Taper le texte à insérer:" ;Insertion du texte b SciReplaceSel %a } ;Bouton de recherche de texte elseif ($did == 3) { var %a = $?"Taper le texte à rechercher:" b SciFindText -i %a } } elseif ($devent == close) { ;Déchargement de la DLL lors de la fermetuire de la dialogbox .timerSc 1 1 unload_Scintilla } } ;Alias callback envoyée à la DLL pour gérer les événement du composant alias callback1 { ;Détection d'un doubl-clic if ($2 == DoubleClick) echo -a Tu as double-cliqué sur la ligne: $3 ;Détection d'un ajout de caractère elseif ($2 == CharAdded) echo -a Tu as ajouté le caractère: $3 ;Détection d'une insertion de texte elseif (($2 == Modified) && ($3 == InsertText)) echo -a Tu as inséré $6 lignes à la position $4 $+ , de texte: $7- } /*
  • Test 2 (niveau intermédiaire)
  • /
;Alias d'ouverture du dialog alias test_2 dialog -m test_Scintilla2 test_Scintilla2 ;Boite de dialogue dialog test_Scintilla2 { title "Test Scintilla (niveau intermédiaire)" option dbu size -1 -1 300 180 button "Afficher la selection", 2, 10 155 60 20 edit "", 3, 80 155 210 20, multi return vsbar } ;Gestion d'événement "normaux" on *:dialog:test_Scintilla2:*:*:{ if ($devent == init) { ;Création du contrôle Scintilla d'id "1", de fonction callback "callback1" et de style "clientedge" b SciCreate $dialog($dname).hwnd > 1 > callback2 > clientedge ;Redimentionnement du contrôle b SciSetPos -s 300 150 ;Affichage des numéros de lignes b SciSetMarge -l 35 ;Affichage du folder b SciSetMarge -f 20 $rgb(100,100,100) circle ;Modification de la couleur de selection et remplissage b SciSetSelStyle $rgb(230,230,230) fill ;Modification de la couleur de la ligne contenant le curseur b SciSetLineCursor $rgb(255,255,200) ;Mise en place d'une ligne verticale b SciSetVerticalLine 75 $rgb(200,200,200) ;Surlignement des brackets ({ et }) et tags (< et >) lorsque le curseur est dessus b SciSetHL -bu $rgb(255,0,0) $rgb(255,255,200) ;Zoom de 1 (échelle: -10 à 20) b SciSetZoom 1 ;Indentation avec espaces, marqués par des lignes verticales b SciSetIndentGuide -s 4 $rgb(255,0,0) $rgb(0,0,0) lookboth ;Texte b SciSetText alias pouet $chr(123) b SciAddLine if (%a) $chr(123) b SciAddLine echo -a La variable existe b SciAddLine write fichier.txt Valeur : $+(%,a) b SciAddLine $chr(125) b SciAddLine else exit b SciAddLine $chr(125) ;Auto-indentation b SciAutoIndent ;Choix de caractères de fins de lignes : LF ;Cela permet de récupérer et d'afficher du texte compatible avec les normes des ;editbox de mIRC b SciSetEOL crlf } ;Clic sur le bouton d'affichage de la selection elseif (($devent == sclick) && ($did == 2)) { ;Récupération du texte selectionné var %buffer = $b(SciGetSelText,.) ;Affichage du texte selectionné dans l'editbox if (%buffer == $null) did -ra $dname 3 aucune selection else did -ra $dname 3 %buffer } elseif ($devent == close) { ;Déchargement de la DLL lors de la fermeture de la dialogbox .timerSc 1 1 unload_Scintilla } } ;Alias callback envoyée à la DLL pour gérer les événement du composant alias callback2 { ;Détection d'un clic sur la marge de folding if ($2 == MarginClick) b SciToggle $3 } /*
  • Test 3 (niveau initié)
  • /
;Alias d'ouverture du dialog alias test_3 dialog -m test_Scintilla3 test_Scintilla3 ;Boite de dialogue dialog test_Scintilla3 { title "Test Scintilla (niveau initié)" option dbu size -1 -1 300 180 menu "&Fichier", 1001 item "A vous de jouer ;-)", 1101, 1001 menu "&Edtition", 1002 item "Annuler", 1201, 1002 item "Refaire", 1202, 1002 item break, 1203, 1002 item "Selectionner tout", 1209, 1002 item "Supprimer tout", 1210, 1002 item break, 1211, 1002 item "Rechercher", 1204, 1002 item "Rechercher suivant", 1205, 1002 item "Ateindre...", 1206, 1002 item break, 1207, 1002 item "Insérer l'heure", 1208, 1002 menu "&Affichage", 1003 item "Afficher/cacher ouleurs", 1301, 1003 item break, 1302, 1003 menu "Fins de ligne", 1303, 1003 item "CR", 2301, 1303 item "LF", 2302, 1303 item "CRLF", 2303, 1303 item break, 2304, 1303 item "Afficher/cacher", 2305, 1303 item "Afficher/cacher guide d'indentation", 1304, 1003 item "Afficher/cacher ligne verticale", 1305, 1003 item "Afficher/cacher espaces", 1306, 1003 menu "&?", 1004 item "A propos...", 1401, 1004 } ;Gestion d'événement "normaux" on *:dialog:test_Scintilla3:*:*:{ if ($devent == init) { b SciCreate $dialog($dname).hwnd > 1 > callback3 > clientedge staticedge b SciSetPos -s 300 180 b SciSetMarge -l 35 b SciSetMarge -f 20 $rgb(100,100,100) b SciSetSelStyle $rgb(230,230,230) fill b SciSetLineCursor $rgb(255,255,200) b SciSetVerticalLine 75 $rgb(200,200,200) set %lvert 1 b SciSetHL -bu $rgb(255,0,0) $rgb(255,255,200) b SciSetZoom 1 b SciSetIndentGuide -s 2 $rgb(255,0,0) $rgb(255,255,255) lookforward set %gindent 1 b SciSetWord_mIRC 1 b SciSetColor default $rgb(0,0,0) $rgb(255,255,255) 0 0 0 b SciSetColor comment $rgb(130,140,230) $rgb(255,255,255) 0 0 0 b SciSetColor regex $rgb(160,30,160) $rgb(255,255,255) 0 0 0 b SciSetColor group $rgb(0,180,0) $rgb(255,255,255) 0 0 0 b SciSetColor operator $rgb(255,0,0) $rgb(255,255,255) 0 0 0 b SciSetColor number $rgb(245,70,245) $rgb(255,255,255) 0 0 0 b SciSetColor word $rgb(160,30,160) $rgb(255,255,255) 0 1 0 b SciSetColor word2 $rgb(0,0,160) $rgb(255,255,255) 1 0 0 b SciSetColor quote $rgb(0,0,255) $rgb(255,255,255) 0 0 0 set %color 0 b SciShowColor 1 ;Texte b SciSetText alias pouet $chr(123) b SciAddLine if (%a) $chr(123) b SciAddLine echo -a La variable existe b SciAddLine write fichier.txt Valeur : $+(%,a) b SciAddLine $chr(125) b SciAddLine else exit b SciAddLine $chr(125) ;Auto-indentation b SciAutoIndent ;Caractères de fin de ligne b SciSetEOL crlf set %ws 1 } elseif ($devent == menu) { if ($did == 1401) var %a = $?!"Scintilla_mIRC.dll - WINKEL Vincent" ;On vérifie qu'on peut effectuer un UNDO puis on le fait si on peut else if (($did == 1201) && ($b(SciCanUndo))) .b SciUndo ;On vérifie qu'on peut effectuer un REDO puis on le fait si on peut elseif (($did == 1202) && ($b(SciCanRedo))) .b SciRedo ;Selection de tout le texte elseif ($did == 1209) .b SciSelectAll ;Suppression de tout le texte elseif ($did == 1210) { if ($?!"Etes-vous sûr(e) de vouloir tout supprimer ?") .b SciClearAll } ;Rechercher... if ($did == 1204) { ;Récupération du texte à chercher set %find_text $?"Saisissez le texte à rechercher:" ;Demande de recherche .b SciFindText -ai %find_text } ;Rechercher le suivant if ($did == 1205) .b SciFindText -i %find_text ;Atteindre la ligne... if ($did == 1206) { var %line = $?"Ligne ?" | if (%line isnum) .b SciGoToLine %line } ;Insérer l'heure if ($did == 1208) .b SciReplaceSel $time ;Affichage des couleurs if ($did == 1301) { .b SciShowColor %color | set %color $iif(%color == 1,0,1) } ;Caractères de fin de lignes if ($did == 2301) .b SciSetEOL cr if ($did == 2302) .b SciSetEOL lf if ($did == 2303) .b SciSetEOL crlf if ($did == 2305) .b SciSetShowEOL $iif($b(SciGetShowEOL,.),0,1) ;Guide d'indentation if ($did == 1304) { .b SciSetIndentGuide $iif(%gindent == 1,-h,-s 2 $rgb(255,0,0) $rgb(255,255,255) lookboth) | set %gindent $iif(%gindent == 1,0,1) } ;Ligne verticale if ($did == 1305) { .b SciSetVerticalLine $iif(%lvert == 1,-1 $rgb(255,255,255),75 $rgb(200,200,200)) | set %lvert $iif(%lvert == 1,0,1) } ;Espaces if ($did == 1306) { .b SciSetShowWS %ws | set %ws $iif(%ws == 1,0,1) } } elseif ($devent == close) { ;Déchargement de la DLL lors de la fermeture de la dialogbox .timerSc 1 1 unload_Scintilla } } ;Alias callback envoyée à la DLL pour gérer les événement du composant alias callback3 { echo 3 -a $1- ;Détection d'un clic sur la marge de folding if ($2 == MarginClick) b SciToggle $3 } ;End of file

Conclusion :


J'attends toute remarque.

Pour tester les exemples, tapez /test_1 pour le niveau débutant, /test_2 pour le niveau intermédiaire et /test_3 pour le niveau initié.

Le code-source de la DLL (codée en C/C++) en également disponible dans le zip.
Pour faire fonctionner cette DLL, vous n'avez besoin que de Scintilla_mIRC.dll et SciLexer.dll qui doivent impérativement être dans le même dossier. Le reste des fichiers inclus n'est que la doc ou les fichiers sources de la dll.

Bon scripting.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.