Rappel , il sert a voir surtout , les appels de procedures , (gros rectangle bleu a droite )
la zone Grise représente le listing
la zone rouge foncé représente l'emplacement de la boucle des events (s'il y en a une ..)
les petites zone bleues représente l'emplacement des procedures ...
les petites zone "carré" rose, représente l'emplacement des boucles For-Next
les petites zone "ligne" jaune-orange représente l'emplacement des IF-Endif ...
le but de ce Gadget, est surtout de voir les liens vers les procédures
si ça part de la zone Grise , ce sont des appels a partir du listing
si ça part d'une Procedure (Gros Rectangle BLeu) c'est que l'appel a lieu a partir de la procedure
un lien qui part d'une procedure, et qui y reviens, est typique d'un appel Recursif
bien sur plusieurs appels peuvent Partir ou arriver d'une procedure ....
les Procedures sans Liens ... sont des procedures qui ne sont pas utilisées....
Note : ne chargez pas de trop Gros listing .. il pourrai y avoir un bug d'affichage (chevauchements des liens sur les Bloc de procedures...
dans ce cas precis , il faut changer la ligne 621
Code : Tout sélectionner
Spr_procedure()\posx.l=600
en augmentant sa valeur ... il est actuellement reglé pour que la majorités des listing s'affichent comme il faut ...
voici le code :
Code : Tout sélectionner
;***********************************************
;Titre :*graph_Code2
;Auteur : Dobro
;Date :10/07/2019
;Heure :13:02:30
;Version Purebasic : PureBasic 5.70 LTS (Windows - x86)
;Version de l'editeur :EPB PHOENIX V2.68
; Libairies necessaire : Aucune
;***********************************************
Enumeration
#win
#Panel
#Cont
#load
#text_procedure
#text_For
#text_If
EndEnumeration
Enumeration
; ***** ces sprites n'utilisent qu'une seule images *****
#Spr_attente
#spr_listing
#spr_boucle
#spr_procedure_appel
#spr_procedure_list
#spr_procedure_appel_arr
#spr_procedure_appel_arrd
#spr_boucle_for
#spr_boucle_next
#spr_IF
#spr_Endif
; ***********************************************
#spr_procedure ; doit rester le dernier puisque le numero va augmenter en fonction du nombre de procedure et que l'image du sprite change (Texte)
EndEnumeration
Declare Button_action()
Declare.s Load()
Declare Dessine (listing.s)
Declare Cherche_mot(ligne.s,mot_a_chercher.s)
Global compteur_procedure,name_file.s, Flag_procedure
structure Spr_listing
num_sprite.l
posx.l
posy.l
hauteur.l
Largeur.l
couleur.l
name.s
EndStructure
Global NewList Spr_listing.Spr_listing()
;
structure Spr_boucle
num_sprite.l
posx.l
posy.l
hauteur.l
Largeur.l
couleur.l
name.s
EndStructure
Global NewList Spr_boucle.Spr_boucle()
structure spr_procedure
num_sprite.l
posx.l
posy.l
hauteur.l
Largeur.l
couleur.l
name.s
name_par.s
num_ligne_deb.i
num_ligne_fin.i
EndStructure
Global NewList spr_procedure.spr_procedure()
;
structure spr_procedure_list
num_sprite.l
posx.l
posy.l
hauteur.l
Largeur.l
couleur.l
name.s
name_par.s
num_ligne_deb.i
num_ligne_fin.i
EndStructure
Global NewList spr_procedure_list.spr_procedure_list()
;
;
structure spr_procedure_appel
num_sprite.l
posx.l
posy.l
hauteur.l
Largeur.l
couleur.l
name.s
numero_ligne.l
arrx.i ; les coordonées de la procedure pointé !!
arry.i
long1.i
couleur_fil.i
type.b ; determine l'image employé pour afficher l'entrée
Entree.i
EndStructure
Global NewList spr_procedure_appel.spr_procedure_appel()
structure spr_procedure_appel_arr ; pour le sprite d'arrivé de la ligne
num_sprite.l
posx.l
posy.l
hauteur.l
Largeur.l
couleur.l
EndStructure
Global NewList spr_procedure_appel_arr.spr_procedure_appel_arr()
;
structure spr_boucle_for_next
num_sprite.l
posx.l
posy.l
hauteur.l
Largeur.l
couleur.l
name.s
num_ligne_deb.i
num_ligne_fin.i
decal_for.l
decal_next.l
EndStructure
Global NewList spr_boucle_for_next.spr_boucle_for_next()
;
structure spr_If
num_sprite.l
posx.l
posy.l
hauteur.l
Largeur.l
couleur.l
name.s
num_ligne_deb.i
num_ligne_fin.i
decal_if.l
decal_endif.l
EndStructure
Global NewList spr_If.spr_If()
Structure Spr_attente
posx.l
posy.l
EndStructure
global NewList Spr_attente.Spr_attente()
;- Les couleurs
global couleur_fond=$0
global couleur_listing=Rgb(125,125,125)
global couleur_boucle=RGB(118,58,0)
global couleur_appel=RGB(255,255,0)
global couleur_entree=RGB(0,255,0)
global couleur_procedures=RGB(0,111,209)
Global Flag_affichage=#false
Global Flag_creation_sprite_procedure_List=#false
Global Flag_creation_sprite_procedure_appel=#false
Global Flag_creation_sprite_Fleche_appel_arr=#false
Global Flag_creation_sprite_Fleche_appel_arrd=#false
;********** attention tout ceci existe aussi dans "LOAD" , pour initialiser une valeur, il faut allez dans "LOAD" ****************************************
Global Compteur_fil=15 ; determine l'ecartement horizontal du depart des lignes plus c'est grand, plus ça s'eloigne du listing (a gauche)
Global Compteur_fil2=15 ; determine l'ecartement horizontal du depart des lignes a partir des procedures (a droite )
Global compteur_1=8 ; determine l'ecartement entre les lignes horizontale a gauche des procedures et aide a eloigner les procedures si beaucoups d'appels evite ainsi le chevauchement des sprites..
Global compteur_2=8 ; determine l'ecartement entre les lignes horizontale a droite des procedures
; ****************************************************************************************************************************************
Global Compteur_de_for=0
Global Compteur_de_if=0
;- Ouverture de la fenètre et de l'écran
hwnd = OpenWindow(#win, 0, 0, 1024,800, "GraphCode By Dobro ",#PB_Window_TitleBar | #PB_Window_ScreenCentered|#PB_Window_SystemMenu )
;- Initialisation de DirectX
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
CloseWindow(#win) : End
EndIf
larg=8000
haut=8000
ButtonGadget(#load,10,760, 150,30,"Load")
BindGadgetEvent(#load, @Button_action())
TextGadget(#text_procedure, 200, 760,250, 30, "procedure")
TextGadget(#text_For, 200+250, 760,250, 30, "Nb de For")
TextGadget(#text_If, 200+500, 760,250, 30, "Nb de If")
ScrollAreaGadget(#Panel,10, 10,1010,750, larg,haut, 30)
hCont = ContainerGadget(#Cont,10,10,larg,haut,#PB_Container_Double)
OpenWindowedScreen(hCont, 0, 0,larg,haut, 0, 0,0)
CloseGadgetList()
CreateSprite(#Spr_attente,128,64)
If issprite(#Spr_attente)
StartDrawing(SpriteOutput(#Spr_attente))
BackColor(Rgb(255,255,255))
DrawText(10,1, "Je dessine...", RGB(0, 0, 255))
StopDrawing()
Endif
Procedure Button_action()
listing.s=Load()
dessine(listing.s)
EndProcedure
Dep = 8
;- début de la boucle
Repeat
Select WaitWindowEvent(20)
Case #PB_Event_Gadget
Select EventGadget()
;Case #load
;listing.s=Load()
;dessine(listing.s)
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
; ***************************************************************************************************************
;-affichage
;-aff listing
IF ListSize(spr_listing())
If IsSprite(#spr_listing)
DisplaySprite (#spr_listing,spr_listing()\posx.l,spr_listing()\posy.l)
Endif
Endif
;-aff boucle
If ListSize(Spr_boucle())
If IsSprite(#Spr_boucle)
if ListSize(Spr_boucle())>0
DisplaySprite (#Spr_boucle,Spr_boucle()\posx.l,Spr_boucle()\posy.l)
Endif
Endif
Endif
;-aff boucle for
If ListSize(spr_boucle_for_next()) >0
If IsSprite(spr_boucle_for_next()\num_sprite.l) ;>2
ForEach spr_boucle_for_next();>3
DisplaySprite (spr_boucle_for_next()\num_sprite.l,spr_boucle_for_next()\posx.l,spr_boucle_for_next()\num_ligne_deb);>4
Next ;>3
Endif;>2
;
If IsSprite(spr_boucle_for_next()\num_sprite.l) ;>2
ForEach spr_boucle_for_next();>3
DisplaySprite (spr_boucle_for_next()\num_sprite.l,spr_boucle_for_next()\posx.l,spr_boucle_for_next()\num_ligne_fin);>4
Next ;>3
Endif;>2
Endif;>1
;-aff IF ENDIF
If ListSize(spr_If()) >0
If IsSprite(spr_IF()\num_sprite.l) ;>2
ForEach spr_IF();>3
DisplaySprite (spr_IF()\num_sprite.l,spr_IF()\posx.l,spr_IF()\num_ligne_deb);>4
Next ;>3
Endif;>2
;
If IsSprite(spr_IF()\num_sprite.l) ;>2
ForEach spr_IF();>3
DisplaySprite (spr_IF()\num_sprite.l,spr_IF()\posx.l,spr_IF()\num_ligne_fin);>4
Next ;>3
Endif;>2
Endif;>1
;-aff procedures
IF ListSize(Spr_procedure())
If IsSprite(Spr_procedure()\num_sprite.l)
ForEach Spr_procedure()
DisplaySprite(Spr_procedure()\num_sprite.l,Spr_Procedure()\posx.l,Spr_Procedure()\posy.l)
Next
Endif
Endif
;-aff procedures_list
IF ListSize(Spr_procedure_list())
If IsSprite(Spr_procedure_list()\num_sprite.l)
ForEach Spr_procedure_list()
DisplaySprite(Spr_procedure_list()\num_sprite.l,Spr_Procedure_list()\posx.l,Spr_Procedure_list()\posy.l)
Next
Endif
Endif
;RandomSeed(13)
;-aff les Appels des procedures et les Arrivée ainsi que la ligne
IF ListSize(Spr_procedure_appel())
If IsSprite(Spr_procedure_appel()\num_sprite.l)
ForEach Spr_procedure_appel()
Foreach spr_procedure()
;{ **************Event Gadget suplementaire pour eviter le Freeze*************
Select WaitWindowEvent(20)
Case #PB_Event_Gadget
Select EventGadget()
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
;}
;- affiche le sprite d'appel
If ListSize(Spr_procedure_appel())
if Issprite(Spr_procedure_appel()\num_sprite.l)
DisplaySprite(Spr_procedure_appel()\num_sprite.l,Spr_Procedure_appel()\posx.l,Spr_Procedure_appel()\posy.l-2)
Endif
Endif
if ListSize(spr_procedure())>0
IF spr_procedure()\name.s =Spr_procedure_appel()\name.s
StartDrawing(ScreenOutput())
; part a l'horizontale
LineXY(Spr_procedure_appel()\posx,Spr_procedure_appel()\posy, Spr_procedure_appel()\posx+spr_procedure_appel()\long1,Spr_procedure_appel()\posy , spr_procedure_appel()\couleur_fil.i)
; ça monte ou descend
LineXY(Spr_procedure_appel()\posx+spr_procedure_appel()\long1,Spr_procedure_appel()\posy, Spr_procedure_appel()\posx+spr_procedure_appel()\long1,spr_procedure_appel()\entree, spr_procedure_appel()\couleur_fil.i)
; fini la ligne vers la procedure
LineXY(Spr_procedure_appel()\posx+spr_procedure_appel()\long1,spr_procedure_appel()\entree, Spr_procedure_appel()\arrx.i,spr_procedure_appel()\entree ,spr_procedure_appel()\couleur_fil.i)
;LineXY(Spr_procedure_appel()\posx,Spr_procedure_appel()\posy, spr_procedure()\posx, spr_procedure()\posy , couleur_liens_procedures) ; anciennes ligne qui font les diagonales
StopDrawing()
index=ListIndex(Spr_procedure_appel())
SelectElement(Spr_procedure_appel_arr(),index)
;-dessin des petites fleches
if issprite(spr_procedure_appel_arr()\num_sprite.l)
DisplaytransparentSprite(spr_procedure_appel_arr()\num_sprite.l,Spr_Procedure_appel_arr()\posx.l,spr_procedure_appel()\entree-3); le "-3" recentre la sprite sur la ligne
Endif
Endif
Endif
Next
Next
Endif
Endif
FlipBuffers()
; ***************************************************************************************************************
Forever
;- *********** Procedures ZONE ***************²
Procedure.s Load()
;-LOAD
ClearScreen(couleur_fond)
ClearList(Spr_Procedure())
ClearList(Spr_Procedure_appel())
ClearList(Spr_Procedure_appel_arr())
ClearList( spr_boucle())
ClearList( spr_listing())
ClearList(spr_procedure_list())
ClearList(spr_boucle_for_next())
ClearList(spr_If())
Compteur_de_for=0
Compteur_de_if=0
Compteur_fil=80 ; determine l'ecartement horizontal du depart des lignes
Compteur_fil2=32 ; pareil mais coté droit des procedures
compteur_1=8 ; determine l'ecartement entre les lignes horizontale a gauche des procedures et aide a eloigner les procedures si beaucoups d'appels evite ainsi le chevauchement des sprites..
compteur_2=8 ; determine l'ecartement entre les lignes horizontale a droite des procedures
Dep =8: compteur_procedure=0
file.s=OpenFileRequester("ouvrir un PB",GetCurrentDirectory(),"*.pb",1)
if file.s<>""
name_file.s=GetFilePart(file.s,#PB_FileSystem_NoExtension)
SetWindowTitle(#win, "GraphCode By Dobro "+name_file.s)
If OpenFile(0, file.s) ; Ouvre un fichier existant ou en crée un nouveau s'il n'existait pas
While Eof(0) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
listing.s=listing.s+ReadString(0,#PB_UTF8 )+chr(10) ; Affiche ligne par ligne le contenu du fichier
Wend
CloseFile(0);>
SetGadgetAttribute( #Panel,#PB_ScrollArea_X ,0 )
SetGadgetAttribute(#Panel, #PB_ScrollArea_Y ,0 )
EndIf
ProcedureReturn listing.s
Else
listing.s=""
ProcedureReturn listing.s
Endif
EndProcedure
;
Procedure Dessine (listing.s)
AddElement(Spr_attente())
Spr_attente()\posx.l = -128
Spr_attente()\posy.l=50
;-create listing
nb_ligne=CountString(listing.s,chr(10))
AddElement(spr_listing())
Spr_listing()\hauteur.l=nb_ligne*2
;debug "numero de ligne fin de listing :"+str(nb_ligne)
Spr_listing()\num_sprite.l=#spr_listing
Spr_listing()\posx.l=10
Spr_listing()\posy.l=10
Spr_listing()\couleur.l=couleur_listing
Spr_listing()\largeur.l=200
Spr_listing()\name.s=name_file.s
;-create_sprite_listing
CreateSprite(Spr_listing()\num_sprite.l,Spr_listing()\largeur.l,Spr_listing()\hauteur.l)
If issprite(Spr_listing()\num_sprite.l)
StartDrawing(SpriteOutput(Spr_listing()\num_sprite.l))
Box(0,0,Spr_listing()\largeur.l,Spr_listing()\hauteur.l,Spr_listing()\couleur.l)
BackColor(Rgb(255,255,255))
DrawText(10,1, Spr_listing()\name.s, RGB(0, 0, 255))
StopDrawing()
Endif
;- **********************************
;-Passe 1
;- **********************************
For i=1 to nb_ligne
yoyo=yoyo+1
Ligne.s=StringField(listing.s,i,chr(10))
gros_decal=CountString(Ligne.s,chr(9))*10 ; fonctionne aussi
Ligne.s=trim(Ligne.s) :Ligne.s=Trim(Ligne.s,chr(9))
if Ligne.s<>""
Spr_attente()\posx.l=Spr_attente()\posx.l+1
IF Spr_attente()\posx.l>WindowWidth(#win)
Spr_attente()\posx.l=-128
Endif
;********* Traitement **********
;- recherche la boucle principale
If FindString(Lcase(Ligne.s),"windowevent",1,#PB_String_NoCase) >0
flag_c_boucle=#True
AddElement(Spr_boucle())
Spr_boucle()\posy.l=i*2
Endif
IF Lcase(left(Ligne.s,5))="until" or Lcase(left(Ligne.s,7))="forever";or Lcase(left(Ligne.s,12))="endprocedure"
;debug "numero de ligne fin de boucle :"+str(i)
;calldebugger
If flag_c_boucle=#True
Flag_c_boucle=#False
Spr_boucle()\hauteur.l=(i*2 - Spr_boucle()\posy.l):compteur_boucle=0
Spr_boucle()\num_sprite.l=#spr_boucle
Spr_boucle()\posx.l=20
Spr_boucle()\couleur.l=couleur_boucle
Spr_boucle()\largeur.l=180
Spr_boucle()\name.s="Boucle"
;-Create_sprite_boucle principale
CreateSprite(Spr_boucle()\num_sprite.l,Spr_boucle()\largeur.l,Spr_boucle()\hauteur.l)
StartDrawing(SpriteOutput(Spr_boucle()\num_sprite.l))
Box(0,0,Spr_boucle()\largeur.l,Spr_boucle()\hauteur.l,Spr_boucle()\couleur.l)
DrawingMode(#PB_2DDrawing_Transparent )
DrawText(1,1, Spr_boucle()\name.s, RGB(255,255,255))
StopDrawing()
Endif
Endif
; *********** boucle For ***************
;-recherche boucle For
If Left( Lcase(Ligne.s),4)="for "
AddElement(spr_boucle_for_next())
spr_boucle_for_next()\posy.l=i*2
spr_boucle_for_next()\hauteur.l=8
spr_boucle_for_next()\num_sprite.l=#spr_boucle_for
spr_boucle_for_next()\posx.l=20+gros_decal;decal_for.l ;gros_decal;
spr_boucle_for_next()\couleur.l=rgb(255,120,255)
spr_boucle_for_next()\largeur.l=8
spr_boucle_for_next()\num_ligne_deb=i*2
spr_boucle_for_next()\name.s="Boucle_for"
Compteur_de_for=Compteur_de_for+1
decal_for.l=decal_for+5
SetGadgetText(#text_For, "Nbr de For :"+str(Compteur_de_For))
;-Create_sprite_boucle_for
CreateSprite(#spr_boucle_for,spr_boucle_for_next()\largeur.l,spr_boucle_for_next()\hauteur.l)
StartDrawing(SpriteOutput(#spr_boucle_for))
Box(0,0,spr_boucle_for_next()\largeur.l,spr_boucle_for_next()\hauteur.l,spr_boucle_for_next()\couleur.l)
DrawingMode(#PB_2DDrawing_Transparent )
StopDrawing()
Endif
;-recherche Next
IF Lcase(left(Ligne.s,5))="next "
AddElement(spr_boucle_for_next())
spr_boucle_for_next()\posy.l=i*2
spr_boucle_for_next()\hauteur.l=8
spr_boucle_for_next()\num_sprite.l=#spr_boucle_next
decal_for.l=decal_for.l-5
spr_boucle_for_next()\posx.l=20+gros_decal;decal_for.l;gros_decal;
spr_boucle_for_next()\couleur.l=rgb(255,0,255)
spr_boucle_for_next()\largeur.l=8
spr_boucle_for_next()\name.s="Boucle_next"
spr_boucle_for_next()\num_ligne_fin=i*2
;-Create_sprite_boucle_Next
CreateSprite(#spr_boucle_next,spr_boucle_for_next()\largeur.l,spr_boucle_for_next()\hauteur.l)
StartDrawing(SpriteOutput(#spr_boucle_next))
Box(0,0,spr_boucle_for_next()\largeur.l,spr_boucle_for_next()\hauteur.l,spr_boucle_for_next()\couleur.l)
DrawingMode(#PB_2DDrawing_Transparent )
StopDrawing()
Endif
; *********** IF/ENdif***************
;-recherche Endif
If Left( Lcase(Ligne.s),5)="endif"
AddElement(spr_if())
spr_If()\posy.l=i*2
spr_If()\hauteur.l=3
spr_If()\num_sprite.l=#spr_Endif
decal_If=decal_If-5
spr_If()\posx.l=20+gros_decal;decal_IF;gros_decal;
spr_If()\couleur.l=rgb(255,100,0)
spr_If()\largeur.l=25
spr_If()\num_ligne_fin=i*2
spr_If()\name.s="Endif"
;-Create_sprite_for
CreateSprite(#spr_endif,spr_If()\largeur.l,spr_If()\hauteur.l)
StartDrawing(SpriteOutput(#spr_endif))
Box(0,0,spr_If()\largeur.l,spr_If()\hauteur.l,spr_If()\couleur.l)
DrawingMode(#PB_2DDrawing_Transparent )
StopDrawing()
Endif
;-recherche If
IF Lcase(left(Ligne.s,3))="if "
AddElement(spr_If())
spr_If()\posy.l=i*2
spr_If()\hauteur.l=3
spr_If()\num_sprite.l=#spr_If
spr_If()\posx.l=20+gros_decal;decal_IF ;gros_decal
spr_If()\couleur.l=rgb(255,150,0)
spr_If()\largeur.l=25
spr_If()\name.s="If"
spr_If()\num_ligne_deb=i*2
decal_IF=decal_IF+5
Compteur_de_If=Compteur_de_If+1
SetGadgetText(#text_If, "Nbr de IF :"+str(Compteur_de_If))
;-Create_sprite_Next
CreateSprite(#spr_IF,spr_If()\largeur.l,spr_If()\hauteur.l)
StartDrawing(SpriteOutput(#spr_If))
Box(0,0,spr_If()\largeur.l,spr_If()\hauteur.l,spr_If()\couleur.l)
DrawingMode(#PB_2DDrawing_Transparent )
StopDrawing()
Endif
;********************************************************************************
;-Les procedures
If Lcase(left(Ligne.s,9))="procedure" and Lcase(left(Ligne.s,15))<>"procedurereturn" ;|
compteur_procedure=compteur_procedure+1 ;>
AddElement(Spr_procedure())
Spr_Procedure()\name_par.s=stringfield(Ligne.s,1,"(")+"("
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,"procedure",#PB_String_NoCase)
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,".s",#PB_String_NoCase)
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,".l",#PB_String_NoCase)
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,".i",#PB_String_NoCase)
Spr_Procedure()\name_par.s=RemoveString(Spr_Procedure()\name_par.s,".f",#PB_String_NoCase)
Spr_Procedure()\name_par.s=Trim(Spr_Procedure()\name_par.s)
;
;
Spr_Procedure()\name.s=stringfield(Ligne.s,1,"(")
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,"procedure",#PB_String_NoCase)
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,".s",#PB_String_NoCase)
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,".l",#PB_String_NoCase)
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,".i",#PB_String_NoCase)
Spr_Procedure()\name.s=RemoveString(Spr_Procedure()\name.s,".f",#PB_String_NoCase)
Spr_Procedure()\name.s=Trim(Spr_Procedure()\name.s)
Spr_Procedure()\num_ligne_deb.i=i*2 ; recup le numero de ligne du debut de la procedure
flag_c_procedure=#True
;-create Sprite Procedure
Spr_procedure()\num_sprite.l=#spr_procedure+compteur_procedure
Spr_Procedure()\posy.l=Spr_Procedure()\posy.l+compteur_procedure*90
Spr_procedure()\posx.l=600
Spr_procedure()\couleur.l=couleur_procedures
Spr_procedure()\Largeur.l=200
Spr_procedure()\hauteur.l=60
;
CreateSprite(Spr_procedure()\num_sprite.l,spr_procedure()\largeur.l,Spr_procedure()\hauteur.l)
StartDrawing(SpriteOutput(Spr_procedure()\num_sprite.l))
Box(0,0,Spr_procedure()\largeur.l,Spr_procedure()\hauteur.l,Spr_procedure()\couleur.l)
DrawingMode(#PB_2DDrawing_Transparent )
DrawText(1,1, Spr_Procedure()\name.s, $0)
StopDrawing()
SetGadgetText(#text_procedure, "Nbr Procedures :"+str(compteur_procedure))
AddElement(spr_procedure_list())
spr_procedure_list()\num_ligne_deb.i=Spr_Procedure()\num_ligne_deb.i
spr_procedure_list()\num_sprite.l=#spr_procedure_list
spr_procedure_list()\posy.l=spr_procedure_list()\num_ligne_deb.i
spr_procedure_list()\posx.l=20
spr_procedure_list()\couleur.l=couleur_procedures
spr_procedure_list()\Largeur.l=(Spr_listing()\largeur.l-spr_procedure_list()\posx.l)
spr_procedure_list()\hauteur.l=5
;-create Sprite procedure_list
If Flag_creation_sprite_Procedure_list=#false
Flag_creation_sprite_Procedure_list=#True
CreateSprite(Spr_procedure_list()\num_sprite.l,spr_procedure_list()\largeur.l,Spr_procedure_list()\hauteur.l)
StartDrawing(SpriteOutput(Spr_procedure_list()\num_sprite.l))
Box(0,0,Spr_procedure_list()\largeur.l,Spr_procedure_list()\hauteur.l,Spr_procedure_list()\couleur.l)
DrawingMode(#PB_2DDrawing_Transparent )
;;;DrawText(1,1, Spr_Procedure_list()\name.s, $0)
StopDrawing()
Endif
Endif
If Lcase(left(Ligne.s,12))="endprocedure" ;
Spr_Procedure()\num_ligne_fin.i=i*2
spr_procedure_list()\num_ligne_deb.i=Spr_Procedure()\num_ligne_fin.i
Endif
;********************************************************************************
Endif
If Flag_c_boucle=#true
compteur_boucle=i
Endif
If yoyo=>10
yoyo=0
DisplayTransparentSprite(#Spr_attente,Spr_attente()\posx.l,Spr_attente()\posy.l)
FlipBuffers() :ClearScreen($0)
Endif
Next i
yoyo=0
Spr_attente()\posx.l=-128
DisplayTransparentSprite(#Spr_attente,Spr_attente()\posx.l,Spr_attente()\posy.l)
FlipBuffers() :ClearScreen($0)
;- **********************************
;-Passe 2
;- **********************************
For i=1 to nb_ligne
yoyo=yoyo+1
Spr_attente()\posx.l=Spr_attente()\posx.l+1
IF Spr_attente()\posx.l>WindowWidth(#win)
Spr_attente()\posx.l=-128
Endif
Ligne.s=StringField(listing.s,i,chr(10))
Ligne.s=trim(Ligne.s) :Ligne.s=Trim(Ligne.s,chr(9))
if Ligne.s<>""
;-appel des procedures
;-entrée dans procedure detecté
If Left(Lcase(Ligne.s),9)="procedure" ; on entre dans une procedure
; on recupe le nom de la procedure "mere"
nom_de_la_procedure_mere.s=stringfield(Ligne.s,1,"(")
nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,"procedure",#PB_String_NoCase)
nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,".s",#PB_String_NoCase)
nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,".l",#PB_String_NoCase)
nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,".i",#PB_String_NoCase)
nom_de_la_procedure_mere.s=RemoveString(nom_de_la_procedure_mere.s,".f",#PB_String_NoCase)
nom_de_la_procedure_mere.s=Trim(nom_de_la_procedure_mere.s)
Flag_procedure=#true
; on recup les coordonées de la procedure "Mere"
ForEach Spr_procedure()
If spr_procedure()\name.s=nom_de_la_procedure_mere.s
position_y=spr_procedure()\posy.l
position_x=spr_procedure()\posx.l
largeur_procedure=Spr_procedure()\Largeur.l
Endif
Next
Endif
If Left(Lcase(Ligne.s),12)="endprocedure"
Flag_procedure=#False
Endif
;-appel de procedure detecté
If left( Lcase(Ligne.s),9)<>"procedure" and Left(Lcase(Ligne.s),7)<>"declare"
ForEach Spr_procedure()
if Cherche_mot(Lcase(Ligne.s),Spr_Procedure()\name_par.s)=#true
compteur_procedure_appel=compteur_procedure_appel+1
; if Spr_Procedure()\name_par.s="toto("
; calldebugger
; Endif
If Flag_procedure=#false ;- l'appel a lieu dans le listing
compteur_1=compteur_1+6
if compteur_1>40:compteur_1=8:Endif
AddElement(spr_procedure_appel())
spr_procedure_appel()\num_sprite.l=#spr_procedure_appel
spr_procedure_appel()\posy.l=i *2
spr_procedure_appel()\posx.l=(Spr_listing()\largeur.l-20)
spr_procedure_appel()\couleur.l=couleur_appel
spr_procedure_appel()\Largeur.l=5
spr_procedure_appel()\hauteur.l=5
spr_procedure_appel()\name.s=Spr_Procedure()\name.s
spr_procedure_appel()\numero_ligne.l=i*2
spr_procedure_appel()\arrx.i=Spr_Procedure()\posx.l
spr_procedure_appel()\arry.i=Spr_Procedure()\posy.l
spr_procedure_appel()\long1=Compteur_fil ;random(random(100,31),30)
Compteur_fil=compteur_fil+10
spr_procedure_appel()\couleur_fil.i=RGB(random(255,127),random(255,127),random(255,127))
spr_procedure_appel()\type=#False
spr_procedure_appel()\entree=Spr_Procedure()\posy.l+compteur_1
; creation sprite
AddElement(spr_procedure_appel_arr())
spr_procedure_appel_arr()\num_sprite.l=#spr_procedure_appel_arr
spr_procedure_appel_arr()\posy.l=Spr_Procedure()\posy.l
spr_procedure_appel_arr()\posx.l=Spr_Procedure()\posx.l
spr_procedure_appel_arr()\couleur.l=spr_procedure_appel()\couleur_fil.i
spr_procedure_appel_arr()\Largeur.l=7
spr_procedure_appel_arr()\hauteur.l=7
Else ;- l'appel a lieu au sein d'une procedure
compteur_2=compteur_2+6
if compteur_2>40:compteur_2=8:Endif
AddElement(spr_procedure_appel())
spr_procedure_appel()\num_sprite.l=#spr_procedure_appel
; ici on prend les coordonée de la procedure mere pour le dessins de l'appel
spr_procedure_appel()\posy.l=position_y
spr_procedure_appel()\posx.l=spr_procedure()\posx.l+largeur_procedure
spr_procedure_appel()\couleur.l=couleur_appel
spr_procedure_appel()\Largeur.l=5
spr_procedure_appel()\hauteur.l=5
spr_procedure_appel()\name.s=Spr_Procedure()\name.s ; vers la procedure de destination
spr_procedure_appel()\numero_ligne.l=i
spr_procedure_appel()\arrx.i=Spr_Procedure()\posx.l+largeur_procedure
spr_procedure_appel()\arry.i=Spr_Procedure()\posy.l
spr_procedure_appel()\long1=Compteur_fil2;random(random(150,16),15)
Compteur_fil2=compteur_fil2+15
spr_procedure_appel()\couleur_fil.i=RGB(random(255,50),random(255,50),random(255,50))
spr_procedure_appel()\type=#true
spr_procedure_appel()\entree=Spr_Procedure()\posy.l+compteur_2
; creation sprite
AddElement(spr_procedure_appel_arr())
spr_procedure_appel_arr()\num_sprite.l=#spr_procedure_appel_arrd
spr_procedure_appel_arr()\posy.l=Spr_Procedure()\posy.l
spr_procedure_appel_arr()\posx.l=spr_procedure_appel()\arrx.i
spr_procedure_appel_arr()\couleur.l=spr_procedure_appel()\couleur_fil.i
spr_procedure_appel_arr()\Largeur.l=7
spr_procedure_appel_arr()\hauteur.l=7
Endif
;-create Sprite Procedure appel depart
If Flag_creation_sprite_procedure_appel=#false ; comme ça on ne creer le sprite qu'une seule fois ;)
Flag_creation_sprite_procedure_appel=#True
CreateSprite(spr_procedure_appel()\num_sprite.l,spr_procedure_appel()\largeur.l,spr_procedure_appel()\hauteur.l)
StartDrawing(SpriteOutput(spr_procedure_appel()\num_sprite.l))
Box(0,0,spr_procedure_appel()\largeur.l,spr_procedure_appel()\hauteur.l,spr_procedure_appel()\couleur.l)
;DrawText(1,1, spr_procedure_appel()\name.s, RGB(0, 255, 0))
StopDrawing()
Endif
;
;-create Sprite Fleche arrivée gauche
If Flag_creation_sprite_Fleche_appel_arr=#false ; comme ça on ne creer le sprite qu'une seule fois ;)
Flag_creation_sprite_Fleche_appel_arr=#True
spr_procedure_appel_arr()\num_sprite.l=#spr_procedure_appel_arr
CreateSprite(spr_procedure_appel_arr()\num_sprite.l,spr_procedure_appel_arr()\largeur.l,spr_procedure_appel_arr()\hauteur.l)
StartDrawing(SpriteOutput(spr_procedure_appel_arr()\num_sprite.l))
xsprdess.s="0,1,2,3,2,1,0"
;CallDebugger
for u=1 to 7
vv=val(StringField(xsprdess.s,u,","))
plot(vv,u-1,spr_procedure_appel_arr()\couleur.l)
Next u
StopDrawing()
Endif
;- create Sprite Fleche arrivée droite
If Flag_creation_sprite_Fleche_appel_arrd=#false ; comme ça on ne creer le sprite qu'une seule fois ;)
Flag_creation_sprite_Fleche_appel_arrd=#True
spr_procedure_appel_arr()\num_sprite.l=#spr_procedure_appel_arrd
CreateSprite(spr_procedure_appel_arr()\num_sprite.l,spr_procedure_appel_arr()\largeur.l,spr_procedure_appel_arr()\hauteur.l)
StartDrawing(SpriteOutput(spr_procedure_appel_arr()\num_sprite.l))
xsprdess.s="3,2,1,0,1,2,3"
;CallDebugger
for u=1 to 7
vv=val(StringField(xsprdess.s,u,","))
plot(vv,u-1,spr_procedure_appel_arr()\couleur.l)
Next u
StopDrawing()
Endif
Endif
Next
Endif
Endif
if yoyo>=10
yoyo=0
DisplayTransparentSprite(#Spr_attente,Spr_attente()\posx.l,Spr_attente()\posy.l)
FlipBuffers() :ClearScreen($0)
Endif
Next i
Spr_attente()\posx.l=-1280
debug #Spr_attente
EndProcedure
Procedure Cherche_mot(ligne.s,mot_a_chercher.s)
; by Dobro
pos = FindString(lcase(ligne.s),lcase(mot_a_chercher.s),1,#PB_String_NoCase)
; recherche arriere
if pos>0
For i=1 to 35
car.s=mid(ligne.s,pos-i,1)
cc=asc(car.s)
If (cc >64 and cc<91) or (cc>47 and cc<58) or (cc>96 and cc<123) or (cc>223 and cc<255) or cc=95 ; si c'est une lettre on continue
else
Dep=pos-i
Break
Endif
Next i
;recherche avant
For i=1 to 50
car.s=mid(ligne.s,Dep+i,1)
cc=asc(car.s)
If (cc >64 and cc<91) or (cc>47 and cc<58) or (cc>96 and cc<123) or (cc>223 and cc<255) or cc=95 or cc=32; si c'est une lettre on continue
longueur=longueur+1
Else
Break
Endif
Next i
;debug Mid(Ligne.s,Dep+1,longueur)
; renvoi le mot
;ProcedureReturn Mid(Ligne.s,Dep+1,longueur)
;renvoi la position et la longueur
;ProcedureReturn str(Dep+1)+","+str(longueur)
;renvoi Vrais ou faux
mot_trouve.s=Mid(Ligne.s,Dep+1,longueur)
long=len(mot_a_chercher.s)
;calldebugger
; if longueur<long
; ;ProcedureReturn #False
; Endif
if longueur>0
;CallDebugger
mot_a_chercher.s=Left(mot_a_chercher.s,Len(mot_a_chercher.s)-1)
;debug mot_trouve.s
;debug mot_a_chercher.s
If lCase(mot_trouve.s)=Lcase(mot_a_chercher.s)
ProcedureReturn #True
Else
ProcedureReturn #False
Endif
endif
Else
ProcedureReturn #False
Endif
EndProcedure
; Epb