[Algorithmie] éditeur de code ....

éditeur de code .... [Algorithmie] - Programmation

Marsh Posté le 22-03-2002 à 20:54:15    

voilà, j'ai décidé de programmer un éditeur de code en delphi ...
 
j'ai utilisé un richedit, j'ai fait une fonction qui permet de colorier du texte mais je sais pas comment gérer la MAJ des couleurs au fur et à mesure des frappes de l'utilisateur.
 
je dois tout recontroller le texte à chque frappe ?
essayer de mettre en place un contrôle local ?
 
j'aimerais des idées paske chuis bloké là ...

Reply

Marsh Posté le 22-03-2002 à 20:54:15   

Reply

Marsh Posté le 22-03-2002 à 21:20:10    

Tu le fais parce que tu as besoin d'une zone de texte style éditeur de code, ou bien tu le fais par "défi" / "devoir" ?
Si c'est juste parce que tu en as besoin, ne te fatigue plus, utlise ça:
http://synedit.sourceforge.net/
Y a pas mieux je pense ;)
C'est ce qu'utilise ConTEXT par exemple : http://fixedsys.com/context/

 

[jfdsdjhfuetppo]--Message édité par antp--[/jfdsdjhfuetppo]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 22-03-2002 à 21:25:42    

antp a écrit a écrit :

Tu le fais parce que tu as besoin d'une zone de texte style éditeur de code, ou bien tu le fais par "défi" / "devoir" ?
Si c'est juste parce que tu en as besoin, ne te fatigue plus, utlise ça:
http://synedit.sourceforge.net/
Y a pas mieux je pense ;)
C'est ce qu'utilise ConTEXT par exemple : http://fixedsys.com/context/  
 
 




 
en fait, c'était aussi par défi  :D  
 
mais je vais regarder tes adresses qd même, merci bcp

Reply

Marsh Posté le 22-03-2002 à 21:50:26    

bon, comme j'ai pas envie de lire tout le code de synedit, je vais exposer mes idées ...
 

  • SOLUTION BOURRIN:


à chaque frappe, je recalcule toutes les couleurs pour tout le texte (ZOGZOG)  [:tatanka]  
 

  • SOLUTION + FINE


à chque frappe, je regarde quelle touche a été frappée et je réfléchie pour savoir quelle importance ça peut avoir...
exemple en C++:
on frappe un espace, pas grave, seulement une ligne à analyser !
on frappe une accolade  :sweat: gros bourdel ...
 
 
k'en pensez vous ?
 
ps est ce que partir d'un richedit est handicappant ?
(j'ai pas envie de ma lancer ds la prog de composants ...  :crazy: )

Reply

Marsh Posté le 22-03-2002 à 21:55:07    

Ça ressemble quand même fort à la réinvention de la roue :/
Et SynEdit est pas difficile à utiliser...
Enfin bon :)
Pour le RichEdit je l'ai jamais utilisé donc je peux pas t'aider, mais je te souhaite bonne chance :jap:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 22-03-2002 à 21:56:04    

ah ben bien, j'ai fait ca y'a deux semaine :)
 
bon, voila comment j'ai fait :
 
j'ai un abre N-aire qui contient les mots a colorier (chaque noeud a N-fils, avec un caractere par fils  . de cette facon tu peux facilement verifier si un mot est a colorier ou non)
 
Ensuite a chaque input de l'utilisateur, je check le mot courant (tu prends la position actuelle, tu te deplace sur la gauche jusqu'a trouver un separateur (espace, entrée, ';' ...), idem sur la droite
 
je passe le mot dans mon arbre, je regarde si ca existe. Si oui, zou, en couleur !
 
Note que l'arbre est pratique pour autre chose, genre la completion automatique ;)

Reply

Marsh Posté le 22-03-2002 à 22:37:18    

chrisbk a écrit a écrit :

ah ben bien, j'ai fait ca y'a deux semaine :)
 
bon, voila comment j'ai fait :
 
j'ai un abre N-aire qui contient les mots a colorier (chaque noeud a N-fils, avec un caractere par fils  . de cette facon tu peux facilement verifier si un mot est a colorier ou non)
 
Ensuite a chaque input de l'utilisateur, je check le mot courant (tu prends la position actuelle, tu te deplace sur la gauche jusqu'a trouver un separateur (espace, entrée, ';' ...), idem sur la droite
 
je passe le mot dans mon arbre, je regarde si ca existe. Si oui, zou, en couleur !
 
Note que l'arbre est pratique pour autre chose, genre la completion automatique ;)  




 
l'histoire de l'arbre, j'y avais pensé  :) ce qui me pose problème, c'est de trouver les cas où il ya bcp de changements à faire sur les couleurs du texte ....
 
par exemple, tu tapes un " qqpart et ça te changes les couleurs de ton code sur 12 lignes ...          ou pas :wahoo:  
 
bon, je m'y remets
 
@+

Reply

Marsh Posté le 22-03-2002 à 23:38:27    

trueslash a écrit a écrit :

 
 
l'histoire de l'arbre, j'y avais pensé  :) ce qui me pose problème, c'est de trouver les cas où il ya bcp de changements à faire sur les couleurs du texte ....
 
par exemple, tu tapes un " qqpart et ça te changes les couleurs de ton code sur 12 lignes ...          ou pas :wahoo:  
 
bon, je m'y remets
 
@+  




 
ah oui merde j'avais oublier ce cas (vu que je le gere pas :)
le " meparait assez chaud, vu qu'il faut savoir si c un ouvrant, ou un fermant ;
 
tu dois pouvoir verifier ca en cherchant la couleur du mot precedant (si coloré, alors fermant, sinon ouvrant)
 
a partir de la t'as plus qu'a aller en avant et chercher quand ca se ferme, colorier le tout  
aucune idée de l'impact sur la vitesse

Reply

Marsh Posté le 23-03-2002 à 00:25:23    

j'en avais commencé un, je m'étais arrêté aux tokens qui ne modifient que la ligne courante ;) dans ce cas-là, c'était tout simple : chopper la position du curseur, chopper la ligne sur laquelle est le curseur, passer la ligne à un miniparser qui renvoie une liste chaîne de tokens avec leurs positions dans la chaîne, et update du richedit.
 
pour les tokens comme ", /*, */ en C, j'imagine qu'il n'y a pas de solution miracle : par ex pour */, parser toute la source jusqu'à tomber sur /* ou sur le premier token. peut-être garder un arbre en mémoire de tout le fichier pour accélérer le parsing & permettre des trucs sympas comme savoir dans quelle fonction / méthode on est, etc.
 
une chose est sûre, il ne faut PAS colorier tout le fichier lors de l'ouverture mais seulement la partie visible. j'ai essayé tout le fichier, j'ai eu des problèmes :D (ça rame très vite pour un nombre de lignes relativement peu important). donc en fait, colorier au fur et à mesure qu'on descend / remonte dans le fichier.

 

[jfdsdjhfuetppo]--Message édité par youdontcare--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 23-03-2002 à 00:52:36    

interessant l'histoire de colorier que la partie visible, cé pô con !
 
sinon, je crois que je vais partir de cette idée:  
 
=> l'utilisateur tape qqchose  
 
=> analyse du caractère inséré/supprimé
 
=> déduction de la portée maximale du changement
 
=> recoloriage
 
le problème, c qu'il faut réfléchir aux structures de données à utiliser et je me sens pas d'improviser   :wahoo:  
 
bon, au boulot  ;)

Reply

Marsh Posté le 23-03-2002 à 00:52:36   

Reply

Marsh Posté le 23-03-2002 à 00:59:16    

stp, tiens-nous au courant ! ça m'intéresse beaucoup de savoir comment tu vas faire pour les caractères qui changent plus d'une ligne de couleurs (/*, */, etc.).
 
:hello:

 

[jfdsdjhfuetppo]--Message édité par youdontcare--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 23-03-2002 à 01:08:56    

youdontcare a écrit a écrit :

 
 
une chose est sûre, il ne faut PAS colorier tout le fichier lors de l'ouverture mais seulement la partie visible. j'ai essayé tout le fichier, j'ai eu des problèmes :D (ça rame très vite pour un nombre de lignes relativement peu important). donc en fait, colorier au fur et à mesure qu'on descend / remonte dans le fichier.  
 
 




 
 
 
Ca ramait tant que ca ?
 
 
Sinon pour optimiser y'a deja un truc tout con : ne pas mettre ajour la fenetre a chaque changement de couleur
 
en MFC c'est :
 
setRedraw(FALSE);
 
changement de couleur
 
 
setRedraw(TRUE);
Invalidate(FALSE);
 
 
(redraw ou repaint ? je sais pu :D )

 

[jfdsdjhfuetppo]--Message édité par chrisbk--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 23-03-2002 à 01:14:14    

c'était assez terrible sur les 'gros fichiers', je me souviens de qq dizaines de secondes pour la coloration. visual l'ouvrait instantanément.
 
j'ai peut-être codé ça comme un pied aussi ... :D :D :D pour le setRedraw(), merci :) j'essaierai de tester si j'ai le temps de me replonger là-dedans (le code a presque un an et ma mémoire défaille ...)

 

[jfdsdjhfuetppo]--Message édité par youdontcare--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 23-03-2002 à 01:16:19    

t'avais fait ca avec un parser et tout et tout ? Clair que c la bonne solution (une fois qu'on a les token on doit pouvoir en tirer plein de chose interessantes :D ), mais la fo deja plus de tps pour coder ca :/

Reply

Marsh Posté le 23-03-2002 à 01:23:25    

à la base, le parser était là car je testais la compilation d'un langage script.
 
du coup le code pour l'update était hyper simple :
 
TokenizerResult tr;
if (tknz.Tokenize(singleLine, length+1, tr))
{
  Token* t = tr.root;
  while (t)
  {
    if (t->type < Token_line)
      SetColorRange(t->srcidx1+start, t->srcidx2+start, colors[t->type]);
    t = t->next;
  }
}
 
le 'tokenizer' convertit la ligne sur laquelle on tape en une liste chaînée de tokens, la méthode de coloration parcourt la liste et update les couleurs (SetColorRange) en fonction du type du token (t->type) et de sa position dans la ligne (srcidx1, srcidx2).
 
c'était juste un test bourrin et rapide, ça marchait assez bien.
 
en en reparlant, ça me redonne envie de tester ça plus en profondeur. bon, j'aimerai bien aussi me coder 'mon' richedit :D avec une lib de fontes comme freetype, permettre du html dans les commentaires de fonctions, génération automatique de la doc, pouvoir 'replier' certains bouts de code, marquer telle fonction comme 'à revoir', etc.
 
oui, ça doit déjà exister (genre emacs :lol:) mais je suis sectaire :)

 

[jfdsdjhfuetppo]--Message édité par youdontcare--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 23-03-2002 à 01:25:01    

j'avais repompé le code de coloration sur un projet trouvé sur le net, qui faisait la syntaxe vb ... donc trueslash tu peux chercher de ce côté là aussi (parce que la doc, j'ai essayé ... j'ai encore eu des problèmes :D)

Reply

Marsh Posté le 23-03-2002 à 02:09:41    

ben je vais plutôt le faire en delphi  :D  
pour le moment, je réfléchis à comment hiérarchiser un fichier texte contenant du code par rapport à la portée des modifications que l'on peut y faire
 
 :wahoo: ouh là, c pas tres clair ce que je viens de dire ...
 
au lit !  :sol:  
 
 :hello:

Reply

Marsh Posté le 23-03-2002 à 02:16:50    

trueslash a écrit a écrit :

ben je vais plutôt le faire en delphi  :D  
pour le moment, je réfléchis à comment hiérarchiser un fichier texte contenant du code par rapport à la portée des modifications que l'on peut y faire
 
 :wahoo: ouh là, c pas tres clair ce que je viens de dire ...
 
au lit !  :sol:  
 
 :hello:  




je confirme ! g rien pigé !  :D

Reply

Marsh Posté le 23-03-2002 à 12:12:47    

HappyHarry a écrit a écrit :

 
je confirme ! g rien pigé !  :D  




 
 
Moi j'ai compris [:neffy]
 
ca risque d'etre assez sport, non, ta hierarchie .......... quoique c'est a essayer :)

Reply

Marsh Posté le 23-03-2002 à 12:14:18    

trueslash : pour ton editeur te faudra aussi l'identation automatique ....  
 
Je te laisse chercher car en fait c'est tres con comme truc :D

Reply

Marsh Posté le 23-03-2002 à 12:36:39    

chrisbk a écrit a écrit :

trueslash : pour ton editeur te faudra aussi l'identation automatique ....  
 
Je te laisse chercher car en fait c'est tres con comme truc :D  




 
 
en fait un de mes autres projets, c'est de définir des guides de style... ça paraît assez chaud comme ça mais si j'arrive à hiérarchiser, ça devrait être faisable

Reply

Marsh Posté le 23-03-2002 à 12:45:20    

trueslash a écrit a écrit :

en fait un de mes autres projets, c'est de définir des guides de style


c'est quoi ? :)

Reply

Marsh Posté le 23-03-2002 à 13:20:26    

youdontcare a écrit a écrit :

c'est quoi ? :)  




 
qqchose qui met ton code en forme automatiquement, exemple:
 
tu tapes:
 
for(unsigned int i=0; i<10; i++)
{tab[i] = tab2[i];
k++;
AppelFonction();}
 
et il te transformes ça en:
for(unsigned int i=0; i<10; i++)
{
     tab[i] = tab2[i];
     k++;
     AppelFonction();
}

Reply

Marsh Posté le 23-03-2002 à 13:46:44    

sympa !
 
idéal pour chambouler la syntaxe de tes collègues et imposer ta loi :D ;)

Reply

Marsh Posté le 23-03-2002 à 14:01:50    

trueslash a écrit a écrit :

 
 
qqchose qui met ton code en forme automatiquement, exemple:
 
tu tapes:
 
for(unsigned int i=0; i<10; i++)
{tab[i] = tab2[i];
k++;
AppelFonction();}
 
et il te transformes ça en:
for(unsigned int i=0; i<10; i++)
{
     tab[i] = tab2[i];
     k++;
     AppelFonction();
}  




 
ca devraitpas etre bien sur, enfin, en "post processing" (genre tu tape tout ton code et il te le formate apres)
 
Globalement l'idée c'est qu'a chaque retour a la ligne, tu compte le nombre d'espace qu'il y a au debut de la ligne précédente. A ceci tu ajoute des espaces suivantle nombre de '{' de la ligne précédente et vala ! :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed