;-- TIME_STAMP   2019-02-17 22:41:09   v 1.0

#Region    ;************ Includes ************
#include-once
;~ #include <WinAPIConstants.au3>
#include <WinAPIConv.au3>
#include <SciTE_Interface.au3>
#EndRegion ;************ Includes ************

Global Const $g_aPrintStructError = [ _
										[0, 'OK'], _
										[1, 'Struct not a valid struct returned by DllStructCreate().'], _
										[2, 'Element out of range or unknown.'], _
										[3, 'Index out of range.'], _
										[4, 'Element data type is unknown.'], _
										[5, 'Index <= 0.'] _
									]

; Wie ConsoleWrite('Test' & @CRLF) --> _CW('Test')
; Anstelle von zusätzlichen @CRLF, @CR, @LF oder @TAB kann \r\n, \r, \n oder \t angegeben werden.
; Spezial: _CW('@@ _Func() BlaBla...') wird konvertiert zu _CW('@@ _Func(9) : 15:33:33 BlaBla...'), wobei (9) die aktuelle Zeilennummer ist.
;          Dies hat den Vorteil, dass man in der Scite output pane mit einem Doppelklick auf diese springen kann.
; $iS: Codepage für SciTE output pane, SciTE-Default = 0 (output.code.page=0) (Windows Default Codepage 1252 (ANSI)), bei mir 65001 (output.code.page=65001)
; $iC: Codepage für CMD.exe, CMD-Default = 850, bei mir 65001
; Abbrev: _cw
Func _CW($sText, $sScriptLineNumber = @ScriptLineNumber)
	$sText = StringRegExpReplace($sText, '^(@@.+)\(\)(.*)', '\1(' & $sScriptLineNumber & ') : '&@HOUR & ':' & @MIN & ':' & @SEC & '\2')
	ConsoleWrite(StringFormat(_WideCharToMultiByte($sText)) & @CRLF)
EndFunc   ;==>_CW

; Wie ConsoleWrite(StringFormat('%s\r\n', 'Test')) --> _CWSF('%s', 'Test')
; Abbrev: _cwsf
Func _CWSF($SF, $sT1, $sT2 = '', $sT3 = '', $sT4 = '', $sT5 = '', $sT6 = '', $sT7 = '', $sT8 = '', $sT9 = '', $sT10 = '', $sT11 = '', $sT12 = '', $sT13 = '', $sT14 = '', $sT15 = '', $sT16 = '', $sT17 = '', $sT18 = '', $sT19 = '', $sScriptLineNumber = @ScriptLineNumber)
	Local $aText = [$sT1, $sT2, $sT3, $sT4, $sT5, $sT6, $sT7, $sT8, $sT9, $sT10, $sT11, $sT12, $sT13, $sT14, $sT15, $sT16, $sT17, $sT18, $sT19]
	$SF = StringRegExpReplace($SF, '^(@@.+)\(\)(.*)', '\1(' & $sScriptLineNumber & ') : '&@HOUR & ':' & @MIN & ':' & @SEC & '\2')

	For $i = 1 To @NumParams - 1 Step 1
		If $aText[$i] <> '' Then $aText[$i] = _WideCharToMultiByte($aText[$i])
	Next
	ConsoleWrite(StringFormat($SF, $aText[0], $aText[1], $aText[2], $aText[3], $aText[4], $aText[5], $aText[6], $aText[7], $aText[8], $aText[9], $aText[10], $aText[11], $aText[12], $aText[13], $aText[14], $aText[15], $aText[16], $aText[17], $aText[18]) & @CRLF)
EndFunc   ;==>_CWSF

; Wie _CW, aber nur wenn das Script nicht kompiliert ist und $g_iDEBUG > 0 oder die ersten beiden Zeichen '!!' sind
; Abbrev: dp
Func _DebugPrint($sText, $sScriptLineNumber = @ScriptLineNumber)
	If Not @Compiled And (Eval('g_iDEBUG') Or StringLeft($sText, 2) = '!!') Then
		$sText = StringRegExpReplace($sText, '^(@@.+)\(\)(.*)', '\1(' & $sScriptLineNumber & ') : '&@HOUR & ':' & @MIN & ':' & @SEC & '\2')
		ConsoleWrite(StringFormat(_WideCharToMultiByte($sText)) & @CRLF)
	EndIf
EndFunc   ;==>_DebugPrint

; Wie _CWSF, aber nur wenn das Script nicht kompiliert ist und $g_iDEBUG > 0 oder die ersten beiden Zeichen '!!' sind
; Abbrev: _cwsf
Func _DebugPrintStringFormat($SF, $sT1, $sT2 = '', $sT3 = '', $sT4 = '', $sT5 = '', $sT6 = '', $sT7 = '', $sT8 = '', $sT9 = '', $sT10 = '', $sT11 = '', $sT12 = '', $sT13 = '', $sT14 = '', $sT15 = '', $sT16 = '', $sT17 = '', $sT18 = '', $sT19 = '', $sScriptLineNumber = @ScriptLineNumber)
	Local $sString, $aText = [$sT1, $sT2, $sT3, $sT4, $sT5, $sT6, $sT7, $sT8, $sT9, $sT10, $sT11, $sT12, $sT13, $sT14, $sT15, $sT16, $sT17, $sT18, $sT19]
	$SF = StringRegExpReplace($SF, '^(@@.+)\(\)(.*)', '\1(' & $sScriptLineNumber & ') : '&@HOUR & ':' & @MIN & ':' & @SEC & '\2')

	If Not @Compiled And (Eval('g_iDEBUG') Or StringLeft($SF, 2) = '!!') Then
		StringReplace($SF, '%', '')
		For $i = 0 To @extended - 1 Step 1
			If $aText[$i] = '' Then ContinueLoop
			$sString &= StringFormat('"%s", ', $aText[$i])
		Next
		$sString = "StringFormat('" & $SF & "', " & StringTrimRight($sString, 2) & ')'
		ConsoleWrite(_WideCharToMultiByte(Execute($sString)))
	EndIf
EndFunc   ;==>_DebugPrintStringFormat

; $aPos[4]
; Abbrev: ppos
Func _PrintPos($sName, $aPos, $sScriptLineNumber = @ScriptLineNumber)
	If UBound($aPos) <> 4 Then
		_CWSF('%-48s =    %s', $sName, '_PrintPos: $aPos ist not an $aArray[4]!')
	Else
		$sName = StringRegExpReplace($sName, '^(@@.+)\(\)(.*)', '\1(' & $sScriptLineNumber & ') : '&@HOUR & ':' & @MIN & ':' & @SEC & '\2')
		_CWSF('%-48s =    X: %5i,   Y: %5i,     W: %5i,      H: %5i', $sName, $aPos[0], $aPos[1], $aPos[2], $aPos[3])
	EndIf
EndFunc   ;==>__PrintPos

; $aSize[2]
; Abbrev: pcls
Func _PrintClientSize($sName, $aSize, $sScriptLineNumber = @ScriptLineNumber)
	If UBound($aSize) <> 2 Then
		_CWSF('%-48s =    %s', $sName, '_PrintClientSize: $aSize ist not an $aArray[2]!')
	Else
		$sName = StringRegExpReplace($sName, '^(@@.+)\(\)(.*)', '\1(' & $sScriptLineNumber & ') : '&@HOUR & ':' & @MIN & ':' & @SEC & '\2')
		_CWSF('%-48s =                              W: %5i,      H: %5i', $sName, $aSize[0], $aSize[1])
	EndIf
EndFunc   ;==>__PrintPos

; Struct $tagPoint
; Abbrev: ppoint
Func _PrintPoint($sName, $tPoint, $sScriptLineNumber = @ScriptLineNumber)
	Local $iX = DllStructGetData($tPoint, 'X'), $iX_Error = @error, $iY = DllStructGetData($tPoint, 'Y'), $iY_Error = @error
	$sName = StringRegExpReplace($sName, '^(@@.+)\(\)(.*)', '\1(' & $sScriptLineNumber & ') : '&@HOUR & ':' & @MIN & ':' & @SEC & '\2')
	Select
		Case $iX_Error
			_CWSF('%-48s =    %s\n!\t#Error %i - %s', $sName, '_PrintPoint: DllStructGetData($tPoint, "X")', @error, $g_aPrintStructError[@error][1])
		Case $iY_Error
			_CWSF('%-48s =    %s\n!\t#Error %i - %s', $sName, '_PrintPoint: DllStructGetData($tPoint, "Y")', @error, $g_aPrintStructError[@error][1])
		Case Else
			_CWSF('%-48s =    X: %5i,   Y: %5i', $sName, $iX, $iY)
	EndSelect
EndFunc   ;==>__PrintPoint

; Struct $tagRECT
; Abbrev: prect
Func _PrintRect($sName, $tRECT, $sScriptLineNumber = @ScriptLineNumber)
	Local $iLeft   = DllStructGetData($tRECT, 'Left'),   $iLeft_Error   = @error, _
		  $iTop    = DllStructGetData($tRECT, 'Top'),    $iTop_Error    = @error, _
		  $iRight  = DllStructGetData($tRECT, 'Right'),  $iRight_Error  = @error, _
		  $iBottom = DllStructGetData($tRECT, 'Bottom'), $iBottom_Error = @error
	$sName = StringRegExpReplace($sName, '^(@@.+)\(\)(.*)', '\1(' & $sScriptLineNumber & ') : '&@HOUR & ':' & @MIN & ':' & @SEC & '\2')
	Select
		Case $iLeft_Error
			_CWSF('%-48s =    %s\n!\t#Error %i - %s', $sName, '_PrintRect: DllStructGetData($tRECT, "Left")',   @error, $g_aPrintStructError[@error][1])
		Case $iTop_Error
			_CWSF('%-48s =    %s\n!\t#Error %i - %s', $sName, '_PrintRect: DllStructGetData($tRECT, "Top")',    @error, $g_aPrintStructError[@error][1])
		Case $iRight_Error
			_CWSF('%-48s =    %s\n!\t#Error %i - %s', $sName, '_PrintRect: DllStructGetData($tRECT, "Right")',  @error, $g_aPrintStructError[@error][1])
		Case $iBottom_Error
			_CWSF('%-48s =    %s\n!\t#Error %i - %s', $sName, '_PrintRect: DllStructGetData($tRECT, "Bottom")', @error, $g_aPrintStructError[@error][1])
		Case Else
;~ 			_CWSF('%-48s = Left: %5i, Top: %5i, Right: %5i, Bottom: %5i', $sName, DllStructGetData($tRECT, 'Left'), DllStructGetData($tRECT, 'Top'), DllStructGetData($tRECT, 'Right'), DllStructGetData($tRECT, 'Bottom'))
			_CWSF('%-48s = Left: %5i, Top: %5i, Right: %5i, Bottom: %5i', $sName, $iLeft, $iTop, $iRight, $iBottom)
	EndSelect
EndFunc   ;==>__PrintRect

; Konvertiert den Text, damit Umlaute und Sonderzeichen in SciTE und in der Eingabeaufforderung korrekt dargestellt werden!
; Syntax: _WinAPI_WideCharToMultiByte ( $vUnicode [, $iCodePage = 0 [, $bRetNoStruct = True [, $bRetBinary = False]]] )
Func _WideCharToMultiByte($vText, $iCodePageSource = $g_iSCI_Codepage, $iCodePageCompiled = $g_iSCI_OutputCodepage, $bRetNoStruct = True, $bRetBinary = False)
	$vText = String($vText) ; Damit _WinAPI_WideCharToMultiByte nicht abstürzt, wenn kein String übergeben wurde!

	; SciTE output.code.page = 65001 (UTF-8), Eingabeaufforderung = 65001 (UTF-8) + Schriftart, die UTF-8-Zeichen enthält!
;~ 	Return _WinAPI_WideCharToMultiByte($vText, $iCodePage, $bRetNoStruct)

	; SciTE output.code.page = 65001 (UTF-8), Eingabeaufforderung = 1 (OEM 850) + Schriftart, die UTF-8-Zeichen enthält! (Default)
;~ 	Return _WinAPI_WideCharToMultiByte($vText, @Compiled ? $iCodePageCompiled : $iCodePageSource, $bRetNoStruct)
	Local $iCodePage = @Compiled ? $iCodePageCompiled : $iCodePageSource
;~ 	Return _WinAPI_WideCharToMultiByte($sCodePage & $vText, $iCodePage, $bRetNoStruct)
	Return _WinAPI_WideCharToMultiByte($vText, $iCodePage, $bRetNoStruct, $bRetBinary)
EndFunc   ;==>_WideCharToMultiByte

Func _MultiByteToWideChar($vText, $iCodePageSource = $g_iSCI_Codepage, $iCodePageCompiled = $g_iSCI_OutputCodepage, $iFlags = $MB_COMPOSITE, $bRetString = True)
	Return _WinAPI_MultiByteToWideChar($vText, @Compiled ? $iCodePageCompiled : $iCodePageSource, $iFlags, $bRetString)
EndFunc  ;==>_MultiByteToWideChar
