Re: PB-Tool: Namen der aktuellen Procedure ausgeben lassen
Verfasst: 21.08.2014 22:18
				
				Ich hab damit mal ein bisschen gespielt.
Unter Win wird die Prozedur in der Liste markiert, bei den anderen OS kommt der Messagerequester.
Allerdings wird nicht "unmarkiert", falls man sich in keiner Prozedur befindet.
Könnte man noch verfeinern...
Z.B. trotzdem den Messagerequester abfeuern, wenn ein User die Prozedurliste gar nicht aktiviert hat.
			Unter Win wird die Prozedur in der Liste markiert, bei den anderen OS kommt der Messagerequester.
Allerdings wird nicht "unmarkiert", falls man sich in keiner Prozedur befindet.
Code: Alles auswählen
; GetProcedureName
; #################################################################
; In den Werkzeug-Einstellungen als Argumente "%TEMPFILE" eintragen
; #################################################################
EnableExplicit
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()
	
	; thx to sicro (http://www.purebasic.fr/german/viewtopic.php?p=324916#p324916)
	
	Protected ReturnValue.s
	Protected FilePath.s
	Protected File, BOM
	
	FilePath = ProgramParameter(0) ; %TEMPFILE (Datei existiert auch, wenn Code nicht gespeichert ist)
	
	File = ReadFile(#PB_Any, FilePath, #PB_File_SharedRead)
	If IsFile(File)
		BOM = ReadStringFormat(File) ; BOM überspringen, wenn vorhanden
		ReturnValue = ReadString(File, #PB_File_IgnoreEOL | BOM)
		CloseFile(File)
	EndIf
	
	ProcedureReturn ReturnValue
	
EndProcedure
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
	Procedure EnumChildProc(hWnd, *lParam)
		Protected CName.s{128}, Count, i, Size, Buffer.s, searchfull
		
		GetClassName_(hWnd, @CName, 128)
		If CName = "ListBox"
			Count = SendMessage_(hWnd, #LB_GETCOUNT, #Null, #Null)
			For i = 0 To Count - 1
				Size   = SendMessage_(hWnd, #LB_GETTEXTLEN, i, #Null)
				Buffer = Space(Size)
				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 #False
						EndIf
					ElseIf FindString(PeekS(*lParam), Buffer)
						SendMessage_(hWnd, #LB_SETCURSEL, i, #Null)
						ProcedureReturn #False
					EndIf
				EndIf
			Next i
		EndIf
		
		ProcedureReturn #True
	EndProcedure
CompilerEndIf
Procedure ShowIt(Line.s)
	Protected hwnd, s.s, i
	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)
			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 - 1 To 1 Step - 1
		
		Line = RemoveLeadingWhitespaceFromString(StringField(ScintillaText, LineCounter, #LineFeed))
		
		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
	
EndIf
Z.B. trotzdem den Messagerequester abfeuern, wenn ein User die Prozedurliste gar nicht aktiviert hat.