FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Immortaliser les photos de famille
par Jean Claude Hier à 21:24

» Concours de Morpions
par jjn4 Hier à 16:34

» Tout est tranquille
par Jean Claude Ven 22 Sep 2017 - 21:41

» Texte en gif animé
par JL35 Ven 22 Sep 2017 - 13:29

» BasicEditor
par Yannick Mer 20 Sep 2017 - 17:17

» Simuler l’appui d'une touche ou combinaison de touches.
par pascal10000 Lun 18 Sep 2017 - 19:30

» Utilisation de HVIEWER pour afficher des images
par papydall Lun 18 Sep 2017 - 17:43

» Panoramic et les gifs animés.
par papydall Lun 18 Sep 2017 - 16:32

» recover source
par pascal10000 Dim 17 Sep 2017 - 14:21

» Recent dans vos menu
par Jean Claude Sam 16 Sep 2017 - 11:41

» Comment centrer un texte 3D.
par pascal10000 Ven 15 Sep 2017 - 20:20

» Carte interface 16 entrées et 16 sorties
par Jicehel Ven 15 Sep 2017 - 16:30

» Version instantanée V 0.9.28i9 possédant l'objet SYNEDIT
par pascal10000 Ven 15 Sep 2017 - 16:20

» Compilateur FBPano
par jean_debord Ven 15 Sep 2017 - 9:59

» 1 (en analyse): 3D_TARGET_IS ne fonctionne pas sur 3D_TEXT
par Jack Jeu 14 Sep 2017 - 19:52

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier

Partagez | 
 

 Editeur avec marquage syntaxique

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2, 3, 4 ... 17 ... 32  Suivant
AuteurMessage
Yannick

avatar

Nombre de messages : 7991
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 25 Aoû 2014 - 13:49

Perso, quand j' ouvre synedit.exe, j' ai un conflit avec un autre logiciel qui lui fait de l' édition html (IziSpot 4).
Quand je veux ouvrir l' éditeur, il veut m' ouvrir ce logiciel et je suis obligé de fermer 50 fenêtres (je suis du sud Laughing ) avant
que l' éditeur s' ouvre.

J' espère que ce problème ne se répétera pas avec le programme de klaus. pale
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Lun 25 Aoû 2014 - 19:15

Voici une version corrigée de Synedit_Editor.bas. Il y avait une malheureuse confusion de variables, introduite lors du codage du traitement du fichier de configuration de syntaxe. Voilà qui est résolu dans le source BAS. La DLL n'était pas concernée:
Code:
' Synedit_Editor.bas                          r

' Options générales
' =================
' Les options générales sont accessibles à tout moment.
' Elles sont mémorisées dans le fichier suivant:
'    (chemin)\Synedit_Editor.ini
' où "chemin" représente le chemin vers Synedit.exe.
' Ces options s'imposent à toutes les pages.
' Leur modification prend effet immédiatement,
' mais leur action n'est visible dans les pages existantes
' que lors de la consultation suivante du paralètre. Par
' exemple, la police par défaut sera utilisée pour créer
' une page vide ou charger un fichier, mais ne modifiera
' pas les polices déjà configurées pour des pages affichées.

' Les macros sont des portions de code mémorisées dans des fichiers
'    (chemin)\Synedit_Editor_Macros\(nom).macro
' Ces fichiers sont créées par le menu de configuration des macros
' et utilisés à partir du menu d'exécution des macros.

label close0, close3000, close3200, close3300, close3400
label nouveau, ouvrir, copier, fermer, sauver, sauverdans, sortir
label lignes, options, optionsgen,  tick, fenetre
label aide, apropos, syneditalert
label options_abandon, options_valider
label optionsgen_abandon, optionsgen_valider
label apropos_fermer, outilsconfig, outilsexec
label macrosconfig
label macroadd, macrodel, macromod, macroupd, macroins, macrosel
label syntaxe, keyajouter, keymodifier, keysupprimer
label keychargertout, keysauvertout, keychargerstyles, appliquerkeyattrib

' ===== variables pour gérer les pages d'édition
dim OptGen$          : ' options générales
dim SE%(100)        : ' les objets Synedit
dim hndSE%(100)      : ' les handles des fenêtres
dim ln%(100)        : ' flags "numéros de lignes affichés"
dim capt$(100)      : ' titre des fenetres
dim OSE$(100)        : ' les options des objets
dim FSE$(100)        : ' les noms des fichiers
dim nsyn%            : ' plus grand numéro de page d'édition (0...100)
dim act%            : ' page d'édition actuellement active (0...100)

' ===== variables internes
dim res%, d%, nf%, t%, l%, i%, optvalid%, opt$, opt1$, f$, colorkey$
dim org%, s$, s1$, s2$, olddir$, salert$, nalert%, confirm%, fil$

' ===== constantes
dim M1%        : M1% = 0 - 1
dim version$  : version$ = "Alpha 0.5"
dim verdat$    : verdat$ = "24/08/2014"
dim KGF$      : KGF$ = "KGF.dll"
dim dir$      : dir$ = file_extract_path$(param_value$(0))
dim ini$      : ini$ = dir$+"Synedit_editor.ini"
dim dirmacros$ : dirmacros$ = dir$ + "Synedit_Editor_Macros\"

' configurer la form 0 (uniquement le menu)
width 0,800 : height 0,60 : border_small 0

' ===== création de tous les menus
main_menu 10
  sub_menu 11 : parent 11,10 : caption 11,"Fichier"
    sub_menu 12 : parent 12,11 : caption 12,"Nouveau" : on_click 12,nouveau
    sub_menu 13 : parent 13,11 : caption 13,"Ouvrir..." : on_click 13,ouvrir
    sub_menu 14 : parent 14,11 : caption 14,"Copier" : on_click 14,copier
    sub_menu 15 : parent 15,11 : caption 15,"Fermer" : on_click 15,fermer
    sub_menu 16 : parent 16,11 : caption 16,"Sauver" : on_click 16,sauver
    sub_menu 17 : parent 17,11 : caption 17,"Sauver dans..." : on_click 17,sauverdans
    sub_menu 18 : parent 18,11 : caption 18,"-"
    sub_menu 19 : parent 19,11 : caption 19,"Sortir" : on_click 19,sortir
  sub_menu 21 : parent 21,10 : caption 21,"Options"
    sub_menu 22 : parent 22,21 : caption 22,"N° de ligne" : on_click 22,lignes
    sub_menu 23 : parent 23,21 : caption 23,"Options de la page" : on_click 23,options
    sub_menu 24 : parent 24,21 : caption 24,"Options générales" : on_click 24,optionsgen
    sub_menu 25 : parent 25,21 : caption 25,"-"
    sub_menu 26 : parent 26,21 : caption 26,"Syntaxe de la page" : on_click 26,syntaxe
  sub_menu 400 : parent 400,10 : caption 400,"Edition"
    sub_menu 401 : parent 401,400 : caption 401,"pas encore implémenté" : ' on_click 401,???
  sub_menu 430 : parent 430,10 : caption 430,"Outils"
    sub_menu 431 : parent 431,430 : caption 431,"Configuration" : on_click 431,outilsconfig
    sub_menu 432 : parent 432,430 : caption 432,"Exécution" : on_click 432,outilsexec
  sub_menu 440 : parent 440,10 : caption 440,"Macros"
    sub_menu 441 : parent 441,440 : caption 441,"Macros" : on_click 441,macrosconfig
  sub_menu 300 : parent 300,10 : caption 300,"Fenêtres"
'    sub_menu 301 : parent 301,300 : caption 301,"Fenêtre" : on_click 301,fenetre
  sub_menu 420 : parent 420,10 : caption 420,"Aide"
    sub_menu 421 : parent 421,420 : caption 421,"Aide" : on_click 421,aide
    sub_menu 422 : parent 422,420 : caption 422,"A-propos" : on_click 422,apropos

' ===== création de la fenêtre des options de la page actuelle
form 3000 : hide 3000 : caption 3000,"Options" : command_target_is 3000
  top 3000,100 : left 3000,200
  width 3000,550 :height 3000,400 : on_close 3000,close3000
check 3001 : top 3001,10 : left 3001,10 : width 3001,150
  caption 3001,"Numéros de de ligne"
container 3002 : caption 3002,"Format par défaut"
  top 3002,40 : left 3002,10 : width 3002,250 : height 3002,110
combo 3003 : parent 3003,3002 : top 3003,20 : left 3003,10 : width 3003,170
  font_names_load 3003 : text 3003,"Courier"
alpha 3004 : parent 3004,3002 : top 3004,50 : left 3004,10 : caption 3004,"Taille:"
combo 3005 : parent 3005,3002 : top 3005,50 : left 3005,60 : width 3005,40
  item_add 3005,"8"
  item_add 3005,"9"
  item_add 3005,"10"
  item_add 3005,"11"
  item_add 3005,"12"
  item_add 3005,"14"
  item_add 3005,"16"
  item_add 3005,"18"
text 3005,"10"
check 3006 : parent 3006,3002 : top 3006,80 : left 3006,10 : caption 3006,"Gras"
  font_bold 3006
check 3007 : parent 3007,3002 : top 3007,80 : left 3007,60 : caption 3007,"Italique"
  font_italic 3007
check 3008 : parent 3008,3002 : top 3008,80 : left 3008,120 : caption 3008,"Sousligné"
  font_underline 3008
check 3009 : parent 3009,3002 : top 3009,80 : left 3009,190 : caption 3009,"Barré" : width 3009,40
  font_strike 3009
alpha 3010 : top 3010,160 : left 3010,10 : caption 3010,"Syntaxe:"
combo 3011 : top 3011,160 : left 3011,80 : width 3011,150

button 3098 : top 3098,310 : left 3098,10 : caption 3098,"Abandon"
  on_click 3098,options_abandon
button 3099 : top 3099,310 : left 3099,210 : caption 3099,"Valider"
  on_click 3099,options_valider

' ===== création de la fenêtre des options générales
form 3200 : hide 3200 : caption 3200,"Options" : command_target_is 3200
  top 3200,100 : left 3200,200
  width 3200,550 :height 3200,400 : on_close 3200,close3200
check 3201 : top 3201,10 : left 3201,10 : width 3201,150
  caption 3201,"Numéros de de ligne"
container 3202 : caption 3202,"Format par défaut"
  top 3202,40 : left 3202,10 : width 3202,250 : height 3202,110
combo 3203 : parent 3203,3202 : top 3203,20 : left 3203,10 : width 3203,170
  font_names_load 3203 : text 3203,"Courier"
alpha 3204 : parent 3204,3202 : top 3204,50 : left 3204,10 : caption 3204,"Taille:"
combo 3205 : parent 3205,3202 : top 3205,50 : left 3205,60 : width 3205,40
  item_add 3205,"8"
  item_add 3205,"9"
  item_add 3205,"10"
  item_add 3205,"11"
  item_add 3205,"12"
  item_add 3205,"14"
  item_add 3205,"16"
  item_add 3205,"18"
text 3205,"10"
check 3206 : parent 3206,3202 : top 3206,80 : left 3206,10 : caption 3206,"Gras"
  font_bold 3206
check 3207 : parent 3207,3202 : top 3207,80 : left 3207,60 : caption 3207,"Italique"
  font_italic 3207
check 3208 : parent 3208,3202 : top 3208,80 : left 3208,120 : caption 3208,"Sousligné"
  font_underline 3208
check 3209 : parent 3209,3202 : top 3209,80 : left 3209,190 : caption 3209,"Barré" : width 3209,40
  font_strike 3209
alpha 3210 : top 3210,160 : left 3210,10 : caption 3210,"Syntaxe:"
combo 3211 : top 3211,160 : left 3211,80 : width 3211,150
container 3212 : caption 3212,"Style des mots-clé"
  top 3212,190 : left 3212,10 : width 3212,250 : height 3212,100
check 3213 : parent 3213,3212 : top 3213,20 : left 3213,10 : caption 3213,"Gras" : font_bold 3213
check 3214 : parent 3214,3212 : top 3214,20 : left 3214,60 : caption 3214,"Italique" : font_italic 3214
check 3215 : parent 3215,3212 : top 3215,20 : left 3215,120 : caption 3215,"Sousligné" : font_underline 3215
check 3216 : parent 3216,3212 : top 3216,20 : left 3216,190 : caption 3216,"Barré" : font_strike 3216
  width 3216,50
alpha 3218 : parent 3218,3212 : top 3218,50 : left 3218,10 : caption 3218,"Couleur;"
combo 3219 : parent 3219,3212 : top 3219,50 : left 3219,70 : width 3219,70

button 3298 : top 3298,310 : left 3298,10 : caption 3298,"Abandon"
  on_click 3298,optionsgen_abandon
button 3299 : top 3299,310 : left 3299,210 : caption 3299,"Valider"
  on_click 3299,optionsgen_valider


' ===== création de la fenêtre des définitions des macros
form 3300 : hide 3300 : caption 3300,"Configuration des macros" : command_target_is 3300
  top 3300,0 : left 3300,width(0) : border_small 3300
  width 3300,420 :height 3300,105 : on_close 3300,close3300
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins


' ===== création de la fenêtre des définitions de syntaxe de la page
form 3400 : hide 3400 : caption 3400,"Configuration de la syntaxe" : command_target_is 3400
  top 3400,100 : left 3400,200
  width 3400,750 :height 3400,610 : on_close 3400,close3400
Alpha 3401 : top 3401,10 : left 3401,10 : caption 3401,"Mots-clé:"
edit 3402 : top 3402,30 : left 3402,10 : width 3402,200
list 3403 : top 3403,60 : left 3403,10 : width 3403,200 : height 3403,400
  sort_on 3403
button 3404: top 3404,30 : left 3404,220 : width 3404,70
  caption 3404,"Ajouter" : on_click 3404,keyajouter
button 3405: top 3405,60 : left 3405,220 : width 3405,70
  caption 3405,"Modifier" : on_click 3405,keymodifier
button 3406: top 3406,90 : left 3406,220 : width 3406,70
  caption 3406,"Supprimer" : on_click 3406,keysupprimer
button 3409: top 3409,480 : left 3409,10 : width 3409,200 : height 3409,70
  caption 3409,"Charger la syntaxe" : on_click 3409,keychargertout
  font_bold 3409 : font_size 3409,12
button 3410: top 3410,480 : left 3410,300 : width 3410,200 : height 3410,70
  caption 3410,"Sauver la syntaxe" : on_click 3410,keysauvertout
  font_bold 3410 : font_size 3410,12
container 3417 : top 3417,10 : left 3417,310 : width 3417,300 : height 3417,90
  caption 3417,"Attributs Keywords"
alpha 3411 : parent 3411,3417 : top 3411,20 : left 3411,10 : caption 3411,"Styles;"
check 3412 : parent 3412,3417 : top 3412,20 : left 3412,50 : caption 3412,"Gras" : font_bold 3412
check 3413 : parent 3413,3417 : top 3413,20 : left 3413,100 : caption 3413,"Italique" : font_italic 3413
check 3414 : parent 3414,3417 : top 3414,20 : left 3414,160 : caption 3414,"Sousligné" : font_underline 3414
check 3415 : parent 3415,3417 : top 3415,20 : left 3415,230 : caption 3415,"Barré" : font_strike 3415
  width 3415,50
alpha 3418 : parent 3418,3417 : top 3418,50 : left 3418,10 : caption 3418,"Couleur;"
combo 3419 : parent 3419,3417 : top 3419,50 : left 3419,70 : width 3419,70
button 3416 : parent 3416,3417 : top 3416,50 : left 3416,200 : caption 3416,"Appliquer"
  on_click 3416,appliquerkeyattrib

' ===== création de la fenêtre A-propos
form 3100 : hide 3100 : top 3100,100 : left 3100,300 : command_target_is 3100
  width 3100,400 : height 3100,200 : on_close 3100,apropos_fermer
picture 3101 : full_space 3101  : print_target_is 3101
font_name 3101,"Courier" : font_size 3101,10 : font_bold 3101
print_locate 40,20  : print "Programme: "+"Synedit_Editor"
print_locate 40,40  : print "Version:  "+version$
print_locate 40,60  : print "Date:      "+verdat$
print_locate 40,80  : print "Auteur:    "+"Klaus"

' ===== quelques objets invisbles
command_target_is 0
edit 95 : hide 95 : on_change 95,syneditalert
memo 96 : hide 96
save_dialog 97
open_dialog 98
timer 99 : timer_off 99 : timer_interval 99,300 : on_timer 99,tick
 
' ===== activer la DLL
dll_on KGF$

' === faire quelques initialialisations
res% = dll_call0("SyneditInitialize")
res% = DLL_call2("SetCloseBox",handle(0),0) : ' désactiver la croix rouge !
res% = dll_call3("SyneditFunction",0,4,0)      : ' récupérer la liste des définitions de syntaxe
s$ = clipboard_string_paste$                : ' sauvegarder le presse-papier
clipboard_paste 96                          : ' la charger dans un mémo
for i%=1 to count(96)                      : ' et recopier dans la combo
  item_add 3011,item_read$(96,i%)          : '    options de la page
  item_add 3211,item_read$(96,i%)          : '    options générales
next i%
clipboard_string_copy s$                    : ' restaurer le presse-papier
res% = dll_call2("SelectComboBoxItem",handle(3011),1) : ' sélectionner (aucune)
res% = dll_call2("SelectComboBoxItem",handle(3211),1) : ' sélectionner (aucune)
' OptGen$ = "0100000Courier\(aucune)"        : ' options générales par défaut
OptGen$ = "01000001000Courier\(aucune)"    : ' options générales par défaut
if file_exists(ini$)=1                      : ' si fichier INI existe, relire les options générales
  file_open_read 1,ini$
  file_readln 1,OptGen$
  file_close 1
  if len(OptGen$)<27
    OptGen$ = left$(OptGen$,7) + "1000" + mid$(OptGen$,8,len(OptGen$))
    file_open_write 1,ini$
    file_writeln 1,OptGen$
    file_close 1
  end_if
else                                        : ' si fichier INI n'existe pas, le créer
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  file_close 1
end_if
if dir_exists(dirmacros$)=0 then dir_make dirmacros$ : ' créer le dossier des macros
olddir$ = dir_current$                      : ' sauvegarder le dossier actuel
dir_change dirmacros$                      : ' aller dans le dossier des macros
s$ = file_find_first$                      : ' parcourir ce dossier
while s$<>"_"                              : '  pour charger la liste des macros existantes
  if left$(s$,1)<>"."
    if right$(s$,6)=".macro"
      s$ = left$(s$,len(s$)-6)
      item_add 3302,s$
    end_if
  end_if
  s$ = file_find_next$
end_while
dir_change olddir$                          : ' restaurer le dossier par défaut
if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1) : ' sélectionner la première macro
item_add 3419,"NOIR"
item_add 3419,"BLEU"
item_add 3419,"ROUGE"
item_add 3419,"VERT"
item_add 3419,"VIOLET"
res% = dll_call2("SelectComboBoxItem",handle(3419),1) : ' sélectionner le noir
for i%=1 to count(3419)
  item_add 3219,item_read$(3419,i%)
next i%
res% = dll_call2("SelectComboBoxItem",handle(3219),1) : ' sélectionner le noir
end




' ===== évènement déclenché par Synedit, quelque soit la page
' l'objetinvisible 95 (un EDIT) contient:
'    Cnnn = la page nnn a changé
'    Hnnn = on a frappé F1 dans la page nnn
syneditalert:
  salert$ = text$(95)
  nalert% = instr("CH",left$(salert$,1))
  select nalert%
    case 1: ' une page a changé
      syneditchange(mid$(salert$,2,3))
    case 2: ' on a frappé F1
      synedithelp(mid$(salert$,2,3))
  end_select
  return

' ===== à la fin, on supprime toutes les fenêtres ouvertes
close0:
  while nsyn%>0
    res% = dll_call1("SyneditDelete",SE%(nsyn%))
    pause 500              : ' ce délai pourra éventuellement être réduit...
    delete 100+nsyn%
    nsyn% = nsyn% - 1
  end_while
  return

' ===== fermeture de la fenêtre des paramètres de la page
close3000:
  closeX(3000)
  return
 
' ===== fermeture de la fenêtre des paramètres généraux
close3200:
  closeX(3200)
  return

' ===== fermeture de la fenêtre de configuration de la syntaxe de la page
close3400:
  closeX(3400)
  return

' ===== fermeture de la fenêtre de configuration des macros
close3300:
  closeX(3300)
  return

' ===== mode d'emploi
aide:
  message "L'aide n'est pas encore implémentée."
  return
 
' ===== montrer la fenêtre A-propos
apropos:
  show 3100
  inactive 0
  return
 
' ===== fermer la fenêtre A-propos et restaurer la fenêtre active
apropos_fermer:
  hide 3100
  active 0
  if act%=0
    to_foreground 0
  else
    to_foreground 100+act%
  end_if
  return
 
' ===== sortir du programme
sortir:
  if nsyn%>0 then purger()
  gosub close0
  res% = dll_call1("KillProcessByHandle",handle(0))
  ' *** on ne passera jamais ici !

' ===== choisir une fenêtre par le menu "Fenêtres"
fenetre:
  mark_off 300+act%
  act% = number_click-300
  mark_on 300+act%
  show 100 + act%
  to_foreground 100 + act%
  return



' ======================== fonctions du menu "Fichiers"

' ===== créer une nouvelle fenêtre d'édition vide
nouveau:
  if nsyn%=100 then return
  if nsyn%>0
    t% = top(100+nsyn%)
    l% = left(100+nsyn%)
  else
    t% = top(0) + 50
    l% = left(0) + 50
  end_if
  nsyn% = nsyn% + 1
  if act%>0 then mark_off 300+act%
  act% = nsyn%
  d% = 20
  nf% = 100 + nsyn%
  capt$(nsyn%) = "<nouveau "+str$(nsyn%)+">"
  form nf% : top nf%,t%+d% : left nf%,l%+d% : width nf%,600 : height nf%,400
    caption nf%,capt$(nsyn%)
  hndSE%(nsyn%) = handle(nf%)
  opt$ = OptGen$      : ' par défaut, prendre les options générales
  OSE$(nsyn%) = opt$
  FSE$(nsyn%) = "_"
  sub_menu 300+nsyn% : parent 300+nsyn%,300 : caption 300+nsyn%,capt$(nsyn%) : on_click 300+nsyn%,fenetre
  mark_on 300+act%
  SE%(nsyn%) = dll_call2("SyneditCreate",handle(nf%),handle(95))
  res% = dll_call3("SyneditFunction",SE%(nsyn%),3,adr(opt$))
  res% = dll_call5("SyneditGeometry",SE%(nsyn%),M1%,M1%,M1%,M1%)
  if instr(opt$,"\Panoramic")>0
    gosub keychargertout  : ' charge les mots-clé dans Synedit
    gosub keychargerstyles : ' charge les attributs graphiques
  end_if
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
  res% = dll_call3("SyneditFunction",SE%(nsyn%),6,0)
  if nsyn%=1 then timer_on 99
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger un fichier
ouvrir:
  fil$ = file_name$(98)
  if fil$="_" then return
  if file_exists(fil$)=0
    message "Ouverture impossible"
    return
  end_if
  gosub nouveau
  res% = dll_call2("SyneditOpen",SE%(act%),adr(fil$))
  if res%=0
    FSE$(act%) = fil$
    f$ = file_extract_name$(fil$)
    capt$(act%) = fil$
    caption 100+act%,fil$
    caption 300+act%,fil$
  end_if
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger une copie de la fenêtre active
copier:
  if act%=0 then return
  org% = act%
  gosub nouveau
  if res%=0
    res% = dll_call2("SyneditCopyObject",org%,act%)
    capt$(nsyn%) = "(copie) "+capt$(org%)
    caption 100+nsyn%,capt$(nsyn%)
    caption 300+nsyn%,capt$(nsyn%)
    FSE$(nsyn%) = "_"
    OSE$(nsyn%) = OSE$(org%)
  end_if
  return
 
' ===== fermer la fenêtre active
fermer:
  if act%=0 then return
  if left$(caption$(100+act%),1)="*" then Confirmer("Le code a été modifié. Voulez-vous vraiment fermer la fenêtre ?")
  if confirm%<>1 then return
  res% = dll_call1("SyneditDelete",SE%(act%))
  pause 500
  delete 100+act%
  inactive 300+act%
  caption 300+act%,"<supprimé>"
  SE%(act%) = 0
  act% = act% -1
  while SE%(nsyn%)=0
    delete 300+nsyn%
    nsyn% = nsyn% - 1
    if nsyn%=0 then exit_while
  end_while
  if act%>nsyn% then act% = nsyn%
  return
 
' =====enregistrer la fenêtre active dans son fichier associé
sauver:
  if act%=0 then return
  if FSE$(act%)="_" then goto sauverdans
  f$ = FSE$(act%)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if left$(caption(100+act%),1)="*" then caption 100+act%,mid$(caption 100+act%,3,200)
  return

' ===== enregistrer la fenêtre active dans un fichier choisi par dialogue
sauverdans:
  if act%=0 then return
  f$ = file_name$(97)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Voulez-vous le remplacer ?")<>1 then return
  end_if
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if res%=0
    FSE$(act%) = f$
    f$ = file_extract_name$(f$)
    caption 100+act%,f$
    caption 300+act%,f$
    capt$(act%) = f$
  end_if
  return
 
 
 
' ======================== fonctions du menu "Outils"

' ===== configuration des outils
outilsconfig:
  message "pas encore implémenté."
  return
 
' ===== exécution des outils
outilsexec:
  message "pas encore implémenté."
  return
 



' ======================== fonctions du menu "Macros"

' ===== configuration des macros
macrosconfig:
  optvalid% = 0
  show 3300
  inactive 0
  return
 
macrosel:
  to_foreground 0
  to_foreground 100+act%
  set_focus 3307
  return

' ===== ajouter une nouvelle macro à partir du presse-papier
macroadd:
  if act%=0 then return
  f$ = trim$(text$(3302))
  if f$="" then return
  i% = 0
  while i%<count(3302)
    i% = i% + 1
    if f$=item_read$(3302,i%)
      message "Cette macro existe déjà."
      return
    end_if
  end_while
  res% = dll_call1("SyneditCopyText",act%)
  if res%<1
    message "Il n'y a rien dans le presse-papier."
    return
  end_if
  s$ = clipboard_string_paste$
  file_open_write 1,dirmacros$+f$+".macro"
  file_writeln 1,s$
  file_close 1
  item_add 3302,f$
  message "La macro "+f$+" a été créée."
  return
 
' ===== supprimer la macro sélectionnée
macrodel:
  if count(3302)=0 then return
  s$ = item_index$(3302)
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer la macro "+s$)
  if i%<>1 then return
  f$ = dirmacros$ + s$ + ".macro"
  file_delete f$
  item_delete 3302,item_index(3302)
  if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1)
  message "La macro "+s$+" a été supprimée."
  return

' ===== remplacer la page actuelle par la macro sélectionnée
macromod:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditOpen",act%,adr(f$))
  caption 100+act%,"(macro) "+item_index$(3302)
  caption 300+act%,"(macro) "+item_index$(3302)
  capt$(act%) = "(macro) "+item_index$(3302)
  return

' ===== remplacer la macro sélectionnée par la page actuelle
macroupd:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  message "La macro "+item_index$(3302)+" a été remplacée."
  return

' ===== insérer une macro
macroins:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  s$ = ""
  file_open_read 1,f$
  while file_eof(1)=0
    file_readln 1,s1$
    s$= s$ + s1$ + chr$(13) + chr$(10)
  end_while
  file_close 1
  ' ici, charger s$ avec le contenu de la macro
  res% = dll_call2("SyneditInsertString",act%,adr(s$))
  to_foreground 100+act%
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  return




' ======================== fonctions du menu "Options"

' ===== inverser l'indicateur de présence des numéros de ligne dans la fenêtre active
lignes:
  ln%(act%) = 1 - ln%(act%)    : ' basculer 0<-->1
  res% = dll_call3("SyneditFunction",SE%(act%),1,ln%(act%))  : ' signaler à Synedit
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  OSE$(act%) = str$(ln%(act%)) + mid$(OSE$(act%),2,20)  : ' mémoriser dans les param_tres
  return
 
' ===== charger la fenêtre des options avec les valeurs de la fenêtre active, puis afficher
options:
  if act%=0 then return
  optvalid% = 0
  opt$ = OSE$(act%)
  if left$(opt$,1)="1"
    mark_on 3001
  else
    mark_off 3001
  end_if
  text 3005,mid$(opt$,2,2)
  if mid$(opt$,4,1)="1"
    mark_on 3006
  else
    mark_off 3006
  end_if
  if mid$(opt$,5,1)="1"
    mark_on 3007
  else
    mark_off 3007
  end_if
  if mid$(opt$,6,1)="1"
    mark_on 3008
  else
    mark_off 3008
  end_if
  if mid$(opt$,7,1)="1"
    mark_on 3009
  else
    mark_off 3009
  end_if
  i% = instr(opt$,"\")
  text 3003,mid$(opt$,8,i%-8)
  opt$ = mid$(opt$,i%+1,len(opt$))
  for i%=1 to count(3011)
    if opt$=item_read$(3011,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3011),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  show 3000
  inactive 0
  return
 
' ===== charger la fenêtre des options générales, puis afficher
optionsgen:
  if left$(OptGen$,1)="1"
    mark_on 3201
  else
    mark_off 3201
  end_if
  text 3205,mid$(OptGen$,2,2)
  if mid$(OptGen$,4,1)="1"
    mark_on 3206
  else
    mark_off 3206
  end_if
  if mid$(OptGen$,5,1)="1"
    mark_on 3207
  else
    mark_off 3207
  end_if
  if mid$(OptGen$,6,1)="1"
    mark_on 3208
  else
    mark_off 3208
  end_if
  if mid$(OptGen$,7,1)="1"
    mark_on 3209
  else
    mark_off 3209
  end_if
  if mid$(OptGen$,8,1)="1"
    mark_on 3213
  else
    mark_off 3213
  end_if
  if mid$(OptGen$,9,1)="1"
    mark_on 3214
  else
    mark_off 3214
  end_if
  if mid$(OptGen$,10,1)="1"
    mark_on 3215
  else
    mark_off 3215
  end_if
  if mid$(OptGen$,11,1)="1"
    mark_on 3216
  else
    mark_off 3216
  end_if
  i% = instr(OptGen$,"\")
  text 3203,mid$(OptGen$,12,i%-12)
  opt$ = mid$(OptGen$,i%+1,len(OptGen$))
  for i%=1 to count(3211)
    if opt$=item_read$(3211,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3211),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  show 3200
  inactive 0
  return
 
' ===== sortie de la fenêtre des options de la page par "Abandon"
options_abandon:
  hide 3000
  show 0
  active 0
  to_foreground 0
  return

' ===== sortie de la fenêtre des options générales par "Abandon"
optionsgen_abandon:
  hide 3200
  show 0
  active 0
  to_foreground 0
  return

' =====sortie de la fenêtre des options de la page par "Valider"
options_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt$ = str$(checked(3001))+right$("0"+text$(3005),2)+str$(checked(3006))
  opt$ = opt$ + str$(checked(3007))+str$(checked(3008))+str$(checked(3009))
  opt$ = opt$ + mid$(optgen$,8,4)
  opt$ = opt$ + text$(3003) + "\" + text$(3011)
  OSE$(act%) = opt$
  ln%(act%) = checked(3001)
  res% = dll_call3("SyneditFunction",SE%(act%),3,adr(opt$)) : ' activer les nouvelles options
  gosub keychargerstyles : ' charge les attributs graphiques
  hide 3000
  show 0
  active 0
  to_foreground 0
  return
 
' =====sortie de la fenêtre des options générales par "Valider"
optionsgen_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt1$ = str$(checked(3201))+right$("0"+text$(3205),2)+str$(checked(3206))
  opt1$ = opt1$ + str$(checked(3207))+str$(checked(3208))+str$(checked(3209))
  opt1$ = opt1$ + str$(checked(3213))+str$(checked(3214))+str$(checked(3215))+str$(checked(3216))
  opt1$ = opt1$ + text$(3203) + "\" + text$(3211)
  OptGen$ = opt1$    : ' mémoriser les options générales
  colorkey$ = text$(3219)
  res% = dll_call2("SelectComboBoxItem",handle(3419),item_index(3219))
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  file_close 1
  hide 3200
  active 0
  to_foreground 0
  if act%>0 then to_foreground 100+act%
  return

' ===== afficher la fenêtre "Syntaxe"
syntaxe:
  if act%=0 then return
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  if (s$<>"Panoramic") and (s$<>"General")
    message "Action impossible sur cette syntaxe."
    return
  end_if
  optvalid% = 0
  caption 3400,"Configuration de la syntaxe - "+s$
  if mid$(Opt$,8,1)="1"
    mark_on 3412
  else
    mark_off 3412
  end_if
  if mid$(Opt$,9,1)="1"
    mark_on 3413
  else
    mark_off 3413
  end_if
  if mid$(Opt$,10,1)="1"
    mark_on 3414
  else
    mark_off 3414
  end_if
  if mid$(Opt$,11,1)="1"
    mark_on 3415
  else
    mark_off 3415
  end_if

  show 3400
  inactive 0
  return
 
' ===== nouveau mot-cle
keyajouter:
  s$ = lower$(trim$(text$(3402)))
  if s$="" then return
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    if s$=item_read$(3403,i%)
      message "Ce mot-clé existe déjà."
      return
    end_if
  end_while
  item_add 3403,s$
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  appliquer_syntax(s$)
  return

keymodifier:
  return

keysupprimer:
  return

keychargertout:
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  clear 3403
  file_open_read 1,f$
  file_readln 1,s1$
  i% = 1
  if s1$<>"#SYNTAX" then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>s$ then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>"#KEYS" then goto invalidsyntax
  while file_eof(1)=0
    file_readln 1,s1$
    i% = i% + 1
    if s1$="#END" then exit_while
    item_add 3403,s1$
  end_while
' ici, charger les attributs
' #KEYSTYLE
' STYLE=GRAS,ITALIQUE
' COLOR=BLEU
' #END
  file_readln 1,s1$
  i% = 1
  if s1$<>"#KEYSTYLE" then goto invalidsyntax
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"STYLE=" then goto invalidsyntax
  s2$ = ""
  if instr(s1$,"GRAS")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"ITALIQUE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"SOUSLIGNE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"BARRE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"COLOR=" then goto invalidsyntax
  colorkey$ = mid$(s1$,7,len(s1$))
  for i%=1 to count(3419)
    if colorkey$=item_read$(3419,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3419),i%)
      res% = dll_call2("SelectComboBoxItem",handle(3219),i%)
    end_if
  next i%
  file_readln 1,s1$
  i% = 1
  if s1$<>"#END" then goto invalidsyntax
  file_close 1
  appliquer_syntax(s$)
  return
invalidsyntax:
  file_close 1
  message "Fichier invalide en ligne "+str$(i%)+": "+s1$
  return
 
keychargerstyles:
  s$ = mid$(opt$,8,4)
  res% = dll_call4("SyneditConfigureHighlighter",act%,4,adr(s$),adr(colorkey$))
return

keysauvertout:
' format du fichier de la syntaxe:
' fichier Synedit_Editor_Syntax_Panoramic.txt
' #SYNTAX
' Panoramic (nom de la syntaxe en 1 ligne)
' #KEYS
' pause (une ligne par mot-clé)
' ...
' #END
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  file_open_write 1,f$
  file_writeln 1,"#SYNTAX"
  file_writeln 1,s$
  file_writeln 1,"#KEYS"
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    file_writeln 1,item_read$(3403,i%)
  end_while
  file_writeln 1,"#END"
' ici, sauver les attributs
  file_writeln 1,"#KEYSTYLE"
  s$ = ""
  if mid$(optgen$,8,1)="1" then s$ = s$ + "GRAS"
  if mid$(optgen$,9,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "ITALIQUE"
  end_if
  if mid$(optgen$,10,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "SOUSLIGNE"
  end_if
  if mid$(optgen$,11,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "BARRE"
  end_if
  file_writeln 1,"STYLE="+s$
  file_writeln 1,"COLOR="+colorkey$
  file_writeln 1,"#END"
  file_close 1
  message "La syntaxe est sauvée dans "+f$
  return
 
appliquerkeyattrib:
  s2$ = ""
  if checked(3412)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3413)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3414)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3415)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  colorkey$ = text$(3419)
  res% = dll_call2("SelectComboBoxItem",handle(3219),item_index(3419))
  gosub keychargerstyles
  return


' ======================== fonctions indépendantes

' ===== ce timer surveille la fenêtre active et ses dimensions
tick:
  timer_off 99
  res% = dll_call0("GetActiveWindow")  : ' récupérer le handle de la fenêtre active
  for i%=1 to nsyn%                    : ' chercher dans la table des fenêtres d"édition
    if res%=hndSE%(i%)                  : ' est-ce qu'on a trouvé la fenêtre
      if i%<>act%                      : ' est-elle différente de la fenêtre active précédente ?
        mark_off 300+act%              : ' alors changer le marquade du menu
        mark_on 300+i%
      end_if
      act% = i%                        : ' mémoriser le numéro de la fenêtre active
      res% = dll_call5("SyneditGeometry",SE%(act%),M1%,M1%,M1%,M1%) : ' ajuster la taille de Synedit à celle de la fenêtre
      exit_for
    end_if
  next i%
  timer_on 99
  return



' ======================== SUBs internes

' ===== fermer une des fenêres auxiliaires modales
sub CloseX(f%)
  if optvalid%=0
    hide f%
    show 0
    active 0
    if act%=0
      to_foreground 0
    else
      to_foreground 100+act%
    end_if
  end_if
end_sub

' ===== appliquer une syntaxe paramétrée
sub appliquer_syntax(sy$)
  dim_local s$, i%
  s$ = sy$
  i% = instr(s$,"\")
  if i%>0 then s$ = mid$(sy$,i%+1,len(s$))
  ' imposer d'abord les mots-clé
  if (s$="Panoramic") or (s$="General")
    clear 96
    i% = 0
    while i%<count(3403)
      i% = i% + 1
      item_add 96,item_read$(3403,i%)
    end_while
    res% = dll_call4("SyneditConfigureHighlighter",act%,3,handle(96),0)
  else
    message "La syntaxe "+sy$+" ne peut pas être configurée."
  end_if
end_sub

' ===== une des pages a changé
sub syneditchange(n$)
  dim_local n%
  n% = val(n$)
  if left$(caption$(100+n%),1)<>"*" then caption 100+n%,"* "+caption$(100+n%)
end_sub

' ===== on a frappé F1
sub synedithelp(n$)
  dim_local n%
  n% = val(n$)
  message "Aide pas encore implémentée."
end_sub

' ===== demande d'un message de confirmation
sub confirmer(s$)
  confirm% = message_confirmation_yes_no(s$)
end_sub
 
' ===== purger les pages non mises à jour
sub purger()
dim_local i%
  for i%=1 to nsyn%
    if left$(caption$(100+i%),1)="*"
      s$ = "La page ["+capt$(i%)+"] a été modifiée. Voulez-vous la sauvegarder ?"
      confirmer(s$)
      if confirm%=1
        act% = i%
        message "on sauvegarde "+str$(act%)
        to_foreground 100+act%
        res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
        gosub sauver
      end_if
    end_if
  next i%
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Laurent (Minibug)

avatar

Nombre de messages : 2353
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Editeur avec marquage syntaxique   Lun 25 Aoû 2014 - 22:55

Bonsoir Klaus

Bon et bien avec cette nouvelle version, il y a un plantage dès le depart :

(29) Not correct arithmetic expression : Error in function. Line : 248

Précision : il s'agit du fichier EXE
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 1:01

?????????????

Voici la ligne 248:
Code:
edit 3503 : top 3503,50 : left 3503,80 : width 3503,120
où serait le problème ?

Voici ce que le programme donne chez moi, si je fais "Ouvrir" avec le fichier Synedit_Editor.bas:

On voit bien que le source est chargé et que la coloration syntaxique se met en place, avec bleu/gras/italique...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Laurent (Minibug)

avatar

Nombre de messages : 2353
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 9:00

Bonjour Klaus !

Dans la derniere version c'est a la ligne 250 :

Citation :
res% = dll_call3("SyneditFunction",0,4,0) : ' récupérer la liste des définitions de syntaxe
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 10:25

Alors, 2 lignes au-dessus, juste après
Code:
res% = dll_call0("SyneditInitialize")
insère s'il te plait
Code:
Message "résultat = "+str$(res%)
Tu devrais obtenir 44...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Laurent (Minibug)

avatar

Nombre de messages : 2353
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 10:32

resultat = 45
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 11:25

Oui, désolé. 45 est correct - c'est le nombre d'analyseurs syntaxiques connus, numérotés de 0 à 44.
Après le plantage, va s'il te plaît dans un éditeur (Panoramic, Notepad, ...) et fais ctrl/C. Tu devrais obtenir la liste des analyseurs syntaxiques qui devrait être placée dans le presse-papier...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Laurent (Minibug)

avatar

Nombre de messages : 2353
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 12:13

Je pense que tu veux parler de CTRL+V

voila le résultat après plantage :

Citation :
---------------------------
Panoramic_editor
---------------------------
(29) Not correct arithmetic expression : Error in function. Line : 250
---------------------------
OK
---------------------------

EDIT :

Est-ce normal que dans le fichier -Synedit_Editor_Syntax_Panoramic.txt- téléchargable sur le WEBDAV tous les mots clé sont en double ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 13:52

Effectivement, je veux parler de ctrl/V. Quel est le résultat ?

Et pour les doublons, ce n'est évidemment pas normal, et je corrige ça.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 14:17

Nouvelle version Alpha 0.6 du 26/08/2014, utilisant la nouvelle version V3.28 du 26/07/2014 de KGF.dll.

Nouveautés:
- forcer Synedit_Editor à utiliser la représentation Ansi et non Unicode
- gestion des "Outils"

Avec la gestion des outils (maxi 50), on peut par exemple programmer l'exécuteur Panoramic (PAnoramic.exe fourni par Jack) pour exécuter le code présent dans la page d'édition active, exactement comme avec "Run" de l'éditeur de Panoramic.

Voici le code:
Code:
' Synedit_Editor.bas                          r

' Options générales
' =================
' Les options générales sont accessibles à tout moment.
' Elles sont mémorisées dans le fichier suivant:
'    (chemin)\Synedit_Editor.ini
' où "chemin" représente le chemin vers Synedit.exe.
' Ces options s'imposent à toutes les pages.
' Leur modification prend effet immédiatement,
' mais leur action n'est visible dans les pages existantes
' que lors de la consultation suivante du paralètre. Par
' exemple, la police par défaut sera utilisée pour créer
' une page vide ou charger un fichier, mais ne modifiera
' pas les polices déjà configurées pour des pages affichées.

' Les macros sont des portions de code mémorisées dans des fichiers
'    (chemin)\Synedit_Editor_Macros\(nom).macro
' Ces fichiers sont créées par le menu de configuration des macros
' et utilisés à partir du menu d'exécution des macros.

label close0, close3000, close3200, close3300, close3400, close3500
label nouveau, ouvrir, copier, fermer, sauver, sauverdans, sortir
label lignes, options, optionsgen,  tick, fenetre
label aide, apropos, syneditalert
label options_abandon, options_valider
label optionsgen_abandon, optionsgen_valider
label apropos_fermer, outilsconfig, cheminoutil, clickoutil
label ajouteroutil, executeroutil, supprimeroutil
label macrosconfig
label macroadd, macrodel, macromod, macroupd, macroins, macrosel
label syntaxe, keyajouter, keymodifier, keysupprimer
label keychargertout, keysauvertout, keychargerstyles, appliquerkeyattrib

' ===== variables pour gérer les pages d'édition
dim OptGen$          : ' options générales
dim SE%(100)        : ' les objets Synedit
dim hndSE%(100)      : ' les handles des fenêtres
dim ln%(100)        : ' flags "numéros de lignes affichés"
dim capt$(100)      : ' titre des fenetres
dim OSE$(100)        : ' les options des objets
dim FSE$(100)        : ' les noms des fichiers
dim nsyn%            : ' plus grand numéro de page d'édition (0...100)
dim act%            : ' page d'édition actuellement active (0...100)

' ===== variables internes
dim res%, d%, nf%, t%, l%, i%, optvalid%, opt$, opt1$, f$, colorkey$
dim org%, s$, s1$, s2$, olddir$, salert$, nalert%, confirm%, fil$
dim noutil%, poutil$, doutil$, eoutil$

' ===== constantes
dim M1%        : M1% = 0 - 1
dim version$  : version$ = "Alpha 0.6"
dim verdat$    : verdat$ = "26/08/2014"
dim KGF$      : KGF$ = "KGF.dll"
dim dir$      : dir$ = file_extract_path$(param_value$(0))
dim ini$      : ini$ = dir$+"Synedit_editor.ini"
dim dirmacros$ : dirmacros$ = dir$ + "Synedit_Editor_Macros\"
dim q$        : q$ = chr$(34)

' configurer la form 0 (uniquement le menu)
width 0,800 : height 0,60 : border_small 0
caption 0,"Synedit_Editor - Version "+version$+" du "+verdat$

' ===== création de tous les menus
main_menu 10
  sub_menu 11 : parent 11,10 : caption 11,"Fichier"
    sub_menu 12 : parent 12,11 : caption 12,"Nouveau" : on_click 12,nouveau
    sub_menu 13 : parent 13,11 : caption 13,"Ouvrir..." : on_click 13,ouvrir
    sub_menu 14 : parent 14,11 : caption 14,"Copier" : on_click 14,copier
    sub_menu 15 : parent 15,11 : caption 15,"Fermer" : on_click 15,fermer
    sub_menu 16 : parent 16,11 : caption 16,"Sauver" : on_click 16,sauver
    sub_menu 17 : parent 17,11 : caption 17,"Sauver dans..." : on_click 17,sauverdans
    sub_menu 18 : parent 18,11 : caption 18,"-"
    sub_menu 19 : parent 19,11 : caption 19,"Sortir" : on_click 19,sortir
  sub_menu 21 : parent 21,10 : caption 21,"Options"
    sub_menu 22 : parent 22,21 : caption 22,"N° de ligne" : on_click 22,lignes
    sub_menu 23 : parent 23,21 : caption 23,"Options de la page" : on_click 23,options
    sub_menu 24 : parent 24,21 : caption 24,"Options générales" : on_click 24,optionsgen
    sub_menu 25 : parent 25,21 : caption 25,"-"
    sub_menu 26 : parent 26,21 : caption 26,"Syntaxe de la page" : on_click 26,syntaxe
  sub_menu 400 : parent 400,10 : caption 400,"Edition"
    sub_menu 401 : parent 401,400 : caption 401,"pas encore implémenté" : ' on_click 401,???
  sub_menu 430 : parent 430,10 : caption 430,"Outils"
    sub_menu 431 : parent 431,430 : caption 431,"Outils" : on_click 431,outilsconfig
    sub_menu 441 : parent 441,430 : caption 441,"Macros" : on_click 441,macrosconfig
  sub_menu 300 : parent 300,10 : caption 300,"Fenêtres"
'    sub_menu 301 : parent 301,300 : caption 301,"Fenêtre" : on_click 301,fenetre
  sub_menu 420 : parent 420,10 : caption 420,"Aide"
    sub_menu 421 : parent 421,420 : caption 421,"Aide" : on_click 421,aide
    sub_menu 422 : parent 422,420 : caption 422,"A-propos" : on_click 422,apropos

' ===== création de la fenêtre des options de la page actuelle
form 3000 : hide 3000 : caption 3000,"Options" : command_target_is 3000
  top 3000,100 : left 3000,200
  width 3000,550 :height 3000,400 : on_close 3000,close3000
check 3001 : top 3001,10 : left 3001,10 : width 3001,150
  caption 3001,"Numéros de de ligne"
container 3002 : caption 3002,"Format par défaut"
  top 3002,40 : left 3002,10 : width 3002,250 : height 3002,110
combo 3003 : parent 3003,3002 : top 3003,20 : left 3003,10 : width 3003,170
  font_names_load 3003 : text 3003,"Courier"
alpha 3004 : parent 3004,3002 : top 3004,50 : left 3004,10 : caption 3004,"Taille:"
combo 3005 : parent 3005,3002 : top 3005,50 : left 3005,60 : width 3005,40
  item_add 3005,"8"
  item_add 3005,"9"
  item_add 3005,"10"
  item_add 3005,"11"
  item_add 3005,"12"
  item_add 3005,"14"
  item_add 3005,"16"
  item_add 3005,"18"
text 3005,"10"
check 3006 : parent 3006,3002 : top 3006,80 : left 3006,10 : caption 3006,"Gras"
  font_bold 3006
check 3007 : parent 3007,3002 : top 3007,80 : left 3007,60 : caption 3007,"Italique"
  font_italic 3007
check 3008 : parent 3008,3002 : top 3008,80 : left 3008,120 : caption 3008,"Sousligné"
  font_underline 3008
check 3009 : parent 3009,3002 : top 3009,80 : left 3009,190 : caption 3009,"Barré" : width 3009,40
  font_strike 3009
alpha 3010 : top 3010,160 : left 3010,10 : caption 3010,"Syntaxe:"
combo 3011 : top 3011,160 : left 3011,80 : width 3011,150

button 3098 : top 3098,310 : left 3098,10 : caption 3098,"Abandon"
  on_click 3098,options_abandon
button 3099 : top 3099,310 : left 3099,210 : caption 3099,"Valider"
  on_click 3099,options_valider

' ===== création de la fenêtre des options générales
form 3200 : hide 3200 : caption 3200,"Options" : command_target_is 3200
  top 3200,100 : left 3200,200
  width 3200,550 :height 3200,400 : on_close 3200,close3200
check 3201 : top 3201,10 : left 3201,10 : width 3201,150
  caption 3201,"Numéros de de ligne"
container 3202 : caption 3202,"Format par défaut"
  top 3202,40 : left 3202,10 : width 3202,250 : height 3202,110
combo 3203 : parent 3203,3202 : top 3203,20 : left 3203,10 : width 3203,170
  font_names_load 3203 : text 3203,"Courier"
alpha 3204 : parent 3204,3202 : top 3204,50 : left 3204,10 : caption 3204,"Taille:"
combo 3205 : parent 3205,3202 : top 3205,50 : left 3205,60 : width 3205,40
  item_add 3205,"8"
  item_add 3205,"9"
  item_add 3205,"10"
  item_add 3205,"11"
  item_add 3205,"12"
  item_add 3205,"14"
  item_add 3205,"16"
  item_add 3205,"18"
text 3205,"10"
check 3206 : parent 3206,3202 : top 3206,80 : left 3206,10 : caption 3206,"Gras"
  font_bold 3206
check 3207 : parent 3207,3202 : top 3207,80 : left 3207,60 : caption 3207,"Italique"
  font_italic 3207
check 3208 : parent 3208,3202 : top 3208,80 : left 3208,120 : caption 3208,"Sousligné"
  font_underline 3208
check 3209 : parent 3209,3202 : top 3209,80 : left 3209,190 : caption 3209,"Barré" : width 3209,40
  font_strike 3209
alpha 3210 : top 3210,160 : left 3210,10 : caption 3210,"Syntaxe:"
combo 3211 : top 3211,160 : left 3211,80 : width 3211,150
container 3212 : caption 3212,"Style des mots-clé"
  top 3212,190 : left 3212,10 : width 3212,250 : height 3212,100
check 3213 : parent 3213,3212 : top 3213,20 : left 3213,10 : caption 3213,"Gras" : font_bold 3213
check 3214 : parent 3214,3212 : top 3214,20 : left 3214,60 : caption 3214,"Italique" : font_italic 3214
check 3215 : parent 3215,3212 : top 3215,20 : left 3215,120 : caption 3215,"Sousligné" : font_underline 3215
check 3216 : parent 3216,3212 : top 3216,20 : left 3216,190 : caption 3216,"Barré" : font_strike 3216
  width 3216,50
alpha 3218 : parent 3218,3212 : top 3218,50 : left 3218,10 : caption 3218,"Couleur;"
combo 3219 : parent 3219,3212 : top 3219,50 : left 3219,70 : width 3219,70

button 3298 : top 3298,310 : left 3298,10 : caption 3298,"Abandon"
  on_click 3298,optionsgen_abandon
button 3299 : top 3299,310 : left 3299,210 : caption 3299,"Valider"
  on_click 3299,optionsgen_valider


' ===== création de la fenêtre des définitions des macros
form 3300 : hide 3300 : caption 3300,"Configuration des macros" : command_target_is 3300
  top 3300,0 : left 3300,width(0) : border_small 3300
  width 3300,420 :height 3300,105 : on_close 3300,close3300
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins


' ===== création de la fenêtre des définitions de syntaxe de la page
form 3400 : hide 3400 : caption 3400,"Configuration de la syntaxe" : command_target_is 3400
  top 3400,100 : left 3400,200
  width 3400,750 :height 3400,610 : on_close 3400,close3400
Alpha 3401 : top 3401,10 : left 3401,10 : caption 3401,"Mots-clé:"
edit 3402 : top 3402,30 : left 3402,10 : width 3402,200
list 3403 : top 3403,60 : left 3403,10 : width 3403,200 : height 3403,400
  sort_on 3403
button 3404: top 3404,30 : left 3404,220 : width 3404,70
  caption 3404,"Ajouter" : on_click 3404,keyajouter
button 3405: top 3405,60 : left 3405,220 : width 3405,70
  caption 3405,"Modifier" : on_click 3405,keymodifier
button 3406: top 3406,90 : left 3406,220 : width 3406,70
  caption 3406,"Supprimer" : on_click 3406,keysupprimer
button 3409: top 3409,480 : left 3409,10 : width 3409,200 : height 3409,70
  caption 3409,"Charger la syntaxe" : on_click 3409,keychargertout
  font_bold 3409 : font_size 3409,12
button 3410: top 3410,480 : left 3410,300 : width 3410,200 : height 3410,70
  caption 3410,"Sauver la syntaxe" : on_click 3410,keysauvertout
  font_bold 3410 : font_size 3410,12
container 3417 : top 3417,10 : left 3417,310 : width 3417,300 : height 3417,90
  caption 3417,"Attributs Keywords"
alpha 3411 : parent 3411,3417 : top 3411,20 : left 3411,10 : caption 3411,"Styles;"
check 3412 : parent 3412,3417 : top 3412,20 : left 3412,50 : caption 3412,"Gras" : font_bold 3412
check 3413 : parent 3413,3417 : top 3413,20 : left 3413,100 : caption 3413,"Italique" : font_italic 3413
check 3414 : parent 3414,3417 : top 3414,20 : left 3414,160 : caption 3414,"Sousligné" : font_underline 3414
check 3415 : parent 3415,3417 : top 3415,20 : left 3415,230 : caption 3415,"Barré" : font_strike 3415
  width 3415,50
alpha 3418 : parent 3418,3417 : top 3418,50 : left 3418,10 : caption 3418,"Couleur;"
combo 3419 : parent 3419,3417 : top 3419,50 : left 3419,70 : width 3419,70
button 3416 : parent 3416,3417 : top 3416,50 : left 3416,200 : caption 3416,"Appliquer"
  on_click 3416,appliquerkeyattrib
 

' ===== création de la fenêtre A-propos
form 3100 : hide 3100 : top 3100,100 : left 3100,300 : command_target_is 3100
  width 3100,400 : height 3100,200 : on_close 3100,apropos_fermer
picture 3101 : full_space 3101  : print_target_is 3101
font_name 3101,"Courier" : font_size 3101,10 : font_bold 3101
print_locate 40,20  : print "Programme: "+"Synedit_Editor"
print_locate 40,40  : print "Version:  "+version$
print_locate 40,60  : print "Date:      "+verdat$
print_locate 40,80  : print "Auteur:    "+"Klaus"


' ===== création de la fenêtre des définitions des outils
form 3500 : hide 3500 : caption 3500,"Configuration des outils" : command_target_is 3500
  top 3500,100 : left 3500,200 : border_small 3300
  width 3500,520 :height 3500,450 : on_close 3500,close3500
alpha 3501 : top 3501,10 : left 3501,10
  s$ = "Donnez un nom à un outil, un chemin vers l'exécutable et des paramètres. "+chr$(13)+chr$(10)
  s$ = s$ + "Le code %s représente le code source de la page. Le dossier de l'outil sera utilisé."
  caption 3501,s$
alpha 3502 : top 3502,50 : left 3502,10 : caption 3502,"Nom:"
edit 3503 : top 3503,50 : left 3503,80 : width 3503,120
alpha 3504 : top 3504,80 : left 3504,10 : caption 3504,"Cible:"
edit 3505 : top 3505,80 : left 3505,80 : width 3505,300
button 3506 : top 3506,80 : left 3506,390 : width 3506,20 : caption 3506,"..."
  on_click 3506,cheminoutil
alpha 3507 : top 3507,110 : left 3507,10 : caption 3507,"Paramètres:"
edit 3508 : top 3508,110 : left 3508,80 : width 3508,300
button 3510 : top 3510,140 : left 3510,10 : caption 3510,"Ajouter" : width 3510,80
  on_click 3510,ajouteroutil
button 3511 : top 3511,140 : left 3511,100 : caption 3511,"Exécuter" : width 3511,300 : inactive 3511
  on_click 3511,executeroutil
button 3512 : top 3512,140 : left 3512,410 : caption 3512,"Supprimerr" : width 3512,80 : inactive 3512
  on_click 3512,supprimeroutil
grid 3513 : top 3513,170 : left 3513,10 : width 3513,480 : height 3513,190
  grid_column 3513,3 : grid_row 3513,50 : grid_one_column_width 3513,1,120
  grid_one_column_width 3513,2,120 : grid_one_column_width 3513,3,215
  grid_write 3513,1,1,"Outil" : grid_write 3513,1,2,"Chemin" : grid_write 3513,1,3,"Paramètres"
  on_click 3513,clickoutil
if 1=2
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins
end_if


' ===== quelques objets invisbles
command_target_is 0
edit 95 : hide 95 : on_change 95,syneditalert
memo 96 : hide 96
save_dialog 97
open_dialog 98
timer 99 : timer_off 99 : timer_interval 99,300 : on_timer 99,tick
 
' ===== activer la DLL
dll_on KGF$

' === faire quelques initialialisations
res% = dll_call0("SyneditInitialize")
res% = DLL_call2("SetCloseBox",handle(0),0) : ' désactiver la croix rouge !
res% = dll_call3("SyneditFunction",0,4,0)  : ' récupérer la liste des définitions de syntaxe
s$ = clipboard_string_paste$                : ' sauvegarder le presse-papier
clipboard_paste 96                          : ' la charger dans un mémo
for i%=1 to count(96)                      : ' et recopier dans la combo
  item_add 3011,item_read$(96,i%)          : '    options de la page
  item_add 3211,item_read$(96,i%)          : '    options générales
next i%
clipboard_string_copy s$                    : ' restaurer le presse-papier
res% = dll_call2("SelectComboBoxItem",handle(3011),1) : ' sélectionner (aucune)
res% = dll_call2("SelectComboBoxItem",handle(3211),1) : ' sélectionner (aucune)
' OptGen$ = "0100000Courier\(aucune)"        : ' options générales par défaut
OptGen$ = "01000001000Courier\(aucune)"    : ' options générales par défaut
if file_exists(ini$)=1                      : ' si fichier INI existe, relire les options générales
  file_open_read 1,ini$
  file_readln 1,OptGen$
  noutil% = 1
  while file_eof(1)=0
    noutil% = noutil% + 1
    file_readln 1,s$
    grid_write 3513,noutil%,1,s$
    file_readln 1,s$
    grid_write 3513,noutil%,2,s$
    file_readln 1,s$
    grid_write 3513,noutil%,3,s$
  end_while
  file_close 1
  if len(OptGen$)<27
    OptGen$ = left$(OptGen$,7) + "1000" + mid$(OptGen$,8,len(OptGen$))
    file_open_write 1,ini$
    file_writeln 1,OptGen$
    noutil% = 2
    while trim$(grid_read$(3513,noutil%,1))<>""
      file_writeln 1,grid_read$(3513,noutil%,1)
      file_writeln 1,grid_read$(3513,noutil%,2)
      file_writeln 1,grid_read$(3513,noutil%,3)
      noutil% = noutil% + 1
    end_while
    noutil% = 0
    file_close 1
  end_if
else                                        : ' si fichier INI n'existe pas, le créer
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  file_close 1
end_if
if dir_exists(dirmacros$)=0 then dir_make dirmacros$ : ' créer le dossier des macros
olddir$ = dir_current$                      : ' sauvegarder le dossier actuel
dir_change dirmacros$                      : ' aller dans le dossier des macros
s$ = file_find_first$                      : ' parcourir ce dossier
while s$<>"_"                              : '  pour charger la liste des macros existantes
  if left$(s$,1)<>"."
    if right$(s$,6)=".macro"
      s$ = left$(s$,len(s$)-6)
      item_add 3302,s$
    end_if
  end_if
  s$ = file_find_next$
end_while
dir_change olddir$                          : ' restaurer le dossier par défaut
if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1) : ' sélectionner la première macro
item_add 3419,"NOIR"
item_add 3419,"BLEU"
item_add 3419,"ROUGE"
item_add 3419,"VERT"
item_add 3419,"VIOLET"
res% = dll_call2("SelectComboBoxItem",handle(3419),1) : ' sélectionner le noir
for i%=1 to count(3419)
  item_add 3219,item_read$(3419,i%)
next i%
res% = dll_call2("SelectComboBoxItem",handle(3219),1) : ' sélectionner le noir
end




' ===== évènement déclenché par Synedit, quelque soit la page
' l'objetinvisible 95 (un EDIT) contient:
'    Cnnn = la page nnn a changé
'    Hnnn = on a frappé F1 dans la page nnn
syneditalert:
  salert$ = text$(95)
  nalert% = instr("CH",left$(salert$,1))
  select nalert%
    case 1: ' une page a changé
      syneditchange(mid$(salert$,2,3))
    case 2: ' on a frappé F1
      synedithelp(mid$(salert$,2,3))
  end_select
  return

' ===== à la fin, on supprime toutes les fenêtres ouvertes
close0:
  while nsyn%>0
    res% = dll_call1("SyneditDelete",SE%(nsyn%))
    pause 500              : ' ce délai pourra éventuellement être réduit...
    delete 100+nsyn%
    nsyn% = nsyn% - 1
  end_while
  return

' ===== fermeture de la fenêtre des paramètres de la page
close3000:
  closeX(3000)
  return
 
' ===== fermeture de la fenêtre des paramètres généraux
close3200:
  closeX(3200)
  return

' ===== fermeture de la fenêtre de configuration de la syntaxe de la page
close3400:
  closeX(3400)
  return

' ===== fermeture de la fenêtre de configuration des macros
close3300:
  closeX(3300)
  return

' ===== fermeture de la fenêtre de configuration des outils
close3500:
  closeX(3500)
  return

' ===== mode d'emploi
aide:
  message "L'aide n'est pas encore implémentée."
  return
 
' ===== montrer la fenêtre A-propos
apropos:
  show 3100
  inactive 0
  return
 
' ===== fermer la fenêtre A-propos et restaurer la fenêtre active
apropos_fermer:
  hide 3100
  active 0
  if act%=0
    to_foreground 0
  else
    to_foreground 100+act%
  end_if
  return
 
' ===== sortir du programme
sortir:
  if nsyn%>0 then purger()
  gosub close0
  res% = dll_call1("KillProcessByHandle",handle(0))
  ' *** on ne passera jamais ici !

' ===== choisir une fenêtre par le menu "Fenêtres"
fenetre:
  mark_off 300+act%
  act% = number_click-300
  mark_on 300+act%
  show 100 + act%
  to_foreground 100 + act%
  return



' ======================== fonctions du menu "Fichiers"

' ===== créer une nouvelle fenêtre d'édition vide
nouveau:
  if nsyn%=100 then return
  if nsyn%>0
    t% = top(100+nsyn%)
    l% = left(100+nsyn%)
  else
    t% = top(0) + 50
    l% = left(0) + 50
  end_if
  nsyn% = nsyn% + 1
  if act%>0 then mark_off 300+act%
  act% = nsyn%
  d% = 20
  nf% = 100 + nsyn%
  capt$(nsyn%) = "<nouveau "+str$(nsyn%)+">"
  form nf% : top nf%,t%+d% : left nf%,l%+d% : width nf%,600 : height nf%,400
    caption nf%,capt$(nsyn%)
  hndSE%(nsyn%) = handle(nf%)
  opt$ = OptGen$      : ' par défaut, prendre les options générales
  OSE$(nsyn%) = opt$
  FSE$(nsyn%) = "_"
  sub_menu 300+nsyn% : parent 300+nsyn%,300 : caption 300+nsyn%,capt$(nsyn%) : on_click 300+nsyn%,fenetre
  mark_on 300+act%
  SE%(nsyn%) = dll_call2("SyneditCreate",handle(nf%),handle(95))
  res% = dll_call3("SyneditFunction",SE%(nsyn%),3,adr(opt$))
  res% = dll_call5("SyneditGeometry",SE%(nsyn%),M1%,M1%,M1%,M1%)
  if instr(opt$,"\Panoramic")>0
    gosub keychargertout  : ' charge les mots-clé dans Synedit
    gosub keychargerstyles : ' charge les attributs graphiques
  end_if
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
'  res% = dll_call3("SyneditFunction",SE%(nsyn%),6,0) : ' injecter le code démo
  res% = dll_call3("SyneditFunction",SE%(act%),7,0)  : ' forcer le mode ANSI
  if nsyn%=1 then timer_on 99
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger un fichier
ouvrir:
  fil$ = file_name$(98)
  if fil$="_" then return
  if file_exists(fil$)=0
    message "Ouverture impossible"
    return
  end_if
  gosub nouveau
  res% = dll_call2("SyneditOpen",SE%(act%),adr(fil$))
  if res%=0
    FSE$(act%) = fil$
    f$ = file_extract_name$(fil$)
    capt$(act%) = fil$
    caption 100+act%,fil$
    caption 300+act%,fil$
  end_if
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger une copie de la fenêtre active
copier:
  if act%=0 then return
  org% = act%
  gosub nouveau
  if res%=0
    res% = dll_call2("SyneditCopyObject",org%,act%)
    capt$(nsyn%) = "(copie) "+capt$(org%)
    caption 100+nsyn%,capt$(nsyn%)
    caption 300+nsyn%,capt$(nsyn%)
    FSE$(nsyn%) = "_"
    OSE$(nsyn%) = OSE$(org%)
  end_if
  return
 
' ===== fermer la fenêtre active
fermer:
  if act%=0 then return
  if left$(caption$(100+act%),1)="*" then Confirmer("Le code a été modifié. Voulez-vous vraiment fermer la fenêtre ?")
  if confirm%<>1 then return
  res% = dll_call1("SyneditDelete",SE%(act%))
  pause 500
  delete 100+act%
  inactive 300+act%
  caption 300+act%,"<supprimé>"
  SE%(act%) = 0
  act% = act% -1
  while SE%(nsyn%)=0
    delete 300+nsyn%
    nsyn% = nsyn% - 1
    if nsyn%=0 then exit_while
  end_while
  if act%>nsyn% then act% = nsyn%
  return
 
' =====enregistrer la fenêtre active dans son fichier associé
sauver:
  if act%=0 then return
  if FSE$(act%)="_" then goto sauverdans
  f$ = FSE$(act%)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if left$(caption(100+act%),1)="*" then caption 100+act%,mid$(caption 100+act%,3,200)
  return

' ===== enregistrer la fenêtre active dans un fichier choisi par dialogue
sauverdans:
  if act%=0 then return
  f$ = file_name$(97)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Voulez-vous le remplacer ?")<>1 then return
  end_if
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if res%=0
    FSE$(act%) = f$
    f$ = file_extract_name$(f$)
    caption 100+act%,f$
    caption 300+act%,f$
    capt$(act%) = f$
  end_if
  return
 
 
 
' ======================== fonctions du menu "Outils"

' ===== configuration des outils
outilsconfig:
  optvalid% = 0
  show 3500
  inactive 0
  return
 
' ===== sélection de l'outil
cheminoutil:
  f$ = file_name$(98)
  if f$="_" then return
  if file_exists(f$)=0
    message "Ce fichier n'existe pas."
    return
  end_if
  text 3505,f$
  return
 
' ===== clic dans le grid avec les outils
clickoutil:
  noutil% = grid_y_to_row(3513,mouse_y_left_down(3513))
  if grid_read$(3513,noutil%,1)=""
    inactive 3511 : inactive 3512
  else
    active 3511 : active 3512
  end_if
  return
 
' ===== ajouter un nouvel outil
ajouteroutil:
  if trim$(text$(3503))=""
    message "Le nom de l'outil manque."
    return
  end_if
  if trim$(text$(3505))=""
    message "Le chemin de l'outil manque."
    return
  end_if
  if file_exists(text$(3505))=0
    message "Le fichier de l'outil n'existe pas."
    return
  end_if
  ' voir si l'outil existe déjà
  for i%=2 to 50
    if grid_read$(3513,i%,1)=text$(3503)
      message "Cet outil existe déjà."
      return
    end_if
  next i%
  ' trouver la première place libre
  noutil% = 0
  for i%=2 to 50
    if grid_read$(3513,i%,1)=""
      noutil% = i%
      exit_for
    end_if
  next i%
  if noutil%=0
    inactive 3511 : inactive 3512
    message "Désolé. Vous avez déjà 50 outils."
    return
  end_if
  grid_write 3513,noutil%,1,text$(3503)
  grid_write 3513,noutil%,2,text$(3505)
  grid_write 3513,noutil%,3,text$(3508)
  sauver_options_generales()
  active 3511 : active 3512
  return

' === exécuter l'outil sélectionné (ligne noutil%)
executeroutil:
  if act%=0 then return
  poutil$ = grid_read$(3513,noutil%,3)
  doutil$ = file_extract_path$(grid_read$(3513,noutil%,2))
  f$ = doutil$ + "Synedit_Editor_Source.bas" : ' + chr$(34)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  i% = instr(lower$(poutil$),"%s")
  if i%>0
    s$ = ""
    if i%>1 then s$ = left$(poutil$,i%-1)
    poutil$ = s$ + file_extract_name$(f$) + mid$(poutil$,i%+2,300)
  end_if
  eoutil$ = file_extract_name$(grid_read$(3513,noutil%,2))
  res% = DLL_call3("ExecuteProgram",adr(eoutil$),adr(poutil$),adr(doutil$))
  return

' === supprimer l'outil sélectionné (ligne noutil%)
supprimeroutil:
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer l'outil "+grid_read$(3513,noutil%,1))
  if i%<>1 then return
  if noutil%<50
    for i%=noutil% to 49
      grid_write 3513,i%,1,grid_read$(3513,i%+1,1)
      grid_write 3513,i%,2,grid_read$(3513,i%+1,2)
      grid_write 3513,i%,3,grid_read$(3513,i%+1,3)
    next i%
    grid_write 3513,50,1,""
    grid_write 3513,50,2,""
    grid_write 3513,50,3,""
  else
    grid_write 3513,noutil%,1,""
    grid_write 3513,noutil%,2,""
    grid_write 3513,noutil%,3,""
  end_if
  noutil% = 0
  sauver_options_generales()
  inactive 3511 : inactive 3512
  return




' ======================== fonctions du menu "Macros"

' ===== configuration des macros
macrosconfig:
  optvalid% = 0
  show 3300
  inactive 0
  return
 
macrosel:
  to_foreground 0
  to_foreground 100+act%
  set_focus 3307
  return

' ===== ajouter une nouvelle macro à partir du presse-papier
macroadd:
  if act%=0 then return
  f$ = trim$(text$(3302))
  if f$="" then return
  i% = 0
  while i%<count(3302)
    i% = i% + 1
    if f$=item_read$(3302,i%)
      message "Cette macro existe déjà."
      return
    end_if
  end_while
  res% = dll_call1("SyneditCopyText",act%)
  if res%<1
    message "Il n'y a rien dans le presse-papier."
    return
  end_if
  s$ = clipboard_string_paste$
  file_open_write 1,dirmacros$+f$+".macro"
  file_writeln 1,s$
  file_close 1
  item_add 3302,f$
  message "La macro "+f$+" a été créée."
  return
 
' ===== supprimer la macro sélectionnée
macrodel:
  if count(3302)=0 then return
  s$ = item_index$(3302)
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer la macro "+s$)
  if i%<>1 then return
  f$ = dirmacros$ + s$ + ".macro"
  file_delete f$
  item_delete 3302,item_index(3302)
  if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1)
  message "La macro "+s$+" a été supprimée."
  return

' ===== remplacer la page actuelle par la macro sélectionnée
macromod:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditOpen",act%,adr(f$))
  caption 100+act%,"(macro) "+item_index$(3302)
  caption 300+act%,"(macro) "+item_index$(3302)
  capt$(act%) = "(macro) "+item_index$(3302)
  return

' ===== remplacer la macro sélectionnée par la page actuelle
macroupd:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  message "La macro "+item_index$(3302)+" a été remplacée."
  return

' ===== insérer une macro
macroins:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  s$ = ""
  file_open_read 1,f$
  while file_eof(1)=0
    file_readln 1,s1$
    s$= s$ + s1$ + chr$(13) + chr$(10)
  end_while
  file_close 1
  ' ici, charger s$ avec le contenu de la macro
  res% = dll_call2("SyneditInsertString",act%,adr(s$))
  to_foreground 100+act%
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  return




' ======================== fonctions du menu "Options"

' ===== inverser l'indicateur de présence des numéros de ligne dans la fenêtre active
lignes:
  ln%(act%) = 1 - ln%(act%)    : ' basculer 0<-->1
  res% = dll_call3("SyneditFunction",SE%(act%),1,ln%(act%))  : ' signaler à Synedit
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  OSE$(act%) = str$(ln%(act%)) + mid$(OSE$(act%),2,20)  : ' mémoriser dans les param_tres
  return
 
' ===== charger la fenêtre des options avec les valeurs de la fenêtre active, puis afficher
options:
  if act%=0 then return
  optvalid% = 0
  opt$ = OSE$(act%)
  if left$(opt$,1)="1"
    mark_on 3001
  else
    mark_off 3001
  end_if
  text 3005,mid$(opt$,2,2)
  if mid$(opt$,4,1)="1"
    mark_on 3006
  else
    mark_off 3006
  end_if
  if mid$(opt$,5,1)="1"
    mark_on 3007
  else
    mark_off 3007
  end_if
  if mid$(opt$,6,1)="1"
    mark_on 3008
  else
    mark_off 3008
  end_if
  if mid$(opt$,7,1)="1"
    mark_on 3009
  else
    mark_off 3009
  end_if
  i% = instr(opt$,"\")
  text 3003,mid$(opt$,8,i%-8)
  opt$ = mid$(opt$,i%+1,len(opt$))
  for i%=1 to count(3011)
    if opt$=item_read$(3011,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3011),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  show 3000
  inactive 0
  return
 
' ===== charger la fenêtre des options générales, puis afficher
optionsgen:
  if left$(OptGen$,1)="1"
    mark_on 3201
  else
    mark_off 3201
  end_if
  text 3205,mid$(OptGen$,2,2)
  if mid$(OptGen$,4,1)="1"
    mark_on 3206
  else
    mark_off 3206
  end_if
  if mid$(OptGen$,5,1)="1"
    mark_on 3207
  else
    mark_off 3207
  end_if
  if mid$(OptGen$,6,1)="1"
    mark_on 3208
  else
    mark_off 3208
  end_if
  if mid$(OptGen$,7,1)="1"
    mark_on 3209
  else
    mark_off 3209
  end_if
  if mid$(OptGen$,8,1)="1"
    mark_on 3213
  else
    mark_off 3213
  end_if
  if mid$(OptGen$,9,1)="1"
    mark_on 3214
  else
    mark_off 3214
  end_if
  if mid$(OptGen$,10,1)="1"
    mark_on 3215
  else
    mark_off 3215
  end_if
  if mid$(OptGen$,11,1)="1"
    mark_on 3216
  else
    mark_off 3216
  end_if
  i% = instr(OptGen$,"\")
  text 3203,mid$(OptGen$,12,i%-12)
  opt$ = mid$(OptGen$,i%+1,len(OptGen$))
  for i%=1 to count(3211)
    if opt$=item_read$(3211,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3211),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  show 3200
  inactive 0
  return
 
' ===== sortie de la fenêtre des options de la page par "Abandon"
options_abandon:
  hide 3000
  show 0
  active 0
  to_foreground 0
  return

' ===== sortie de la fenêtre des options générales par "Abandon"
optionsgen_abandon:
  hide 3200
  show 0
  active 0
  to_foreground 0
  return

' =====sortie de la fenêtre des options de la page par "Valider"
options_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt$ = str$(checked(3001))+right$("0"+text$(3005),2)+str$(checked(3006))
  opt$ = opt$ + str$(checked(3007))+str$(checked(3008))+str$(checked(3009))
  opt$ = opt$ + mid$(optgen$,8,4)
  opt$ = opt$ + text$(3003) + "\" + text$(3011)
  OSE$(act%) = opt$
  ln%(act%) = checked(3001)
  res% = dll_call3("SyneditFunction",SE%(act%),3,adr(opt$)) : ' activer les nouvelles options
  gosub keychargerstyles : ' charge les attributs graphiques
  hide 3000
  show 0
  active 0
  to_foreground 0
  return
 
' =====sortie de la fenêtre des options générales par "Valider"
optionsgen_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt1$ = str$(checked(3201))+right$("0"+text$(3205),2)+str$(checked(3206))
  opt1$ = opt1$ + str$(checked(3207))+str$(checked(3208))+str$(checked(3209))
  opt1$ = opt1$ + str$(checked(3213))+str$(checked(3214))+str$(checked(3215))+str$(checked(3216))
  opt1$ = opt1$ + text$(3203) + "\" + text$(3211)
  OptGen$ = opt1$    : ' mémoriser les options générales
  colorkey$ = text$(3219)
  res% = dll_call2("SelectComboBoxItem",handle(3419),item_index(3219))
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  file_close 1
  hide 3200
  active 0
  to_foreground 0
  if act%>0 then to_foreground 100+act%
  return

' ===== afficher la fenêtre "Syntaxe"
syntaxe:
  if act%=0 then return
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  if (s$<>"Panoramic") and (s$<>"General")
    message "Action impossible sur cette syntaxe."
    return
  end_if
  optvalid% = 0
  caption 3400,"Configuration de la syntaxe - "+s$
  if mid$(Opt$,8,1)="1"
    mark_on 3412
  else
    mark_off 3412
  end_if
  if mid$(Opt$,9,1)="1"
    mark_on 3413
  else
    mark_off 3413
  end_if
  if mid$(Opt$,10,1)="1"
    mark_on 3414
  else
    mark_off 3414
  end_if
  if mid$(Opt$,11,1)="1"
    mark_on 3415
  else
    mark_off 3415
  end_if

  show 3400
  inactive 0
  return
 
' ===== nouveau mot-cle
keyajouter:
  s$ = lower$(trim$(text$(3402)))
  if s$="" then return
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    if s$=item_read$(3403,i%)
      message "Ce mot-clé existe déjà."
      return
    end_if
  end_while
  item_add 3403,s$
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  appliquer_syntax(s$)
  return

keymodifier:
  return

keysupprimer:
  return

keychargertout:
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  clear 3403
  file_open_read 1,f$
  file_readln 1,s1$
  i% = 1
  if s1$<>"#SYNTAX" then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>s$ then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>"#KEYS" then goto invalidsyntax
  while file_eof(1)=0
    file_readln 1,s1$
    i% = i% + 1
    if s1$="#END" then exit_while
    item_add 3403,s1$
  end_while
' ici, charger les attributs
' #KEYSTYLE
' STYLE=GRAS,ITALIQUE
' COLOR=BLEU
' #END
  file_readln 1,s1$
  i% = 1
  if s1$<>"#KEYSTYLE" then goto invalidsyntax
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"STYLE=" then goto invalidsyntax
  s2$ = ""
  if instr(s1$,"GRAS")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"ITALIQUE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"SOUSLIGNE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"BARRE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"COLOR=" then goto invalidsyntax
  colorkey$ = mid$(s1$,7,len(s1$))
  for i%=1 to count(3419)
    if colorkey$=item_read$(3419,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3419),i%)
      res% = dll_call2("SelectComboBoxItem",handle(3219),i%)
    end_if
  next i%
  file_readln 1,s1$
  i% = 1
  if s1$<>"#END" then goto invalidsyntax
  file_close 1
  appliquer_syntax(s$)
  return
invalidsyntax:
  file_close 1
  message "Fichier invalide en ligne "+str$(i%)+": "+s1$
  return
 
keychargerstyles:
  s$ = mid$(opt$,8,4)
  res% = dll_call4("SyneditConfigureHighlighter",act%,4,adr(s$),adr(colorkey$))
return

keysauvertout:
' format du fichier de la syntaxe:
' fichier Synedit_Editor_Syntax_Panoramic.txt
' #SYNTAX
' Panoramic (nom de la syntaxe en 1 ligne)
' #KEYS
' pause (une ligne par mot-clé)
' ...
' #END
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  file_open_write 1,f$
  file_writeln 1,"#SYNTAX"
  file_writeln 1,s$
  file_writeln 1,"#KEYS"
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    file_writeln 1,item_read$(3403,i%)
  end_while
  file_writeln 1,"#END"
' ici, sauver les attributs
  file_writeln 1,"#KEYSTYLE"
  s$ = ""
  if mid$(optgen$,8,1)="1" then s$ = s$ + "GRAS"
  if mid$(optgen$,9,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "ITALIQUE"
  end_if
  if mid$(optgen$,10,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "SOUSLIGNE"
  end_if
  if mid$(optgen$,11,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "BARRE"
  end_if
  file_writeln 1,"STYLE="+s$
  file_writeln 1,"COLOR="+colorkey$
  file_writeln 1,"#END"
  file_close 1
  message "La syntaxe est sauvée dans "+f$
  return
 
appliquerkeyattrib:
  s2$ = ""
  if checked(3412)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3413)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3414)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3415)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  colorkey$ = text$(3419)
  res% = dll_call2("SelectComboBoxItem",handle(3219),item_index(3419))
  gosub keychargerstyles
  return


' ======================== fonctions indépendantes

' ===== ce timer surveille la fenêtre active et ses dimensions
tick:
  timer_off 99
  res% = dll_call0("GetActiveWindow")  : ' récupérer le handle de la fenêtre active
  for i%=1 to nsyn%                    : ' chercher dans la table des fenêtres d"édition
    if res%=hndSE%(i%)                  : ' est-ce qu'on a trouvé la fenêtre
      if i%<>act%                      : ' est-elle différente de la fenêtre active précédente ?
        mark_off 300+act%              : ' alors changer le marquade du menu
        mark_on 300+i%
      end_if
      act% = i%                        : ' mémoriser le numéro de la fenêtre active
      res% = dll_call5("SyneditGeometry",SE%(act%),M1%,M1%,M1%,M1%) : ' ajuster la taille de Synedit à celle de la fenêtre
      exit_for
    end_if
  next i%
  timer_on 99
  return



' ======================== SUBs internes

' ===== fermer une des fenêres auxiliaires modales
sub CloseX(f%)
  if optvalid%=0
    hide f%
    show 0
    active 0
    if act%=0
      to_foreground 0
    else
      to_foreground 100+act%
    end_if
  end_if
end_sub

' ===== appliquer une syntaxe paramétrée
sub appliquer_syntax(sy$)
  dim_local s$, i%
  s$ = sy$
  i% = instr(s$,"\")
  if i%>0 then s$ = mid$(sy$,i%+1,len(s$))
  ' imposer d'abord les mots-clé
  if (s$="Panoramic") or (s$="General")
    clear 96
    i% = 0
    while i%<count(3403)
      i% = i% + 1
      item_add 96,item_read$(3403,i%)
    end_while
    res% = dll_call4("SyneditConfigureHighlighter",act%,3,handle(96),0)
  else
    message "La syntaxe "+sy$+" ne peut pas être configurée."
  end_if
end_sub

' ===== une des pages a changé
sub syneditchange(n$)
  dim_local n%
  n% = val(n$)
  if left$(caption$(100+n%),1)<>"*" then caption 100+n%,"* "+caption$(100+n%)
end_sub

' ===== on a frappé F1
sub synedithelp(n$)
  dim_local n%
  n% = val(n$)
  message "Aide pas encore implémentée."
end_sub

' ===== demande d'un message de confirmation
sub confirmer(s$)
  confirm% = message_confirmation_yes_no(s$)
end_sub
 
' ===== purger les pages non mises à jour
sub purger()
dim_local i%
  for i%=1 to nsyn%
    if left$(caption$(100+i%),1)="*"
      s$ = "La page ["+capt$(i%)+"] a été modifiée. Voulez-vous la sauvegarder ?"
      confirmer(s$)
      if confirm%=1
        act% = i%
        message "on sauvegarde "+str$(act%)
        to_foreground 100+act%
        res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
        gosub sauver
      end_if
    end_if
  next i%
end_sub

' ===== sauver les options générales
sub sauver_options_generales()
  dim_local i%
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  i% = 2
  while trim$(grid_read$(3513,noutil%,1))<>""
    file_writeln 1,grid_read$(3513,i%,1)
    file_writeln 1,grid_read$(3513,i%,2)
    file_writeln 1,grid_read$(3513,i%,3)
    i% = i% + 1
  end_while
  file_close 1
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Laurent (Minibug)

avatar

Nombre de messages : 2353
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 14:42

Merci Klaus,
Cette fois ci ça fonctionne !

Quelques bugs découverts :
- la couleur de la syntaxe qui n'est pas mémorisée
- Le changement des polices de la page ou général non pris en compte et pas mémorisé systématiquement
- la sélection du programme d’exécution non mémorisé

Peut être ces fonctions ne sont pas encore implantées.
A toi de voir... Smile
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mar 26 Aoû 2014 - 15:05

Pour mémoriser de façon permanente les modifications de couleur et attributs graphiques, il faut aller dns le menu "Options/Syntaxe de la page", puis cliquer sur "Sauver la syntaxe". Sinon, les modification ne sont valables que pour la session en cours.

Pour les "Outils", la mémorisation est faite de façon automatique en cliquant sur la touche "Ajouter", dans le fichier Synedit_Editor.ini. Après la première ligne qui contient des indicateurs, la police et le nom de la syntaxe, il y a des groupes de 3 lignes, chacun décrivant un outil, avec, dans l'ordre, le nom, puis le chemin vers l'outil, et finalement les paramètres.

Pour Panoramic.exe, il suffit de mettre %s dans le champ "Paramètres". Voici ce que ça donne chez moi:


Je viens de faire une petite modif. Maintenant, en cliquant sur une ligne du tableau des outils, les zones de saisie au-dessus s'actualisent en fonction du contenu de la ligne cliquée. Voici ce code:
Code:
' Synedit_Editor.bas                          r

' Options générales
' =================
' Les options générales sont accessibles à tout moment.
' Elles sont mémorisées dans le fichier suivant:
'    (chemin)\Synedit_Editor.ini
' où "chemin" représente le chemin vers Synedit.exe.
' Ces options s'imposent à toutes les pages.
' Leur modification prend effet immédiatement,
' mais leur action n'est visible dans les pages existantes
' que lors de la consultation suivante du paralètre. Par
' exemple, la police par défaut sera utilisée pour créer
' une page vide ou charger un fichier, mais ne modifiera
' pas les polices déjà configurées pour des pages affichées.

' Les macros sont des portions de code mémorisées dans des fichiers
'    (chemin)\Synedit_Editor_Macros\(nom).macro
' Ces fichiers sont créées par le menu de configuration des macros
' et utilisés à partir du menu d'exécution des macros.

label close0, close3000, close3200, close3300, close3400, close3500
label nouveau, ouvrir, copier, fermer, sauver, sauverdans, sortir
label lignes, options, optionsgen,  tick, fenetre
label aide, apropos, syneditalert
label options_abandon, options_valider
label optionsgen_abandon, optionsgen_valider
label apropos_fermer, outilsconfig, cheminoutil, clickoutil
label ajouteroutil, executeroutil, supprimeroutil
label macrosconfig
label macroadd, macrodel, macromod, macroupd, macroins, macrosel
label syntaxe, keyajouter, keymodifier, keysupprimer
label keychargertout, keysauvertout, keychargerstyles, appliquerkeyattrib

' ===== variables pour gérer les pages d'édition
dim OptGen$          : ' options générales
dim SE%(100)        : ' les objets Synedit
dim hndSE%(100)      : ' les handles des fenêtres
dim ln%(100)        : ' flags "numéros de lignes affichés"
dim capt$(100)      : ' titre des fenetres
dim OSE$(100)        : ' les options des objets
dim FSE$(100)        : ' les noms des fichiers
dim nsyn%            : ' plus grand numéro de page d'édition (0...100)
dim act%            : ' page d'édition actuellement active (0...100)

' ===== variables internes
dim res%, d%, nf%, t%, l%, i%, optvalid%, opt$, opt1$, f$, colorkey$
dim org%, s$, s1$, s2$, olddir$, salert$, nalert%, confirm%, fil$
dim noutil%, poutil$, doutil$, eoutil$

' ===== constantes
dim M1%        : M1% = 0 - 1
dim version$  : version$ = "Alpha 0.6"
dim verdat$    : verdat$ = "26/08/2014"
dim KGF$      : KGF$ = "KGF.dll"
dim dir$      : dir$ = file_extract_path$(param_value$(0))
dim ini$      : ini$ = dir$+"Synedit_editor.ini"
dim dirmacros$ : dirmacros$ = dir$ + "Synedit_Editor_Macros\"
dim q$        : q$ = chr$(34)

' configurer la form 0 (uniquement le menu)
width 0,800 : height 0,60 : border_small 0
caption 0,"Synedit_Editor - Version "+version$+" du "+verdat$

' ===== création de tous les menus
main_menu 10
  sub_menu 11 : parent 11,10 : caption 11,"Fichier"
    sub_menu 12 : parent 12,11 : caption 12,"Nouveau" : on_click 12,nouveau
    sub_menu 13 : parent 13,11 : caption 13,"Ouvrir..." : on_click 13,ouvrir
    sub_menu 14 : parent 14,11 : caption 14,"Copier" : on_click 14,copier
    sub_menu 15 : parent 15,11 : caption 15,"Fermer" : on_click 15,fermer
    sub_menu 16 : parent 16,11 : caption 16,"Sauver" : on_click 16,sauver
    sub_menu 17 : parent 17,11 : caption 17,"Sauver dans..." : on_click 17,sauverdans
    sub_menu 18 : parent 18,11 : caption 18,"-"
    sub_menu 19 : parent 19,11 : caption 19,"Sortir" : on_click 19,sortir
  sub_menu 21 : parent 21,10 : caption 21,"Options"
    sub_menu 22 : parent 22,21 : caption 22,"N° de ligne" : on_click 22,lignes
    sub_menu 23 : parent 23,21 : caption 23,"Options de la page" : on_click 23,options
    sub_menu 24 : parent 24,21 : caption 24,"Options générales" : on_click 24,optionsgen
    sub_menu 25 : parent 25,21 : caption 25,"-"
    sub_menu 26 : parent 26,21 : caption 26,"Syntaxe de la page" : on_click 26,syntaxe
  sub_menu 400 : parent 400,10 : caption 400,"Edition"
    sub_menu 401 : parent 401,400 : caption 401,"pas encore implémenté" : ' on_click 401,???
  sub_menu 430 : parent 430,10 : caption 430,"Outils"
    sub_menu 431 : parent 431,430 : caption 431,"Outils" : on_click 431,outilsconfig
    sub_menu 441 : parent 441,430 : caption 441,"Macros" : on_click 441,macrosconfig
  sub_menu 300 : parent 300,10 : caption 300,"Fenêtres"
'    sub_menu 301 : parent 301,300 : caption 301,"Fenêtre" : on_click 301,fenetre
  sub_menu 420 : parent 420,10 : caption 420,"Aide"
    sub_menu 421 : parent 421,420 : caption 421,"Aide" : on_click 421,aide
    sub_menu 422 : parent 422,420 : caption 422,"A-propos" : on_click 422,apropos

' ===== création de la fenêtre des options de la page actuelle
form 3000 : hide 3000 : caption 3000,"Options" : command_target_is 3000
  top 3000,100 : left 3000,200
  width 3000,550 :height 3000,400 : on_close 3000,close3000
check 3001 : top 3001,10 : left 3001,10 : width 3001,150
  caption 3001,"Numéros de de ligne"
container 3002 : caption 3002,"Format par défaut"
  top 3002,40 : left 3002,10 : width 3002,250 : height 3002,110
combo 3003 : parent 3003,3002 : top 3003,20 : left 3003,10 : width 3003,170
  font_names_load 3003 : text 3003,"Courier"
alpha 3004 : parent 3004,3002 : top 3004,50 : left 3004,10 : caption 3004,"Taille:"
combo 3005 : parent 3005,3002 : top 3005,50 : left 3005,60 : width 3005,40
  item_add 3005,"8"
  item_add 3005,"9"
  item_add 3005,"10"
  item_add 3005,"11"
  item_add 3005,"12"
  item_add 3005,"14"
  item_add 3005,"16"
  item_add 3005,"18"
text 3005,"10"
check 3006 : parent 3006,3002 : top 3006,80 : left 3006,10 : caption 3006,"Gras"
  font_bold 3006
check 3007 : parent 3007,3002 : top 3007,80 : left 3007,60 : caption 3007,"Italique"
  font_italic 3007
check 3008 : parent 3008,3002 : top 3008,80 : left 3008,120 : caption 3008,"Sousligné"
  font_underline 3008
check 3009 : parent 3009,3002 : top 3009,80 : left 3009,190 : caption 3009,"Barré" : width 3009,40
  font_strike 3009
alpha 3010 : top 3010,160 : left 3010,10 : caption 3010,"Syntaxe:"
combo 3011 : top 3011,160 : left 3011,80 : width 3011,150

button 3098 : top 3098,310 : left 3098,10 : caption 3098,"Abandon"
  on_click 3098,options_abandon
button 3099 : top 3099,310 : left 3099,210 : caption 3099,"Valider"
  on_click 3099,options_valider

' ===== création de la fenêtre des options générales
form 3200 : hide 3200 : caption 3200,"Options" : command_target_is 3200
  top 3200,100 : left 3200,200
  width 3200,550 :height 3200,400 : on_close 3200,close3200
check 3201 : top 3201,10 : left 3201,10 : width 3201,150
  caption 3201,"Numéros de de ligne"
container 3202 : caption 3202,"Format par défaut"
  top 3202,40 : left 3202,10 : width 3202,250 : height 3202,110
combo 3203 : parent 3203,3202 : top 3203,20 : left 3203,10 : width 3203,170
  font_names_load 3203 : text 3203,"Courier"
alpha 3204 : parent 3204,3202 : top 3204,50 : left 3204,10 : caption 3204,"Taille:"
combo 3205 : parent 3205,3202 : top 3205,50 : left 3205,60 : width 3205,40
  item_add 3205,"8"
  item_add 3205,"9"
  item_add 3205,"10"
  item_add 3205,"11"
  item_add 3205,"12"
  item_add 3205,"14"
  item_add 3205,"16"
  item_add 3205,"18"
text 3205,"10"
check 3206 : parent 3206,3202 : top 3206,80 : left 3206,10 : caption 3206,"Gras"
  font_bold 3206
check 3207 : parent 3207,3202 : top 3207,80 : left 3207,60 : caption 3207,"Italique"
  font_italic 3207
check 3208 : parent 3208,3202 : top 3208,80 : left 3208,120 : caption 3208,"Sousligné"
  font_underline 3208
check 3209 : parent 3209,3202 : top 3209,80 : left 3209,190 : caption 3209,"Barré" : width 3209,40
  font_strike 3209
alpha 3210 : top 3210,160 : left 3210,10 : caption 3210,"Syntaxe:"
combo 3211 : top 3211,160 : left 3211,80 : width 3211,150
container 3212 : caption 3212,"Style des mots-clé"
  top 3212,190 : left 3212,10 : width 3212,250 : height 3212,100
check 3213 : parent 3213,3212 : top 3213,20 : left 3213,10 : caption 3213,"Gras" : font_bold 3213
check 3214 : parent 3214,3212 : top 3214,20 : left 3214,60 : caption 3214,"Italique" : font_italic 3214
check 3215 : parent 3215,3212 : top 3215,20 : left 3215,120 : caption 3215,"Sousligné" : font_underline 3215
check 3216 : parent 3216,3212 : top 3216,20 : left 3216,190 : caption 3216,"Barré" : font_strike 3216
  width 3216,50
alpha 3218 : parent 3218,3212 : top 3218,50 : left 3218,10 : caption 3218,"Couleur;"
combo 3219 : parent 3219,3212 : top 3219,50 : left 3219,70 : width 3219,70

button 3298 : top 3298,310 : left 3298,10 : caption 3298,"Abandon"
  on_click 3298,optionsgen_abandon
button 3299 : top 3299,310 : left 3299,210 : caption 3299,"Valider"
  on_click 3299,optionsgen_valider


' ===== création de la fenêtre des définitions des macros
form 3300 : hide 3300 : caption 3300,"Configuration des macros" : command_target_is 3300
  top 3300,0 : left 3300,width(0) : border_small 3300
  width 3300,420 :height 3300,105 : on_close 3300,close3300
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins


' ===== création de la fenêtre des définitions de syntaxe de la page
form 3400 : hide 3400 : caption 3400,"Configuration de la syntaxe" : command_target_is 3400
  top 3400,100 : left 3400,200
  width 3400,750 :height 3400,610 : on_close 3400,close3400
Alpha 3401 : top 3401,10 : left 3401,10 : caption 3401,"Mots-clé:"
edit 3402 : top 3402,30 : left 3402,10 : width 3402,200
list 3403 : top 3403,60 : left 3403,10 : width 3403,200 : height 3403,400
  sort_on 3403
button 3404: top 3404,30 : left 3404,220 : width 3404,70
  caption 3404,"Ajouter" : on_click 3404,keyajouter
button 3405: top 3405,60 : left 3405,220 : width 3405,70
  caption 3405,"Modifier" : on_click 3405,keymodifier
button 3406: top 3406,90 : left 3406,220 : width 3406,70
  caption 3406,"Supprimer" : on_click 3406,keysupprimer
button 3409: top 3409,480 : left 3409,10 : width 3409,200 : height 3409,70
  caption 3409,"Charger la syntaxe" : on_click 3409,keychargertout
  font_bold 3409 : font_size 3409,12
button 3410: top 3410,480 : left 3410,300 : width 3410,200 : height 3410,70
  caption 3410,"Sauver la syntaxe" : on_click 3410,keysauvertout
  font_bold 3410 : font_size 3410,12
container 3417 : top 3417,10 : left 3417,310 : width 3417,300 : height 3417,90
  caption 3417,"Attributs Keywords"
alpha 3411 : parent 3411,3417 : top 3411,20 : left 3411,10 : caption 3411,"Styles;"
check 3412 : parent 3412,3417 : top 3412,20 : left 3412,50 : caption 3412,"Gras" : font_bold 3412
check 3413 : parent 3413,3417 : top 3413,20 : left 3413,100 : caption 3413,"Italique" : font_italic 3413
check 3414 : parent 3414,3417 : top 3414,20 : left 3414,160 : caption 3414,"Sousligné" : font_underline 3414
check 3415 : parent 3415,3417 : top 3415,20 : left 3415,230 : caption 3415,"Barré" : font_strike 3415
  width 3415,50
alpha 3418 : parent 3418,3417 : top 3418,50 : left 3418,10 : caption 3418,"Couleur;"
combo 3419 : parent 3419,3417 : top 3419,50 : left 3419,70 : width 3419,70
button 3416 : parent 3416,3417 : top 3416,50 : left 3416,200 : caption 3416,"Appliquer"
  on_click 3416,appliquerkeyattrib
 

' ===== création de la fenêtre A-propos
form 3100 : hide 3100 : top 3100,100 : left 3100,300 : command_target_is 3100
  width 3100,400 : height 3100,200 : on_close 3100,apropos_fermer
picture 3101 : full_space 3101  : print_target_is 3101
font_name 3101,"Courier" : font_size 3101,10 : font_bold 3101
print_locate 40,20  : print "Programme: "+"Synedit_Editor"
print_locate 40,40  : print "Version:  "+version$
print_locate 40,60  : print "Date:      "+verdat$
print_locate 40,80  : print "Auteur:    "+"Klaus"


' ===== création de la fenêtre des définitions des outils
form 3500 : hide 3500 : caption 3500,"Configuration des outils" : command_target_is 3500
  top 3500,100 : left 3500,200 : border_small 3300
  width 3500,520 :height 3500,450 : on_close 3500,close3500
alpha 3501 : top 3501,10 : left 3501,10
  s$ = "Donnez un nom à un outil, un chemin vers l'exécutable et des paramètres. "+chr$(13)+chr$(10)
  s$ = s$ + "Le code %s représente le code source de la page. Le dossier de l'outil sera utilisé."
  caption 3501,s$
alpha 3502 : top 3502,50 : left 3502,10 : caption 3502,"Nom:"
edit 3503 : top 3503,50 : left 3503,80 : width 3503,120
alpha 3504 : top 3504,80 : left 3504,10 : caption 3504,"Cible:"
edit 3505 : top 3505,80 : left 3505,80 : width 3505,300
button 3506 : top 3506,80 : left 3506,390 : width 3506,20 : caption 3506,"..."
  on_click 3506,cheminoutil
alpha 3507 : top 3507,110 : left 3507,10 : caption 3507,"Paramètres:"
edit 3508 : top 3508,110 : left 3508,80 : width 3508,300
button 3510 : top 3510,140 : left 3510,10 : caption 3510,"Ajouter" : width 3510,80
  on_click 3510,ajouteroutil
button 3511 : top 3511,140 : left 3511,100 : caption 3511,"Exécuter" : width 3511,300 : inactive 3511
  on_click 3511,executeroutil
button 3512 : top 3512,140 : left 3512,410 : caption 3512,"Supprimerr" : width 3512,80 : inactive 3512
  on_click 3512,supprimeroutil
grid 3513 : top 3513,170 : left 3513,10 : width 3513,480 : height 3513,190
  grid_column 3513,3 : grid_row 3513,50 : grid_one_column_width 3513,1,120
  grid_one_column_width 3513,2,120 : grid_one_column_width 3513,3,215
  grid_write 3513,1,1,"Outil" : grid_write 3513,1,2,"Chemin" : grid_write 3513,1,3,"Paramètres"
  on_click 3513,clickoutil
if 1=2
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins
end_if


' ===== quelques objets invisbles
command_target_is 0
edit 95 : hide 95 : on_change 95,syneditalert
memo 96 : hide 96
save_dialog 97
open_dialog 98
timer 99 : timer_off 99 : timer_interval 99,300 : on_timer 99,tick
 
' ===== activer la DLL
dll_on KGF$

' === faire quelques initialialisations
res% = dll_call0("SyneditInitialize")
res% = DLL_call2("SetCloseBox",handle(0),0) : ' désactiver la croix rouge !
res% = dll_call3("SyneditFunction",0,4,0)  : ' récupérer la liste des définitions de syntaxe
s$ = clipboard_string_paste$                : ' sauvegarder le presse-papier
clipboard_paste 96                          : ' la charger dans un mémo
for i%=1 to count(96)                      : ' et recopier dans la combo
  item_add 3011,item_read$(96,i%)          : '    options de la page
  item_add 3211,item_read$(96,i%)          : '    options générales
next i%
clipboard_string_copy s$                    : ' restaurer le presse-papier
res% = dll_call2("SelectComboBoxItem",handle(3011),1) : ' sélectionner (aucune)
res% = dll_call2("SelectComboBoxItem",handle(3211),1) : ' sélectionner (aucune)
' OptGen$ = "0100000Courier\(aucune)"        : ' options générales par défaut
OptGen$ = "01000001000Courier\(aucune)"    : ' options générales par défaut
if file_exists(ini$)=1                      : ' si fichier INI existe, relire les options générales
  file_open_read 1,ini$
  file_readln 1,OptGen$
  noutil% = 1
  while file_eof(1)=0
    noutil% = noutil% + 1
    file_readln 1,s$
    grid_write 3513,noutil%,1,s$
    file_readln 1,s$
    grid_write 3513,noutil%,2,s$
    file_readln 1,s$
    grid_write 3513,noutil%,3,s$
  end_while
  file_close 1
  if len(OptGen$)<27
    OptGen$ = left$(OptGen$,7) + "1000" + mid$(OptGen$,8,len(OptGen$))
    file_open_write 1,ini$
    file_writeln 1,OptGen$
    noutil% = 2
    while trim$(grid_read$(3513,noutil%,1))<>""
      file_writeln 1,grid_read$(3513,noutil%,1)
      file_writeln 1,grid_read$(3513,noutil%,2)
      file_writeln 1,grid_read$(3513,noutil%,3)
      noutil% = noutil% + 1
    end_while
    noutil% = 0
    file_close 1
  end_if
else                                        : ' si fichier INI n'existe pas, le créer
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  file_close 1
end_if
if dir_exists(dirmacros$)=0 then dir_make dirmacros$ : ' créer le dossier des macros
olddir$ = dir_current$                      : ' sauvegarder le dossier actuel
dir_change dirmacros$                      : ' aller dans le dossier des macros
s$ = file_find_first$                      : ' parcourir ce dossier
while s$<>"_"                              : '  pour charger la liste des macros existantes
  if left$(s$,1)<>"."
    if right$(s$,6)=".macro"
      s$ = left$(s$,len(s$)-6)
      item_add 3302,s$
    end_if
  end_if
  s$ = file_find_next$
end_while
dir_change olddir$                          : ' restaurer le dossier par défaut
if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1) : ' sélectionner la première macro
item_add 3419,"NOIR"
item_add 3419,"BLEU"
item_add 3419,"ROUGE"
item_add 3419,"VERT"
item_add 3419,"VIOLET"
res% = dll_call2("SelectComboBoxItem",handle(3419),1) : ' sélectionner le noir
for i%=1 to count(3419)
  item_add 3219,item_read$(3419,i%)
next i%
res% = dll_call2("SelectComboBoxItem",handle(3219),1) : ' sélectionner le noir
end




' ===== évènement déclenché par Synedit, quelque soit la page
' l'objetinvisible 95 (un EDIT) contient:
'    Cnnn = la page nnn a changé
'    Hnnn = on a frappé F1 dans la page nnn
syneditalert:
  salert$ = text$(95)
  nalert% = instr("CH",left$(salert$,1))
  select nalert%
    case 1: ' une page a changé
      syneditchange(mid$(salert$,2,3))
    case 2: ' on a frappé F1
      synedithelp(mid$(salert$,2,3))
  end_select
  return

' ===== à la fin, on supprime toutes les fenêtres ouvertes
close0:
  while nsyn%>0
    res% = dll_call1("SyneditDelete",SE%(nsyn%))
    pause 500              : ' ce délai pourra éventuellement être réduit...
    delete 100+nsyn%
    nsyn% = nsyn% - 1
  end_while
  return

' ===== fermeture de la fenêtre des paramètres de la page
close3000:
  closeX(3000)
  return
 
' ===== fermeture de la fenêtre des paramètres généraux
close3200:
  closeX(3200)
  return

' ===== fermeture de la fenêtre de configuration de la syntaxe de la page
close3400:
  closeX(3400)
  return

' ===== fermeture de la fenêtre de configuration des macros
close3300:
  closeX(3300)
  return

' ===== fermeture de la fenêtre de configuration des outils
close3500:
  closeX(3500)
  return

' ===== mode d'emploi
aide:
  message "L'aide n'est pas encore implémentée."
  return
 
' ===== montrer la fenêtre A-propos
apropos:
  show 3100
  inactive 0
  return
 
' ===== fermer la fenêtre A-propos et restaurer la fenêtre active
apropos_fermer:
  hide 3100
  active 0
  if act%=0
    to_foreground 0
  else
    to_foreground 100+act%
  end_if
  return
 
' ===== sortir du programme
sortir:
  if nsyn%>0 then purger()
  gosub close0
  res% = dll_call1("KillProcessByHandle",handle(0))
  ' *** on ne passera jamais ici !

' ===== choisir une fenêtre par le menu "Fenêtres"
fenetre:
  mark_off 300+act%
  act% = number_click-300
  mark_on 300+act%
  show 100 + act%
  to_foreground 100 + act%
  return



' ======================== fonctions du menu "Fichiers"

' ===== créer une nouvelle fenêtre d'édition vide
nouveau:
  if nsyn%=100 then return
  if nsyn%>0
    t% = top(100+nsyn%)
    l% = left(100+nsyn%)
  else
    t% = top(0) + 50
    l% = left(0) + 50
  end_if
  nsyn% = nsyn% + 1
  if act%>0 then mark_off 300+act%
  act% = nsyn%
  d% = 20
  nf% = 100 + nsyn%
  capt$(nsyn%) = "<nouveau "+str$(nsyn%)+">"
  form nf% : top nf%,t%+d% : left nf%,l%+d% : width nf%,600 : height nf%,400
    caption nf%,capt$(nsyn%)
  hndSE%(nsyn%) = handle(nf%)
  opt$ = OptGen$      : ' par défaut, prendre les options générales
  OSE$(nsyn%) = opt$
  FSE$(nsyn%) = "_"
  sub_menu 300+nsyn% : parent 300+nsyn%,300 : caption 300+nsyn%,capt$(nsyn%) : on_click 300+nsyn%,fenetre
  mark_on 300+act%
  SE%(nsyn%) = dll_call2("SyneditCreate",handle(nf%),handle(95))
  res% = dll_call3("SyneditFunction",SE%(nsyn%),3,adr(opt$))
  res% = dll_call5("SyneditGeometry",SE%(nsyn%),M1%,M1%,M1%,M1%)
  if instr(opt$,"\Panoramic")>0
    gosub keychargertout  : ' charge les mots-clé dans Synedit
    gosub keychargerstyles : ' charge les attributs graphiques
  end_if
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
'  res% = dll_call3("SyneditFunction",SE%(nsyn%),6,0) : ' injecter le code démo
  res% = dll_call3("SyneditFunction",SE%(act%),7,0)  : ' forcer le mode ANSI
  if nsyn%=1 then timer_on 99
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger un fichier
ouvrir:
  fil$ = file_name$(98)
  if fil$="_" then return
  if file_exists(fil$)=0
    message "Ouverture impossible"
    return
  end_if
  gosub nouveau
  res% = dll_call2("SyneditOpen",SE%(act%),adr(fil$))
  if res%=0
    FSE$(act%) = fil$
    f$ = file_extract_name$(fil$)
    capt$(act%) = fil$
    caption 100+act%,fil$
    caption 300+act%,fil$
  end_if
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger une copie de la fenêtre active
copier:
  if act%=0 then return
  org% = act%
  gosub nouveau
  if res%=0
    res% = dll_call2("SyneditCopyObject",org%,act%)
    capt$(nsyn%) = "(copie) "+capt$(org%)
    caption 100+nsyn%,capt$(nsyn%)
    caption 300+nsyn%,capt$(nsyn%)
    FSE$(nsyn%) = "_"
    OSE$(nsyn%) = OSE$(org%)
  end_if
  return
 
' ===== fermer la fenêtre active
fermer:
  if act%=0 then return
  if left$(caption$(100+act%),1)="*" then Confirmer("Le code a été modifié. Voulez-vous vraiment fermer la fenêtre ?")
  if confirm%<>1 then return
  res% = dll_call1("SyneditDelete",SE%(act%))
  pause 500
  delete 100+act%
  inactive 300+act%
  caption 300+act%,"<supprimé>"
  SE%(act%) = 0
  act% = act% -1
  while SE%(nsyn%)=0
    delete 300+nsyn%
    nsyn% = nsyn% - 1
    if nsyn%=0 then exit_while
  end_while
  if act%>nsyn% then act% = nsyn%
  return
 
' =====enregistrer la fenêtre active dans son fichier associé
sauver:
  if act%=0 then return
  if FSE$(act%)="_" then goto sauverdans
  f$ = FSE$(act%)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if left$(caption(100+act%),1)="*" then caption 100+act%,mid$(caption 100+act%,3,200)
  return

' ===== enregistrer la fenêtre active dans un fichier choisi par dialogue
sauverdans:
  if act%=0 then return
  f$ = file_name$(97)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Voulez-vous le remplacer ?")<>1 then return
  end_if
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if res%=0
    FSE$(act%) = f$
    f$ = file_extract_name$(f$)
    caption 100+act%,f$
    caption 300+act%,f$
    capt$(act%) = f$
  end_if
  return
 
 
 
' ======================== fonctions du menu "Outils"

' ===== configuration des outils
outilsconfig:
  optvalid% = 0
  show 3500
  inactive 0
  return
 
' ===== sélection de l'outil
cheminoutil:
  f$ = file_name$(98)
  if f$="_" then return
  if file_exists(f$)=0
    message "Ce fichier n'existe pas."
    return
  end_if
  text 3505,f$
  return
 
' ===== clic dans le grid avec les outils
clickoutil:
  noutil% = grid_y_to_row(3513,mouse_y_left_down(3513))
  if grid_read$(3513,noutil%,1)=""
    inactive 3511 : inactive 3512
    text 3503,""
    text 3505,""
    text 3508,""
  else
    active 3511 : active 3512
    text 3503,grid_read$(3513,noutil%,1)
    text 3505,grid_read$(3513,noutil%,2)
    text 3508,grid_read$(3513,noutil%,3)
  end_if
  return
 
' ===== ajouter un nouvel outil
ajouteroutil:
  if trim$(text$(3503))=""
    message "Le nom de l'outil manque."
    return
  end_if
  if trim$(text$(3505))=""
    message "Le chemin de l'outil manque."
    return
  end_if
  if file_exists(text$(3505))=0
    message "Le fichier de l'outil n'existe pas."
    return
  end_if
  ' voir si l'outil existe déjà
  for i%=2 to 50
    if grid_read$(3513,i%,1)=text$(3503)
      message "Cet outil existe déjà."
      return
    end_if
  next i%
  ' trouver la première place libre
  noutil% = 0
  for i%=2 to 50
    if grid_read$(3513,i%,1)=""
      noutil% = i%
      exit_for
    end_if
  next i%
  if noutil%=0
    inactive 3511 : inactive 3512
    message "Désolé. Vous avez déjà 50 outils."
    return
  end_if
  grid_write 3513,noutil%,1,text$(3503)
  grid_write 3513,noutil%,2,text$(3505)
  grid_write 3513,noutil%,3,text$(3508)
  sauver_options_generales()
  active 3511 : active 3512
  return

' === exécuter l'outil sélectionné (ligne noutil%)
executeroutil:
  if act%=0 then return
  poutil$ = grid_read$(3513,noutil%,3)
  doutil$ = file_extract_path$(grid_read$(3513,noutil%,2))
  f$ = doutil$ + "Synedit_Editor_Source.bas" : ' + chr$(34)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  i% = instr(lower$(poutil$),"%s")
  if i%>0
    s$ = ""
    if i%>1 then s$ = left$(poutil$,i%-1)
    poutil$ = s$ + file_extract_name$(f$) + mid$(poutil$,i%+2,300)
  end_if
  eoutil$ = file_extract_name$(grid_read$(3513,noutil%,2))
  res% = DLL_call3("ExecuteProgram",adr(eoutil$),adr(poutil$),adr(doutil$))
  return

' === supprimer l'outil sélectionné (ligne noutil%)
supprimeroutil:
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer l'outil "+grid_read$(3513,noutil%,1))
  if i%<>1 then return
  if noutil%<50
    for i%=noutil% to 49
      grid_write 3513,i%,1,grid_read$(3513,i%+1,1)
      grid_write 3513,i%,2,grid_read$(3513,i%+1,2)
      grid_write 3513,i%,3,grid_read$(3513,i%+1,3)
    next i%
    grid_write 3513,50,1,""
    grid_write 3513,50,2,""
    grid_write 3513,50,3,""
  else
    grid_write 3513,noutil%,1,""
    grid_write 3513,noutil%,2,""
    grid_write 3513,noutil%,3,""
  end_if
  noutil% = 0
  sauver_options_generales()
  inactive 3511 : inactive 3512
  return




' ======================== fonctions du menu "Macros"

' ===== configuration des macros
macrosconfig:
  optvalid% = 0
  show 3300
  inactive 0
  return
 
macrosel:
  to_foreground 0
  to_foreground 100+act%
  set_focus 3307
  return

' ===== ajouter une nouvelle macro à partir du presse-papier
macroadd:
  if act%=0 then return
  f$ = trim$(text$(3302))
  if f$="" then return
  i% = 0
  while i%<count(3302)
    i% = i% + 1
    if f$=item_read$(3302,i%)
      message "Cette macro existe déjà."
      return
    end_if
  end_while
  res% = dll_call1("SyneditCopyText",act%)
  if res%<1
    message "Il n'y a rien dans le presse-papier."
    return
  end_if
  s$ = clipboard_string_paste$
  file_open_write 1,dirmacros$+f$+".macro"
  file_writeln 1,s$
  file_close 1
  item_add 3302,f$
  message "La macro "+f$+" a été créée."
  return
 
' ===== supprimer la macro sélectionnée
macrodel:
  if count(3302)=0 then return
  s$ = item_index$(3302)
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer la macro "+s$)
  if i%<>1 then return
  f$ = dirmacros$ + s$ + ".macro"
  file_delete f$
  item_delete 3302,item_index(3302)
  if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1)
  message "La macro "+s$+" a été supprimée."
  return

' ===== remplacer la page actuelle par la macro sélectionnée
macromod:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditOpen",act%,adr(f$))
  caption 100+act%,"(macro) "+item_index$(3302)
  caption 300+act%,"(macro) "+item_index$(3302)
  capt$(act%) = "(macro) "+item_index$(3302)
  return

' ===== remplacer la macro sélectionnée par la page actuelle
macroupd:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  message "La macro "+item_index$(3302)+" a été remplacée."
  return

' ===== insérer une macro
macroins:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  s$ = ""
  file_open_read 1,f$
  while file_eof(1)=0
    file_readln 1,s1$
    s$= s$ + s1$ + chr$(13) + chr$(10)
  end_while
  file_close 1
  ' ici, charger s$ avec le contenu de la macro
  res% = dll_call2("SyneditInsertString",act%,adr(s$))
  to_foreground 100+act%
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  return




' ======================== fonctions du menu "Options"

' ===== inverser l'indicateur de présence des numéros de ligne dans la fenêtre active
lignes:
  ln%(act%) = 1 - ln%(act%)    : ' basculer 0<-->1
  res% = dll_call3("SyneditFunction",SE%(act%),1,ln%(act%))  : ' signaler à Synedit
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  OSE$(act%) = str$(ln%(act%)) + mid$(OSE$(act%),2,20)  : ' mémoriser dans les param_tres
  return
 
' ===== charger la fenêtre des options avec les valeurs de la fenêtre active, puis afficher
options:
  if act%=0 then return
  optvalid% = 0
  opt$ = OSE$(act%)
  if left$(opt$,1)="1"
    mark_on 3001
  else
    mark_off 3001
  end_if
  text 3005,mid$(opt$,2,2)
  if mid$(opt$,4,1)="1"
    mark_on 3006
  else
    mark_off 3006
  end_if
  if mid$(opt$,5,1)="1"
    mark_on 3007
  else
    mark_off 3007
  end_if
  if mid$(opt$,6,1)="1"
    mark_on 3008
  else
    mark_off 3008
  end_if
  if mid$(opt$,7,1)="1"
    mark_on 3009
  else
    mark_off 3009
  end_if
  i% = instr(opt$,"\")
  text 3003,mid$(opt$,8,i%-8)
  opt$ = mid$(opt$,i%+1,len(opt$))
  for i%=1 to count(3011)
    if opt$=item_read$(3011,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3011),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  show 3000
  inactive 0
  return
 
' ===== charger la fenêtre des options générales, puis afficher
optionsgen:
  if left$(OptGen$,1)="1"
    mark_on 3201
  else
    mark_off 3201
  end_if
  text 3205,mid$(OptGen$,2,2)
  if mid$(OptGen$,4,1)="1"
    mark_on 3206
  else
    mark_off 3206
  end_if
  if mid$(OptGen$,5,1)="1"
    mark_on 3207
  else
    mark_off 3207
  end_if
  if mid$(OptGen$,6,1)="1"
    mark_on 3208
  else
    mark_off 3208
  end_if
  if mid$(OptGen$,7,1)="1"
    mark_on 3209
  else
    mark_off 3209
  end_if
  if mid$(OptGen$,8,1)="1"
    mark_on 3213
  else
    mark_off 3213
  end_if
  if mid$(OptGen$,9,1)="1"
    mark_on 3214
  else
    mark_off 3214
  end_if
  if mid$(OptGen$,10,1)="1"
    mark_on 3215
  else
    mark_off 3215
  end_if
  if mid$(OptGen$,11,1)="1"
    mark_on 3216
  else
    mark_off 3216
  end_if
  i% = instr(OptGen$,"\")
  text 3203,mid$(OptGen$,12,i%-12)
  opt$ = mid$(OptGen$,i%+1,len(OptGen$))
  for i%=1 to count(3211)
    if opt$=item_read$(3211,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3211),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  show 3200
  inactive 0
  return
 
' ===== sortie de la fenêtre des options de la page par "Abandon"
options_abandon:
  hide 3000
  show 0
  active 0
  to_foreground 0
  return

' ===== sortie de la fenêtre des options générales par "Abandon"
optionsgen_abandon:
  hide 3200
  show 0
  active 0
  to_foreground 0
  return

' =====sortie de la fenêtre des options de la page par "Valider"
options_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt$ = str$(checked(3001))+right$("0"+text$(3005),2)+str$(checked(3006))
  opt$ = opt$ + str$(checked(3007))+str$(checked(3008))+str$(checked(3009))
  opt$ = opt$ + mid$(optgen$,8,4)
  opt$ = opt$ + text$(3003) + "\" + text$(3011)
  OSE$(act%) = opt$
  ln%(act%) = checked(3001)
  res% = dll_call3("SyneditFunction",SE%(act%),3,adr(opt$)) : ' activer les nouvelles options
  gosub keychargerstyles : ' charge les attributs graphiques
  hide 3000
  show 0
  active 0
  to_foreground 0
  return
 
' =====sortie de la fenêtre des options générales par "Valider"
optionsgen_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt1$ = str$(checked(3201))+right$("0"+text$(3205),2)+str$(checked(3206))
  opt1$ = opt1$ + str$(checked(3207))+str$(checked(3208))+str$(checked(3209))
  opt1$ = opt1$ + str$(checked(3213))+str$(checked(3214))+str$(checked(3215))+str$(checked(3216))
  opt1$ = opt1$ + text$(3203) + "\" + text$(3211)
  OptGen$ = opt1$    : ' mémoriser les options générales
  colorkey$ = text$(3219)
  res% = dll_call2("SelectComboBoxItem",handle(3419),item_index(3219))
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  file_close 1
  hide 3200
  active 0
  to_foreground 0
  if act%>0 then to_foreground 100+act%
  return

' ===== afficher la fenêtre "Syntaxe"
syntaxe:
  if act%=0 then return
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  if (s$<>"Panoramic") and (s$<>"General")
    message "Action impossible sur cette syntaxe."
    return
  end_if
  optvalid% = 0
  caption 3400,"Configuration de la syntaxe - "+s$
  if mid$(Opt$,8,1)="1"
    mark_on 3412
  else
    mark_off 3412
  end_if
  if mid$(Opt$,9,1)="1"
    mark_on 3413
  else
    mark_off 3413
  end_if
  if mid$(Opt$,10,1)="1"
    mark_on 3414
  else
    mark_off 3414
  end_if
  if mid$(Opt$,11,1)="1"
    mark_on 3415
  else
    mark_off 3415
  end_if

  show 3400
  inactive 0
  return
 
' ===== nouveau mot-cle
keyajouter:
  s$ = lower$(trim$(text$(3402)))
  if s$="" then return
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    if s$=item_read$(3403,i%)
      message "Ce mot-clé existe déjà."
      return
    end_if
  end_while
  item_add 3403,s$
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  appliquer_syntax(s$)
  return

keymodifier:
  return

keysupprimer:
  return

keychargertout:
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  clear 3403
  file_open_read 1,f$
  file_readln 1,s1$
  i% = 1
  if s1$<>"#SYNTAX" then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>s$ then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>"#KEYS" then goto invalidsyntax
  while file_eof(1)=0
    file_readln 1,s1$
    i% = i% + 1
    if s1$="#END" then exit_while
    item_add 3403,s1$
  end_while
' ici, charger les attributs
' #KEYSTYLE
' STYLE=GRAS,ITALIQUE
' COLOR=BLEU
' #END
  file_readln 1,s1$
  i% = 1
  if s1$<>"#KEYSTYLE" then goto invalidsyntax
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"STYLE=" then goto invalidsyntax
  s2$ = ""
  if instr(s1$,"GRAS")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"ITALIQUE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"SOUSLIGNE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"BARRE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"COLOR=" then goto invalidsyntax
  colorkey$ = mid$(s1$,7,len(s1$))
  for i%=1 to count(3419)
    if colorkey$=item_read$(3419,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3419),i%)
      res% = dll_call2("SelectComboBoxItem",handle(3219),i%)
    end_if
  next i%
  file_readln 1,s1$
  i% = 1
  if s1$<>"#END" then goto invalidsyntax
  file_close 1
  appliquer_syntax(s$)
  return
invalidsyntax:
  file_close 1
  message "Fichier invalide en ligne "+str$(i%)+": "+s1$
  return
 
keychargerstyles:
  s$ = mid$(opt$,8,4)
  res% = dll_call4("SyneditConfigureHighlighter",act%,4,adr(s$),adr(colorkey$))
return

keysauvertout:
' format du fichier de la syntaxe:
' fichier Synedit_Editor_Syntax_Panoramic.txt
' #SYNTAX
' Panoramic (nom de la syntaxe en 1 ligne)
' #KEYS
' pause (une ligne par mot-clé)
' ...
' #END
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  file_open_write 1,f$
  file_writeln 1,"#SYNTAX"
  file_writeln 1,s$
  file_writeln 1,"#KEYS"
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    file_writeln 1,item_read$(3403,i%)
  end_while
  file_writeln 1,"#END"
' ici, sauver les attributs
  file_writeln 1,"#KEYSTYLE"
  s$ = ""
  if mid$(optgen$,8,1)="1" then s$ = s$ + "GRAS"
  if mid$(optgen$,9,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "ITALIQUE"
  end_if
  if mid$(optgen$,10,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "SOUSLIGNE"
  end_if
  if mid$(optgen$,11,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "BARRE"
  end_if
  file_writeln 1,"STYLE="+s$
  file_writeln 1,"COLOR="+colorkey$
  file_writeln 1,"#END"
  file_close 1
  message "La syntaxe est sauvée dans "+f$
  return
 
appliquerkeyattrib:
  s2$ = ""
  if checked(3412)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3413)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3414)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3415)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  colorkey$ = text$(3419)
  res% = dll_call2("SelectComboBoxItem",handle(3219),item_index(3419))
  gosub keychargerstyles
  return


' ======================== fonctions indépendantes

' ===== ce timer surveille la fenêtre active et ses dimensions
tick:
  timer_off 99
  res% = dll_call0("GetActiveWindow")  : ' récupérer le handle de la fenêtre active
  for i%=1 to nsyn%                    : ' chercher dans la table des fenêtres d"édition
    if res%=hndSE%(i%)                  : ' est-ce qu'on a trouvé la fenêtre
      if i%<>act%                      : ' est-elle différente de la fenêtre active précédente ?
        mark_off 300+act%              : ' alors changer le marquade du menu
        mark_on 300+i%
      end_if
      act% = i%                        : ' mémoriser le numéro de la fenêtre active
      res% = dll_call5("SyneditGeometry",SE%(act%),M1%,M1%,M1%,M1%) : ' ajuster la taille de Synedit à celle de la fenêtre
      exit_for
    end_if
  next i%
  timer_on 99
  return



' ======================== SUBs internes

' ===== fermer une des fenêres auxiliaires modales
sub CloseX(f%)
  if optvalid%=0
    hide f%
    show 0
    active 0
    if act%=0
      to_foreground 0
    else
      to_foreground 100+act%
    end_if
  end_if
end_sub

' ===== appliquer une syntaxe paramétrée
sub appliquer_syntax(sy$)
  dim_local s$, i%
  s$ = sy$
  i% = instr(s$,"\")
  if i%>0 then s$ = mid$(sy$,i%+1,len(s$))
  ' imposer d'abord les mots-clé
  if (s$="Panoramic") or (s$="General")
    clear 96
    i% = 0
    while i%<count(3403)
      i% = i% + 1
      item_add 96,item_read$(3403,i%)
    end_while
    res% = dll_call4("SyneditConfigureHighlighter",act%,3,handle(96),0)
  else
    message "La syntaxe "+sy$+" ne peut pas être configurée."
  end_if
end_sub

' ===== une des pages a changé
sub syneditchange(n$)
  dim_local n%
  n% = val(n$)
  if left$(caption$(100+n%),1)<>"*" then caption 100+n%,"* "+caption$(100+n%)
end_sub

' ===== on a frappé F1
sub synedithelp(n$)
  dim_local n%
  n% = val(n$)
  message "Aide pas encore implémentée."
end_sub

' ===== demande d'un message de confirmation
sub confirmer(s$)
  confirm% = message_confirmation_yes_no(s$)
end_sub
 
' ===== purger les pages non mises à jour
sub purger()
dim_local i%
  for i%=1 to nsyn%
    if left$(caption$(100+i%),1)="*"
      s$ = "La page ["+capt$(i%)+"] a été modifiée. Voulez-vous la sauvegarder ?"
      confirmer(s$)
      if confirm%=1
        act% = i%
        message "on sauvegarde "+str$(act%)
        to_foreground 100+act%
        res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
        gosub sauver
      end_if
    end_if
  next i%
end_sub

' ===== sauver les options générales
sub sauver_options_generales()
  dim_local i%
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  i% = 2
  while trim$(grid_read$(3513,noutil%,1))<>""
    file_writeln 1,grid_read$(3513,i%,1)
    file_writeln 1,grid_read$(3513,i%,2)
    file_writeln 1,grid_read$(3513,i%,3)
    i% = i% + 1
  end_while
  file_close 1
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mer 27 Aoû 2014 - 2:38

Nouvelle version Alpha 0.7 du 27/08/2014, utilisant la nouvelle version V3.29 du 27/08/2014 de KGF.dll.

Nouveauté: on peut maintenant gérer les chaînes de caractères exactement comme les mots-clé, en choisissant les attributs et la couleur.

Voici la version de Synedit_Editor qui gère cela:
Code:
' Synedit_Editor.bas                          r

' Options générales
' =================
' Les options générales sont accessibles à tout moment.
' Elles sont mémorisées dans le fichier suivant:
'    (chemin)\Synedit_Editor.ini
' où "chemin" représente le chemin vers Synedit.exe.
' Ces options s'imposent à toutes les pages.
' Leur modification prend effet immédiatement,
' mais leur action n'est visible dans les pages existantes
' que lors de la consultation suivante du paralètre. Par
' exemple, la police par défaut sera utilisée pour créer
' une page vide ou charger un fichier, mais ne modifiera
' pas les polices déjà configurées pour des pages affichées.

' Les macros sont des portions de code mémorisées dans des fichiers
'    (chemin)\Synedit_Editor_Macros\(nom).macro
' Ces fichiers sont créées par le menu de configuration des macros
' et utilisés à partir du menu d'exécution des macros.

' Le fichier des options générales contient les lignes suivantes:
' 1=xttgisbp\S    pour les options générales du texte
' suivi de 3 lignes par outil configuré

label close0, close3000, close3200, close3300, close3400, close3500
label nouveau, ouvrir, copier, fermer, sauver, sauverdans, sortir
label lignes, options, optionsgen,  tick, fenetre
label aide, apropos, syneditalert
label options_abandon, options_valider
label optionsgen_abandon, optionsgen_valider
label apropos_fermer, outilsconfig, cheminoutil, clickoutil
label ajouteroutil, executeroutil, supprimeroutil
label macrosconfig
label macroadd, macrodel, macromod, macroupd, macroins, macrosel
label syntaxe, keyajouter, keymodifier, keysupprimer
label keychargertout, keysauvertout, keychargerstyles, appliquerkeyattrib
label appliquerstringattrib, stringchargerstyles

' ===== variables pour gérer les pages d'édition
dim OptGen$          : ' options générales
  ' xttgisbP\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' P=police S=syntaxe
dim OptGenKeyAtt$    : ' pour mots-clé: gisbC    général
dim OptGenKeyClr$    : ' pour mots-clé: couleur  généra
dim OptGenStrAtt$    : ' pour chaînes:  gisbC    généra
dim OptGenStrClr$    : ' pour chaînes:  couleur  généra
dim OptKeyAtt$      : ' pour mots-clé: gisbC    page actuelle
dim OptKeyClr$      : ' pour mots-clé: couleur  page actuelle
dim OptStrAtt$      : ' pour chaînes:  gisbC    page actuelle
dim OptStrClr$      : ' pour chaînes:  couleur  page actuelle
dim SE%(100)        : ' les objets Synedit
dim hndSE%(100)      : ' les handles des fenêtres
dim ln%(100)        : ' flags "numéros de lignes affichés"
dim capt$(100)      : ' titre des fenetres
dim OSE$(100)        : ' les options des objets
dim FSE$(100)        : ' les noms des fichiers
dim nsyn%            : ' plus grand numéro de page d'édition (0...100)
dim act%            : ' page d'édition actuellement active (0...100)
' dim colorkey$        : ' couleur des mots-clé
dim colorstring$    : ' couleur des chaînes de caractères

' ===== variables internes
dim res%, d%, nf%, t%, l%, i%, optvalid%, opt$, opt1$, f$
dim org%, s$, s1$, s2$, olddir$, salert$, nalert%, confirm%, fil$
dim noutil%, poutil$, doutil$, eoutil$

' ===== constantes
dim M1%        : M1% = 0 - 1
dim version$  : version$ = "Alpha 0.7"
dim verdat$    : verdat$ = "27/08/2014"
dim KGF$      : KGF$ = "KGF.dll"
dim dir$      : dir$ = file_extract_path$(param_value$(0))
dim ini$      : ini$ = dir$+"Synedit_editor.ini"
dim dirmacros$ : dirmacros$ = dir$ + "Synedit_Editor_Macros\"
dim q$        : q$ = chr$(34)

data "Noir","Eau","Bleu","Crème","Gris foncé","Gris","Vert","Citron"
data "Gris clair","Marron","Gris moyen","Vert menthe","Bleu marine"
data "Vert olive","Violet","Rouge","Argent","Bleu ciel","Fuschia"
data "Canard","Blanc","Jaune","./."


' configurer la form 0 (uniquement le menu)
width 0,800 : height 0,60 : border_small 0
caption 0,"Synedit_Editor - Version "+version$+" du "+verdat$

' ===== création de tous les menus
main_menu 10
  sub_menu 11 : parent 11,10 : caption 11,"Fichier"
    sub_menu 12 : parent 12,11 : caption 12,"Nouveau" : on_click 12,nouveau
    sub_menu 13 : parent 13,11 : caption 13,"Ouvrir..." : on_click 13,ouvrir
    sub_menu 14 : parent 14,11 : caption 14,"Copier" : on_click 14,copier
    sub_menu 15 : parent 15,11 : caption 15,"Fermer" : on_click 15,fermer
    sub_menu 16 : parent 16,11 : caption 16,"Sauver" : on_click 16,sauver
    sub_menu 17 : parent 17,11 : caption 17,"Sauver dans..." : on_click 17,sauverdans
    sub_menu 18 : parent 18,11 : caption 18,"-"
    sub_menu 19 : parent 19,11 : caption 19,"Sortir" : on_click 19,sortir
  sub_menu 21 : parent 21,10 : caption 21,"Options"
    sub_menu 22 : parent 22,21 : caption 22,"N° de ligne" : on_click 22,lignes
    sub_menu 23 : parent 23,21 : caption 23,"Options de la page" : on_click 23,options
    sub_menu 24 : parent 24,21 : caption 24,"Options générales" : on_click 24,optionsgen
    sub_menu 25 : parent 25,21 : caption 25,"-"
    sub_menu 26 : parent 26,21 : caption 26,"Syntaxe de la page" : on_click 26,syntaxe
  sub_menu 400 : parent 400,10 : caption 400,"Edition"
    sub_menu 401 : parent 401,400 : caption 401,"pas encore implémenté" : ' on_click 401,???
  sub_menu 430 : parent 430,10 : caption 430,"Outils"
    sub_menu 431 : parent 431,430 : caption 431,"Outils" : on_click 431,outilsconfig
    sub_menu 441 : parent 441,430 : caption 441,"Macros" : on_click 441,macrosconfig
  sub_menu 300 : parent 300,10 : caption 300,"Fenêtres"
'    sub_menu 301 : parent 301,300 : caption 301,"Fenêtre" : on_click 301,fenetre
  sub_menu 420 : parent 420,10 : caption 420,"Aide"
    sub_menu 421 : parent 421,420 : caption 421,"Aide" : on_click 421,aide
    sub_menu 422 : parent 422,420 : caption 422,"A-propos" : on_click 422,apropos

' ===== création de la fenêtre des options de la page actuelle
form 3000 : hide 3000 : caption 3000,"Options de la page" : command_target_is 3000
  top 3000,100 : left 3000,200
  width 3000,550 :height 3000,400 : on_close 3000,close3000
check 3001 : top 3001,10 : left 3001,10 : width 3001,150
  caption 3001,"Numéros de de ligne"
container 3002 : caption 3002,"Format par défaut"
  top 3002,40 : left 3002,10 : width 3002,250 : height 3002,110
combo 3003 : parent 3003,3002 : top 3003,20 : left 3003,10 : width 3003,170
  font_names_load 3003 : text 3003,"Courier"
alpha 3004 : parent 3004,3002 : top 3004,50 : left 3004,10 : caption 3004,"Taille:"
combo 3005 : parent 3005,3002 : top 3005,50 : left 3005,60 : width 3005,40
  item_add 3005,"8"
  item_add 3005,"9"
  item_add 3005,"10"
  item_add 3005,"11"
  item_add 3005,"12"
  item_add 3005,"14"
  item_add 3005,"16"
  item_add 3005,"18"
text 3005,"10"
check 3006 : parent 3006,3002 : top 3006,80 : left 3006,10 : caption 3006,"Gras"
  font_bold 3006
check 3007 : parent 3007,3002 : top 3007,80 : left 3007,60 : caption 3007,"Italique"
  font_italic 3007
check 3008 : parent 3008,3002 : top 3008,80 : left 3008,120 : caption 3008,"Sousligné"
  font_underline 3008
check 3009 : parent 3009,3002 : top 3009,80 : left 3009,190 : caption 3009,"Barré" : width 3009,40
  font_strike 3009
alpha 3010 : top 3010,160 : left 3010,10 : caption 3010,"Syntaxe:"
combo 3011 : top 3011,160 : left 3011,80 : width 3011,150

button 3098 : top 3098,310 : left 3098,10 : caption 3098,"Abandon"
  on_click 3098,options_abandon
button 3099 : top 3099,310 : left 3099,210 : caption 3099,"Valider"
  on_click 3099,options_valider

' ===== création de la fenêtre des options générales
form 3200 : hide 3200 : caption 3200,"Options générales" : command_target_is 3200
  top 3200,100 : left 3200,200
  width 3200,550 :height 3200,400 : on_close 3200,close3200
check 3201 : top 3201,10 : left 3201,10 : width 3201,150
  caption 3201,"Numéros de de ligne"
container 3202 : caption 3202,"Format par défaut"
  top 3202,40 : left 3202,10 : width 3202,250 : height 3202,110
combo 3203 : parent 3203,3202 : top 3203,20 : left 3203,10 : width 3203,170
  font_names_load 3203 : text 3203,"Courier"
alpha 3204 : parent 3204,3202 : top 3204,50 : left 3204,10 : caption 3204,"Taille:"
combo 3205 : parent 3205,3202 : top 3205,50 : left 3205,60 : width 3205,40
  item_add 3205,"8"
  item_add 3205,"9"
  item_add 3205,"10"
  item_add 3205,"11"
  item_add 3205,"12"
  item_add 3205,"14"
  item_add 3205,"16"
  item_add 3205,"18"
text 3205,"10"
check 3206 : parent 3206,3202 : top 3206,80 : left 3206,10 : caption 3206,"Gras"
  font_bold 3206
check 3207 : parent 3207,3202 : top 3207,80 : left 3207,60 : caption 3207,"Italique"
  font_italic 3207
check 3208 : parent 3208,3202 : top 3208,80 : left 3208,120 : caption 3208,"Sousligné"
  font_underline 3208
check 3209 : parent 3209,3202 : top 3209,80 : left 3209,190 : caption 3209,"Barré" : width 3209,40
  font_strike 3209
alpha 3210 : top 3210,160 : left 3210,10 : caption 3210,"Syntaxe:"
combo 3211 : top 3211,160 : left 3211,80 : width 3211,150
container 3212 : caption 3212,"Style des mots-clé"
  top 3212,40 : left 3212,270 : width 3212,250 : height 3212,100
check 3213 : parent 3213,3212 : top 3213,20 : left 3213,10 : caption 3213,"Gras" : font_bold 3213
check 3214 : parent 3214,3212 : top 3214,20 : left 3214,60 : caption 3214,"Italique" : font_italic 3214
check 3215 : parent 3215,3212 : top 3215,20 : left 3215,120 : caption 3215,"Sousligné" : font_underline 3215
check 3216 : parent 3216,3212 : top 3216,20 : left 3216,190 : caption 3216,"Barré" : font_strike 3216
  width 3216,50
alpha 3218 : parent 3218,3212 : top 3218,50 : left 3218,10 : caption 3218,"Couleur;"
combo 3219 : parent 3219,3212 : top 3219,50 : left 3219,70 : width 3219,70

container 3227 : top 3227,150 : left 3227,270 : width 3227,250 : height 3227,90
  caption 3227,"Style des chaînes de caractères"
check 3222 : parent 3222,3227 : top 3222,20 : left 3222,10 : caption 3222,"Gras" : font_bold 3222
check 3223 : parent 3223,3227 : top 3223,20 : left 3223,60 : caption 3223,"Italique" : font_italic 3223
check 3224 : parent 3224,3227 : top 3224,20 : left 3224,120 : caption 3224,"Sousligné" : font_underline 3224
check 3225 : parent 3225,3227 : top 3225,20 : left 3225,190 : caption 3225,"Barré" : font_strike 3225
  width 3225,50
alpha 3228 : parent 3228,3227 : top 3228,50 : left 3228,10 : caption 3228,"Couleur;"
combo 3229 : parent 3229,3227 : top 3229,50 : left 3229,70 : width 3229,70
' button 3226 : parent 3226,3227 : top 3226,50 : left 3226,200 : caption 3226,"Appliquer"
'  on_click 3226,appliquerstringattrib

button 3298 : top 3298,310 : left 3298,10 : caption 3298,"Abandon"
  on_click 3298,optionsgen_abandon
button 3299 : top 3299,310 : left 3299,210 : caption 3299,"Valider"
  on_click 3299,optionsgen_valider


' ===== création de la fenêtre des définitions des macros
form 3300 : hide 3300 : caption 3300,"Configuration des macros" : command_target_is 3300
  top 3300,0 : left 3300,width(0) : border_small 3300
  width 3300,420 :height 3300,105 : on_close 3300,close3300
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins


' ===== création de la fenêtre des définitions de syntaxe de la page
form 3400 : hide 3400 : caption 3400,"Configuration de la syntaxe" : command_target_is 3400
  top 3400,100 : left 3400,200
  width 3400,750 :height 3400,610 : on_close 3400,close3400
Alpha 3401 : top 3401,10 : left 3401,10 : caption 3401,"Mots-clé:"
edit 3402 : top 3402,30 : left 3402,10 : width 3402,200
list 3403 : top 3403,60 : left 3403,10 : width 3403,200 : height 3403,400
  sort_on 3403
button 3404: top 3404,30 : left 3404,220 : width 3404,70
  caption 3404,"Ajouter" : on_click 3404,keyajouter
button 3405: top 3405,60 : left 3405,220 : width 3405,70
  caption 3405,"Modifier" : on_click 3405,keymodifier
button 3406: top 3406,90 : left 3406,220 : width 3406,70
  caption 3406,"Supprimer" : on_click 3406,keysupprimer
button 3409: top 3409,480 : left 3409,10 : width 3409,200 : height 3409,70
  caption 3409,"Charger la syntaxe" : on_click 3409,keychargertout
  font_bold 3409 : font_size 3409,12
button 3410: top 3410,480 : left 3410,300 : width 3410,200 : height 3410,70
  caption 3410,"Sauver la syntaxe" : on_click 3410,keysauvertout
  font_bold 3410 : font_size 3410,12
container 3417 : top 3417,10 : left 3417,310 : width 3417,300 : height 3417,90
  caption 3417,"Style des mots-clé"
alpha 3411 : parent 3411,3417 : top 3411,20 : left 3411,10 : caption 3411,"Styles;"
check 3412 : parent 3412,3417 : top 3412,20 : left 3412,50 : caption 3412,"Gras" : font_bold 3412
check 3413 : parent 3413,3417 : top 3413,20 : left 3413,100 : caption 3413,"Italique" : font_italic 3413
check 3414 : parent 3414,3417 : top 3414,20 : left 3414,160 : caption 3414,"Sousligné" : font_underline 3414
check 3415 : parent 3415,3417 : top 3415,20 : left 3415,230 : caption 3415,"Barré" : font_strike 3415
  width 3415,50
alpha 3418 : parent 3418,3417 : top 3418,50 : left 3418,10 : caption 3418,"Couleur;"
combo 3419 : parent 3419,3417 : top 3419,50 : left 3419,70 : width 3419,70
button 3416 : parent 3416,3417 : top 3416,50 : left 3416,200 : caption 3416,"Appliquer"
  on_click 3416,appliquerkeyattrib
 
container 3427 : top 3427,110 : left 3427,310 : width 3427,300 : height 3427,90
  caption 3427,"Style des chaînes de caractères"
alpha 3421 : parent 3421,3427 : top 3421,20 : left 3421,10 : caption 3421,"Styles;"
check 3422 : parent 3422,3427 : top 3422,20 : left 3422,50 : caption 3422,"Gras" : font_bold 3422
check 3423 : parent 3423,3427 : top 3423,20 : left 3423,100 : caption 3423,"Italique" : font_italic 3423
check 3424 : parent 3424,3427 : top 3424,20 : left 3424,160 : caption 3424,"Sousligné" : font_underline 3424
check 3425 : parent 3425,3427 : top 3425,20 : left 3425,230 : caption 3425,"Barré" : font_strike 3425
  width 3425,50
alpha 3428 : parent 3428,3427 : top 3428,50 : left 3428,10 : caption 3428,"Couleur;"
combo 3429 : parent 3429,3427 : top 3429,50 : left 3429,70 : width 3429,70
button 3426 : parent 3426,3427 : top 3426,50 : left 3426,200 : caption 3426,"Appliquer"
  on_click 3426,appliquerstringattrib

' ===== création de la fenêtre A-propos
form 3100 : hide 3100 : top 3100,100 : left 3100,300 : command_target_is 3100
  width 3100,400 : height 3100,200 : on_close 3100,apropos_fermer
picture 3101 : full_space 3101  : print_target_is 3101
font_name 3101,"Courier" : font_size 3101,10 : font_bold 3101
print_locate 40,20  : print "Programme: "+"Synedit_Editor"
print_locate 40,40  : print "Version:  "+version$
print_locate 40,60  : print "Date:      "+verdat$
print_locate 40,80  : print "Auteur:    "+"Klaus"


' ===== création de la fenêtre des définitions des outils
form 3500 : hide 3500 : caption 3500,"Configuration des outils" : command_target_is 3500
  top 3500,100 : left 3500,200 : border_small 3300
  width 3500,520 :height 3500,450 : on_close 3500,close3500
alpha 3501 : top 3501,10 : left 3501,10
  s$ = "Donnez un nom à un outil, un chemin vers l'exécutable et des paramètres. "+chr$(13)+chr$(10)
  s$ = s$ + "Le code %s représente le code source de la page. Le dossier de l'outil sera utilisé."
  caption 3501,s$
alpha 3502 : top 3502,50 : left 3502,10 : caption 3502,"Nom:"
edit 3503 : top 3503,50 : left 3503,80 : width 3503,120
alpha 3504 : top 3504,80 : left 3504,10 : caption 3504,"Cible:"
edit 3505 : top 3505,80 : left 3505,80 : width 3505,300
button 3506 : top 3506,80 : left 3506,390 : width 3506,20 : caption 3506,"..."
  on_click 3506,cheminoutil
alpha 3507 : top 3507,110 : left 3507,10 : caption 3507,"Paramètres:"
edit 3508 : top 3508,110 : left 3508,80 : width 3508,300
button 3510 : top 3510,140 : left 3510,10 : caption 3510,"Ajouter" : width 3510,80
  on_click 3510,ajouteroutil
button 3511 : top 3511,140 : left 3511,100 : caption 3511,"Exécuter" : width 3511,300 : inactive 3511
  on_click 3511,executeroutil
button 3512 : top 3512,140 : left 3512,410 : caption 3512,"Supprimerr" : width 3512,80 : inactive 3512
  on_click 3512,supprimeroutil
grid 3513 : top 3513,170 : left 3513,10 : width 3513,480 : height 3513,190
  grid_column 3513,3 : grid_row 3513,50 : grid_one_column_width 3513,1,120
  grid_one_column_width 3513,2,120 : grid_one_column_width 3513,3,215
  grid_write 3513,1,1,"Outil" : grid_write 3513,1,2,"Chemin" : grid_write 3513,1,3,"Paramètres"
  on_click 3513,clickoutil
if 1=2
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins
end_if


' ===== quelques objets invisbles
command_target_is 0
edit 95 : hide 95 : on_change 95,syneditalert
memo 96 : hide 96
save_dialog 97
open_dialog 98
timer 99 : timer_off 99 : timer_interval 99,300 : on_timer 99,tick
 
' ===== activer la DLL
dll_on KGF$

' === faire quelques initialialisations
res% = dll_call0("SyneditInitialize")
res% = DLL_call2("SetCloseBox",handle(0),0) : ' désactiver la croix rouge !
res% = dll_call3("SyneditFunction",0,4,0)  : ' récupérer la liste des définitions de syntaxe
s$ = clipboard_string_paste$                : ' sauvegarder le presse-papier
clipboard_paste 96                          : ' la charger dans un mémo
for i%=1 to count(96)                      : ' et recopier dans la combo
  item_add 3011,item_read$(96,i%)          : '    options de la page
  item_add 3211,item_read$(96,i%)          : '    options générales
next i%
clipboard_string_copy s$                    : ' restaurer le presse-papier
res% = dll_call2("SelectComboBoxItem",handle(3011),1) : ' sélectionner (aucune)
res% = dll_call2("SelectComboBoxItem",handle(3211),1) : ' sélectionner (aucune)
' OptGen$ = "0100000Courier\(aucune)"        : ' options générales par défaut
OptGen$ = "01000001000Courier\(aucune)"    : ' options générales par défaut
if file_exists(ini$)=1                      : ' si fichier INI existe, relire les options générales
  file_open_read 1,ini$
  file_readln 1,OptGen$
  noutil% = 1
  while file_eof(1)=0
    noutil% = noutil% + 1
    file_readln 1,s$
    grid_write 3513,noutil%,1,s$
    file_readln 1,s$
    grid_write 3513,noutil%,2,s$
    file_readln 1,s$
    grid_write 3513,noutil%,3,s$
  end_while
  file_close 1
else                                        : ' si fichier INI n'existe pas, le créer
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  file_close 1
end_if
if dir_exists(dirmacros$)=0 then dir_make dirmacros$ : ' créer le dossier des macros
olddir$ = dir_current$                      : ' sauvegarder le dossier actuel
dir_change dirmacros$                      : ' aller dans le dossier des macros
s$ = file_find_first$                      : ' parcourir ce dossier
while s$<>"_"                              : '  pour charger la liste des macros existantes
  if left$(s$,1)<>"."
    if right$(s$,6)=".macro"
      s$ = left$(s$,len(s$)-6)
      item_add 3302,s$
    end_if
  end_if
  s$ = file_find_next$
end_while
dir_change olddir$                          : ' restaurer le dossier par défaut
if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1) : ' sélectionner la première macro
read s$
while s$<>"./."
  item_add 3419,s$  : ' options syntaxe:  couleur des mots-clé
  item_add 3429,s$  : ' options syntaxe:  couleur des chaînes de caractères
  item_add 3219,s$  : ' options générales: couleur des mots-clé
  item_add 3229,s$  : ' options générales: couleur des chaînes de caractères
  read s$
end_while
res% = dll_call2("SelectComboBoxItem",handle(3419),1) : ' sélectionner le noir
res% = dll_call2("SelectComboBoxItem",handle(3429),1) : ' sélectionner le noir
res% = dll_call2("SelectComboBoxItem",handle(3219),1) : ' sélectionner le noir
res% = dll_call2("SelectComboBoxItem",handle(3229),1) : ' sélectionner le noir

end




' ===== évènement déclenché par Synedit, quelque soit la page
' l'objetinvisible 95 (un EDIT) contient:
'    Cnnn = la page nnn a changé
'    Hnnn = on a frappé F1 dans la page nnn
syneditalert:
  salert$ = text$(95)
  nalert% = instr("CH",left$(salert$,1))
  select nalert%
    case 1: ' une page a changé
      syneditchange(mid$(salert$,2,3))
    case 2: ' on a frappé F1
      synedithelp(mid$(salert$,2,3))
  end_select
  return

' ===== à la fin, on supprime toutes les fenêtres ouvertes
close0:
  while nsyn%>0
    res% = dll_call1("SyneditDelete",SE%(nsyn%))
    pause 500              : ' ce délai pourra éventuellement être réduit...
    delete 100+nsyn%
    nsyn% = nsyn% - 1
  end_while
  return

' ===== fermeture de la fenêtre des paramètres de la page
close3000:
  closeX(3000)
  return
 
' ===== fermeture de la fenêtre des paramètres généraux
close3200:
  closeX(3200)
  return

' ===== fermeture de la fenêtre de configuration de la syntaxe de la page
close3400:
  closeX(3400)
  return

' ===== fermeture de la fenêtre de configuration des macros
close3300:
  closeX(3300)
  return

' ===== fermeture de la fenêtre de configuration des outils
close3500:
  closeX(3500)
  return

' ===== mode d'emploi
aide:
  message "L'aide n'est pas encore implémentée."
  return
 
' ===== montrer la fenêtre A-propos
apropos:
  show 3100
  inactive 0
  return
 
' ===== fermer la fenêtre A-propos et restaurer la fenêtre active
apropos_fermer:
  hide 3100
  active 0
  if act%=0
    to_foreground 0
  else
    to_foreground 100+act%
  end_if
  return
 
' ===== sortir du programme
sortir:
  if nsyn%>0 then purger()
  gosub close0
  res% = dll_call1("KillProcessByHandle",handle(0))
  ' *** on ne passera jamais ici !

' ===== choisir une fenêtre par le menu "Fenêtres"
fenetre:
  mark_off 300+act%
  act% = number_click-300
  mark_on 300+act%
  show 100 + act%
  to_foreground 100 + act%
  return



' ======================== fonctions du menu "Fichiers"

' ===== créer une nouvelle fenêtre d'édition vide
nouveau:
  if nsyn%=100 then return
  if nsyn%>0
    t% = top(100+nsyn%)
    l% = left(100+nsyn%)
  else
    t% = top(0) + 50
    l% = left(0) + 50
  end_if
  nsyn% = nsyn% + 1
  if act%>0 then mark_off 300+act%
  act% = nsyn%
  d% = 20
  nf% = 100 + nsyn%
  capt$(nsyn%) = "<nouveau "+str$(nsyn%)+">"
  form nf% : top nf%,t%+d% : left nf%,l%+d% : width nf%,600 : height nf%,400
    caption nf%,capt$(nsyn%)
  hndSE%(nsyn%) = handle(nf%)
  opt$ = OptGen$      : ' par défaut, prendre les options générales
  OSE$(nsyn%) = opt$
  FSE$(nsyn%) = "_"
  sub_menu 300+nsyn% : parent 300+nsyn%,300 : caption 300+nsyn%,capt$(nsyn%) : on_click 300+nsyn%,fenetre
  mark_on 300+act%
  SE%(nsyn%) = dll_call2("SyneditCreate",handle(nf%),handle(95))
  res% = dll_call3("SyneditFunction",SE%(nsyn%),3,adr(opt$))
  res% = dll_call5("SyneditGeometry",SE%(nsyn%),M1%,M1%,M1%,M1%)
  if instr(opt$,"\Panoramic")>0
    gosub keychargertout      : ' charge les mots-clé dans Synedit
    gosub keychargerstyles    : ' charge les attributs graphiques des mots-clé
    gosub stringchargerstyles : ' charge les attributs graphiques des chaînes
  end_if
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
'  res% = dll_call3("SyneditFunction",SE%(nsyn%),6,0) : ' injecter le code démo
  res% = dll_call3("SyneditFunction",SE%(act%),7,0)  : ' forcer le mode ANSI
  if nsyn%=1 then timer_on 99
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger un fichier
ouvrir:
  fil$ = file_name$(98)
  if fil$="_" then return
  if file_exists(fil$)=0
    message "Ouverture impossible"
    return
  end_if
  gosub nouveau
  res% = dll_call2("SyneditOpen",SE%(act%),adr(fil$))
  if res%=0
    FSE$(act%) = fil$
    f$ = file_extract_name$(fil$)
    capt$(act%) = fil$
    caption 100+act%,fil$
    caption 300+act%,fil$
  end_if
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger une copie de la fenêtre active
copier:
  if act%=0 then return
  org% = act%
  gosub nouveau
  if res%=0
    res% = dll_call2("SyneditCopyObject",org%,act%)
    capt$(nsyn%) = "(copie) "+capt$(org%)
    caption 100+nsyn%,capt$(nsyn%)
    caption 300+nsyn%,capt$(nsyn%)
    FSE$(nsyn%) = "_"
    OSE$(nsyn%) = OSE$(org%)
  end_if
  return
 
' ===== fermer la fenêtre active
fermer:
  if act%=0 then return
  if left$(caption$(100+act%),1)="*" then Confirmer("Le code a été modifié. Voulez-vous vraiment fermer la fenêtre ?")
  if confirm%<>1 then return
  res% = dll_call1("SyneditDelete",SE%(act%))
  pause 500
  delete 100+act%
  inactive 300+act%
  caption 300+act%,"<supprimé>"
  SE%(act%) = 0
  act% = act% -1
  while SE%(nsyn%)=0
    delete 300+nsyn%
    nsyn% = nsyn% - 1
    if nsyn%=0 then exit_while
  end_while
  if act%>nsyn% then act% = nsyn%
  return
 
' =====enregistrer la fenêtre active dans son fichier associé
sauver:
  if act%=0 then return
  if FSE$(act%)="_" then goto sauverdans
  f$ = FSE$(act%)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if left$(caption(100+act%),1)="*" then caption 100+act%,mid$(caption 100+act%,3,200)
  return

' ===== enregistrer la fenêtre active dans un fichier choisi par dialogue
sauverdans:
  if act%=0 then return
  f$ = file_name$(97)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Voulez-vous le remplacer ?")<>1 then return
  end_if
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if res%=0
    FSE$(act%) = f$
    f$ = file_extract_name$(f$)
    caption 100+act%,f$
    caption 300+act%,f$
    capt$(act%) = f$
  end_if
  return
 
 
 
' ======================== fonctions du menu "Outils"

' ===== configuration des outils
outilsconfig:
  optvalid% = 0
  show 3500
  inactive 0
  return
 
' ===== sélection de l'outil
cheminoutil:
  f$ = file_name$(98)
  if f$="_" then return
  if file_exists(f$)=0
    message "Ce fichier n'existe pas."
    return
  end_if
  text 3505,f$
  return
 
' ===== clic dans le grid avec les outils
clickoutil:
  noutil% = grid_y_to_row(3513,mouse_y_left_down(3513))
  if grid_read$(3513,noutil%,1)=""
    inactive 3511 : inactive 3512
    text 3503,""
    text 3505,""
    text 3508,""
  else
    active 3511 : active 3512
    text 3503,grid_read$(3513,noutil%,1)
    text 3505,grid_read$(3513,noutil%,2)
    text 3508,grid_read$(3513,noutil%,3)
  end_if
  return
 
' ===== ajouter un nouvel outil
ajouteroutil:
  if trim$(text$(3503))=""
    message "Le nom de l'outil manque."
    return
  end_if
  if trim$(text$(3505))=""
    message "Le chemin de l'outil manque."
    return
  end_if
  if file_exists(text$(3505))=0
    message "Le fichier de l'outil n'existe pas."
    return
  end_if
  ' voir si l'outil existe déjà
  for i%=2 to 50
    if grid_read$(3513,i%,1)=text$(3503)
      message "Cet outil existe déjà."
      return
    end_if
  next i%
  ' trouver la première place libre
  noutil% = 0
  for i%=2 to 50
    if grid_read$(3513,i%,1)=""
      noutil% = i%
      exit_for
    end_if
  next i%
  if noutil%=0
    inactive 3511 : inactive 3512
    message "Désolé. Vous avez déjà 50 outils."
    return
  end_if
  grid_write 3513,noutil%,1,text$(3503)
  grid_write 3513,noutil%,2,text$(3505)
  grid_write 3513,noutil%,3,text$(3508)
  sauver_options_generales()
  active 3511 : active 3512
  return

' === exécuter l'outil sélectionné (ligne noutil%)
executeroutil:
  if act%=0 then return
  poutil$ = grid_read$(3513,noutil%,3)
  doutil$ = file_extract_path$(grid_read$(3513,noutil%,2))
  f$ = doutil$ + "Synedit_Editor_Source.bas" : ' + chr$(34)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  i% = instr(lower$(poutil$),"%s")
  if i%>0
    s$ = ""
    if i%>1 then s$ = left$(poutil$,i%-1)
    poutil$ = s$ + file_extract_name$(f$) + mid$(poutil$,i%+2,300)
  end_if
  eoutil$ = file_extract_name$(grid_read$(3513,noutil%,2))
  res% = DLL_call3("ExecuteProgram",adr(eoutil$),adr(poutil$),adr(doutil$))
  return

' === supprimer l'outil sélectionné (ligne noutil%)
supprimeroutil:
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer l'outil "+grid_read$(3513,noutil%,1))
  if i%<>1 then return
  if noutil%<50
    for i%=noutil% to 49
      grid_write 3513,i%,1,grid_read$(3513,i%+1,1)
      grid_write 3513,i%,2,grid_read$(3513,i%+1,2)
      grid_write 3513,i%,3,grid_read$(3513,i%+1,3)
    next i%
    grid_write 3513,50,1,""
    grid_write 3513,50,2,""
    grid_write 3513,50,3,""
  else
    grid_write 3513,noutil%,1,""
    grid_write 3513,noutil%,2,""
    grid_write 3513,noutil%,3,""
  end_if
  noutil% = 0
  sauver_options_generales()
  inactive 3511 : inactive 3512
  return




' ======================== fonctions du menu "Macros"

' ===== configuration des macros
macrosconfig:
  optvalid% = 0
  show 3300
  inactive 0
  return
 
macrosel:
  to_foreground 0
  to_foreground 100+act%
  set_focus 3307
  return

' ===== ajouter une nouvelle macro à partir du presse-papier
macroadd:
  if act%=0 then return
  f$ = trim$(text$(3302))
  if f$="" then return
  i% = 0
  while i%<count(3302)
    i% = i% + 1
    if f$=item_read$(3302,i%)
      message "Cette macro existe déjà."
      return
    end_if
  end_while
  res% = dll_call1("SyneditCopyText",act%)
  if res%<1
    message "Il n'y a rien dans le presse-papier."
    return
  end_if
  s$ = clipboard_string_paste$
  file_open_write 1,dirmacros$+f$+".macro"
  file_writeln 1,s$
  file_close 1
  item_add 3302,f$
  message "La macro "+f$+" a été créée."
  return
 
' ===== supprimer la macro sélectionnée
macrodel:
  if count(3302)=0 then return
  s$ = item_index$(3302)
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer la macro "+s$)
  if i%<>1 then return
  f$ = dirmacros$ + s$ + ".macro"
  file_delete f$
  item_delete 3302,item_index(3302)
  if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1)
  message "La macro "+s$+" a été supprimée."
  return

' ===== remplacer la page actuelle par la macro sélectionnée
macromod:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditOpen",act%,adr(f$))
  caption 100+act%,"(macro) "+item_index$(3302)
  caption 300+act%,"(macro) "+item_index$(3302)
  capt$(act%) = "(macro) "+item_index$(3302)
  return

' ===== remplacer la macro sélectionnée par la page actuelle
macroupd:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  message "La macro "+item_index$(3302)+" a été remplacée."
  return

' ===== insérer une macro
macroins:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  s$ = ""
  file_open_read 1,f$
  while file_eof(1)=0
    file_readln 1,s1$
    s$= s$ + s1$ + chr$(13) + chr$(10)
  end_while
  file_close 1
  ' ici, charger s$ avec le contenu de la macro
  res% = dll_call2("SyneditInsertString",act%,adr(s$))
  to_foreground 100+act%
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  return




' ======================== fonctions du menu "Options"

' ===== inverser l'indicateur de présence des numéros de ligne dans la fenêtre active
lignes:
  ln%(act%) = 1 - ln%(act%)    : ' basculer 0<-->1
  res% = dll_call3("SyneditFunction",SE%(act%),1,ln%(act%))  : ' signaler à Synedit
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  OSE$(act%) = str$(ln%(act%)) + mid$(OSE$(act%),2,20)  : ' mémoriser dans les param_tres
  return
 
' ===== charger la fenêtre des options avec les valeurs de la fenêtre active, puis afficher
options:
  if act%=0 then return
  optvalid% = 0
  opt$ = OSE$(act%)
  if left$(opt$,1)="1"
    mark_on 3001
  else
    mark_off 3001
  end_if
  text 3005,mid$(opt$,2,2)
  if mid$(opt$,4,1)="1"
    mark_on 3006
  else
    mark_off 3006
  end_if
  if mid$(opt$,5,1)="1"
    mark_on 3007
  else
    mark_off 3007
  end_if
  if mid$(opt$,6,1)="1"
    mark_on 3008
  else
    mark_off 3008
  end_if
  if mid$(opt$,7,1)="1"
    mark_on 3009
  else
    mark_off 3009
  end_if
  i% = instr(opt$,"\")
  text 3003,mid$(opt$,8,i%-8)
  opt$ = mid$(opt$,i%+1,len(opt$))
  for i%=1 to count(3011)
    if opt$=item_read$(3011,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3011),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  show 3000
  inactive 0
  return
 
' ===== charger la fenêtre des options générales, puis afficher
optionsgen:
  if left$(OptGen$,1)="1"
    mark_on 3201
  else
    mark_off 3201
  end_if
  text 3205,mid$(OptGen$,2,2)
  if mid$(OptGen$,4,1)="1"
    mark_on 3206
  else
    mark_off 3206
  end_if
  if mid$(OptGen$,5,1)="1"
    mark_on 3207
  else
    mark_off 3207
  end_if
  if mid$(OptGen$,6,1)="1"
    mark_on 3208
  else
    mark_off 3208
  end_if
  if mid$(OptGen$,7,1)="1"
    mark_on 3209
  else
    mark_off 3209
  end_if
  if mid$(OptGen$,8,1)="1"
    mark_on 3213
  else
    mark_off 3213
  end_if
  if mid$(OptGen$,9,1)="1"
    mark_on 3214
  else
    mark_off 3214
  end_if
  if mid$(OptGen$,10,1)="1"
    mark_on 3215
  else
    mark_off 3215
  end_if
  if mid$(OptGen$,11,1)="1"
    mark_on 3216
  else
    mark_off 3216
  end_if
  i% = instr(OptGen$,"\")
  text 3203,mid$(OptGen$,12,i%-12)
  opt$ = mid$(OptGen$,i%+1,len(OptGen$))
  for i%=1 to count(3211)
    if opt$=item_read$(3211,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3211),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  for i%=1 to count(3219)
    if OptGenKeyClr$=item_read$(3219,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3219),i%) : ' restaurer la couleur
      exit_for
    end_if
  next i%

  if mid$(OptGenStrAtt$,1,1)="1"
    mark_on 3222
  else
    mark_off 3222
  end_if
  if mid$(OptGenStrAtt$,2,1)="1"
    mark_on 3213
  else
    mark_off 3223
  end_if
  if mid$(OptGenStrAtt$,3,1)="1"
    mark_on 3224
  else
    mark_off 3224
  end_if
  if mid$(OptGenStrAtt$,4,1)="1"
    mark_on 3225
  else
    mark_off 3225
  end_if
  for i%=1 to count(3229)
    if OptGenStrClr$=item_read$(3229,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3229),i%) : ' restaurer la couleur
      exit_for
    end_if
  next i%

  show 3200
  inactive 0
  return
 
' ===== sortie de la fenêtre des options de la page par "Abandon"
options_abandon:
  hide 3000
  show 0
  active 0
  to_foreground 0
  return

' ===== sortie de la fenêtre des options générales par "Abandon"
optionsgen_abandon:
  hide 3200
  show 0
  active 0
  to_foreground 0
  return

' =====sortie de la fenêtre des options de la page par "Valider"
options_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt$ = str$(checked(3001))+right$("0"+text$(3005),2)+str$(checked(3006))
  opt$ = opt$ + str$(checked(3007))+str$(checked(3008))+str$(checked(3009))
  opt$ = opt$ + mid$(optgen$,8,4)
  opt$ = opt$ + text$(3003) + "\" + text$(3011)
  OSE$(act%) = opt$
  ln%(act%) = checked(3001)
  res% = dll_call3("SyneditFunction",SE%(act%),3,adr(opt$)) : ' activer les nouvelles options
  OptKeyAtt$ = mid$(opt$,8,4)
'  OptKeyClr$ = text$(...)
  gosub keychargerstyles    : ' charge les attributs graphiques
'  gosub Stringchargerstyles  : ' charge les attributs graphiques
  hide 3000
  show 0
  active 0
  to_foreground 0
  return
 
' =====sortie de la fenêtre des options générales par "Valider"
optionsgen_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt1$ = str$(checked(3201))+right$("0"+text$(3205),2)+str$(checked(3206))
  opt1$ = opt1$ + str$(checked(3207))+str$(checked(3208))+str$(checked(3209))
  opt1$ = opt1$ + str$(checked(3213))+str$(checked(3214))+str$(checked(3215))+str$(checked(3216))
  opt1$ = opt1$ + text$(3203) + "\" + text$(3211)
  OptGen$ = opt1$    : ' mémoriser les options générales
  OptGenKeyAtt$ = str$(checked(3213))+str$(checked(3214))+str$(checked(3215))+str$(checked(3216))
  OptGenKeyClr$ = text$(3219)
  OptGenStrAtt$ = str$(checked(3223))+str$(checked(3224))+str$(checked(3225))+str$(checked(3226))
  OptGenStrClr$ = text$(3229)
  res% = dll_call2("SelectComboBoxItem",handle(3419),item_index(3219))
  sauver_options_generales()
  hide 3200
  active 0
  to_foreground 0
  if act%>0 then to_foreground 100+act%
  return

' ===== afficher la fenêtre "Syntaxe"
syntaxe:
  if act%=0 then return
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  if (s$<>"Panoramic") and (s$<>"General")
    message "Action impossible sur cette syntaxe."
    return
  end_if
  optvalid% = 0
  caption 3400,"Configuration de la syntaxe - "+s$
  if mid$(Opt$,8,1)="1"
    mark_on 3412
  else
    mark_off 3412
  end_if
  if mid$(Opt$,9,1)="1"
    mark_on 3413
  else
    mark_off 3413
  end_if
  if mid$(Opt$,10,1)="1"
    mark_on 3414
  else
    mark_off 3414
  end_if
  if mid$(Opt$,11,1)="1"
    mark_on 3415
  else
    mark_off 3415
  end_if

  show 3400
  inactive 0
  return
 
' ===== nouveau mot-cle
keyajouter:
  s$ = lower$(trim$(text$(3402)))
  if s$="" then return
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    if s$=item_read$(3403,i%)
      message "Ce mot-clé existe déjà."
      return
    end_if
  end_while
  item_add 3403,s$
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  appliquer_syntax(s$)
  return

keymodifier:
  return

keysupprimer:
  return

keychargertout:
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  clear 3403
  file_open_read 1,f$
  file_readln 1,s1$
  i% = 1
  if s1$<>"#SYNTAX" then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>s$ then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>"#KEYS" then goto invalidsyntax
  while file_eof(1)=0
    file_readln 1,s1$
    i% = i% + 1
    if s1$="#END" then exit_while
    item_add 3403,s1$
  end_while
  appliquer_syntax(s$)
' ici, charger les attributs
' #KEYSTYLE
' STYLE=GRAS,ITALIQUE
' COLOR=Bleu
' #END
  file_readln 1,s1$
  i% = 1
  if s1$<>"#KEYSTYLE" then goto invalidsyntax
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"STYLE=" then goto invalidsyntax
  s2$ = ""
  if instr(s1$,"GRAS")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"ITALIQUE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"SOUSLIGNE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"BARRE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  OptGenKeyAtt$ = s2$
  OptKeyAtt$ = OptGenKeyAtt$
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"COLOR=" then goto invalidsyntax
  OptGenKeyClr$ = mid$(s1$,7,len(s1$))
  OptKeyClr$ = OptGenKeyClr$
  for i%=1 to count(3419)
    if OptGenKeyClr$=item_read$(3419,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3419),i%)
      res% = dll_call2("SelectComboBoxItem",handle(3219),i%)
      exit_for
    end_if
  next i%
  file_readln 1,s1$
  i% = 1
  if s1$<>"#END" then goto invalidsyntax
' ici charger les attributs
' #STRINGSTYLE
' STYLE=ITALIQUE
' COLOR=Gris
' #END
  if file_eof(1)=0
    file_readln 1,s1$
    i% = 1
    if s1$<>"#STRINGSTYLE" then goto invalidsyntax
    file_readln 1,s1$
    i% = 1
    if left$(s1$,6)<>"STYLE=" then goto invalidsyntax
    s2$ = ""
    if instr(s1$,"GRAS")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    if instr(s1$,"ITALIQUE")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    if instr(s1$,"SOUSLIGNE")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    if instr(s1$,"BARRE")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    OptGenStrAtt$ = s2$
    OptStrAtt$ = OptGenStrAtt$
    opt$ = s2$
    file_readln 1,s1$
    i% = 1
    if left$(s1$,6)<>"COLOR=" then goto invalidsyntax
    OptGenStrClr$ = mid$(s1$,7,len(s1$))
    OptStrClr$ = OptGenStrClr$
    for i%=1 to count(3429)
      if OptGenStrClr$=item_read$(3429,i%)
        res% = dll_call2("SelectComboBoxItem",handle(3429),i%)
        res% = dll_call2("SelectComboBoxItem",handle(3229),i%)
        exit_for
      end_if
    next i%
    file_readln 1,s1$
    i% = 1
    if s1$<>"#END" then goto invalidsyntax
  end_if
  file_close 1
  return
invalidsyntax:
  file_close 1
  message "Fichier invalide en ligne "+str$(i%)+": "+s1$
  return
 
keychargerstyles:
  res% = dll_call4("SyneditConfigureHighlighter",act%,4,adr(OptKeyAtt$),adr(OptKeyClr$))
  return

stringchargerstyles:
  res% = dll_call4("SyneditConfigureHighlighter",act%,5,adr(OptStrAtt$),adr(OptStrClr$))
  return

keysauvertout:
' format du fichier de la syntaxe:
' fichier Synedit_Editor_Syntax_Panoramic.txt
' #SYNTAX
' Panoramic (nom de la syntaxe en 1 ligne)
' #KEYS
' pause (une ligne par mot-clé)
' ...
' #END
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  file_open_write 1,f$
  file_writeln 1,"#SYNTAX"
  file_writeln 1,s$
  file_writeln 1,"#KEYS"
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    file_writeln 1,item_read$(3403,i%)
  end_while
  file_writeln 1,"#END"
' ici, sauver les attributs des mots-clé
  file_writeln 1,"#KEYSTYLE"
  s$ = ""
  if mid$(optgen$,8,1)="1" then s$ = s$ + "GRAS"
  if mid$(optgen$,9,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "ITALIQUE"
  end_if
  if mid$(optgen$,10,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "SOUSLIGNE"
  end_if
  if mid$(optgen$,11,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "BARRE"
  end_if
  file_writeln 1,"STYLE="+s$
  file_writeln 1,"COLOR="+OptGenKeyClr$
  file_writeln 1,"#END"
' ici, sauver les attributs des chaînes
  file_writeln 1,"#STRINGSTYLE"
  s$ = ""
  if mid$(optgen$,8,1)="1" then s$ = s$ + "GRAS"
  if mid$(optgen$,9,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "ITALIQUE"
  end_if
  if mid$(optgen$,10,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "SOUSLIGNE"
  end_if
  if mid$(optgen$,11,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "BARRE"
  end_if
  file_writeln 1,"STYLE="+s$
  file_writeln 1,"COLOR="+OptGenStrClr$
  file_writeln 1,"#END"
  file_close 1
  message "La syntaxe est sauvée dans "+f$
  return
 
appliquerkeyattrib:
  s2$ = ""
  if checked(3412)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3413)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3414)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3415)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  OptGenKeyAtt$ = s2$
  OptGenKeyClr$ = text$(3419)
  OptKeyAtt$ = s2$
  OptKeyClr$ = text$(3419)
  res% = dll_call2("SelectComboBoxItem",handle(3219),item_index(3419))
  gosub keychargerstyles
  return

appliquerstringattrib:
  s2$ = ""
  if checked(3422)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3423)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3424)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3425)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  OptGenStrAtt$ = s2$
  OptGenStrClr$ = text$(3429)
  OptStrAtt$ = s2$
  OptStrClr$ = text$(3429)
'  res% = dll_call2("SelectComboBoxItem",handle(3229),item_index(3429))
  gosub stringchargerstyles
  return

 
 
' ======================== fonctions indépendantes

' ===== ce timer surveille la fenêtre active et ses dimensions
tick:
  timer_off 99
  res% = dll_call0("GetActiveWindow")  : ' récupérer le handle de la fenêtre active
  for i%=1 to nsyn%                    : ' chercher dans la table des fenêtres d"édition
    if res%=hndSE%(i%)                  : ' est-ce qu'on a trouvé la fenêtre
      if i%<>act%                      : ' est-elle différente de la fenêtre active précédente ?
        mark_off 300+act%              : ' alors changer le marquade du menu
        mark_on 300+i%
      end_if
      act% = i%                        : ' mémoriser le numéro de la fenêtre active
      res% = dll_call5("SyneditGeometry",SE%(act%),M1%,M1%,M1%,M1%) : ' ajuster la taille de Synedit à celle de la fenêtre
      exit_for
    end_if
  next i%
  timer_on 99
  return



' ======================== SUBs internes

' ===== fermer une des fenêres auxiliaires modales
sub CloseX(f%)
  if optvalid%=0
    hide f%
    show 0
    active 0
    if act%=0
      to_foreground 0
    else
      to_foreground 100+act%
    end_if
  end_if
end_sub

' ===== appliquer une syntaxe paramétrée
sub appliquer_syntax(sy$)
  dim_local s$, i%
  s$ = sy$
  i% = instr(s$,"\")
  if i%>0 then s$ = mid$(sy$,i%+1,len(s$))
  ' imposer d'abord les mots-clé
  if (s$="Panoramic") or (s$="General")
    clear 96
    i% = 0
    while i%<count(3403)
      i% = i% + 1
      item_add 96,item_read$(3403,i%)
    end_while
    res% = dll_call4("SyneditConfigureHighlighter",act%,3,handle(96),0)
  else
    message "La syntaxe "+sy$+" ne peut pas être configurée."
  end_if
end_sub

' ===== une des pages a changé
sub syneditchange(n$)
  dim_local n%
  n% = val(n$)
  if left$(caption$(100+n%),1)<>"*" then caption 100+n%,"* "+caption$(100+n%)
end_sub

' ===== on a frappé F1
sub synedithelp(n$)
  dim_local n%
  n% = val(n$)
  message "Aide pas encore implémentée."
end_sub

' ===== demande d'un message de confirmation
sub confirmer(s$)
  confirm% = message_confirmation_yes_no(s$)
end_sub
 
' ===== purger les pages non mises à jour
sub purger()
dim_local i%
  for i%=1 to nsyn%
    if left$(caption$(100+i%),1)="*"
      s$ = "La page ["+capt$(i%)+"] a été modifiée. Voulez-vous la sauvegarder ?"
      confirmer(s$)
      if confirm%=1
        act% = i%
        message "on sauvegarde "+str$(act%)
        to_foreground 100+act%
        res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
        gosub sauver
      end_if
    end_if
  next i%
end_sub

' ===== sauver les options générales
sub sauver_options_generales()
  dim_local i%
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  i% = 2
  while trim$(grid_read$(3513,noutil%,1))<>""
    file_writeln 1,grid_read$(3513,i%,1)
    file_writeln 1,grid_read$(3513,i%,2)
    file_writeln 1,grid_read$(3513,i%,3)
    i% = i% + 1
  end_while
  file_close 1
end_sub

Ca commence à prendre forme, non ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Froggy One

avatar

Nombre de messages : 391
Date d'inscription : 06/01/2012

MessageSujet: Re   Mer 27 Aoû 2014 - 10:02

Hélas pas chez moi ! Erreur incompréhensible en 1040. Je me suis dit que c'est parce que j'ai voulu régler les options générales sans avoir ouvert un fichier. Au second essai, read access in 0000 in KGF.DLL...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://gaeldwest.wordpress.com
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mer 27 Aoû 2014 - 10:51

Oups... ça devrait aller mieux comme ça:
Spoiler:
 
Supprime stp le fichier Synedit_Editor.ini avant de relancer le programme !

EDIT

NON! Désolé, j'ai foutu le bazar ! Attends...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mer 27 Aoû 2014 - 12:41

Et voilà la version corrigée:
Code:
' Synedit_Editor.bas                          r

' Options générales
' =================
' Les options générales sont accessibles à tout moment.
' Elles sont mémorisées dans le fichier suivant:
'    (chemin)\Synedit_Editor.ini
' où "chemin" représente le chemin vers Synedit.exe.
' Ces options s'imposent à toutes les pages.
' Leur modification prend effet immédiatement,
' mais leur action n'est visible dans les pages existantes
' que lors de la consultation suivante du paralètre. Par
' exemple, la police par défaut sera utilisée pour créer
' une page vide ou charger un fichier, mais ne modifiera
' pas les polices déjà configurées pour des pages affichées.

' Les macros sont des portions de code mémorisées dans des fichiers
'    (chemin)\Synedit_Editor_Macros\(nom).macro
' Ces fichiers sont créées par le menu de configuration des macros
' et utilisés à partir du menu d'exécution des macros.

' Le fichier des options générales contient les lignes suivantes:
' 1=xttgisbp\S    pour les options générales du texte
' suivi de 3 lignes par outil configuré

label close0, close3000, close3200, close3300, close3400, close3500
label nouveau, ouvrir, copier, fermer, sauver, sauverdans, sortir
label lignes, options, optionsgen,  tick, fenetre
label aide, apropos, syneditalert, invalidsyntax
label options_abandon, options_valider
label optionsgen_abandon, optionsgen_valider
label apropos_fermer, outilsconfig, cheminoutil, clickoutil
label ajouteroutil, executeroutil, supprimeroutil
label macrosconfig
label macroadd, macrodel, macromod, macroupd, macroins, macrosel
label syntaxe, keyajouter, keymodifier, keysupprimer
label keychargertout, keysauvertout, keychargerstyles, appliquerkeyattrib
label appliquerstringattrib, stringchargerstyles

' ===== variables pour gérer les pages d'édition
dim OptGen$          : ' options générales
  ' xttgisbP\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' P=police S=syntaxe
dim OptGenKeyAtt$    : ' pour mots-clé: gisbC    général
dim OptGenKeyClr$    : ' pour mots-clé: couleur  généra
dim OptGenStrAtt$    : ' pour chaînes:  gisbC    généra
dim OptGenStrClr$    : ' pour chaînes:  couleur  généra
dim OptKeyAtt$      : ' pour mots-clé: gisbC    page actuelle
dim OptKeyClr$      : ' pour mots-clé: couleur  page actuelle
dim OptStrAtt$      : ' pour chaînes:  gisbC    page actuelle
dim OptStrClr$      : ' pour chaînes:  couleur  page actuelle
dim SE%(100)        : ' les objets Synedit
dim hndSE%(100)      : ' les handles des fenêtres
dim ln%(100)        : ' flags "numéros de lignes affichés"
dim capt$(100)      : ' titre des fenetres
dim OSE$(100)        : ' les options des objets
dim FSE$(100)        : ' les noms des fichiers
dim nsyn%            : ' plus grand numéro de page d'édition (0...100)
dim act%            : ' page d'édition actuellement active (0...100)
' dim colorkey$        : ' couleur des mots-clé
dim colorstring$    : ' couleur des chaînes de caractères

' ===== variables internes
dim res%, d%, nf%, t%, l%, i%, k%, optvalid%, opt$, opt1$, f$
dim org%, s$, s1$, s2$, olddir$, salert$, nalert%, confirm%, fil$
dim noutil%, poutil$, doutil$, eoutil$

' ===== constantes
dim M1%        : M1% = 0 - 1
dim version$  : version$ = "Alpha 0.7"
dim verdat$    : verdat$ = "27/08/2014"
dim KGF$      : KGF$ = "KGF.dll"
dim dir$      : dir$ = file_extract_path$(param_value$(0))
dim ini$      : ini$ = dir$+"Synedit_editor.ini"
dim dirmacros$ : dirmacros$ = dir$ + "Synedit_Editor_Macros\"
dim q$        : q$ = chr$(34)

data "Noir","Eau","Bleu","Crème","Gris foncé","Gris","Vert","Citron"
data "Gris clair","Marron","Gris moyen","Vert menthe","Bleu marine"
data "Vert olive","Violet","Rouge","Argent","Bleu ciel","Fuschia"
data "Canard","Blanc","Jaune","./."


' configurer la form 0 (uniquement le menu)
width 0,800 : height 0,60 : border_small 0
caption 0,"Synedit_Editor - Version "+version$+" du "+verdat$

' ===== création de tous les menus
main_menu 10
  sub_menu 11 : parent 11,10 : caption 11,"Fichier"
    sub_menu 12 : parent 12,11 : caption 12,"Nouveau" : on_click 12,nouveau
    sub_menu 13 : parent 13,11 : caption 13,"Ouvrir..." : on_click 13,ouvrir
    sub_menu 14 : parent 14,11 : caption 14,"Copier" : on_click 14,copier
    sub_menu 15 : parent 15,11 : caption 15,"Fermer" : on_click 15,fermer
    sub_menu 16 : parent 16,11 : caption 16,"Sauver" : on_click 16,sauver
    sub_menu 17 : parent 17,11 : caption 17,"Sauver dans..." : on_click 17,sauverdans
    sub_menu 18 : parent 18,11 : caption 18,"-"
    sub_menu 19 : parent 19,11 : caption 19,"Sortir" : on_click 19,sortir
  sub_menu 21 : parent 21,10 : caption 21,"Options"
    sub_menu 22 : parent 22,21 : caption 22,"N° de ligne" : on_click 22,lignes
    sub_menu 23 : parent 23,21 : caption 23,"Options de la page" : on_click 23,options
    sub_menu 24 : parent 24,21 : caption 24,"Options générales" : on_click 24,optionsgen
    sub_menu 25 : parent 25,21 : caption 25,"-"
    sub_menu 26 : parent 26,21 : caption 26,"Syntaxe de la page" : on_click 26,syntaxe
  sub_menu 400 : parent 400,10 : caption 400,"Edition"
    sub_menu 401 : parent 401,400 : caption 401,"pas encore implémenté" : ' on_click 401,???
  sub_menu 430 : parent 430,10 : caption 430,"Outils"
    sub_menu 431 : parent 431,430 : caption 431,"Outils" : on_click 431,outilsconfig
    sub_menu 441 : parent 441,430 : caption 441,"Macros" : on_click 441,macrosconfig
  sub_menu 300 : parent 300,10 : caption 300,"Fenêtres"
'    sub_menu 301 : parent 301,300 : caption 301,"Fenêtre" : on_click 301,fenetre
  sub_menu 420 : parent 420,10 : caption 420,"Aide"
    sub_menu 421 : parent 421,420 : caption 421,"Aide" : on_click 421,aide
    sub_menu 422 : parent 422,420 : caption 422,"A-propos" : on_click 422,apropos

' ===== création de la fenêtre des options de la page actuelle
form 3000 : hide 3000 : caption 3000,"Options de la page" : command_target_is 3000
  top 3000,100 : left 3000,200
  width 3000,550 :height 3000,400 : on_close 3000,close3000
check 3001 : top 3001,10 : left 3001,10 : width 3001,150
  caption 3001,"Numéros de de ligne"
container 3002 : caption 3002,"Format par défaut"
  top 3002,40 : left 3002,10 : width 3002,250 : height 3002,110
combo 3003 : parent 3003,3002 : top 3003,20 : left 3003,10 : width 3003,170
  font_names_load 3003 : text 3003,"Courier"
alpha 3004 : parent 3004,3002 : top 3004,50 : left 3004,10 : caption 3004,"Taille:"
combo 3005 : parent 3005,3002 : top 3005,50 : left 3005,60 : width 3005,40
  item_add 3005,"8"
  item_add 3005,"9"
  item_add 3005,"10"
  item_add 3005,"11"
  item_add 3005,"12"
  item_add 3005,"14"
  item_add 3005,"16"
  item_add 3005,"18"
text 3005,"10"
check 3006 : parent 3006,3002 : top 3006,80 : left 3006,10 : caption 3006,"Gras"
  font_bold 3006
check 3007 : parent 3007,3002 : top 3007,80 : left 3007,60 : caption 3007,"Italique"
  font_italic 3007
check 3008 : parent 3008,3002 : top 3008,80 : left 3008,120 : caption 3008,"Sousligné"
  font_underline 3008
check 3009 : parent 3009,3002 : top 3009,80 : left 3009,190 : caption 3009,"Barré" : width 3009,40
  font_strike 3009
alpha 3010 : top 3010,160 : left 3010,10 : caption 3010,"Syntaxe:"
combo 3011 : top 3011,160 : left 3011,80 : width 3011,150

button 3098 : top 3098,310 : left 3098,10 : caption 3098,"Abandon"
  on_click 3098,options_abandon
button 3099 : top 3099,310 : left 3099,210 : caption 3099,"Valider"
  on_click 3099,options_valider

' ===== création de la fenêtre des options générales
form 3200 : hide 3200 : caption 3200,"Options générales" : command_target_is 3200
  top 3200,100 : left 3200,200
  width 3200,550 :height 3200,400 : on_close 3200,close3200
check 3201 : top 3201,10 : left 3201,10 : width 3201,150
  caption 3201,"Numéros de de ligne"
container 3202 : caption 3202,"Format par défaut"
  top 3202,40 : left 3202,10 : width 3202,250 : height 3202,110
combo 3203 : parent 3203,3202 : top 3203,20 : left 3203,10 : width 3203,170
  font_names_load 3203 : text 3203,"Courier"
alpha 3204 : parent 3204,3202 : top 3204,50 : left 3204,10 : caption 3204,"Taille:"
combo 3205 : parent 3205,3202 : top 3205,50 : left 3205,60 : width 3205,40
  item_add 3205,"8"
  item_add 3205,"9"
  item_add 3205,"10"
  item_add 3205,"11"
  item_add 3205,"12"
  item_add 3205,"14"
  item_add 3205,"16"
  item_add 3205,"18"
text 3205,"10"
check 3206 : parent 3206,3202 : top 3206,80 : left 3206,10 : caption 3206,"Gras"
  font_bold 3206
check 3207 : parent 3207,3202 : top 3207,80 : left 3207,60 : caption 3207,"Italique"
  font_italic 3207
check 3208 : parent 3208,3202 : top 3208,80 : left 3208,120 : caption 3208,"Sousligné"
  font_underline 3208
check 3209 : parent 3209,3202 : top 3209,80 : left 3209,190 : caption 3209,"Barré" : width 3209,40
  font_strike 3209
alpha 3210 : top 3210,160 : left 3210,10 : caption 3210,"Syntaxe:"
combo 3211 : top 3211,160 : left 3211,80 : width 3211,150
container 3212 : caption 3212,"Style des mots-clé"
  top 3212,40 : left 3212,270 : width 3212,250 : height 3212,100
check 3213 : parent 3213,3212 : top 3213,20 : left 3213,10 : caption 3213,"Gras" : font_bold 3213
check 3214 : parent 3214,3212 : top 3214,20 : left 3214,60 : caption 3214,"Italique" : font_italic 3214
check 3215 : parent 3215,3212 : top 3215,20 : left 3215,120 : caption 3215,"Sousligné" : font_underline 3215
check 3216 : parent 3216,3212 : top 3216,20 : left 3216,190 : caption 3216,"Barré" : font_strike 3216
  width 3216,50
alpha 3218 : parent 3218,3212 : top 3218,50 : left 3218,10 : caption 3218,"Couleur;"
combo 3219 : parent 3219,3212 : top 3219,50 : left 3219,70 : width 3219,70

container 3227 : top 3227,150 : left 3227,270 : width 3227,250 : height 3227,90
  caption 3227,"Style des chaînes de caractères"
check 3222 : parent 3222,3227 : top 3222,20 : left 3222,10 : caption 3222,"Gras" : font_bold 3222
check 3223 : parent 3223,3227 : top 3223,20 : left 3223,60 : caption 3223,"Italique" : font_italic 3223
check 3224 : parent 3224,3227 : top 3224,20 : left 3224,120 : caption 3224,"Sousligné" : font_underline 3224
check 3225 : parent 3225,3227 : top 3225,20 : left 3225,190 : caption 3225,"Barré" : font_strike 3225
  width 3225,50
alpha 3228 : parent 3228,3227 : top 3228,50 : left 3228,10 : caption 3228,"Couleur;"
combo 3229 : parent 3229,3227 : top 3229,50 : left 3229,70 : width 3229,70
' button 3226 : parent 3226,3227 : top 3226,50 : left 3226,200 : caption 3226,"Appliquer"
'  on_click 3226,appliquerstringattrib

button 3298 : top 3298,310 : left 3298,10 : caption 3298,"Abandon"
  on_click 3298,optionsgen_abandon
button 3299 : top 3299,310 : left 3299,210 : caption 3299,"Valider"
  on_click 3299,optionsgen_valider


' ===== création de la fenêtre des définitions des macros
form 3300 : hide 3300 : caption 3300,"Configuration des macros" : command_target_is 3300
  top 3300,0 : left 3300,width(0) : border_small 3300
  width 3300,420 :height 3300,105 : on_close 3300,close3300
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins


' ===== création de la fenêtre des définitions de syntaxe de la page
form 3400 : hide 3400 : caption 3400,"Configuration de la syntaxe" : command_target_is 3400
  top 3400,100 : left 3400,200
  width 3400,750 :height 3400,610 : on_close 3400,close3400
Alpha 3401 : top 3401,10 : left 3401,10 : caption 3401,"Mots-clé:"
edit 3402 : top 3402,30 : left 3402,10 : width 3402,200
list 3403 : top 3403,60 : left 3403,10 : width 3403,200 : height 3403,400
  sort_on 3403
button 3404: top 3404,30 : left 3404,220 : width 3404,70
  caption 3404,"Ajouter" : on_click 3404,keyajouter
button 3405: top 3405,60 : left 3405,220 : width 3405,70
  caption 3405,"Modifier" : on_click 3405,keymodifier
button 3406: top 3406,90 : left 3406,220 : width 3406,70
  caption 3406,"Supprimer" : on_click 3406,keysupprimer
button 3409: top 3409,480 : left 3409,10 : width 3409,200 : height 3409,70
  caption 3409,"Charger la syntaxe" : on_click 3409,keychargertout
  font_bold 3409 : font_size 3409,12
button 3410: top 3410,480 : left 3410,300 : width 3410,200 : height 3410,70
  caption 3410,"Sauver la syntaxe" : on_click 3410,keysauvertout
  font_bold 3410 : font_size 3410,12
container 3417 : top 3417,10 : left 3417,310 : width 3417,300 : height 3417,90
  caption 3417,"Style des mots-clé"
alpha 3411 : parent 3411,3417 : top 3411,20 : left 3411,10 : caption 3411,"Styles;"
check 3412 : parent 3412,3417 : top 3412,20 : left 3412,50 : caption 3412,"Gras" : font_bold 3412
check 3413 : parent 3413,3417 : top 3413,20 : left 3413,100 : caption 3413,"Italique" : font_italic 3413
check 3414 : parent 3414,3417 : top 3414,20 : left 3414,160 : caption 3414,"Sousligné" : font_underline 3414
check 3415 : parent 3415,3417 : top 3415,20 : left 3415,230 : caption 3415,"Barré" : font_strike 3415
  width 3415,50
alpha 3418 : parent 3418,3417 : top 3418,50 : left 3418,10 : caption 3418,"Couleur;"
combo 3419 : parent 3419,3417 : top 3419,50 : left 3419,70 : width 3419,70
button 3416 : parent 3416,3417 : top 3416,50 : left 3416,200 : caption 3416,"Appliquer"
  on_click 3416,appliquerkeyattrib
 
container 3427 : top 3427,110 : left 3427,310 : width 3427,300 : height 3427,90
  caption 3427,"Style des chaînes de caractères"
alpha 3421 : parent 3421,3427 : top 3421,20 : left 3421,10 : caption 3421,"Styles;"
check 3422 : parent 3422,3427 : top 3422,20 : left 3422,50 : caption 3422,"Gras" : font_bold 3422
check 3423 : parent 3423,3427 : top 3423,20 : left 3423,100 : caption 3423,"Italique" : font_italic 3423
check 3424 : parent 3424,3427 : top 3424,20 : left 3424,160 : caption 3424,"Sousligné" : font_underline 3424
check 3425 : parent 3425,3427 : top 3425,20 : left 3425,230 : caption 3425,"Barré" : font_strike 3425
  width 3425,50
alpha 3428 : parent 3428,3427 : top 3428,50 : left 3428,10 : caption 3428,"Couleur;"
combo 3429 : parent 3429,3427 : top 3429,50 : left 3429,70 : width 3429,70
button 3426 : parent 3426,3427 : top 3426,50 : left 3426,200 : caption 3426,"Appliquer"
  on_click 3426,appliquerstringattrib

' ===== création de la fenêtre A-propos
form 3100 : hide 3100 : top 3100,100 : left 3100,300 : command_target_is 3100
  width 3100,400 : height 3100,200 : on_close 3100,apropos_fermer
picture 3101 : full_space 3101  : print_target_is 3101
font_name 3101,"Courier" : font_size 3101,10 : font_bold 3101
print_locate 40,20  : print "Programme: "+"Synedit_Editor"
print_locate 40,40  : print "Version:  "+version$
print_locate 40,60  : print "Date:      "+verdat$
print_locate 40,80  : print "Auteur:    "+"Klaus"


' ===== création de la fenêtre des définitions des outils
form 3500 : hide 3500 : caption 3500,"Configuration des outils" : command_target_is 3500
  top 3500,100 : left 3500,200 : border_small 3300
  width 3500,520 :height 3500,450 : on_close 3500,close3500
alpha 3501 : top 3501,10 : left 3501,10
  s$ = "Donnez un nom à un outil, un chemin vers l'exécutable et des paramètres. "+chr$(13)+chr$(10)
  s$ = s$ + "Le code %s représente le code source de la page. Le dossier de l'outil sera utilisé."
  caption 3501,s$
alpha 3502 : top 3502,50 : left 3502,10 : caption 3502,"Nom:"
edit 3503 : top 3503,50 : left 3503,80 : width 3503,120
alpha 3504 : top 3504,80 : left 3504,10 : caption 3504,"Cible:"
edit 3505 : top 3505,80 : left 3505,80 : width 3505,300
button 3506 : top 3506,80 : left 3506,390 : width 3506,20 : caption 3506,"..."
  on_click 3506,cheminoutil
alpha 3507 : top 3507,110 : left 3507,10 : caption 3507,"Paramètres:"
edit 3508 : top 3508,110 : left 3508,80 : width 3508,300
button 3510 : top 3510,140 : left 3510,10 : caption 3510,"Ajouter" : width 3510,80
  on_click 3510,ajouteroutil
button 3511 : top 3511,140 : left 3511,100 : caption 3511,"Exécuter" : width 3511,300 : inactive 3511
  on_click 3511,executeroutil
button 3512 : top 3512,140 : left 3512,410 : caption 3512,"Supprimerr" : width 3512,80 : inactive 3512
  on_click 3512,supprimeroutil
grid 3513 : top 3513,170 : left 3513,10 : width 3513,480 : height 3513,190
  grid_column 3513,3 : grid_row 3513,50 : grid_one_column_width 3513,1,120
  grid_one_column_width 3513,2,120 : grid_one_column_width 3513,3,215
  grid_write 3513,1,1,"Outil" : grid_write 3513,1,2,"Chemin" : grid_write 3513,1,3,"Paramètres"
  on_click 3513,clickoutil
if 1=2
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins
end_if


' ===== quelques objets invisbles
command_target_is 0
edit 95 : hide 95 : on_change 95,syneditalert
memo 96 : hide 96
save_dialog 97
open_dialog 98
timer 99 : timer_off 99 : timer_interval 99,300 : on_timer 99,tick
 
' ===== activer la DLL
dll_on KGF$

' === faire quelques initialialisations
res% = dll_call0("SyneditInitialize")
res% = DLL_call2("SetCloseBox",handle(0),0) : ' désactiver la croix rouge !
res% = dll_call3("SyneditFunction",0,4,0)  : ' récupérer la liste des définitions de syntaxe
s$ = clipboard_string_paste$                : ' sauvegarder le presse-papier
clipboard_paste 96                          : ' la charger dans un mémo
for i%=1 to count(96)                      : ' et recopier dans la combo
  item_add 3011,item_read$(96,i%)          : '    options de la page
  item_add 3211,item_read$(96,i%)          : '    options générales
next i%
clipboard_string_copy s$                    : ' restaurer le presse-papier
res% = dll_call2("SelectComboBoxItem",handle(3011),1) : ' sélectionner (aucune)
res% = dll_call2("SelectComboBoxItem",handle(3211),1) : ' sélectionner (aucune)
' OptGen$ = "0100000Courier\(aucune)"        : ' options générales par défaut
OptGen$ = "01000001000Courier\(aucune)"    : ' options générales par défaut
if file_exists(ini$)=1                      : ' si fichier INI existe, relire les options générales
  file_open_read 1,ini$
  file_readln 1,OptGen$
  noutil% = 1
  while file_eof(1)=0
    noutil% = noutil% + 1
    file_readln 1,s$
    grid_write 3513,noutil%,1,s$
    file_readln 1,s$
    grid_write 3513,noutil%,2,s$
    file_readln 1,s$
    grid_write 3513,noutil%,3,s$
  end_while
  file_close 1
else                                        : ' si fichier INI n'existe pas, le créer
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  file_close 1
end_if
if dir_exists(dirmacros$)=0 then dir_make dirmacros$ : ' créer le dossier des macros
olddir$ = dir_current$                      : ' sauvegarder le dossier actuel
dir_change dirmacros$                      : ' aller dans le dossier des macros
s$ = file_find_first$                      : ' parcourir ce dossier
while s$<>"_"                              : '  pour charger la liste des macros existantes
  if left$(s$,1)<>"."
    if right$(s$,6)=".macro"
      s$ = left$(s$,len(s$)-6)
      item_add 3302,s$
    end_if
  end_if
  s$ = file_find_next$
end_while
dir_change olddir$                          : ' restaurer le dossier par défaut
if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1) : ' sélectionner la première macro
read s$
while s$<>"./."
  item_add 3419,s$  : ' options syntaxe:  couleur des mots-clé
  item_add 3429,s$  : ' options syntaxe:  couleur des chaînes de caractères
  item_add 3219,s$  : ' options générales: couleur des mots-clé
  item_add 3229,s$  : ' options générales: couleur des chaînes de caractères
  read s$
end_while
res% = dll_call2("SelectComboBoxItem",handle(3419),1) : ' sélectionner le noir
res% = dll_call2("SelectComboBoxItem",handle(3429),1) : ' sélectionner le noir
res% = dll_call2("SelectComboBoxItem",handle(3219),1) : ' sélectionner le noir
res% = dll_call2("SelectComboBoxItem",handle(3229),1) : ' sélectionner le noir

end




' ===== évènement déclenché par Synedit, quelque soit la page
' l'objetinvisible 95 (un EDIT) contient:
'    Cnnn = la page nnn a changé
'    Hnnn = on a frappé F1 dans la page nnn
syneditalert:
  salert$ = text$(95)
  nalert% = instr("CH",left$(salert$,1))
  select nalert%
    case 1: ' une page a changé
      syneditchange(mid$(salert$,2,3))
    case 2: ' on a frappé F1
      synedithelp(mid$(salert$,2,3))
  end_select
  return

' ===== à la fin, on supprime toutes les fenêtres ouvertes
close0:
  while nsyn%>0
    res% = dll_call1("SyneditDelete",SE%(nsyn%))
    pause 500              : ' ce délai pourra éventuellement être réduit...
    delete 100+nsyn%
    nsyn% = nsyn% - 1
  end_while
  return

' ===== fermeture de la fenêtre des paramètres de la page
close3000:
  closeX(3000)
  return
 
' ===== fermeture de la fenêtre des paramètres généraux
close3200:
  closeX(3200)
  return

' ===== fermeture de la fenêtre de configuration de la syntaxe de la page
close3400:
  closeX(3400)
  return

' ===== fermeture de la fenêtre de configuration des macros
close3300:
  closeX(3300)
  return

' ===== fermeture de la fenêtre de configuration des outils
close3500:
  closeX(3500)
  return

' ===== mode d'emploi
aide:
  message "L'aide n'est pas encore implémentée."
  return
 
' ===== montrer la fenêtre A-propos
apropos:
  show 3100
  inactive 0
  return
 
' ===== fermer la fenêtre A-propos et restaurer la fenêtre active
apropos_fermer:
  hide 3100
  active 0
  if act%=0
    to_foreground 0
  else
    to_foreground 100+act%
  end_if
  return
 
' ===== sortir du programme
sortir:
  if nsyn%>0 then purger()
  gosub close0
  res% = dll_call1("KillProcessByHandle",handle(0))
  ' *** on ne passera jamais ici !

' ===== choisir une fenêtre par le menu "Fenêtres"
fenetre:
  mark_off 300+act%
  act% = number_click-300
  mark_on 300+act%
  show 100 + act%
  to_foreground 100 + act%
  return



' ======================== fonctions du menu "Fichiers"

' ===== créer une nouvelle fenêtre d'édition vide
nouveau:
  if nsyn%=100 then return
  if nsyn%>0
    t% = top(100+nsyn%)
    l% = left(100+nsyn%)
  else
    t% = top(0) + 50
    l% = left(0) + 50
  end_if
  nsyn% = nsyn% + 1
  if act%>0 then mark_off 300+act%
  act% = nsyn%
  d% = 20
  nf% = 100 + nsyn%
  capt$(nsyn%) = "<nouveau "+str$(nsyn%)+">"
  form nf% : top nf%,t%+d% : left nf%,l%+d% : width nf%,600 : height nf%,400
    caption nf%,capt$(nsyn%)
  hndSE%(nsyn%) = handle(nf%)
  opt$ = OptGen$      : ' par défaut, prendre les options générales
  OSE$(nsyn%) = opt$
  FSE$(nsyn%) = "_"
  sub_menu 300+nsyn% : parent 300+nsyn%,300 : caption 300+nsyn%,capt$(nsyn%) : on_click 300+nsyn%,fenetre
  mark_on 300+act%
  SE%(nsyn%) = dll_call2("SyneditCreate",handle(nf%),handle(95))
  res% = dll_call3("SyneditFunction",SE%(nsyn%),3,adr(opt$))
  res% = dll_call5("SyneditGeometry",SE%(nsyn%),M1%,M1%,M1%,M1%)
  if instr(opt$,"\Panoramic")>0
    gosub keychargertout      : ' charge les mots-clé dans Synedit
    gosub keychargerstyles    : ' charge les attributs graphiques des mots-clé
    gosub stringchargerstyles : ' charge les attributs graphiques des chaînes
  end_if
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
'  res% = dll_call3("SyneditFunction",SE%(nsyn%),6,0) : ' injecter le code démo
  res% = dll_call3("SyneditFunction",SE%(act%),7,0)  : ' forcer le mode ANSI
  if nsyn%=1 then timer_on 99
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger un fichier
ouvrir:
  fil$ = file_name$(98)
  if fil$="_" then return
  if file_exists(fil$)=0
    message "Ouverture impossible"
    return
  end_if
  gosub nouveau
  res% = dll_call2("SyneditOpen",SE%(act%),adr(fil$))
  if res%=0
    FSE$(act%) = fil$
    f$ = file_extract_name$(fil$)
    capt$(act%) = fil$
    caption 100+act%,fil$
    caption 300+act%,fil$
  end_if
  return
 
' ===== créer une nouvelle fenêtre d'édition et y charger une copie de la fenêtre active
copier:
  if act%=0 then return
  org% = act%
  gosub nouveau
  if res%=0
    res% = dll_call2("SyneditCopyObject",org%,act%)
    capt$(nsyn%) = "(copie) "+capt$(org%)
    caption 100+nsyn%,capt$(nsyn%)
    caption 300+nsyn%,capt$(nsyn%)
    FSE$(nsyn%) = "_"
    OSE$(nsyn%) = OSE$(org%)
  end_if
  return
 
' ===== fermer la fenêtre active
fermer:
  if act%=0 then return
  if left$(caption$(100+act%),1)="*" then Confirmer("Le code a été modifié. Voulez-vous vraiment fermer la fenêtre ?")
  if confirm%<>1 then return
  res% = dll_call1("SyneditDelete",SE%(act%))
  pause 500
  delete 100+act%
  inactive 300+act%
  caption 300+act%,"<supprimé>"
  SE%(act%) = 0
  act% = act% -1
  while SE%(nsyn%)=0
    delete 300+nsyn%
    nsyn% = nsyn% - 1
    if nsyn%=0 then exit_while
  end_while
  if act%>nsyn% then act% = nsyn%
  return
 
' =====enregistrer la fenêtre active dans son fichier associé
sauver:
  if act%=0 then return
  if FSE$(act%)="_" then goto sauverdans
  f$ = FSE$(act%)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if left$(caption(100+act%),1)="*" then caption 100+act%,mid$(caption 100+act%,3,200)
  return

' ===== enregistrer la fenêtre active dans un fichier choisi par dialogue
sauverdans:
  if act%=0 then return
  f$ = file_name$(97)
  if f$="_" then return
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Voulez-vous le remplacer ?")<>1 then return
  end_if
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  if res%=0
    FSE$(act%) = f$
    f$ = file_extract_name$(f$)
    caption 100+act%,f$
    caption 300+act%,f$
    capt$(act%) = f$
  end_if
  return
 
 
 
' ======================== fonctions du menu "Outils"

' ===== configuration des outils
outilsconfig:
  optvalid% = 0
  show 3500
  inactive 0
  return
 
' ===== sélection de l'outil
cheminoutil:
  f$ = file_name$(98)
  if f$="_" then return
  if file_exists(f$)=0
    message "Ce fichier n'existe pas."
    return
  end_if
  text 3505,f$
  return
 
' ===== clic dans le grid avec les outils
clickoutil:
  noutil% = grid_y_to_row(3513,mouse_y_left_down(3513))
  if grid_read$(3513,noutil%,1)=""
    inactive 3511 : inactive 3512
    text 3503,""
    text 3505,""
    text 3508,""
  else
    active 3511 : active 3512
    text 3503,grid_read$(3513,noutil%,1)
    text 3505,grid_read$(3513,noutil%,2)
    text 3508,grid_read$(3513,noutil%,3)
  end_if
  return
 
' ===== ajouter un nouvel outil
ajouteroutil:
  if trim$(text$(3503))=""
    message "Le nom de l'outil manque."
    return
  end_if
  if trim$(text$(3505))=""
    message "Le chemin de l'outil manque."
    return
  end_if
  if file_exists(text$(3505))=0
    message "Le fichier de l'outil n'existe pas."
    return
  end_if
  ' voir si l'outil existe déjà
  for i%=2 to 50
    if grid_read$(3513,i%,1)=text$(3503)
      message "Cet outil existe déjà."
      return
    end_if
  next i%
  ' trouver la première place libre
  noutil% = 0
  for i%=2 to 50
    if grid_read$(3513,i%,1)=""
      noutil% = i%
      exit_for
    end_if
  next i%
  if noutil%=0
    inactive 3511 : inactive 3512
    message "Désolé. Vous avez déjà 50 outils."
    return
  end_if
  grid_write 3513,noutil%,1,text$(3503)
  grid_write 3513,noutil%,2,text$(3505)
  grid_write 3513,noutil%,3,text$(3508)
  sauver_options_generales()
  active 3511 : active 3512
  return

' === exécuter l'outil sélectionné (ligne noutil%)
executeroutil:
  if act%=0 then return
  poutil$ = grid_read$(3513,noutil%,3)
  doutil$ = file_extract_path$(grid_read$(3513,noutil%,2))
  f$ = doutil$ + "Synedit_Editor_Source.bas" : ' + chr$(34)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  i% = instr(lower$(poutil$),"%s")
  if i%>0
    s$ = ""
    if i%>1 then s$ = left$(poutil$,i%-1)
    poutil$ = s$ + file_extract_name$(f$) + mid$(poutil$,i%+2,300)
  end_if
  eoutil$ = file_extract_name$(grid_read$(3513,noutil%,2))
  res% = DLL_call3("ExecuteProgram",adr(eoutil$),adr(poutil$),adr(doutil$))
  return

' === supprimer l'outil sélectionné (ligne noutil%)
supprimeroutil:
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer l'outil "+grid_read$(3513,noutil%,1))
  if i%<>1 then return
  if noutil%<50
    for i%=noutil% to 49
      grid_write 3513,i%,1,grid_read$(3513,i%+1,1)
      grid_write 3513,i%,2,grid_read$(3513,i%+1,2)
      grid_write 3513,i%,3,grid_read$(3513,i%+1,3)
    next i%
    grid_write 3513,50,1,""
    grid_write 3513,50,2,""
    grid_write 3513,50,3,""
  else
    grid_write 3513,noutil%,1,""
    grid_write 3513,noutil%,2,""
    grid_write 3513,noutil%,3,""
  end_if
  noutil% = 0
  sauver_options_generales()
  inactive 3511 : inactive 3512
  return




' ======================== fonctions du menu "Macros"

' ===== configuration des macros
macrosconfig:
  optvalid% = 0
  show 3300
  inactive 0
  return
 
macrosel:
  to_foreground 0
  to_foreground 100+act%
  set_focus 3307
  return

' ===== ajouter une nouvelle macro à partir du presse-papier
macroadd:
  if act%=0 then return
  f$ = trim$(text$(3302))
  if f$="" then return
  i% = 0
  while i%<count(3302)
    i% = i% + 1
    if f$=item_read$(3302,i%)
      message "Cette macro existe déjà."
      return
    end_if
  end_while
  res% = dll_call1("SyneditCopyText",act%)
  if res%<1
    message "Il n'y a rien dans le presse-papier."
    return
  end_if
  s$ = clipboard_string_paste$
  file_open_write 1,dirmacros$+f$+".macro"
  file_writeln 1,s$
  file_close 1
  item_add 3302,f$
  message "La macro "+f$+" a été créée."
  return
 
' ===== supprimer la macro sélectionnée
macrodel:
  if count(3302)=0 then return
  s$ = item_index$(3302)
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer la macro "+s$)
  if i%<>1 then return
  f$ = dirmacros$ + s$ + ".macro"
  file_delete f$
  item_delete 3302,item_index(3302)
  if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1)
  message "La macro "+s$+" a été supprimée."
  return

' ===== remplacer la page actuelle par la macro sélectionnée
macromod:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditOpen",act%,adr(f$))
  caption 100+act%,"(macro) "+item_index$(3302)
  caption 300+act%,"(macro) "+item_index$(3302)
  capt$(act%) = "(macro) "+item_index$(3302)
  return

' ===== remplacer la macro sélectionnée par la page actuelle
macroupd:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  message "La macro "+item_index$(3302)+" a été remplacée."
  return

' ===== insérer une macro
macroins:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  s$ = ""
  file_open_read 1,f$
  while file_eof(1)=0
    file_readln 1,s1$
    s$= s$ + s1$ + chr$(13) + chr$(10)
  end_while
  file_close 1
  ' ici, charger s$ avec le contenu de la macro
  res% = dll_call2("SyneditInsertString",act%,adr(s$))
  to_foreground 100+act%
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  return




' ======================== fonctions du menu "Options"

' ===== inverser l'indicateur de présence des numéros de ligne dans la fenêtre active
lignes:
  ln%(act%) = 1 - ln%(act%)    : ' basculer 0<-->1
  res% = dll_call3("SyneditFunction",SE%(act%),1,ln%(act%))  : ' signaler à Synedit
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  OSE$(act%) = str$(ln%(act%)) + mid$(OSE$(act%),2,20)  : ' mémoriser dans les param_tres
  return
 
' ===== charger la fenêtre des options avec les valeurs de la fenêtre active, puis afficher
options:
  if act%=0 then return
  optvalid% = 0
  opt$ = OSE$(act%)
  if left$(opt$,1)="1"
    mark_on 3001
  else
    mark_off 3001
  end_if
  text 3005,mid$(opt$,2,2)
  if mid$(opt$,4,1)="1"
    mark_on 3006
  else
    mark_off 3006
  end_if
  if mid$(opt$,5,1)="1"
    mark_on 3007
  else
    mark_off 3007
  end_if
  if mid$(opt$,6,1)="1"
    mark_on 3008
  else
    mark_off 3008
  end_if
  if mid$(opt$,7,1)="1"
    mark_on 3009
  else
    mark_off 3009
  end_if
  i% = instr(opt$,"\")
  text 3003,mid$(opt$,8,i%-8)
  opt$ = mid$(opt$,i%+1,len(opt$))
  for i%=1 to count(3011)
    if opt$=item_read$(3011,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3011),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  show 3000
  inactive 0
  return
 
' ===== charger la fenêtre des options générales, puis afficher
optionsgen:
  if left$(OptGen$,1)="1"
    mark_on 3201
  else
    mark_off 3201
  end_if
  text 3205,mid$(OptGen$,2,2)
  if mid$(OptGen$,4,1)="1"
    mark_on 3206
  else
    mark_off 3206
  end_if
  if mid$(OptGen$,5,1)="1"
    mark_on 3207
  else
    mark_off 3207
  end_if
  if mid$(OptGen$,6,1)="1"
    mark_on 3208
  else
    mark_off 3208
  end_if
  if mid$(OptGen$,7,1)="1"
    mark_on 3209
  else
    mark_off 3209
  end_if
  if mid$(OptGen$,8,1)="1"
    mark_on 3213
  else
    mark_off 3213
  end_if
  if mid$(OptGen$,9,1)="1"
    mark_on 3214
  else
    mark_off 3214
  end_if
  if mid$(OptGen$,10,1)="1"
    mark_on 3215
  else
    mark_off 3215
  end_if
  if mid$(OptGen$,11,1)="1"
    mark_on 3216
  else
    mark_off 3216
  end_if
  i% = instr(OptGen$,"\")
  text 3203,mid$(OptGen$,12,i%-12)
  opt$ = mid$(OptGen$,i%+1,len(OptGen$))
  for i%=1 to count(3211)
    if opt$=item_read$(3211,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3211),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  for i%=1 to count(3219)
    if OptGenKeyClr$=item_read$(3219,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3219),i%) : ' restaurer la couleur
      exit_for
    end_if
  next i%

  if mid$(OptGenStrAtt$,1,1)="1"
    mark_on 3222
  else
    mark_off 3222
  end_if
  if mid$(OptGenStrAtt$,2,1)="1"
    mark_on 3223
  else
    mark_off 3223
  end_if
  if mid$(OptGenStrAtt$,3,1)="1"
    mark_on 3224
  else
    mark_off 3224
  end_if
  if mid$(OptGenStrAtt$,4,1)="1"
    mark_on 3225
  else
    mark_off 3225
  end_if
  for i%=1 to count(3229)
    if OptGenStrClr$=item_read$(3229,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3229),i%) : ' restaurer la couleur
      exit_for
    end_if
  next i%

  show 3200
  inactive 0
  return
 
' ===== sortie de la fenêtre des options de la page par "Abandon"
options_abandon:
  hide 3000
  show 0
  active 0
  to_foreground 0
  return

' ===== sortie de la fenêtre des options générales par "Abandon"
optionsgen_abandon:
  hide 3200
  show 0
  active 0
  to_foreground 0
  return

' =====sortie de la fenêtre des options de la page par "Valider"
options_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt$ = str$(checked(3001))+right$("0"+text$(3005),2)+str$(checked(3006))
  opt$ = opt$ + str$(checked(3007))+str$(checked(3008))+str$(checked(3009))
  opt$ = opt$ + mid$(optgen$,8,4)
  opt$ = opt$ + text$(3003) + "\" + text$(3011)
  OSE$(act%) = opt$
  ln%(act%) = checked(3001)
  res% = dll_call3("SyneditFunction",SE%(act%),3,adr(opt$)) : ' activer les nouvelles options
  OptKeyAtt$ = mid$(opt$,8,4)
'  OptKeyClr$ = text$(...)
  gosub keychargerstyles    : ' charge les attributs graphiques
'  gosub Stringchargerstyles  : ' charge les attributs graphiques
  hide 3000
  show 0
  active 0
  to_foreground 0
  return
 
' =====sortie de la fenêtre des options générales par "Valider"
optionsgen_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt1$ = str$(checked(3201))+right$("0"+text$(3205),2)+str$(checked(3206))
  opt1$ = opt1$ + str$(checked(3207))+str$(checked(3208))+str$(checked(3209))
  opt1$ = opt1$ + str$(checked(3213))+str$(checked(3214))+str$(checked(3215))+str$(checked(3216))
  opt1$ = opt1$ + text$(3203) + "\" + text$(3211)
  OptGen$ = opt1$    : ' mémoriser les options générales
  OptGenKeyAtt$ = str$(checked(3213))+str$(checked(3214))+str$(checked(3215))+str$(checked(3216))
  OptGenKeyClr$ = text$(3219)
  OptGenStrAtt$ = str$(checked(3222))+str$(checked(3223))+str$(checked(3224))+str$(checked(3225))
  OptGenStrClr$ = text$(3229)
  res% = dll_call2("SelectComboBoxItem",handle(3419),item_index(3219))
  sauver_options_generales()
  hide 3200
  active 0
  to_foreground 0
  if act%>0 then to_foreground 100+act%
  return

' ===== afficher la fenêtre "Syntaxe"
syntaxe:
  if act%=0 then return
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  if (s$<>"Panoramic") and (s$<>"General")
    message "Action impossible sur cette syntaxe."
    return
  end_if
  optvalid% = 0
  caption 3400,"Configuration de la syntaxe - "+s$
  if mid$(Opt$,8,1)="1"
    mark_on 3412
  else
    mark_off 3412
  end_if
  if mid$(Opt$,9,1)="1"
    mark_on 3413
  else
    mark_off 3413
  end_if
  if mid$(Opt$,10,1)="1"
    mark_on 3414
  else
    mark_off 3414
  end_if
  if mid$(Opt$,11,1)="1"
    mark_on 3415
  else
    mark_off 3415
  end_if

  if mid$(OptStrAtt$,1,1)="1"
    mark_on 3422
  else
    mark_off 3422
  end_if
  if mid$(OptStrAtt$,2,1)="1"
    mark_on 3423
  else
    mark_off 3423
  end_if
  if mid$(OptStrAtt$,3,1)="1"
    mark_on 3424
  else
    mark_off 3424
  end_if
  if mid$(OptStrAtt$,4,1)="1"
    mark_on 3425
  else
    mark_off 3425
  end_if
  show 3400
  inactive 0
  return
 
' ===== nouveau mot-cle
keyajouter:
  s$ = lower$(trim$(text$(3402)))
  if s$="" then return
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    if s$=item_read$(3403,i%)
      message "Ce mot-clé existe déjà."
      return
    end_if
  end_while
  item_add 3403,s$
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  appliquer_syntax(s$)
  return

keymodifier:
  return

keysupprimer:
  return

keychargertout:
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  clear 3403
  file_open_read 1,f$
  file_readln 1,s1$
  i% = 1
  if s1$<>"#SYNTAX" then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>s$ then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>"#KEYS" then goto invalidsyntax
  while file_eof(1)=0
    file_readln 1,s1$
    i% = i% + 1
    if s1$="#END" then exit_while
    item_add 3403,s1$
  end_while
  appliquer_syntax(s$)
' ici, charger les attributs
' #KEYSTYLE
' STYLE=GRAS,ITALIQUE
' COLOR=Bleu
' #END
  file_readln 1,s1$
  i% = 1
  if s1$<>"#KEYSTYLE" then goto invalidsyntax
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"STYLE=" then goto invalidsyntax
  s2$ = ""
  if instr(s1$,"GRAS")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"ITALIQUE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"SOUSLIGNE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"BARRE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  OptGenKeyAtt$ = s2$
  OptKeyAtt$ = OptGenKeyAtt$
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  OSE$(act%) = opt$
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"COLOR=" then goto invalidsyntax
  OptGenKeyClr$ = mid$(s1$,7,len(s1$))
  OptKeyClr$ = OptGenKeyClr$
  for k%=1 to count(3419)
    if OptGenKeyClr$=item_read$(3419,k%)
      res% = dll_call2("SelectComboBoxItem",handle(3419),k%)
      res% = dll_call2("SelectComboBoxItem",handle(3219),k%)
      exit_for
    end_if
  next k%
  file_readln 1,s1$
  OptGenStrAtt$ = "0000"
  OptGenStrClr$ = "Noir"
  OptStrAtt$ = "0000"
  OptStrClr$ = "Noir"
  if s1$<>"#END" then goto invalidsyntax
' ici charger les attributs
' #STRINGSTYLE
' STYLE=ITALIQUE
' COLOR=Gris
' #END
  if file_eof(1)=0
    file_readln 1,s1$
    i% = 1
    if s1$<>"#STRINGSTYLE" then goto invalidsyntax
    file_readln 1,s1$
    i% = 1
    if left$(s1$,6)<>"STYLE=" then goto invalidsyntax
    s2$ = ""
    if instr(s1$,"GRAS")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    if instr(s1$,"ITALIQUE")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    if instr(s1$,"SOUSLIGNE")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    if instr(s1$,"BARRE")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    OptGenStrAtt$ = s2$
    OptStrAtt$ = OptGenStrAtt$
    opt$ = s2$
    file_readln 1,s1$
    i% = 1
    if left$(s1$,6)<>"COLOR=" then goto invalidsyntax
    OptGenStrClr$ = mid$(s1$,7,len(s1$))
    OptStrClr$ = OptGenStrClr$
    for i%=1 to count(3429)
      if OptGenStrClr$=item_read$(3429,i%)
        res% = dll_call2("SelectComboBoxItem",handle(3429),i%)
        res% = dll_call2("SelectComboBoxItem",handle(3229),i%)
        exit_for
      end_if
    next i%
    file_readln 1,s1$
    i% = 1
    if s1$<>"#END" then goto invalidsyntax
  end_if
  file_close 1
  return
invalidsyntax:
  file_close 1
  message "Fichier invalide en ligne "+str$(i%)+": "+s1$
  return
 
keychargerstyles:
  res% = dll_call4("SyneditConfigureHighlighter",act%,4,adr(OptKeyAtt$),adr(OptKeyClr$))
  return

stringchargerstyles:
  res% = dll_call4("SyneditConfigureHighlighter",act%,5,adr(OptStrAtt$),adr(OptStrClr$))
  return

keysauvertout:
' format du fichier de la syntaxe:
' fichier Synedit_Editor_Syntax_Panoramic.txt
' #SYNTAX
' Panoramic (nom de la syntaxe en 1 ligne)
' #KEYS
' pause (une ligne par mot-clé)
' ...
' #END
  opt$ = OSE$(act%)
  i% = instr(opt$,"\")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  file_open_write 1,f$
  file_writeln 1,"#SYNTAX"
  file_writeln 1,s$
  file_writeln 1,"#KEYS"
  i% = 0
  s$ = ""
  while i%<count(3403)
    i% = i% + 1
    s1$ = item_read$(3403,i%)
    if s1$<>s$ then file_writeln 1,s1$  : ' pour éviter les doublons...
    s$ = s1$
  end_while
  file_writeln 1,"#END"
' ici, sauver les attributs des mots-clé
  file_writeln 1,"#KEYSTYLE"
  s$ = ""
  if mid$(optgen$,8,1)="1" then s$ = s$ + "GRAS"
  if mid$(optgen$,9,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "ITALIQUE"
  end_if
  if mid$(optgen$,10,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "SOUSLIGNE"
  end_if
  if mid$(optgen$,11,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "BARRE"
  end_if
  file_writeln 1,"STYLE="+s$
  file_writeln 1,"COLOR="+OptGenKeyClr$
  file_writeln 1,"#END"
' ici, sauver les attributs des chaînes
  file_writeln 1,"#STRINGSTYLE"
  s$ = ""
  if mid$(OptGenStrAtt$,1,1)="1" then s$ = s$ + "GRAS"
  if mid$(OptGenStrAtt$,2,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "ITALIQUE"
  end_if
  if mid$(OptGenStrAtt$,3,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "SOUSLIGNE"
  end_if
  if mid$(OptGenStrAtt$,4,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "BARRE"
  end_if
  file_writeln 1,"STYLE="+s$
  file_writeln 1,"COLOR="+OptGenStrClr$
  file_writeln 1,"#END"
  file_close 1
  message "La syntaxe est sauvée dans "+f$
  return
 
appliquerkeyattrib:
  s2$ = ""
  if checked(3412)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3413)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3414)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3415)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  OptGenKeyAtt$ = s2$
  OptGenKeyClr$ = text$(3419)
  OptKeyAtt$ = s2$
  OptKeyClr$ = text$(3419)
  res% = dll_call2("SelectComboBoxItem",handle(3219),item_index(3419))
  gosub keychargerstyles
  return

appliquerstringattrib:
  s2$ = ""
  if checked(3422)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3423)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3424)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3425)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  OptGenStrAtt$ = s2$
  OptGenStrClr$ = text$(3429)
  OptStrAtt$ = s2$
  OptStrClr$ = text$(3429)
'  res% = dll_call2("SelectComboBoxItem",handle(3229),item_index(3429))
  gosub stringchargerstyles
  return

 
 
' ======================== fonctions indépendantes

' ===== ce timer surveille la fenêtre active et ses dimensions
tick:
  timer_off 99
  res% = dll_call0("GetActiveWindow")  : ' récupérer le handle de la fenêtre active
  for i%=1 to nsyn%                    : ' chercher dans la table des fenêtres d"édition
    if res%=hndSE%(i%)                  : ' est-ce qu'on a trouvé la fenêtre
      if i%<>act%                      : ' est-elle différente de la fenêtre active précédente ?
        mark_off 300+act%              : ' alors changer le marquade du menu
        mark_on 300+i%
      end_if
      act% = i%                        : ' mémoriser le numéro de la fenêtre active
      res% = dll_call5("SyneditGeometry",SE%(act%),M1%,M1%,M1%,M1%) : ' ajuster la taille de Synedit à celle de la fenêtre
      exit_for
    end_if
  next i%
  timer_on 99
  return



' ======================== SUBs internes

' ===== fermer une des fenêres auxiliaires modales
sub CloseX(f%)
  if optvalid%=0
    hide f%
    show 0
    active 0
    if act%=0
      to_foreground 0
    else
      to_foreground 100+act%
    end_if
  end_if
end_sub

' ===== appliquer une syntaxe paramétrée
sub appliquer_syntax(sy$)
  dim_local s$, i%
  s$ = sy$
  i% = instr(s$,"\")
  if i%>0 then s$ = mid$(sy$,i%+1,len(s$))
  ' imposer d'abord les mots-clé
  if (s$="Panoramic") or (s$="General")
    clear 96
    i% = 0
    while i%<count(3403)
      i% = i% + 1
      item_add 96,item_read$(3403,i%)
    end_while
    res% = dll_call4("SyneditConfigureHighlighter",act%,3,handle(96),0)
  else
    message "La syntaxe "+sy$+" ne peut pas être configurée."
  end_if
end_sub

' ===== une des pages a changé
sub syneditchange(n$)
  dim_local n%
  n% = val(n$)
  if left$(caption$(100+n%),1)<>"*" then caption 100+n%,"* "+caption$(100+n%)
end_sub

' ===== on a frappé F1
sub synedithelp(n$)
  dim_local n%
  n% = val(n$)
  message "Aide pas encore implémentée."
end_sub

' ===== demande d'un message de confirmation
sub confirmer(s$)
  confirm% = message_confirmation_yes_no(s$)
end_sub
 
' ===== purger les pages non mises à jour
sub purger()
dim_local i%
  for i%=1 to nsyn%
    if left$(caption$(100+i%),1)="*"
      s$ = "La page ["+capt$(i%)+"] a été modifiée. Voulez-vous la sauvegarder ?"
      confirmer(s$)
      if confirm%=1
        act% = i%
        message "on sauvegarde "+str$(act%)
        to_foreground 100+act%
        res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
        gosub sauver
      end_if
    end_if
  next i%
end_sub

' ===== sauver les options générales
sub sauver_options_generales()
  dim_local i%
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  i% = 2
  while trim$(grid_read$(3513,i%,1))<>""
    file_writeln 1,grid_read$(3513,i%,1)
    file_writeln 1,grid_read$(3513,i%,2)
    file_writeln 1,grid_read$(3513,i%,3)
    i% = i% + 1
  end_while
  file_close 1
end_sub

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Froggy One

avatar

Nombre de messages : 391
Date d'inscription : 06/01/2012

MessageSujet: ReRe   Mer 27 Aoû 2014 - 13:10

(66) No corresponding END_WHILE found. Line:1412.

Y aurait-il un embouteillage sur la route 66 ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://gaeldwest.wordpress.com
Froggy One

avatar

Nombre de messages : 391
Date d'inscription : 06/01/2012

MessageSujet: ReReRe   Mer 27 Aoû 2014 - 13:16

Et en plus, W7 m'embête avec des droits d'administrateur ! Même pas propriétaire de mon matériel !! Je les hais !!!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://gaeldwest.wordpress.com
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mer 27 Aoû 2014 - 13:42

supprime Synedit_Editor.ini, et reprends Synedit_Editor_Syntax_Panoramic.txt du WebDav dossier Synedit, et place-le dans le même dossier que l'EXE (ou dans le dossier ...\tmp\`dans lequel Panoramic_Editor crée son exécutable temporaire, lors du lancement. C'est là aussi que tu trouves Synedit_Editor.ini pour le lancement par Panoramic_Editor.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Laurent (Minibug)

avatar

Nombre de messages : 2353
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Editeur avec marquage syntaxique   Mer 27 Aoû 2014 - 14:23

Bonjour Klaus,

Effectivement cela prend forme et les bugs disparaissent...

Est ce normal que la police ne soit pas prise en charge et que la taille semble plus grande que dans Panoramic ?

Je pense qu'un (mini)bug... s'est caché dans ces paramètres !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mer 27 Aoû 2014 - 17:29

Il y avait bien un bug sur la reconnaissance de la police. C'est corrigé. J'ai regardé aussi les tailles de police - elles sont bien prises en compte séparément pour chaque page, par les options de la page active, ou globalement pour toutes les nouvelles pages à créer.

J'ai corrigé aussi un bug au niveau de la fermeture de multiples fenêtres si elles n'ont pas encore été sauvegardées.

Il faut recharger la DLL qui est passée à la version V3.30 du 27/08/2014. Voici le nouveau code de l'éditeur:
Code:
' Synedit_Editor.bas

' Options générales
' =================
' Les options générales sont accessibles à tout moment.
' Elles sont mémorisées dans le fichier suivant:
'    (chemin)\Synedit_Editor.ini
' où "chemin" représente le chemin vers Synedit.exe.
' Ces options s'imposent à toutes les pages.
' Leur modification prend effet immédiatement,
' mais leur action n'est visible dans les pages existantes
' que lors de la consultation suivante du paralètre. Par
' exemple, la police par défaut sera utilisée pour créer
' une page vide ou charger un fichier, mais ne modifiera
' pas les polices déjà configurées pour des pages affichées.

' Les macros sont des portions de code mémorisées dans des fichiers
'    (chemin)\Synedit_Editor_Macros\(nom).macro
' Ces fichiers sont créées par le menu de configuration des macros
' et utilisés à partir du menu d'exécution des macros.

' Le fichier des options générales contient les lignes suivantes:
' 1=xttgisbp\S     pour les options générales du texte
' suivi de 3 lignes par outil configuré

label close0, close3000, close3200, close3300, close3400, close3500
label nouveau, ouvrir, copier, fermer, sauver, sauverdans, sortir
label lignes, options, optionsgen,  tick, fenetre
label aide, apropos, syneditalert, invalidsyntax
label options_abandon, options_valider, FermerFichierErr
label optionsgen_abandon, optionsgen_valider
label apropos_fermer, outilsconfig, cheminoutil, clickoutil
label ajouteroutil, executeroutil, supprimeroutil
label macrosconfig
label macroadd, macrodel, macromod, macroupd, macroins, macrosel
label syntaxe, keyajouter, keymodifier, keysupprimer
label keychargertout, keysauvertout, keychargerstyles, appliquerkeyattrib
label appliquerstringattrib, stringchargerstyles, commentchargerstyles

' ===== variables pour gérer les pages d'édition
dim OptGen$          : ' options générales
  ' xttgisbP\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' P=police S=syntaxe
dim OptGenKeyAtt$    : ' pour mots-clé:      gisbC     général
dim OptGenKeyClr$    : ' pour mots-clé:      couleur   général
dim OptGenStrAtt$    : ' pour chaînes:       gisbC     général
dim OptGenStrClr$    : ' pour chaînes:       couleur   général
dim OptGenComAtt$    : ' pour commentaires:  gisbC     général
dim OptGenColClr$    : ' pour commentaires:  couleur   général
dim OptKeyAtt$       : ' pour mots-clé:      gisbC     page actuelle
dim OptKeyClr$       : ' pour mots-clé:      couleur   page actuelle
dim OptStrAtt$       : ' pour chaînes:       gisbC     page actuelle
dim OptStrClr$       : ' pour chaînes:       couleur   page actuelle
dim OptComAtt$       : ' pour commentaires:  gisbC     général
dim OptComClr$       : ' pour commentaires:  couleur   général
dim SE%(100)         : ' les objets Synedit
dim hndSE%(100)      : ' les handles des fenêtres
dim ln%(100)         : ' flags "numéros de lignes affichés"
dim capt$(100)       : ' titre des fenetres
dim OSE$(100)        : ' les options des objets
dim FSE$(100)        : ' les noms des fichiers
dim nsyn%            : ' plus grand numéro de page d'édition (0...100)
dim act%             : ' page d'édition actuellement active (0...100)
' dim colorstring$     : ' couleur des chaînes de caractères
dim actsyntax$       : ' nom de la syntaxe actuelle

' ===== variables internes
dim res%, d%, nf%, t%, l%, i%, k%, optvalid%, opt$, opt1$, f$
dim org%, s$, s1$, s2$, olddir$, salert$, nalert%, confirm%, fil$
dim noutil%, poutil$, doutil$, eoutil$

' ===== constantes
dim M1%        : M1% = 0 - 1
dim version$   : version$ = "Alpha 0.8"
dim verdat$    : verdat$ = "27/08/2014"
dim KGF$       : KGF$ = "KGF.dll"
dim dir$       : dir$ = file_extract_path$(param_value$(0))
dim ini$       : ini$ = dir$+"Synedit_editor.ini"
dim dirmacros$ : dirmacros$ = dir$ + "Synedit_Editor_Macros"
dim q$         : q$ = chr$(34)

data "Noir","Eau","Bleu","Crème","Gris foncé","Gris","Vert","Citron"
data "Gris clair","Marron","Gris moyen","Vert menthe","Bleu marine"
data "Vert olive","Violet","Rouge","Argent","Bleu ciel","Fuschia"
data "Canard","Blanc","Jaune","./."


' configurer la form 0 (uniquement le menu)
width 0,800 : height 0,60 : border_small 0
caption 0,"Synedit_Editor - Version "+version$+" du "+verdat$

' ===== création de tous les menus
main_menu 10
  sub_menu 11 : parent 11,10 : caption 11,"Fichier"
    sub_menu 12 : parent 12,11 : caption 12,"Nouveau" : on_click 12,nouveau
    sub_menu 13 : parent 13,11 : caption 13,"Ouvrir..." : on_click 13,ouvrir
    sub_menu 14 : parent 14,11 : caption 14,"Copier" : on_click 14,copier
    sub_menu 15 : parent 15,11 : caption 15,"Fermer" : on_click 15,fermer
    sub_menu 16 : parent 16,11 : caption 16,"Sauver" : on_click 16,sauver
    sub_menu 17 : parent 17,11 : caption 17,"Sauver dans..." : on_click 17,sauverdans
    sub_menu 18 : parent 18,11 : caption 18,"-"
    sub_menu 19 : parent 19,11 : caption 19,"Sortir" : on_click 19,sortir
  sub_menu 21 : parent 21,10 : caption 21,"Options"
    sub_menu 22 : parent 22,21 : caption 22,"N° de ligne" : on_click 22,lignes
    sub_menu 23 : parent 23,21 : caption 23,"Options de la page" : on_click 23,options
    sub_menu 24 : parent 24,21 : caption 24,"Options générales" : on_click 24,optionsgen
    sub_menu 25 : parent 25,21 : caption 25,"-"
    sub_menu 26 : parent 26,21 : caption 26,"Syntaxe de la page" : on_click 26,syntaxe
  sub_menu 400 : parent 400,10 : caption 400,"Edition"
    sub_menu 401 : parent 401,400 : caption 401,"pas encore implémenté" : ' on_click 401,???
  sub_menu 430 : parent 430,10 : caption 430,"Outils"
    sub_menu 431 : parent 431,430 : caption 431,"Outils" : on_click 431,outilsconfig
    sub_menu 441 : parent 441,430 : caption 441,"Macros" : on_click 441,macrosconfig
  sub_menu 300 : parent 300,10 : caption 300,"Fenêtres"
'    sub_menu 301 : parent 301,300 : caption 301,"Fenêtre" : on_click 301,fenetre
  sub_menu 420 : parent 420,10 : caption 420,"Aide"
    sub_menu 421 : parent 421,420 : caption 421,"Aide" : on_click 421,aide
    sub_menu 422 : parent 422,420 : caption 422,"A-propos" : on_click 422,apropos

' ===== création de la fenêtre des options de la page actuelle
form 3000 : hide 3000 : caption 3000,"Options de la page" : command_target_is 3000
  top 3000,100 : left 3000,200
  width 3000,550 :height 3000,400 : on_close 3000,close3000
check 3001 : top 3001,10 : left 3001,10 : width 3001,150
  caption 3001,"Numéros de de ligne"
container 3002 : caption 3002,"Format par défaut"
  top 3002,40 : left 3002,10 : width 3002,250 : height 3002,110
combo 3003 : parent 3003,3002 : top 3003,20 : left 3003,10 : width 3003,170
  font_names_load 3003 : text 3003,"Courier"
alpha 3004 : parent 3004,3002 : top 3004,50 : left 3004,10 : caption 3004,"Taille:"
combo 3005 : parent 3005,3002 : top 3005,50 : left 3005,60 : width 3005,40
  item_add 3005,"8"
  item_add 3005,"9"
  item_add 3005,"10"
  item_add 3005,"11"
  item_add 3005,"12"
  item_add 3005,"14"
  item_add 3005,"16"
  item_add 3005,"18"
text 3005,"10"
check 3006 : parent 3006,3002 : top 3006,80 : left 3006,10 : caption 3006,"Gras"
  font_bold 3006
check 3007 : parent 3007,3002 : top 3007,80 : left 3007,60 : caption 3007,"Italique"
  font_italic 3007
check 3008 : parent 3008,3002 : top 3008,80 : left 3008,120 : caption 3008,"Sousligné"
  font_underline 3008
check 3009 : parent 3009,3002 : top 3009,80 : left 3009,190 : caption 3009,"Barré" : width 3009,40
  font_strike 3009
alpha 3010 : top 3010,160 : left 3010,10 : caption 3010,"Syntaxe:"
combo 3011 : top 3011,160 : left 3011,80 : width 3011,150

button 3098 : top 3098,310 : left 3098,10 : caption 3098,"Abandon"
  on_click 3098,options_abandon
button 3099 : top 3099,310 : left 3099,210 : caption 3099,"Valider"
  on_click 3099,options_valider

' ===== création de la fenêtre des options générales
form 3200 : hide 3200 : caption 3200,"Options générales" : command_target_is 3200
  top 3200,100 : left 3200,200
  width 3200,550 :height 3200,400 : on_close 3200,close3200
check 3201 : top 3201,10 : left 3201,10 : width 3201,150
  caption 3201,"Numéros de de ligne"
container 3202 : caption 3202,"Format par défaut"
  top 3202,40 : left 3202,10 : width 3202,250 : height 3202,110
combo 3203 : parent 3203,3202 : top 3203,20 : left 3203,10 : width 3203,170
  font_names_load 3203 : text 3203,"Courier"
alpha 3204 : parent 3204,3202 : top 3204,50 : left 3204,10 : caption 3204,"Taille:"
combo 3205 : parent 3205,3202 : top 3205,50 : left 3205,60 : width 3205,40
  item_add 3205,"8"
  item_add 3205,"9"
  item_add 3205,"10"
  item_add 3205,"11"
  item_add 3205,"12"
  item_add 3205,"14"
  item_add 3205,"16"
  item_add 3205,"18"
text 3205,"10"
check 3206 : parent 3206,3202 : top 3206,80 : left 3206,10 : caption 3206,"Gras"
  font_bold 3206
check 3207 : parent 3207,3202 : top 3207,80 : left 3207,60 : caption 3207,"Italique"
  font_italic 3207
check 3208 : parent 3208,3202 : top 3208,80 : left 3208,120 : caption 3208,"Sousligné"
  font_underline 3208
check 3209 : parent 3209,3202 : top 3209,80 : left 3209,190 : caption 3209,"Barré" : width 3209,40
  font_strike 3209
alpha 3210 : top 3210,160 : left 3210,10 : caption 3210,"Syntaxe:"
combo 3211 : top 3211,160 : left 3211,80 : width 3211,150
container 3212 : caption 3212,"Style des mots-clé"
  top 3212,40 : left 3212,270 : width 3212,250 : height 3212,100
check 3213 : parent 3213,3212 : top 3213,20 : left 3213,10 : caption 3213,"Gras" : font_bold 3213
check 3214 : parent 3214,3212 : top 3214,20 : left 3214,60 : caption 3214,"Italique" : font_italic 3214
check 3215 : parent 3215,3212 : top 3215,20 : left 3215,120 : caption 3215,"Sousligné" : font_underline 3215
check 3216 : parent 3216,3212 : top 3216,20 : left 3216,190 : caption 3216,"Barré" : font_strike 3216
  width 3216,50
alpha 3218 : parent 3218,3212 : top 3218,50 : left 3218,10 : caption 3218,"Couleur;"
combo 3219 : parent 3219,3212 : top 3219,50 : left 3219,70 : width 3219,70

container 3227 : top 3227,150 : left 3227,270 : width 3227,250 : height 3227,90
  caption 3227,"Style des chaînes de caractères"
check 3222 : parent 3222,3227 : top 3222,20 : left 3222,10 : caption 3222,"Gras" : font_bold 3222
check 3223 : parent 3223,3227 : top 3223,20 : left 3223,60 : caption 3223,"Italique" : font_italic 3223
check 3224 : parent 3224,3227 : top 3224,20 : left 3224,120 : caption 3224,"Sousligné" : font_underline 3224
check 3225 : parent 3225,3227 : top 3225,20 : left 3225,190 : caption 3225,"Barré" : font_strike 3225
  width 3225,50
alpha 3228 : parent 3228,3227 : top 3228,50 : left 3228,10 : caption 3228,"Couleur;"
combo 3229 : parent 3229,3227 : top 3229,50 : left 3229,70 : width 3229,70
' button 3226 : parent 3226,3227 : top 3226,50 : left 3226,200 : caption 3226,"Appliquer"
'  on_click 3226,appliquerstringattrib

button 3298 : top 3298,310 : left 3298,10 : caption 3298,"Abandon"
  on_click 3298,optionsgen_abandon
button 3299 : top 3299,310 : left 3299,210 : caption 3299,"Valider"
  on_click 3299,optionsgen_valider


' ===== création de la fenêtre des définitions des macros
form 3300 : hide 3300 : caption 3300,"Configuration des macros" : command_target_is 3300
  top 3300,0 : left 3300,width(0) : border_small 3300
  width 3300,420 :height 3300,105 : on_close 3300,close3300
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins


' ===== création de la fenêtre des définitions de syntaxe de la page
form 3400 : hide 3400 : caption 3400,"Configuration de la syntaxe" : command_target_is 3400
  top 3400,100 : left 3400,200
  width 3400,750 :height 3400,610 : on_close 3400,close3400
Alpha 3401 : top 3401,10 : left 3401,10 : caption 3401,"Mots-clé:"
edit 3402 : top 3402,30 : left 3402,10 : width 3402,200
list 3403 : top 3403,60 : left 3403,10 : width 3403,200 : height 3403,400
  sort_on 3403
button 3404: top 3404,30 : left 3404,220 : width 3404,70
  caption 3404,"Ajouter" : on_click 3404,keyajouter
button 3405: top 3405,60 : left 3405,220 : width 3405,70
  caption 3405,"Modifier" : on_click 3405,keymodifier
button 3406: top 3406,90 : left 3406,220 : width 3406,70
  caption 3406,"Supprimer" : on_click 3406,keysupprimer
button 3409: top 3409,480 : left 3409,10 : width 3409,200 : height 3409,70
  caption 3409,"Charger la syntaxe" : on_click 3409,keychargertout
  font_bold 3409 : font_size 3409,12
button 3410: top 3410,480 : left 3410,300 : width 3410,200 : height 3410,70
  caption 3410,"Sauver la syntaxe" : on_click 3410,keysauvertout
  font_bold 3410 : font_size 3410,12
container 3417 : top 3417,10 : left 3417,310 : width 3417,300 : height 3417,90
  caption 3417,"Style des mots-clé"
alpha 3411 : parent 3411,3417 : top 3411,20 : left 3411,10 : caption 3411,"Styles;"
check 3412 : parent 3412,3417 : top 3412,20 : left 3412,50 : caption 3412,"Gras" : font_bold 3412
check 3413 : parent 3413,3417 : top 3413,20 : left 3413,100 : caption 3413,"Italique" : font_italic 3413
check 3414 : parent 3414,3417 : top 3414,20 : left 3414,160 : caption 3414,"Sousligné" : font_underline 3414
check 3415 : parent 3415,3417 : top 3415,20 : left 3415,230 : caption 3415,"Barré" : font_strike 3415
  width 3415,50
alpha 3418 : parent 3418,3417 : top 3418,50 : left 3418,10 : caption 3418,"Couleur;"
combo 3419 : parent 3419,3417 : top 3419,50 : left 3419,70 : width 3419,70
button 3416 : parent 3416,3417 : top 3416,50 : left 3416,200 : caption 3416,"Appliquer"
  on_click 3416,appliquerkeyattrib
  
container 3427 : top 3427,110 : left 3427,310 : width 3427,300 : height 3427,90
  caption 3427,"Style des chaînes de caractères"
alpha 3421 : parent 3421,3427 : top 3421,20 : left 3421,10 : caption 3421,"Styles;"
check 3422 : parent 3422,3427 : top 3422,20 : left 3422,50 : caption 3422,"Gras" : font_bold 3422
check 3423 : parent 3423,3427 : top 3423,20 : left 3423,100 : caption 3423,"Italique" : font_italic 3423
check 3424 : parent 3424,3427 : top 3424,20 : left 3424,160 : caption 3424,"Sousligné" : font_underline 3424
check 3425 : parent 3425,3427 : top 3425,20 : left 3425,230 : caption 3425,"Barré" : font_strike 3425
  width 3425,50
alpha 3428 : parent 3428,3427 : top 3428,50 : left 3428,10 : caption 3428,"Couleur;"
combo 3429 : parent 3429,3427 : top 3429,50 : left 3429,70 : width 3429,70
button 3426 : parent 3426,3427 : top 3426,50 : left 3426,200 : caption 3426,"Appliquer"
  on_click 3426,appliquerstringattrib

' ===== création de la fenêtre A-propos
form 3100 : hide 3100 : top 3100,100 : left 3100,300 : command_target_is 3100
  width 3100,400 : height 3100,200 : on_close 3100,apropos_fermer
picture 3101 : full_space 3101  : print_target_is 3101
font_name 3101,"Courier" : font_size 3101,10 : font_bold 3101
print_locate 40,20  : print "Programme: "+"Synedit_Editor"
print_locate 40,40  : print "Version:   "+version$
print_locate 40,60  : print "Date:      "+verdat$
print_locate 40,80  : print "Auteur:    "+"Klaus"


' ===== création de la fenêtre des définitions des outils
form 3500 : hide 3500 : caption 3500,"Configuration des outils" : command_target_is 3500
  top 3500,100 : left 3500,200 : border_small 3300
  width 3500,520 :height 3500,450 : on_close 3500,close3500
alpha 3501 : top 3501,10 : left 3501,10
  s$ = "Donnez un nom à un outil, un chemin vers l'exécutable et des paramètres. "+chr$(13)+chr$(10)
  s$ = s$ + "Le code %s représente le code source de la page. Le dossier de l'outil sera utilisé."
  caption 3501,s$
alpha 3502 : top 3502,50 : left 3502,10 : caption 3502,"Nom:"
edit 3503 : top 3503,50 : left 3503,80 : width 3503,120
alpha 3504 : top 3504,80 : left 3504,10 : caption 3504,"Cible:"
edit 3505 : top 3505,80 : left 3505,80 : width 3505,300
button 3506 : top 3506,80 : left 3506,390 : width 3506,20 : caption 3506,"..."
  on_click 3506,cheminoutil
alpha 3507 : top 3507,110 : left 3507,10 : caption 3507,"Paramètres:"
edit 3508 : top 3508,110 : left 3508,80 : width 3508,300
button 3510 : top 3510,140 : left 3510,10 : caption 3510,"Ajouter" : width 3510,80
  on_click 3510,ajouteroutil
button 3511 : top 3511,140 : left 3511,100 : caption 3511,"Exécuter" : width 3511,300 : inactive 3511
  on_click 3511,executeroutil
button 3512 : top 3512,140 : left 3512,410 : caption 3512,"Supprimerr" : width 3512,80 : inactive 3512
  on_click 3512,supprimeroutil
grid 3513 : top 3513,170 : left 3513,10 : width 3513,480 : height 3513,190
   grid_column 3513,3 : grid_row 3513,50 : grid_one_column_width 3513,1,120
   grid_one_column_width 3513,2,120 : grid_one_column_width 3513,3,215
   grid_write 3513,1,1,"Outil" : grid_write 3513,1,2,"Chemin" : grid_write 3513,1,3,"Paramètres"
   on_click 3513,clickoutil
if 1=2
alpha 3301 : top 3301,10 : left 3301,10 : caption 3301,"Nom:"
combo 3302 : top 3302,10 : left 3302,50 : width 3302,280 : sort_on 3302  : on_click 3302,macrosel
button 3303 : top 3303,40 : left 3303,50 : width 3303,70
  caption 3303,"Nouveau" : font_bold 3303 : on_click 3303,macroadd
button 3304 : top 3304,40 : left 3304,120 : width 3304,70
  caption 3304,"Supprimer" : font_bold 3304 : on_click 3304,macrodel
button 3305 : top 3305,40 : left 3305,190 : width 3305,70
  caption 3305,"Editer" : font_bold 3305 : on_click 3305,macromod
button 3306 : top 3306,40 : left 3306,260 : width 3306,70
  caption 3306,"Remplacer" : font_bold 3306 : on_click 3306,macroupd
button 3307 : top 3307,9 : left 3307,330 : width 3307,70 : height 3307,56
  caption 3307,"Insérer" : font_bold 3307 : on_click 3307,macroins
end_if


' ===== quelques objets invisbles
command_target_is 0
edit 95 : hide 95 : on_change 95,syneditalert
memo 96 : hide 96
save_dialog 97
open_dialog 98
timer 99 : timer_off 99 : timer_interval 99,300 : on_timer 99,tick
  
' ===== activer la DLL
dll_on KGF$

' === faire quelques initialialisations
res% = dll_call0("SyneditInitialize")
res% = DLL_call2("SetCloseBox",handle(0),0) : ' désactiver la croix rouge !
res% = dll_call3("SyneditFunction",0,4,0)   : ' récupérer la liste des définitions de syntaxe
s$ = clipboard_string_paste$                : ' sauvegarder le presse-papier
clipboard_paste 96                          : ' la charger dans un mémo
for i%=1 to count(96)                       : ' et recopier dans la combo
  item_add 3011,item_read$(96,i%)           : '    options de la page
  item_add 3211,item_read$(96,i%)           : '    options générales
next i%
clipboard_string_copy s$
                   : ' restaurer le presse-papier
res% = dll_call2("SelectComboBoxItem",handle(3011),1) : ' sélectionner (aucune)
res% = dll_call2("SelectComboBoxItem",handle(3211),1) : ' sélectionner (aucune)
' OptGen$ = "0100000Courier\(aucune)"         : ' options générales par défaut
OptGen$ = "01000001000Courier\(aucune)"     : ' options générales par défaut
if file_exists(ini$)=1                      : ' si fichier INI existe, relire les options générales
  file_open_read 1,ini$
  file_readln 1,OptGen$
  noutil% = 1
  while file_eof(1)=0
    noutil% = noutil% + 1
    file_readln 1,s$
    grid_write 3513,noutil%,1,s$
    file_readln 1,s$
    grid_write 3513,noutil%,2,s$
    file_readln 1,s$
    grid_write 3513,noutil%,3,s$
  end_while
  file_close 1
else                                        : ' si fichier INI n'existe pas, le créer
  file_open_write 1,ini$
  file_writeln 1,OptGen$
  file_close 1
end_if
if dir_exists(dirmacros$)=0 then dir_make dirmacros$ : ' créer le dossier des macros
olddir$ = dir_current$                      : ' sauvegarder le dossier actuel
dir_change dirmacros$                       : ' aller dans le dossier des macros
s$ = file_find_first$                       : ' parcourir ce dossier
while s$<>"_"                               : '   pour charger la liste des macros existantes
  if left$(s$,1)<>"."
    if right$(s$,6)=".macro"
      s$ = left$(s$,len(s$)-6)
      item_add 3302,s$
    end_if
  end_if
  s$ = file_find_next$
end_while
dir_change olddir$                          : ' restaurer le dossier par défaut
if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1) : ' sélectionner la première macro
read s$
while s$<>"./."
  item_add 3419,s$   : ' options syntaxe:   couleur des mots-clé
  item_add 3429,s$   : ' options syntaxe:   couleur des chaînes de caractères
  item_add 3219,s$   : ' options générales: couleur des mots-clé
  item_add 3229,s$   : ' options générales: couleur des chaînes de caractères
  read s$
end_while
res% = dll_call2("SelectComboBoxItem",handle(3419),1) : ' sélectionner le noir
res% = dll_call2("SelectComboBoxItem",handle(3429),1) : ' sélectionner le noir
res% = dll_call2("SelectComboBoxItem",handle(3219),1) : ' sélectionner le noir
res% = dll_call2("SelectComboBoxItem",handle(3229),1) : ' sélectionner le noir

OptComAtt$ = "0100"
OptComClr$ = "Jaune"
end




' ===== évènement déclenché par Synedit, quelque soit la page
' l'objetinvisible 95 (un EDIT) contient:
'    Cnnn = la page nnn a changé
'    Hnnn = on a frappé F1 dans la page nnn
syneditalert:
  salert$ = text$(95)
  nalert% = instr("CH",left$(salert$,1))
  select nalert%
    case 1: ' une page a changé
      syneditchange(mid$(salert$,2,3))
    case 2: ' on a frappé F1
      synedithelp(mid$(salert$,2,3))
  end_select
  return

' ===== à la fin, on supprime toutes les fenêtres ouvertes
close0:
  while nsyn%>0
    res% = dll_call1("SyneditDelete",SE%(nsyn%))
    pause 500              : ' ce délai pourra éventuellement être réduit...
    delete 100+nsyn%
    nsyn% = nsyn% - 1
  end_while
  return

' ===== fermeture de la fenêtre des paramètres de la page
close3000:
  closeX(3000)
  return
  
' ===== fermeture de la fenêtre des paramètres généraux
close3200:
  closeX(3200)
  return

' ===== fermeture de la fenêtre de configuration de la syntaxe de la page
close3400:
  closeX(3400)
  return

' ===== fermeture de la fenêtre de configuration des macros
close3300:
  closeX(3300)
  return

' ===== fermeture de la fenêtre de configuration des outils
close3500:
  closeX(3500)
  return

' ===== mode d'emploi
aide:
  message "L'aide n'est pas encore implémentée."
  return
  
' ===== montrer la fenêtre A-propos
apropos:
  show 3100
  inactive 0
  return
  
' ===== fermer la fenêtre A-propos et restaurer la fenêtre active
apropos_fermer:
  hide 3100
  active 0
  if act%=0
    to_foreground 0
  else
    to_foreground 100+act%
  end_if
  return
  
' ===== sortir du programme
sortir:
  if nsyn%>0 then purger()
'  gosub close0
  res% = dll_call1("KillProcessByHandle",handle(0))
  ' *** on ne passera jamais ici !

' ===== choisir une fenêtre par le menu "Fenêtres"
fenetre:
  mark_off 300+act%
  act% = number_click-300
  mark_on 300+act%
  show 100 + act%
  to_foreground 100 + act%
  return



' ======================== fonctions du menu "Fichiers"

' ===== créer une nouvelle fenêtre d'édition vide
nouveau:
  if nsyn%=100 then return
  if nsyn%>0
    t% = top(100+nsyn%)
    l% = left(100+nsyn%)
  else
    t% = top(0) + 50
    l% = left(0) + 50
  end_if
  nsyn% = nsyn% + 1
  if act%>0 then mark_off 300+act%
  act% = nsyn%
  d% = 20
  nf% = 100 + nsyn%
  capt$(nsyn%) = "<nouveau "+str$(nsyn%)+">"
  form nf% : top nf%,t%+d% : left nf%,l%+d% : width nf%,600 : height nf%,400
    caption nf%,capt$(nsyn%) : inactive nf%
  hndSE%(nsyn%) = handle(nf%)
  opt$ = OptGen$       : ' par défaut, prendre les options générales
  OSE$(nsyn%) = opt$
  FSE$(nsyn%) = "_"
  sub_menu 300+nsyn% : parent 300+nsyn%,300 : caption 300+nsyn%,capt$(nsyn%) : on_click 300+nsyn%,fenetre
  mark_on 300+act%
  SE%(nsyn%) = dll_call2("SyneditCreate",handle(nf%),handle(95))
  res% = dll_call3("SyneditFunction",SE%(nsyn%),3,adr(opt$))
  res% = dll_call5("SyneditGeometry",SE%(nsyn%),M1%,M1%,M1%,M1%)
  if instr(opt$,"\Panoramic")>0
    gosub keychargertout       : ' charge les mots-clé dans Synedit
    gosub keychargerstyles     : ' charge les attributs graphiques des mots-clé
    gosub stringchargerstyles  : ' charge les attributs graphiques des chaînes
    gosub commentchargerstyles : ' charge les attributs graphiques des commentaires
  end_if
  active nf%
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
'  res% = dll_call3("SyneditFunction",SE%(nsyn%),6,0) : ' injecter le code démo
  res% = dll_call3("SyneditFunction",SE%(act%),7,0)  : ' forcer le mode ANSI
  if nsyn%=1 then timer_on 99
  return
  
' ===== créer une nouvelle fenêtre d'édition et y charger un fichier
ouvrir:
  fil$ = file_name$(98)
  if fil$="_" then return
  if file_exists(fil$)=0
    message "Ouverture impossible"
    return
  end_if
  gosub nouveau
  res% = dll_call2("SyneditOpen",SE%(act%),adr(fil$))
  if res%=0
    FSE$(act%) = fil$
    f$ = file_extract_name$(fil$)
    capt$(act%) = fil$
    caption 100+act%,fil$
    caption 300+act%,fil$
  end_if
  return
  
' ===== créer une nouvelle fenêtre d'édition et y charger une copie de la fenêtre active
copier:
  if act%=0 then return
  org% = act%
  gosub nouveau
  if res%=0
    res% = dll_call2("SyneditCopyObject",org%,act%)
    capt$(nsyn%) = "(copie) "+capt$(org%)
    caption 100+nsyn%,capt$(nsyn%)
    caption 300+nsyn%,capt$(nsyn%)
    FSE$(nsyn%) = "_"
    OSE$(nsyn%) = OSE$(org%)
  end_if
  return
  
' ===== fermer la fenêtre active
fermer:
  if act%=0 then return
  if left$(caption$(100+act%),1)="*" then Confirmer("Le code a été modifié. Voulez-vous vraiment fermer la fenêtre ?")
  if confirm%<>1 then return
  res% = dll_call1("SyneditDelete",SE%(act%))
  pause 500
  delete 100+act%
  inactive 300+act%
  caption 300+act%,"<supprimé>"
  SE%(act%) = 0
  act% = act% -1
  while SE%(nsyn%)=0
    delete 300+nsyn%
    nsyn% = nsyn% - 1
    if nsyn%=0 then exit_while
  end_while
  if act%>nsyn% then act% = nsyn%
  return
  
' =====enregistrer la fenêtre active dans son fichier associé
sauver:
  SauverPage(act%)
  return

' ===== enregistrer la fenêtre active dans un fichier choisi par dialogue
sauverdans:
  SauverPageDans(act%)
  return
  
  
  
' ======================== fonctions du menu "Outils"

' ===== configuration des outils
outilsconfig:
  optvalid% = 0
  show 3500
  inactive 0
  return
  
' ===== sélection de l'outil
cheminoutil:
  f$ = file_name$(98)
  if f$="_" then return
  if file_exists(f$)=0
    message "Ce fichier n'existe pas."
    return
  end_if
  text 3505,f$
  return
  
' ===== clic dans le grid avec les outils
clickoutil:
  noutil% = grid_y_to_row(3513,mouse_y_left_down(3513))
  if grid_read$(3513,noutil%,1)=""
    inactive 3511 : inactive 3512
    text 3503,""
    text 3505,""
    text 3508,""
  else
    active 3511 : active 3512
    text 3503,grid_read$(3513,noutil%,1)
    text 3505,grid_read$(3513,noutil%,2)
    text 3508,grid_read$(3513,noutil%,3)
  end_if
  return
  
' ===== ajouter un nouvel outil
ajouteroutil:
  if trim$(text$(3503))=""
    message "Le nom de l'outil manque."
    return
  end_if
  if trim$(text$(3505))=""
    message "Le chemin de l'outil manque."
    return
  end_if
  if file_exists(text$(3505))=0
    message "Le fichier de l'outil n'existe pas."
    return
  end_if
  ' voir si l'outil existe déjà
  for i%=2 to 50
    if grid_read$(3513,i%,1)=text$(3503)
      message "Cet outil existe déjà."
      return
    end_if
  next i%
  ' trouver la première place libre
  noutil% = 0
  for i%=2 to 50
    if grid_read$(3513,i%,1)=""
      noutil% = i%
      exit_for
    end_if
  next i%
  if noutil%=0
    inactive 3511 : inactive 3512
    message "Désolé. Vous avez déjà 50 outils."
    return
  end_if
  grid_write 3513,noutil%,1,text$(3503)
  grid_write 3513,noutil%,2,text$(3505)
  grid_write 3513,noutil%,3,text$(3508)
  sauver_options_generales()
  active 3511 : active 3512
  return

' === exécuter l'outil sélectionné (ligne noutil%)
executeroutil:
  if act%=0 then return
  poutil$ = grid_read$(3513,noutil%,3)
  doutil$ = file_extract_path$(grid_read$(3513,noutil%,2))
  f$ = doutil$ + "Synedit_Editor_Source.bas" : ' + chr$(34)
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  i% = instr(lower$(poutil$),"%s")
  if i%>0
    s$ = ""
    if i%>1 then s$ = left$(poutil$,i%-1)
    poutil$ = s$ + file_extract_name$(f$) + mid$(poutil$,i%+2,300)
  end_if
  eoutil$ = file_extract_name$(grid_read$(3513,noutil%,2))
  res% = DLL_call3("ExecuteProgram",adr(eoutil$),adr(poutil$),adr(doutil$))
  return

' === supprimer l'outil sélectionné (ligne noutil%)
supprimeroutil:
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer l'outil "+grid_read$(3513,noutil%,1))
  if i%<>1 then return
  if noutil%<50
    for i%=noutil% to 49
      grid_write 3513,i%,1,grid_read$(3513,i%+1,1)
      grid_write 3513,i%,2,grid_read$(3513,i%+1,2)
      grid_write 3513,i%,3,grid_read$(3513,i%+1,3)
    next i%
    grid_write 3513,50,1,""
    grid_write 3513,50,2,""
    grid_write 3513,50,3,""
  else
    grid_write 3513,noutil%,1,""
    grid_write 3513,noutil%,2,""
    grid_write 3513,noutil%,3,""
  end_if
  noutil% = 0
  sauver_options_generales()
  inactive 3511 : inactive 3512
  return




' ======================== fonctions du menu "Macros"

' ===== configuration des macros
macrosconfig:
  optvalid% = 0
  show 3300
  inactive 0
  return
  
macrosel:
  to_foreground 0
  to_foreground 100+act%
  set_focus 3307
  return

' ===== ajouter une nouvelle macro à partir du presse-papier
macroadd:
  if act%=0 then return
  f$ = trim$(text$(3302))
  if f$="" then return
  i% = 0
  while i%<count(3302)
    i% = i% + 1
    if f$=item_read$(3302,i%)
      message "Cette macro existe déjà."
      return
    end_if
  end_while
  res% = dll_call1("SyneditCopyText",act%)
  if res%<1
    message "Il n'y a rien dans le presse-papier."
    return
  end_if
  s$ = clipboard_string_paste$
  file_open_write 1,dirmacros$+f$+".macro"
  file_writeln 1,s$
  file_close 1
  item_add 3302,f$
  message "La macro "+f$+" a été créée."
  return
  
' ===== supprimer la macro sélectionnée
macrodel:
  if count(3302)=0 then return
  s$ = item_index$(3302)
  i% = message_confirmation_yes_no("Voulez-vous vraiment supprimer la macro "+s$)
  if i%<>1 then return
  f$ = dirmacros$ + s$ + ".macro"
  file_delete f$
  item_delete 3302,item_index(3302)
  if count(3302)>0 then res% = dll_call2("SelectComboBoxItem",handle(3302),1)
  message "La macro "+s$+" a été supprimée."
  return

' ===== remplacer la page actuelle par la macro sélectionnée
macromod:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditOpen",act%,adr(f$))
  caption 100+act%,"(macro) "+item_index$(3302)
  caption 300+act%,"(macro) "+item_index$(3302)
  capt$(act%) = "(macro) "+item_index$(3302)
  return

' ===== remplacer la macro sélectionnée par la page actuelle
macroupd:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  res% = dll_call2("SyneditSaveToFile",act%,adr(f$))
  message "La macro "+item_index$(3302)+" a été remplacée."
  return

' ===== insérer une macro
macroins:
  if act%=0 then return
  if count(3302)=0 then return
  f$ = dirmacros$ + item_index$(3302)+".macro"
  s$ = ""
  file_open_read 1,f$
  while file_eof(1)=0
    file_readln 1,s1$
    s$= s$ + s1$ + chr$(13) + chr$(10)
  end_while
  file_close 1
  ' ici, charger s$ avec le contenu de la macro
  res% = dll_call2("SyneditInsertString",act%,adr(s$))
  to_foreground 100+act%
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  return




' ======================== fonctions du menu "Options"

' ===== inverser l'indicateur de présence des numéros de ligne dans la fenêtre active
lignes:
  ln%(act%) = 1 - ln%(act%)    : ' basculer 0<-->1
  res% = dll_call3("SyneditFunction",SE%(act%),1,ln%(act%))  : ' signaler à Synedit
  res% = dll_call3("SyneditFunction",SE%(act%),2,0)          : ' redonner le focus à Synedit
  OSE$(act%) = str$(ln%(act%)) + mid$(OSE$(act%),2,20)   : ' mémoriser dans les param_tres
  return
  
' ===== charger la fenêtre des options avec les valeurs de la fenêtre active, puis afficher
options:
  if act%=0 then return
  optvalid% = 0
  opt$ = OSE$(act%)
  if left$(opt$,1)="1"
    mark_on 3001
  else
    mark_off 3001
  end_if
  text 3005,mid$(opt$,2,2)
  if mid$(opt$,4,1)="1"
    mark_on 3006
  else
    mark_off 3006
  end_if
  if mid$(opt$,5,1)="1"
    mark_on 3007
  else
    mark_off 3007
  end_if
  if mid$(opt$,6,1)="1"
    mark_on 3008
  else
    mark_off 3008
  end_if
  if mid$(opt$,7,1)="1"
    mark_on 3009
  else
    mark_off 3009
  end_if
  i% = instr(opt$,"")
  text 3003,mid$(opt$,12,i%-12)
  opt$ = mid$(opt$,i%+1,len(opt$))
  for i%=1 to count(3011)
    if opt$=item_read$(3011,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3011),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  show 3000
  inactive 0
  return
  
' ===== charger la fenêtre des options générales, puis afficher
optionsgen:
  if left$(OptGen$,1)="1"
    mark_on 3201
  else
    mark_off 3201
  end_if
  text 3205,mid$(OptGen$,2,2)
  if mid$(OptGen$,4,1)="1"
    mark_on 3206
  else
    mark_off 3206
  end_if
  if mid$(OptGen$,5,1)="1"
    mark_on 3207
  else
    mark_off 3207
  end_if
  if mid$(OptGen$,6,1)="1"
    mark_on 3208
  else
    mark_off 3208
  end_if
  if mid$(OptGen$,7,1)="1"
    mark_on 3209
  else
    mark_off 3209
  end_if
  if mid$(OptGen$,8,1)="1"
    mark_on 3213
  else
    mark_off 3213
  end_if
  if mid$(OptGen$,9,1)="1"
    mark_on 3214
  else
    mark_off 3214
  end_if
  if mid$(OptGen$,10,1)="1"
    mark_on 3215
  else
    mark_off 3215
  end_if
  if mid$(OptGen$,11,1)="1"
    mark_on 3216
  else
    mark_off 3216
  end_if
  i% = instr(OptGen$,"")
  text 3203,mid$(OptGen$,12,i%-12)
  opt$ = mid$(OptGen$,i%+1,len(OptGen$))
  for i%=1 to count(3211)
    if opt$=item_read$(3211,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3211),i%) : ' restaurer la syntaxe
      exit_for
    end_if
  next i%
  for i%=1 to count(3219)
    if OptGenKeyClr$=item_read$(3219,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3219),i%) : ' restaurer la couleur
      exit_for
    end_if
  next i%

  if mid$(OptGenStrAtt$,1,1)="1"
    mark_on 3222
  else
    mark_off 3222
  end_if
  if mid$(OptGenStrAtt$,2,1)="1"
    mark_on 3223
  else
    mark_off 3223
  end_if
  if mid$(OptGenStrAtt$,3,1)="1"
    mark_on 3224
  else
    mark_off 3224
  end_if
  if mid$(OptGenStrAtt$,4,1)="1"
    mark_on 3225
  else
    mark_off 3225
  end_if
  for i%=1 to count(3229)
    if OptGenStrClr$=item_read$(3229,i%)
      res% = dll_call2("SelectComboBoxItem",handle(3229),i%) : ' restaurer la couleur
      exit_for
    end_if
  next i%

  show 3200
  inactive 0
  return
  
' ===== sortie de la fenêtre des options de la page par "Abandon"
options_abandon:
  hide 3000
  show 0
  active 0
  to_foreground 0
  return

' ===== sortie de la fenêtre des options générales par "Abandon"
optionsgen_abandon:
  hide 3200
  show 0
  active 0
  to_foreground 0
  return

' =====sortie de la fenêtre des options de la page par "Valider"
options_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt$ = str$(checked(3001))+right$("0"+text$(3005),2)+str$(checked(3006))
  opt$ = opt$ + str$(checked(3007))+str$(checked(3008))+str$(checked(3009))
  opt$ = opt$ + mid$(optgen$,8,4)
  opt$ = opt$ + text$(3003) + "" + text$(3011)
  OSE$(act%) = opt$
  ln%(act%) = checked(3001)
  res% = dll_call3("SyneditFunction",SE%(act%),3,adr(opt$)) : ' activer les nouvelles options
  OptKeyAtt$ = mid$(opt$,8,4)
  gosub keychargerstyles     : ' charge les attributs graphiques
  actsyntax$ = text$(3003)
  hide 3000
  show 0
  active 0
  to_foreground 0
  return
  
' =====sortie de la fenêtre des options générales par "Valider"
optionsgen_valider:
  ' construire le paramètre:
  ' xttgisbp\S
  ' x=numéros de ligne  tt=taille  g=gras  i=italique  s=souslgné  b=barré
  ' p=police S=syntaxe
  optvalid% = 1
  opt1$ = str$(checked(3201))+right$("0"+text$(3205),2)+str$(checked(3206))
  opt1$ = opt1$ + str$(checked(3207))+str$(checked(3208))+str$(checked(3209))
  opt1$ = opt1$ + str$(checked(3213))+str$(checked(3214))+str$(checked(3215))+str$(checked(3216))
  opt1$ = opt1$ + text$(3203) + "" + text$(3211)
  OptGen$ = opt1$     : ' mémoriser les options générales
  OptGenKeyAtt$ = str$(checked(3213))+str$(checked(3214))+str$(checked(3215))+str$(checked(3216))
  OptGenKeyClr$ = text$(3219)
  OptGenStrAtt$ = str$(checked(3222))+str$(checked(3223))+str$(checked(3224))+str$(checked(3225))
  OptGenStrClr$ = text$(3229)
  res% = dll_call2("SelectComboBoxItem",handle(3419),item_index(3219))
  sauver_options_generales()
  actsyntax$ = text$(3203)
  hide 3200
  active 0
  to_foreground 0
  if act%>0 then to_foreground 100+act%
  return

' ===== afficher la fenêtre "Syntaxe"
syntaxe:
  if act%=0 then return
  opt$ = OSE$(act%)
  i% = instr(opt$,"")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  if (s$<>"Panoramic") and (s$<>"General")
    message "Action impossible sur cette syntaxe."
    return
  end_if
  optvalid% = 0
  caption 3400,"Configuration de la syntaxe - "+s$
  if mid$(Opt$,8,1)="1"
    mark_on 3412
  else
    mark_off 3412
  end_if
  if mid$(Opt$,9,1)="1"
    mark_on 3413
  else
    mark_off 3413
  end_if
  if mid$(Opt$,10,1)="1"
    mark_on 3414
  else
    mark_off 3414
  end_if
  if mid$(Opt$,11,1)="1"
    mark_on 3415
  else
    mark_off 3415
  end_if

  if mid$(OptStrAtt$,1,1)="1"
    mark_on 3422
  else
    mark_off 3422
  end_if
  if mid$(OptStrAtt$,2,1)="1"
    mark_on 3423
  else
    mark_off 3423
  end_if
  if mid$(OptStrAtt$,3,1)="1"
    mark_on 3424
  else
    mark_off 3424
  end_if
  if mid$(OptStrAtt$,4,1)="1"
    mark_on 3425
  else
    mark_off 3425
  end_if
  show 3400
  inactive 0
  return
  
' ===== nouveau mot-cle
keyajouter:
  s$ = lower$(trim$(text$(3402)))
  if s$="" then return
  i% = 0
  while i%<count(3403)
    i% = i% + 1
    if s$=item_read$(3403,i%)
      message "Ce mot-clé existe déjà."
      return
    end_if
  end_while
  item_add 3403,s$
  opt$ = OSE$(act%)
  i% = instr(opt$,"")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  appliquer_syntax(s$)
  return

keymodifier:
  return

keysupprimer:
  return

keychargertout:
  opt$ = OSE$(act%)
  i% = instr(opt$,"")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  if actsyntax$=s$ then return   : ' rien à faire si c'est la même syntaxe
  actsyntax$ = s$                : ' sinon, mémoriser
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  clear 3403
  file_open_read 1,f$
  file_readln 1,s1$
  i% = 1
  if s1$<>"#SYNTAX" then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>s$ then goto invalidsyntax
  file_readln 1,s1$
  i% = i% + 1
  if s1$<>"#KEYS" then goto invalidsyntax
  clear 3403
  while file_eof(1)=0
    file_readln 1,s1$
    i% = i% + 1
    if s1$="#END" then exit_while
    item_add 3403,s1$
  end_while
  appliquer_syntax(s$)
' ici, charger les attributs
' #KEYSTYLE
' STYLE=GRAS,ITALIQUE
' COLOR=Bleu
' #END
  file_readln 1,s1$
  i% = 1
  if s1$<>"#KEYSTYLE" then goto invalidsyntax
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"STYLE=" then goto invalidsyntax
  s2$ = ""
  if instr(s1$,"GRAS")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"ITALIQUE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"SOUSLIGNE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if instr(s1$,"BARRE")>0
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  OptGenKeyAtt$ = s2$
  OptKeyAtt$ = OptGenKeyAtt$
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  OSE$(act%) = opt$
  file_readln 1,s1$
  i% = 1
  if left$(s1$,6)<>"COLOR=" then goto invalidsyntax
  OptGenKeyClr$ = mid$(s1$,7,len(s1$))
  OptKeyClr$ = OptGenKeyClr$
  for k%=1 to count(3419)
    if OptGenKeyClr$=item_read$(3419,k%)
      res% = dll_call2("SelectComboBoxItem",handle(3419),k%)
      res% = dll_call2("SelectComboBoxItem",handle(3219),k%)
      exit_for
    end_if
  next k%
  file_readln 1,s1$
  OptGenStrAtt$ = "0000"
  OptGenStrClr$ = "Noir"
  OptStrAtt$ = "0000"
  OptStrClr$ = "Noir"
  if s1$<>"#END" then goto invalidsyntax
' ici charger les attributs
' #STRINGSTYLE
' STYLE=ITALIQUE
' COLOR=Gris
' #END
  if file_eof(1)=0
    file_readln 1,s1$
    i% = 1
    if s1$<>"#STRINGSTYLE" then goto invalidsyntax
    file_readln 1,s1$
    i% = 1
    if left$(s1$,6)<>"STYLE=" then goto invalidsyntax
    s2$ = ""
    if instr(s1$,"GRAS")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    if instr(s1$,"ITALIQUE")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    if instr(s1$,"SOUSLIGNE")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    if instr(s1$,"BARRE")>0
      s2$ = s2$ + "1"
    else
      s2$ = s2$ + "0"
    end_if
    OptGenStrAtt$ = s2$
    OptStrAtt$ = OptGenStrAtt$
    opt$ = s2$
    file_readln 1,s1$
    i% = 1
    if left$(s1$,6)<>"COLOR=" then goto invalidsyntax
    OptGenStrClr$ = mid$(s1$,7,len(s1$))
    OptStrClr$ = OptGenStrClr$
    for i%=1 to count(3429)
      if OptGenStrClr$=item_read$(3429,i%)
        res% = dll_call2("SelectComboBoxItem",handle(3429),i%)
        res% = dll_call2("SelectComboBoxItem",handle(3229),i%)
        exit_for
      end_if
    next i%
    file_readln 1,s1$
    i% = 1
    if s1$<>"#END" then goto invalidsyntax
  end_if
  file_close 1
  return
invalidsyntax:
  file_close 1
  message "Fichier invalide en ligne "+str$(i%)+": "+s1$
  return
  
keychargerstyles:
  res% = dll_call4("SyneditConfigureHighlighter",act%,4,adr(OptKeyAtt$),adr(OptKeyClr$))
  return

stringchargerstyles:
  res% = dll_call4("SyneditConfigureHighlighter",act%,5,adr(OptStrAtt$),adr(OptStrClr$))
  return

commentchargerstyles:
  res% = dll_call4("SyneditConfigureHighlighter",act%,6,adr(OptComAtt$),adr(OptComClr$))
  return

keysauvertout:
' format du fichier de la syntaxe:
' fichier Synedit_Editor_Syntax_Panoramic.txt
' #SYNTAX
' Panoramic (nom de la syntaxe en 1 ligne)
' #KEYS
' pause (une ligne par mot-clé)
' ...
' #END
  opt$ = OSE$(act%)
  i% = instr(opt$,"")
  s$ = mid$(opt$,i%+1,len(opt$)) : ' récupérer la syntaxe de la page
  f$ = dir$ + "Synedit_Editor_Syntax_"+s$+".txt"
  file_open_write 1,f$
  file_writeln 1,"#SYNTAX"
  file_writeln 1,s$
  file_writeln 1,"#KEYS"
  i% = 0
  s$ = ""
  while i%<count(3403)
    i% = i% + 1
    s1$ = item_read$(3403,i%)
    if s1$<>s$ then file_writeln 1,s1$  : ' pour éviter les doublons...
    s$ = s1$
  end_while
  file_writeln 1,"#END"
' ici, sauver les attributs des mots-clé
  file_writeln 1,"#KEYSTYLE"
  s$ = ""
  if mid$(optgen$,8,1)="1" then s$ = s$ + "GRAS"
  if mid$(optgen$,9,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "ITALIQUE"
  end_if
  if mid$(optgen$,10,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "SOUSLIGNE"
  end_if
  if mid$(optgen$,11,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "BARRE"
  end_if
  file_writeln 1,"STYLE="+s$
  file_writeln 1,"COLOR="+OptGenKeyClr$
  file_writeln 1,"#END"
' ici, sauver les attributs des chaînes
  file_writeln 1,"#STRINGSTYLE"
  s$ = ""
  if mid$(OptGenStrAtt$,1,1)="1" then s$ = s$ + "GRAS"
  if mid$(OptGenStrAtt$,2,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "ITALIQUE"
  end_if
  if mid$(OptGenStrAtt$,3,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "SOUSLIGNE"
  end_if
  if mid$(OptGenStrAtt$,4,1)="1"
    if len(s$)>0 then s$ = s$ + ","
    s$ = s$ + "BARRE"
  end_if
  file_writeln 1,"STYLE="+s$
  file_writeln 1,"COLOR="+OptGenStrClr$
  file_writeln 1,"#END"
  file_close 1
  message "La syntaxe est sauvée dans "+f$
  return
  
appliquerkeyattrib:
  s2$ = ""
  if checked(3412)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3413)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3414)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3415)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  optgen$ = left$(optgen$,7) + s2$ + mid$(optgen$,12,len(optgen$))
  opt$ = left$(opt$,7) + s2$ + mid$(opt$,12,len(opt$))
  OptGenKeyAtt$ = s2$
  OptGenKeyClr$ = text$(3419)
  OptKeyAtt$ = s2$
  OptKeyClr$ = text$(3419)
  res% = dll_call2("SelectComboBoxItem",handle(3219),item_index(3419))
  gosub keychargerstyles
  return

appliquerstringattrib:
  s2$ = ""
  if checked(3422)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3423)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3424)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  if checked(3425)=1
    s2$ = s2$ + "1"
  else
    s2$ = s2$ + "0"
  end_if
  OptGenStrAtt$ = s2$
  OptGenStrClr$ = text$(3429)
  OptStrAtt$ = s2$
  OptStrClr$ = text$(3429)
'  res% = dll_call2("SelectComboBoxItem",handle(3229),item_index(3429))
  gosub stringchargerstyles
  return

  
  
' ======================== fonctions indépendantes

' ===== ce timer surveille la fenêtre active et ses dimensions
tick:
  timer_off 99
  res% = dll_call0("GetActiveWindow")   : ' récupérer le handle de la fenêtre active
  for i%=1 to nsyn%                     : ' chercher dans la table des fenêtres d"édition
    if res%=hndSE%(i%)                  : ' est-ce qu'on a trouvé la fenêtre
      if i%<>act%                       : ' est-elle différente de la fenêtre active précédente ?
        mark_off 300+act%               : ' alors changer le marquade du menu
        mark_on 300+i%
      end_if
      act% = i%                         : ' mémoriser le numéro de la fenêtre active
      res% = dll_call5("SyneditGeometry",SE%(act%),M1%,M1%,M1%,M1%) : ' ajuster la taille de Synedit à celle de la fenêtre
      exit_for
    end_if
  next i%
  timer_on 99
  return



' ======================== SUBs internes

' ===== fermer une des fenêres auxiliaires modales
sub CloseX(f%)
  if optvalid%=0
    hide f%
    show 0
    active 0
    if act%=0
      to_foreground 0
    else
      to_foreground 100+act%
    end_if
  end_if
end_sub

' ===== appliquer une syntaxe paramétrée
sub appliquer_syntax(sy$)
  dim_local s$, i%
  s$ = sy$
  i% = instr(s$,"")
  if i%>0 then s$ = mid$(sy$,i%+1,len(s$))
  ' imposer d'abord les mots-clé
  if (s$="Panoramic") or (s$="General")
    clear 96
    i% = 0
    while i%<count(3403)
      i% = i% + 1
      item_add 96,item_read$(3403,i%)
    end_while
    res% = dll_call4("SyneditConfigureHighlighter",act%,3,handle(96),0)
  else
    message "La syntaxe "+sy$+" ne peut pas être configurée."
  end_if
end_sub

' ===== une des pages a changé
sub syneditchange(n$)
  dim_local n%
  n% = val(n$)
  if left$(caption$(100+n%),1)<>"*" then caption 100+n%,"* "+caption$(100+n%)
end_sub

' ===== on a frappé F1
sub synedithelp(n$)
  dim_local n%
  n% = val(n$)
  message "Aide pas encore implémentée."
end_sub

' ===== demande d'un message de confirmation
sub confirmer(s$)
  confirm% = message_confirmation_yes_no(s$)
end_sub
  
' ===== purger les pages non mises à jour
sub purger()
timer_off 99
dim_local ip%
  for ip%=1 to nsyn%
    if left$(caption$(100+ip%),1)="*"
      s$ = "La page ["+capt$(ip%)+"] a été modifiée. Voulez-vous la sauvegarder ?"
      confirmer(s$)
      if confirm%=1
        act% = ip%
        to_foreground 100+act%
        res% = dll_call3("SyneditFunction",SE%(act%),2,0)  : ' donner le focus à Synedit
        SauverPage(ip%)
      end_if
    end_if
  next ip%
end_sub

' ===== sauver les options générales
sub sauver_options_generales()
  dim_local i%
  FermerFichier(1) : file_open_write 1,ini$
  file_writeln 1,OptGen$
  i% = 2
  while trim$(grid_read$(3513,i%,1))<>""
    file_writeln 1,grid_read$(3513,i%,1)
    file_writeln 1,grid_read$(3513,i%,2)
    file_writeln 1,grid_read$(3513,i%,3)
    i% = i% + 1
  end_while
  file_close 1
end_sub

' ===== fermer un fichier inconditionnellement
sub FermerFichier(n%)
  on_error_goto FermerFichierErr
  file_close n%
FermerFichierErr:
  off_error_goto
end_sub
  
' ===== sauver la page actuelle
sub SauverPage(nact%)
  if nact%=0 then exit_sub
  if FSE$(nact%)="_"
    SauverPageDans(nact%)
    exit_sub
  end_if
  f$ = FSE$(nact%)
  res% = dll_call2("SyneditSaveToFile",nact%,adr(f$))
  if left$(caption$(100+nact%),1)="*" then caption 100+nact%,mid$(caption 100+nact%,3,200)
end_sub

' ===== sauver la page actuelle dans un autre fichier
sub SauverPageDans(nact%)
  if nact%=0 then exit_sub
  f$ = file_name$(97)
  if f$="_" then exit_sub
  if file_exists(f$)=1
    if message_confirmation_yes_no("Ce fichier existe déjà. Voulez-vous le remplacer ?")<>1 then exit_sub
  end_if
  res% = dll_call2("SyneditSaveToFile",nact%,adr(f$))
  if res%=0
    FSE$(nact%) = f$
    f$ = file_extract_name$(f$)
    caption 100+nact%,f$
    caption 300+nact%,f$
    capt$(nact%) = f$
  end_if
end_sub

EDIT

Pour la petite histoire:
j'ai galéré un bon moment avec des plantages intempestifs, dûs à une variable qui changeait de valeur de façon aléatoire, des RETURN qui se faisaient ou pas, etc. Et j'ai fini par trouver que j'avais un timer qui marche en permanence, et qui pour un traitement particulier aurait dû être désactivé. je l'ai fait, et tout est rentré dans l'ordre.

J'ai pensé très fort à Cosmos70 qui s'est bagarré avec des problèmes de ce genre.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Laurent (Minibug)

avatar

Nombre de messages : 2353
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Editeur avec marquage syntaxique   Mer 27 Aoû 2014 - 19:35

Au secours Klaus !!!

Une erreur au démarrage :
Juste a l'ouverture du programme je vais dans Options puis dans Options générales et là erreur :

(52) Not correct string expression : Function call with negative or zero value. Line : 932

Il s'agirai de la ligne suivante :

text 3203,mid$(OptGen$,12,i%-12)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Editeur avec marquage syntaxique   Mer 27 Aoû 2014 - 19:59

Le code est bon. C'est ton fichier Synedit_Editor.ini qui n'est pas valide. Ou alors tu le supprimes, ou tu prends celui-ci:
Code:
01000001100Courier\Panoramic
Il faut le placer dans le dossier dans lequel Synedit_Editor.exe est placé si tu l'as généré en exécutable, ou dans le dossier temporaire que Panoramic_Editor utilise pour créer son exécutable temporaire Panoramic.exe. Chez moi, ce dossier est:
C:\Users\klausgunther\AppData\Local\Temp\
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Laurent (Minibug)

avatar

Nombre de messages : 2353
Age : 50
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Editeur avec marquage syntaxique   Mer 27 Aoû 2014 - 20:06

même en supprimant le fichier INI même problème...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Editeur avec marquage syntaxique   

Revenir en haut Aller en bas
 
Editeur avec marquage syntaxique
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 3 sur 32Aller à la page : Précédent  1, 2, 3, 4 ... 17 ... 32  Suivant
 Sujets similaires
-
» Editeur avec marquage syntaxique
» problème éditeur de message sur Firefox
» Probleme avec l'editeur html
» Problème avec editeur HTML
» probleme-d-affichage-avec-la-palette-de-couleurs-de-l-editeur

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: