Page 1 of 1
Highlight the currentl Procedure in the Procedure list
Posted: Tue Jun 04, 2019 1:35 pm
by Bitblazer
It would be convenient if the procedure where the cursor is currently postioned in, would be highlighted in some way inside the procedure list. So one Look would always tell me where i am inside the IDE while editing a larger project. Currently i have to scroll up sometimes to get this info.
Example:
While the cursor is inside "SetDisplayViewGadgetSize", the name inside the procedure list should be highlighted (underline, color, bold)
Re: Highlight the currentl Procedure in the Procedure list
Posted: Tue Jun 04, 2019 1:38 pm
by RSBasic
+1 Good idea
I'll soon develop a tool for you so you don't have to wait long.
Re: Highlight the currentl Procedure in the Procedure list
Posted: Tue Jun 04, 2019 1:39 pm
by RSBasic
Re: Highlight the currentl Procedure in the Procedure list
Posted: Tue Jun 04, 2019 1:41 pm
by Bitblazer
RSBasic wrote:+1 Good idea
I'll soon develop a tool for you so you don't have to wait long.
Haha you are quick

nice. If you create a tool, add a little info window about the parameters while you hover over a procedure inside the list. When you are done with that, add the option to see the call hierarchy - who calls the procedure and what procedures does it call itself
btw. nice work with your tools lately

Re: Highlight the currentl Procedure in the Procedure list
Posted: Tue Jun 04, 2019 3:00 pm
by skywalk
Sorry, kiffi's tool does not work on Windows 10 Pro, PB v571b1x64.
ScintillaText = GetScintillaText() <-- returns empty string?
Re: Highlight the currentl Procedure in the Procedure list
Posted: Tue Jun 04, 2019 3:06 pm
by RSBasic
I can't confirm.
Did you insert "%TEMPFILE" in the "Arguments" field?
Re: Highlight the currentl Procedure in the Procedure list
Posted: Tue Jun 04, 2019 3:24 pm
by skywalk
DOH!
Google translator inserted spaces.

I thought I changed them all but missed "% TEMPFILE".
Works now, but does not update the Procedure List on the left?
Ah, I see HeXOR's code does that!!
This is super helpful. Getting closer to the Notepad++ experience.
EDIT: Only thing is the TEMP folder now holds n Copies of every file browsed during Procedure hunt!
Added the following:
EDIT2: Modified the code to catch similar Procedure names.
Code: Select all
; kiffi, https://www.purebasic.fr/german/viewtopic.php?f=8&t=28267
; GetProcedureName
; REV: 190606, skywalk
; Modified to catch similarly named Procedures in ListBox.
; Ex. ShowIt() and ShowIt2().
;#################################################################
; Tool arguments: "%TEMPFILE"
;#################################################################
EnableExplicit
Global.s FilePath$
Procedure.s RemoveLeadingWhitespaceFromString(InString.s)
While Left(InString, 1) = Chr(32) Or Left(InString, 1) = Chr(9)
InString = LTrim(InString, Chr(32))
InString = LTrim(InString, Chr(9))
Wend
ProcedureReturn InString
EndProcedure
Procedure.s GetScintillaText()
; sicro, http://www.purebasic.fr/german/viewtopic.php?p=324916#p324916
Protected ReturnValue.s
Protected File, BOM
FilePath$ = ProgramParameter(0); %TEMPFILE (file also exists if code is not saved)
File = ReadFile(#PB_Any, FilePath$, #PB_File_SharedRead)
If IsFile(File)
BOM = ReadStringFormat(File) ; Skip BOM if present
ReturnValue = ReadString(File, #PB_File_IgnoreEOL); | BOM)
CloseFile(File)
If FindString(FilePath$, "\Temp\", 1, #PB_String_NoCase)
; Only delete temp file, in case user enters wrong path in Tool options.
DeleteFile(FilePath$)
EndIf
EndIf
ProcedureReturn ReturnValue
EndProcedure
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Procedure EnumChildProc(hWnd, *lParam)
Protected.i Count, i, Size, searchfull
Protected.s Buffer, Buffer2
Protected CName.s{128}
GetClassName_(hWnd, @CName, 128)
If CName = "ListBox"
Count = SendMessage_(hWnd, #LB_GETCOUNT, #Null, #Null)
For i = Count - 1 To 0 Step -1 ; Search bottom up to help search alphabetically.
Size = SendMessage_(hWnd, #LB_GETTEXTLEN, i, #Null)
Buffer = Space(Size + 64)
If SendMessage_(hWnd, #LB_GETTEXT, i, @Buffer)
If searchfull = 0
; Check if parameters are shown in listview
If FindString(Buffer, "(")
searchfull = 1
Else
searchfull = -1
EndIf
EndIf
If searchfull = 1
If PeekS(*lParam) = Buffer
SendMessage_(hWnd, #LB_SETCURSEL, i, #Null)
ProcedureReturn 0
EndIf
Else
Buffer2 = Trim(StringField(PeekS(*lParam), 1, "("))
;MessageRequester("IN EnumChildProc", Buffer + " = " + Buffer2)
If Buffer2 = Buffer
SendMessage_(hWnd, #LB_SETCURSEL, i, #Null)
ProcedureReturn 0
EndIf
EndIf
EndIf
Next i
EndIf
ProcedureReturn 1
EndProcedure
CompilerEndIf
CompilerIf 0
Procedure ShowIt2(Line.s)
; Dummy procedure with nearly same name.
; Cursor here did not not select correct Procedure in ListBox.
EndProcedure
CompilerEndIf
Procedure ShowIt(Line.s)
Protected.i hwnd, i
Protected.s s
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
hwnd = Val(GetEnvironmentVariable("PB_TOOL_MainWindow"))
i = FindString(Line, " ")
If i = 0
i = FindString(Line, #TAB$)
EndIf
Line = Mid(Line, i + 1)
Line = RemoveLeadingWhitespaceFromString(Line)
;MessageRequester("SHOWIT", Line)
EnumChildWindows_(hWnd, @EnumChildProc(), @Line)
CompilerDefault
;Linux / Mac?
MessageRequester("You are here:", Line)
CompilerEndSelect
EndProcedure
Define ScintillaText.s
Define CursorLine = Val(StringField(GetEnvironmentVariable("PB_TOOL_Cursor"), 1, "x"))
Define Line.s
Define LineCounter
ScintillaText = GetScintillaText()
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
#LineFeed = #CRLF$
CompilerDefault
#LineFeed = #LF$
CompilerEndSelect
If ScintillaText <> ""
For LineCounter = CursorLine To 1 Step - 1
Line = RemoveLeadingWhitespaceFromString(StringField(ScintillaText, LineCounter, #LineFeed))
;;MessageRequester("BEFORE SHOWIT", Line)
; Allow EndProcedure to trigger search.
;If Left(LCase(Line), Len("endprocedure")) = "endprocedure"
; Break
;EndIf
If Left(LCase(Line), Len("procedure")) = "procedure"
If Left(LCase(Line), Len("procedurereturn")) <> "procedurereturn"
ShowIt(Line)
Break
EndIf
EndIf
Next LineCounter
EndIf
Re: Highlight the currentl Procedure in the Procedure list
Posted: Thu Jun 06, 2019 5:33 pm
by skywalk
See bug fix above.

This feature is saving me lots of scrolling!

Re: Highlight the currentl Procedure in the Procedure list
Posted: Fri Jun 07, 2019 3:33 am
by BarryG
skywalk, how do you make this work? I've built the exe, made it a tool, gave it the argument of "%TEMPFILE", assigned it a hotkey. Then when I press the hotkey inside a procedure, nothing happens?
Re: Highlight the currentl Procedure in the Procedure list
Posted: Fri Jun 07, 2019 6:21 am
by skywalk
1st, verify the tool is actually triggering. Recompile the code with any messagerequester() uncommented.
2nd, try placing the compiled exe in a white listed folder. Ex. C:\pb-tools\
Antivirus may block these tiny exe's.
Re: Highlight the currentl Procedure in the Procedure list
Posted: Fri Jun 07, 2019 6:48 am
by Kurzer
+ 100
this was requested several times. and i find it super handy. a pity that its not a native ide function after 20 years of pb developing.
Sent via mobile phone
Re: Highlight the currentl Procedure in the Procedure list
Posted: Fri Jun 07, 2019 7:11 am
by RSBasic
The code by Kiffi is very useful. That's why I have included his code in my tool "Multicolor Procedure List". The current procedure is displayed in bold in real time. No MessageRequester, the entry in the procedure list is marked in bold:
viewtopic.php?f=27&t=72884
Re: Highlight the currentl Procedure in the Procedure list
Posted: Fri Jun 07, 2019 7:34 am
by Bitblazer
Thanks, will try it this weekend

Re: Highlight the currentl Procedure in the Procedure list
Posted: Fri Jun 07, 2019 8:53 am
by BarryG
skywalk wrote:1st, verify the tool is actually triggering. Recompile the code with any messagerequester() uncommented.
2nd, try placing the compiled exe in a white listed folder. Ex. C:\pb-tools\
Antivirus may block these tiny exe's.
Hi, no it's not that. My tools panel auto-hides, so I didn't see anything happening when pressing the hotkey. So accounting for the panel being hidden has to be taken into account (hi, RSBasic!).
But even after I disabled auto-hiding, your code doesn't work with long sources. I can scroll down a procedure at line 15000 in my source, hit the hotkey, and nothing is jumped to in the procedure browser. But it does work in a short source.
Re: Highlight the currentl Procedure in the Procedure list
Posted: Fri Jun 07, 2019 1:32 pm
by skywalk
I will check again. I was in line 9000 when last tested.
@RSBasic, see small bug changes to kiffi's code.
EDIT: Verified lowest line Procedure is highlighted in larger include files. ~12k and ~19k lines.
It is noticeably delayed since the file must be written to disk and scanned.
I can adapt the code to inspect the loaded process memory when I have a chance.