PB- Editor schalten
Verfasst: 25.07.2012 07:10
Hallo.
Ich möchte mit meinem Program den PB- Editor steuern.
Mein Prg macht folgendes:
Es sucht in einem auszuwählendem Prg alle Proceduren und zeigt diese an.
(XInclude's werden mit durchsucht)
Nun kann ich eine Angezeigte Proc. doppelt anklicken,
dann werden alle Aufrufe der Proc. gesucht und angezeigt.
Das geht auch durch Markieren der Proc. direkt im Prg und einfügen in ein Suchfeld.
Nun möchte ich, das beim Aklichen eines Aufrufs der PB- Editor auf die entsprechende Zeile geht und diese Anzeigt.
Ist das möglich und könnt Ihr bitte helfen?
Hier mein Program.
(Ich weis, ist noch nicht "durchgesteilt").
Vieleicht eine Idee für eine spätere PB- Version?
Vielen Dank schon mal für Eure Mühe.
Gruß: Bernd
Ich möchte mit meinem Program den PB- Editor steuern.
Mein Prg macht folgendes:
Es sucht in einem auszuwählendem Prg alle Proceduren und zeigt diese an.
(XInclude's werden mit durchsucht)
Nun kann ich eine Angezeigte Proc. doppelt anklicken,
dann werden alle Aufrufe der Proc. gesucht und angezeigt.
Das geht auch durch Markieren der Proc. direkt im Prg und einfügen in ein Suchfeld.
Nun möchte ich, das beim Aklichen eines Aufrufs der PB- Editor auf die entsprechende Zeile geht und diese Anzeigt.
Ist das möglich und könnt Ihr bitte helfen?
Hier mein Program.
(Ich weis, ist noch nicht "durchgesteilt").

Vieleicht eine Idee für eine spätere PB- Version?
Code: Alles auswählen
; Proceduren Finder
Enumeration
#hwnd
EndEnumeration
Global anzwnd=#PB_Compiler_EnumerationValue
Enumeration
#suchbutt
#stopbutt
#suchealleaufrufe
#ButtIde
#buttneu
#buttschliessen
EndEnumeration
#font=0
Global pfad$,datei$
Global LClick=0
Global DPLCLICKEDITOR
Global gOldEditProc
LoadFont(#font,"courier",16)
Structure incl
datei.s
ImPrg.s
zeile.i
EndStructure
Global NewList ListeIncludes.incl()
Structure proc
proc.s
ImPrg.s
Zeile.i
EndStructure
Global NewList ListeProc.proc()
Structure aufrufe
gadgbox.i
gadgedt.i
gadgtxt.i
aufruf.s
EndStructure
Global NewList gadgaufruf.aufrufe()
;-///// SystemProc
Procedure stop(a$)
MessageRequester("",a$)
EndProcedure
Procedure DPLCLICKEDITOR(hWnd, uMsg, wParam, lParam)
Protected result
Select uMsg
Case #WM_LBUTTONDBLCLK
LClick=#WM_LBUTTONDBLCLK
result = 0
Case #WM_LBUTTONUP
LClick=#WM_LBUTTONUP
;result = 0
Default
result = CallWindowProc_(gOldEditProc, hWnd, uMsg, wParam, lParam)
EndSelect
ProcedureReturn result
EndProcedure
Procedure.i PosX(Gadget.i)
Protected GadgetID.i = GadgetID(Gadget), Range.CHARRANGE
SendMessage_(GadgetID, #EM_EXGETSEL, 0, @Range)
ProcedureReturn (Range\cpMax - (SendMessage_(GadgetID, #EM_LINEINDEX, SendMessage_(GadgetID, #EM_EXLINEFROMCHAR, 0, Range\cpMin), 0)) + 1)
EndProcedure
Procedure.i PosY(Gadget.i)
Protected GadgetID.i = GadgetID(Gadget), Range.CHARRANGE
SendMessage_(GadgetID, #EM_EXGETSEL, 0, @Range)
ProcedureReturn SendMessage_(GadgetID, #EM_EXLINEFROMCHAR, 0, Range\cpMin) + 1
EndProcedure
Procedure.s DClick(gadgedt)
a=0:ze=0
a$=GetGadgetItemText(gadgedt,ze)
While Not ze=PosY(gadgedt)-1
a+Len(a$)+1 : ze+1
a$=GetGadgetItemText(gadgedt,ze)
Wend
SendMessage_(GadgetID(gadgedt),#EM_SETSEL,a,a+Len(a$))
ProcedureReturn a$
EndProcedure
Procedure AddItem(a$)
AddGadgetItem(gadgaufruf()\gadgedt,-1,a$)
;SendMessage_(GadgetID(gadgaufruf()\gadgedt),#EM_LINESCROLL,#Null,GetGadgetState(gadgaufruf()\gadgedt))
SendMessage_(GadgetID(gadgaufruf()\gadgedt),#EM_SCROLL,#SB_BOTTOM,0)
EndProcedure
;
Procedure StopEvent()
While WindowEvent()
If EventGadget()=#stopbutt
stop("Abbruch")
ok=1 :Break
EndIf
Wend
ProcedureReturn ok
EndProcedure
;-
;-///// Meine Proc
Procedure Liste_Neu(proc$)
If ListIndex(gadgaufruf())=>0
HideGadget(gadgaufruf()\gadgbox,1)
EndIf
LastElement(gadgaufruf())
AddElement(gadgaufruf())
x=0 : w=WindowWidth(#hwnd)
y=0 : h=WindowHeight(#hwnd)-60
gadgbox=ContainerGadget(#PB_Any,x,y,w,h)
gadgaufruf()\gadgbox=gadgbox
gadgtxt=TextGadget(#PB_Any,0,0,w,22,"")
gadgaufruf()\gadgtxt=gadgtxt
SetGadgetFont(gadgtxt,FontID(#font))
SetGadgetText(gadgtxt,proc$)
gadgaufruf()\aufruf=proc$
gadgedt=EditorGadget(#PB_Any,0,24,w,h-24,#PB_Editor_ReadOnly)
;gadgedt=ListViewGadget(#PB_Any,0,24,w,h-24)
gadgaufruf()\gadgedt=gadgedt
SetGadgetFont(gadgedt,FontID(#font))
CloseGadgetList()
gOldEditProc = SetWindowLongPtr_(GadgetID(gadgaufruf()\gadgedt), #GWL_WNDPROC, @DPLCLICKEDITOR())
EndProcedure
Procedure Liste_Close()
FreeGadget(gadgaufruf()\gadgtxt)
FreeGadget(gadgaufruf()\gadgedt)
FreeGadget(gadgaufruf()\gadgbox)
DeleteElement(gadgaufruf())
EndProcedure
;
Procedure Fenster()
fl=#PB_Window_SystemMenu
fl|#PB_Window_ScreenCentered
ok=OpenWindow(#hwnd,0,0,800,600,"Proc- Finder",fl)
If ok
Liste_Neu("Proceduren")
y=WindowHeight(#hwnd)-54
ButtonGadget(#suchbutt,10,y,80,30,"Suchen")
ButtonGadget(#stopbutt,100,y,80,30,"Stop")
ButtonGadget(#suchealleaufrufe,200,y,200,30,"Suche alle Aufrufe")
ButtonGadget(#ButtIde,440,y,100,30,"Öffne PB")
ButtonGadget(#buttschliessen,560,y,100,30,"Liste Schliessen")
ButtonGadget(#buttneu,670,y,100,30,"Datei auswahl")
Else
End
EndIf
ProcedureReturn ok
EndProcedure
Procedure Menue()
If IsMenu(0)
FreeMenu(0)
EndIf
CreateMenu(0,WindowID(#hwnd))
MenuTitle("Menue")
i=lastmenue
ForEach gadgaufruf()
proc$=gadgaufruf()\aufruf
proc$=StringField(proc$,1,"(") +"("
; Der ProcName bis zur Klammer + die Klammer
proc$=RemoveString(proc$," ")
; Eventuelle Leerzeichen entfernen
MenuItem(i,proc$)
i+1
Next
EndProcedure
Procedure.s Dateiauswahl()
titel$="Datei wählen"
pfad$=GetCurrentDirectory()
patt$="BureBasic |*.pb"
Datei$=OpenFileRequester(titel$,pfad$,patt$,0)
ProcedureReturn datei$
EndProcedure
Procedure finde_include(f)
ClearList(ListeIncludes())
; --- Erster Eintrag ist die Hauptdatei
AddItem("< "+UCase(GetFilePart(datei$))+" >"+#LF$)
AddItem("Einzeldateien :"+#LF$)
AddElement(ListeIncludes())
ListeIncludes()\datei=datei$
; --- Nun die XIncludes suchen und eintragen
If OpenFile(f,datei$)
i=1
While Not Eof(f)
PrgZeile$=LTrim(ReadString(f))
If Not Left(PrgZeile$,1)=";"
suchstr$="XIncludeFile"
a=FindString(UCase(PrgZeile$),UCase(suchstr$))
If a; = 1
;Debug PrgZeile$
b$=Mid(PrgZeile$,a+Len(suchstr$))
b$=Trim(RemoveString(b$,Chr(34)))
If b$
LastElement(ListeIncludes())
AddElement(ListeIncludes())
If Not GetPathPart(b$)
b$=GetPathPart(datei$)+b$
EndIf
ListeIncludes()\datei=b$
ListeIncludes()\zeile=i
ListeIncludes()\ImPrg=GetFilePart(datei$)
b$=#TAB$+Str(ListeIncludes()\zeile)
b$+#TAB$+GetFilePart(ListeIncludes()\datei)
AddItem(b$)
EndIf
EndIf
EndIf
i+1
Wend
CloseFile(f)
AddItem("")
EndIf
EndProcedure
Procedure Finde_Proceduren()
;SelectElement(gadgaufruf(),0)
ClearList(ListeProc())
AddItem("Die Proceduren :"+#LF$)
ForEach ListeIncludes()
file$=ListeIncludes()\datei
AddItem("< "+GetFilePart(ListeIncludes()\datei)+" >"+#LF$)
;Debug "< "+GetFilePart(ListeIncludes()\datei)+" >"
If OpenFile(f,file$) : i=1
While Not Eof(f)
b$=LTrim(ReadString(f))
suchstr$="Procedure"
If Left(b$,Len(suchstr$))=suchstr$ And Not Mid(b$,Len(suchstr$)+1,3)="Ret"
AddElement(ListeProc())
ListeProc()\proc=b$
ListeProc()\zeile=i
ListeProc()\Imprg=GetFilePart(file$)
b$=#TAB$+Str(ListeProc()\zeile)
b$+#TAB$+ListeProc()\proc
AddItem(b$)
EndIf
i+1
If StopEvent() : abbruch=1 : Break : EndIf
Wend
CloseFile(f)
EndIf
If abbruch : Break : EndIf
AddItem("")
Next
EndProcedure
;-
Procedure Is_ProcStart(satz$)
If Left(satz$,10)="Procedure " Or Left(satz$,10)="Procedure."
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
Procedure Is_ProcEnde(satz$)
If Left(satz$,12)="EndProcedure"
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
Procedure Finde_alle_aufrufe(proc$)
ForEach ListeProc()
Proc$=ListeProc()\proc
AddItem(proc$+#LF$)
a=FindString(proc$," ")
proc$=LTrim(Mid(proc$,a))
proc$=StringField(proc$,1,"(") +"("
; Der ProcName bis zur Klammer + die Klammer
proc$=RemoveString(proc$," ")
; Eventuelle Leerzeichen entfernen
gadgedt=gadgaufruf()\gadgedt
ForEach ListeIncludes()
file$=ListeIncludes()\datei
Debug file$
file=0:filealt=0
If OpenFile(f,file$)
i=1
While Not Eof(f)
prgsatz$=LTrim(ReadString(f))
If Not Left(prgsatz$,1)=";"
; Erst mal prüfen, ob der Aufruf eventuell
; Innerhalb oder Ausserhalb einer Proc liegt.
If Is_ProcStart(prgsatz$)
proc=1:proc1$=Str(i)+" : "+prgsatz$
ElseIf Is_ProcEnde(prgsatz$)
proc=0
EndIf
If Not Is_ProcStart(prgsatz$)
If FindString(prgsatz$,proc$)
; Erst den FileNamen
If Not file
AddItem(#TAB$+"< "+GetFilePart(ListeIncludes()\datei)+" >"+#LF$)
file=1
EndIf
; Befindet sich der Aufruf in einer Proc.,
; dann die Procedure mit dem Aufruf
If proc=1 And procalt=0
AddItem(#TAB$+#TAB$+proc1$)
procalt=1
EndIf
; Der Aufruf
If Left(prgsatz$,7)="Declare"
a$=#LF$+Str(i)+" : "+prgsatz$+#LF$
l=Len(a$)
Else
If proc
a$=Str(i)+" : "+#TAB$+prgsatz$
l=Len(a$);+tab
Else
a$=Str(i)+" : "+prgsatz$
l=Len(a$);+tab
EndIf
EndIf
AddItem(#TAB$+#TAB$+a$)
If lmax<L:lmax=L:EndIf
EndIf
EndIf
; Befindet sich der Aufruf in einer Proc.,
; dann Procedureende markieren
If proc=0 And procalt=1
If Is_ProcEnde(prgsatz$)
AddItem(#TAB$+#TAB$+Str(i)+" : "+"EndProcedure")
procalt=0
EndIf
EndIf
EndIf
i+1
If StopEvent() : abbruch=1:Break : EndIf
Wend
If i>imax:imax=i:EndIf
CloseFile(f)
If abbruch:Break 2:EndIf
If file And Not filealt
AddGadgetItem(gadgedt,-1,"")
filealt=file
EndIf
EndIf
Next
Next
ProcedureReturn abbruch
EndProcedure
Procedure Suche_gadgaufruf(proc$)
Liste_Neu(proc$)
Menue()
gadgedt=gadgaufruf()\gadgedt
proc$=StringField(proc$,1,"(") +"("
; Der ProcName bis zur Klammer + die Klammer
proc$=RemoveString(proc$," ")
; Eventuelle Leerzeichen entfernen
ForEach ListeIncludes()
file$=ListeIncludes()\datei
file=0:filealt=0
If OpenFile(f,file$)
i=1
While Not Eof(f)
prgsatz$=LTrim(ReadString(f))
If Not Left(prgsatz$,1)=";"
; Erst mal prüfen, ob der Aufruf eventuell
; Innerhalb oder Ausserhalb einer Proc liegt.
If Is_ProcStart(prgsatz$)
proc=1:proc1$=Str(i)+" : "+prgsatz$
ElseIf Is_ProcEnde(prgsatz$)
proc=0
EndIf
If Not Is_ProcStart(prgsatz$)
If FindString(prgsatz$,proc$)
;Debug prgsatz$
; Erst den FileNamen
If Not file
AddItem("< "+GetFilePart(ListeIncludes()\datei)+" >")
file=1
EndIf
; Befindet sich der Aufruf in einer Proc.,
; dann die Procedure mit dem Aufruf
If proc=1 And procalt=0
AddItem(#LF$+proc1$)
procalt=1
EndIf
; Der Aufruf
If Left(prgsatz$,7)="Declare"
a$=#LF$+Str(i)+" : "+prgsatz$+#LF$
l=Len(a$)
Else
If proc
a$=Str(i)+" : "+#TAB$+prgsatz$
l=Len(a$);+tab
Else
a$=Str(i)+" : "+prgsatz$
l=Len(a$);+tab
EndIf
EndIf
AddItem(a$)
If lmax<L:lmax=L:EndIf
EndIf
EndIf
; Befindet sich der Aufruf in einer Proc.,
; dann Procedureende markieren
If proc=0 And procalt=1
If Is_ProcEnde(prgsatz$)
AddItem(Str(i)+" : "+"EndProcedure"+#LF$)
procalt=0
EndIf
EndIf
EndIf
i+1
If StopEvent() : abbruch=1 : Break : EndIf
Wend
If i>imax:imax=i:EndIf
CloseFile(f)
If abbruch : Break : EndIf
If file And Not filealt
AddItem("")
filealt=file
EndIf
EndIf
Next
If abbruch : ProcedureReturn 0 : EndIf
; nun noch die Zeilennummern formatieren
For i=0 To CountGadgetItems(gadgedt)
a$=GetGadgetItemText(gadgedt,i)
a=Val(a$)
If a
a1$=StringField(a$,1," ")
a2$=Mid(a$,Len(a1$)+1)
a1$=RSet(Str(a),Len(Str(imax))," ")
SetGadgetItemText(gadgedt,i,a1$+a2$)
EndIf
Next
EndProcedure
;-----
For i=0 To CountProgramParameters()
datei$+ProgramParameter()+" "
Next : datei$=RTrim(datei$)
If FileSize(datei$)<0 : datei$="" : EndIf
Fenster()
Menue()
If Not datei$
Dateiauswahl()
EndIf
If Not datei$ : End : EndIf
; ----- Incudes auslesen
finde_include(0)
;AddItem("")
; ----- Die Proceduren
Finde_Proceduren()
menue()
gadgedt=gadgaufruf()\gadgedt
gadgbox=gadgaufruf()\gadgbox
;Debug gadgaufruf()\gadgedt
;-=== Schleife
Repeat
event=WaitWindowEvent()
If ListIndex(gadgaufruf())>0
DisableGadget(#buttschliessen,0)
Else
DisableGadget(#buttschliessen,1)
EndIf
If event=#WM_CLOSE:ende=1:EndIf
If LClick
;--> LBUTTONDBLCLK
If LClick=#WM_LBUTTONDBLCLK
Proc$=DClick(gadgedt)
a=FindString(proc$,"Procedure")
If a
proc$=Mid(proc$,a)
If Is_ProcStart(proc$)
a=FindString(proc$," ")
proc$=LTrim(Mid(proc$,a))
HideGadget(gadgbox,1)
Suche_gadgaufruf(proc$)
HideGadget(gadgaufruf()\gadgbox,0)
EndIf
EndIf
;--> LBUTTONUP
ElseIf LClick=#WM_LBUTTONUP
If gadgedt=gadgaufruf()\gadgedt
DClick(gadgedt)
Else
gadgedt=gadgaufruf()\gadgedt
EndIf
EndIf
LClick=0
EndIf
Select event
Case #PB_Event_Menu
HideGadget(gadgaufruf()\gadgbox,1)
SelectElement(gadgaufruf(),EventMenu())
HideGadget(gadgaufruf()\gadgbox,0)
DClick(gadgaufruf()\gadgedt)
gadgedt=gadgaufruf()\gadgedt
Case #PB_Event_Gadget
Select EventGadget()
Case gadgaufruf()\gadgedt
If EventType()=#PB_EventType_RightButtonUp
stop(Str(PosY(gadgaufruf()\gadgedt)-1))
EndIf
Case #suchbutt
a$ = InputRequester("Suche", "Procedure", "")
If a$
Proc$=a$
a=FindString(proc$,"Procedure")
If a
proc$=Mid(proc$,a)
; Aus dem InputSatz extrahiert
proc$=StringField(proc$,2," ")
; Der Teil nach z.B. "Procedure.s "
EndIf
proc$=StringField(proc$,1,"(") +"("
; Der ProcName bis zur Klammer + die Klammer
proc$=RemoveString(proc$," ")
; Eventuelle Leerzeichen entfernen
Suche_gadgaufruf(proc$)
EndIf
Case #suchealleaufrufe
Liste_Neu("Alle Aufrufe")
menue()
Finde_alle_aufrufe(proc$)
;--> IDE aufrufen
Case #ButtIde
ze=PosY(gadgedt)-1
a$=LTrim(GetGadgetItemText(gadgedt,ze))
ideze=Val(a$)
For i=ze To 0 Step -1
a$=LTrim(GetGadgetItemText(gadgedt,i))
If Left(a$,2)="< "
a$=Mid(a$,3)
a=FindString(a$,">")
a$=Left(a$,a-2)
ForEach ListeIncludes()
If UCase(GetFilePart(ListeIncludes()\datei))=UCase(a$)
a$=ListeIncludes()\datei
RunProgram(Chr(34)+#PB_Compiler_Home+"PureBasic.exe"+Chr(34),Chr(34)+a$+Chr(34)+" /L "+Str(ideze),"")
Break 2
EndIf
Next
EndIf
Next
;--> Butt Schliessen
Case #buttschliessen
If ListIndex(gadgaufruf())>0
Liste_Close()
menue()
gadgedt=gadgaufruf()\gadgedt
HideGadget(gadgaufruf()\gadgbox,0)
EndIf
;--> Butt Neu
Case #buttneu
file$=Datei$
Dateiauswahl()
If Datei$=""
datei$=file$
Else
ForEach gadgaufruf()
Liste_Close()
Next
menue()
Liste_Neu("Proceduren")
Finde_Include(0)
Finde_Proceduren()
EndIf
EndSelect
EndSelect
Until ende
Gruß: Bernd