#include<GDIPlus.au3>
#include<Misc.au3>
#include<GuiListView.au3>
#include<EditConstants.au3>
#include<GuiConstantsEx.au3>
Global $ax[4], $ay[4], $iX = 0, $iY = 80, $iW = 500, $iH = 500, $hGui
Global $iTerm, $iTerm_len, $iPixel_perUnit = 20, $iTerm_Old = "", $iTerm_X = -12.5
Global $iTerm_start = -12.5, $iTerm_end = 12.5, $iTerm_Step = 1 / $iPixel_perUnit
Global $iTerm_YScl, $iTerm_Step, $iTerm_print = 0, $iTerm_StopMode = 0, $iTerm_shockMode = 0
Global $iTerm_DirectlyDraw, $iTerm_QuckDraw, $iCheck_SingleDraw
$ax[0] = 0
$ax[1] = 250
$ax[2] = 500
$ax[3] = $ax[1]
;---
$ay[0] = 250
$ay[1] = 500
$ay[2] = $ay[0]
$ay[3] = 0
;---
$hGui = GUICreate("Funktions Plotter", 1000, 740)
; > Main Inputs <
GUICtrlCreateLabel("f(x) = ", 10, 17, 100, 20)
GUICtrlSetFont(-1, 12)
$iFunktion_Input = GUICtrlCreateInput("", 50, 17, 300, 25)
GUICtrlSetFont(-1, 12)
$iButton_Plotten = GUICtrlCreateButton("Plotten", 360, 15, 140, 50)
$iStatus_lbl_Front = GUICtrlCreateLabel("Status: ", 10, 50, 50, 20)
GUICtrlSetFont(-1, 12)
GUICtrlSetColor(-1, 0x00A000)
$iStatus_lbl = GUICtrlCreateLabel("Waiting...", 60, 50, 300, 20)
GUICtrlSetFont(-1, 12)
; // Main Inputs //
; ====================
; > Daten Liste <
$hListView = GUICtrlCreateListView("X                          |Y                         ", 520, 17, 230, 563)
; // Daten Liste //
; ====================
; > Button Field <
$iButton_Stop = GUICtrlCreateButton("STOP", 10, 590, 215, 45)
GUICtrlSetBkColor(-1, 0xFF0000)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 16)
$iButton_shock = GUICtrlCreateButton("Detail-Shock - OFF", 10, 655, 215, 20)
GUICtrlSetFont(-1, 10)
$iButton_StopMode = GUICtrlCreateButton("Stop Mode - OFF", 10, 680, 215, 20)
GUICtrlSetFont(-1, 10)
$iButton_DirectlyDraw = GUICtrlCreateButton("Directly-Draw - OFF", 10, 705, 215, 20)
GUICtrlSetFont(-1, 10)
;--------------------
$iButton_Reset = GUICtrlCreateButton("RESET", 270, 590, 215, 45)
GUICtrlSetBkColor(-1, 0xFFB000)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 16)
$iButton_QuickStep = GUICtrlCreateButton("Quick-Step - OFF", 270, 655, 215, 20)
GUICtrlSetFont(-1, 10)
$iButton_MoveMode = GUICtrlCreateButton("Move-Mode - ON", 270, 680, 215, 20)
GUICtrlSetFont(-1, 10)
$iTerm_MoveMode = 1
$iButton_MouseMove = GUICtrlCreateButton("Mouse-Move - ON", 270, 705, 215, 20)
GUICtrlSetFont(-1, 10)
$iTerm_MouseMove = 1
;~ $iButton_StopMode = GUICtrlCreateButton("Stop Mode - OFF", 10, 675, 215, 20)
;~ $iButton_DirectlyDraw = GUICtrlCreateButton("Directly-Draw - OFF", 10, 700, 215, 20)
; // Button Field //
; ====================
; > Standard Funktions <
GUICtrlCreateGroup("Standart Functions", 750, 595, 230, 135)
$iButton_Std_nothing = GUICtrlCreateButton("( nothing )", 760, 620, 100, 20)
$iButton_Std_x = GUICtrlCreateButton("Normal x", 760, 645, 100, 20)
$iButton_Std_quad = GUICtrlCreateButton("Quad: x^2", 760, 670, 100, 20)
$iButton_Std_cubic = GUICtrlCreateButton("Cubic: x^3", 760, 695, 100, 20)
$iButton_Std_sin = GUICtrlCreateButton("Sin(x)", 870, 620, 100, 20)
$iButton_Std_cos = GUICtrlCreateButton("Cos(x)", 870, 645, 100, 20)
$iButton_Std_1_x = GUICtrlCreateButton("1/x", 870, 670, 100, 20)
$iButton_Std_1_xh2 = GUICtrlCreateButton("1/x^2", 870, 695, 100, 20)
; // Standard Functions //
; ====================
; > Axes <
GUICtrlCreateGroup("Axes", 505, 595, 240, 135)
GUICtrlCreateLabel("X_Min: ", 515, 618)
$iInput_XMin = GUICtrlCreateInput("-12.5", 555, 615, 60, 20)
GUICtrlCreateLabel("Y_Min: ", 515, 643)
$iInput_YMin = GUICtrlCreateInput("-12.5", 555, 640, 60, 20)
GUICtrlCreateLabel("X_Max: ", 625, 618)
$iInput_XMax = GUICtrlCreateInput("12.5", 665, 615, 60, 20, $ES_READONLY)
GUICtrlCreateLabel("Y_Max: ", 625, 643)
$iInput_YMax = GUICtrlCreateInput("12.5", 665, 640, 60, 20, $ES_READONLY)
GUICtrlCreateLabel("RAP: ", 515, 678)
$iInput_RAP = GUICtrlCreateInput("4", 555, 675, 60, 20)
GUICtrlCreateLabel("Step: ", 625, 678)
$iInput_aStep = GUICtrlCreateInput("15", 665, 675, 60, 20)
$iButton_SetAxes = GUICtrlCreateButton("Set Configuration", 515, 700, 210, 25)
; // Axes //
; ====================
; > Graph Options <
$iList_GraphList = GUICtrlCreateListView("Graph List", 770, 17, 210, 383)
GUICtrlCreateGroup("Graph list", 770, 410, 210, 170)
$iButton_addGraphList = GUICtrlCreateButton("add current Function", 780, 430, 190, 20)
$iButton_delGraphList = GUICtrlCreateButton("delete current Function", 780, 455, 190, 20)
$iButton_drawGraph = GUICtrlCreateButton("draw Function", 780, 480, 190, 20)
$iButton_cleanList = GUICtrlCreateButton("clean list", 780, 505, 190, 20)
$iButton_cleanGraph = GUICtrlCreateButton("clean", 780, 530, 190, 20)
$iCheck_SingleDraw = GUICtrlCreateCheckbox("Single Draw", 780, 555, 90, 20)
; // Graph Options //
; ====================
GUISetState()
_GDIPlus_Startup()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND ($hGui)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hBrush_white = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$hBrush_gray = _GDIPlus_BrushCreateSolid(0xFFF0F0F0)
_Create_Axes()
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, $iX, $iY, $iW, $iH)
while 1
	$msg = GUIGetMsg()
    $mPos = GUIGetCursorInfo()
	While IsArray($mPos) = 0
		$mPos = GUIGetCursorInfo()
	WEnd
;~  ToolTip($mPos[0] & " x " & $mPos[1])
	Select
		case $msg = -3
			Exit
		case $msg = $iButton_Plotten Or _IsPressed("0D") And GUICtrlRead($iFunktion_Input) <> ""
			$iTerm = GUICtrlRead($iFunktion_Input)
			; ---
			$ax[0] = 0
			if GUICtrlRead($iInput_YMin) <= 0 Then $ax[1] = 500 - GUICtrlRead($iInput_YMin) * -1 * 20
			if GUICtrlRead($iInput_YMin) >= 0 Then $ax[1] = GUICtrlRead($iInput_YMin) * 20 + 500
			$ax[2] = 500
			$ax[3] = $ax[1]
			;---
			$ay[0] = GUICtrlRead($iInput_XMin) * 20 *-1
			$ay[1] = 500
			$ay[2] = $ay[0]
			$ay[3] = 0
			;---
			GUICtrlSetData($iInput_XMax, GUICtrlRead($iInput_XMin) + 25)
			GUICtrlSetData($iInput_YMax, GUICtrlRead($iInput_YMin) + 25)
			$iTerm_start = GUICtrlRead($iInput_XMin)
			$iTerm_end = GUICtrlRead($iInput_XMax)
			$iTerm_YScl = 20
			$iTerm_Step = GUICtrlRead($iInput_RAP) / 20
			_Create_Axes()
			_Create_Graph()
			$iTerm_print = 1
		case $msg = $iButton_shock And $iTerm_shockMode = 0;$iButton_shock
			$iTerm_shockMode = 1
			GUICtrlSetData($iInput_RAP, "0.001")
			GUICtrlSetData($iButton_shock, "Detail-Shock - ON")
			$iTerm_step = GUICtrlRead($iInput_RAP) / 20
		case $msg = $iButton_shock And $iTerm_shockMode = 1
			$iTerm_shockMode = 0
			GUICtrlSetData($iInput_RAP, "7")
			$iTerm_step = GUICtrlRead($iInput_RAP) / 20
			GUICtrlSetData($iButton_shock, "Detail-Shock - OFF")
		case $msg = $iButton_StopMode And $iTerm_StopMode = 0;$msg = $iButton_StopMode
			$iTerm_StopMode = 1
			GUICtrlSetData($iButton_StopMode, "Stop Mode - ON")
		case $msg = $iButton_StopMode And $iTerm_StopMode = 1 ;$msg = $iButton_StopMode
			$iTerm_StopMode = 0
			GUICtrlSetData($iButton_StopMode, "Stop Mode - OFF")
		case $msg = $iButton_DirectlyDraw And $iTerm_DirectlyDraw = 0
			GUICtrlSetData($iButton_DirectlyDraw, "Directly-Draw - ON")
			$iTerm_DirectlyDraw = 1
		case $msg = $iButton_DirectlyDraw And $iTerm_DirectlyDraw = 1
			GUICtrlSetData($iButton_DirectlyDraw, "Directly-Draw - OFF")
			$iTerm_DirectlyDraw = 0
		case $msg = $iButton_QuickStep And $iTerm_QuckDraw = 0
			$iTerm_QuckDraw = 1
			GUICtrlSetData($iButton_QuickStep, "Quick-Step - ON")
			GUICtrlSetData($iInput_aStep, "30")
		case $msg = $iButton_QuickStep And $iTerm_QuckDraw = 1
			$iTerm_QuckDraw = 0
			GUICtrlSetData($iButton_QuickStep, "Quick-Step - OFF")
			GUICtrlSetData($iInput_aStep, "15")
		case $msg = $iButton_MoveMode And $iTerm_MoveMode = 0
			$iTerm_MoveMode = 1
			GUICtrlSetData($iButton_MoveMode, "Move-Mode - ON")
		case $msg = $iButton_MoveMode And $iTerm_MoveMode = 1
			$iTerm_MoveMode = 0
			GUICtrlSetData($iButton_MoveMode, "Move-Mode - OFF")
		case $msg = $iButton_MouseMove And $iTerm_MouseMove = 0
			$iTerm_MouseMove = 1
			GUICtrlSetData($iButton_MouseMove, "Mouse-Move - ON")
		case $msg = $iButton_MouseMove And $iTerm_MouseMove = 1
			$iTerm_MouseMove = 0
			GUICtrlSetData($iButton_MouseMove, "Mouse-Move - OFF")
		case $msg = $iButton_Reset
			$ax[0] = 0
			$ax[1] = 250
			$ax[2] = 500
			$ax[3] = $ax[1]
			;---
			$ay[0] = 250
			$ay[1] = 500
			$ay[2] = $ay[0]
			$ay[3] = 0
			GUICtrlSetData($iInput_aStep, "15")
			GUICtrlSetData($iInput_RAP, "4")
			GUICtrlSetData($iInput_XMax, "12.5")
			GUICtrlSetData($iInput_XMin, "-12.5")
			GUICtrlSetData($iInput_YMax, "12.5")
			GUICtrlSetData($iInput_YMin, "-12.5")
			GUICtrlSetData($iFunktion_Input, "")
			_GUICtrlListView_DeleteAllItems($hListView)
			_GUICtrlListView_DeleteAllItems($iList_GraphList)
			_Create_Axes()
			_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, $iX, $iY, $iW, $iH)
		case _IsPressed(01) And $iTerm_MouseMove = 1 And $mPos[0] >= 0 And $mPos[0] <= 500 And $mPos[1] >= 80 And $mPos[1] <= 580 And $iTerm_print = 1
			$mPos_old = GUIGetCursorInfo()
			while _IsPressed(01)
				$mPos = GUIGetCursorInfo()
				Select
					case $mPos[0] <> $mPos_old[0] And $mPos[1] <> $mPos_old[1]
						$iTerm = GUICtrlRead($iFunktion_Input)
						; ---
						$ax[0] = 0
						$ax[1] += ($mPos[1] - $mPos_old[1]) * 3
						$ax[2] = 500
						$ax[3] = $ax[1]
						;---
						$ay[0] -= ($mPos_old[0] - $mPos[0]) * 3
						$ay[1] = 500
						$ay[2] = $ay[0]
						$ay[3] = 0
						;---
						GUICtrlSetData($iInput_XMax, GUICtrlRead($iInput_XMin) + 25)
						GUICtrlSetData($iInput_YMax, GUICtrlRead($iInput_YMin) + 25)
						$iTerm_start = GUICtrlRead($iInput_XMin)
						$iTerm_end = GUICtrlRead($iInput_XMax)
						$iTerm_YScl = 20
						$iTerm_Step = 0.5
						$iTerm_DirectlyDraw = GUICtrlRead($iButton_DirectlyDraw)
						_Create_Axes()
						_Create_Graph()
						_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, $iX, $iY, $iW, $iH)
						$iTerm_print = 1
						$mPos_old = GUIGetCursorInfo()
				EndSelect
			WEnd
		case _IsPressed(25) Or _IsPressed(26) Or _IsPressed(27) Or _IsPressed(28) And $iTerm_print = 1 And $iTerm_MoveMode = 1
			if $iTerm_DirectlyDraw = 1 Then $iTerm_DirectlyDraw = 0
			$aStep = GUICtrlRead($iInput_aStep)
			Select
				case _IsPressed(25)
					$ay[0] += $aStep
					$ay[2] = $ay[0]
					GUICtrlSetData($iInput_XMin, GUICtrlRead($iInput_XMin) - $aStep / 20)
					GUICtrlSetData($iInput_XMax, GUICtrlRead($iInput_XMin) + 25)
				case _IsPressed(26)
					$ax[1] += $aStep
					$ax[3] = $ax[1]
					GUICtrlSetData($iInput_YMin, GUICtrlRead($iInput_YMin) + $aStep / 20)
					GUICtrlSetData($iInput_YMax, GUICtrlRead($iInput_YMin) + 25)
				case _IsPressed(27)
					$ay[0] -= $aStep
					$ay[2] = $ay[0]
					GUICtrlSetData($iInput_XMin, GUICtrlRead($iInput_XMin) + $aStep / 20)
					GUICtrlSetData($iInput_XMax, GUICtrlRead($iInput_XMin) + 25)
				case _IsPressed(28)
					$ax[1] -= $aStep
					$ax[3] = $ax[1]
					GUICtrlSetData($iInput_YMin, GUICtrlRead($iInput_YMin) - $aStep / 20)
					GUICtrlSetData($iInput_YMax, GUICtrlRead($iInput_YMin) + 25)
			EndSelect
			$iTerm_start = GUICtrlRead($iInput_XMin)
			$iTerm_end = GUICtrlRead($iInput_XMax)
			$iTerm_YScl = 20
			$iTerm_Step = GUICtrlRead($iInput_RAP) / 20
			_Create_Axes()
			_Create_Graph()
		case $msg = $iButton_SetAxes
			; ---
			$ax[0] = 0
			if GUICtrlRead($iInput_YMin) <= 0 Then $ax[1] = 500 - GUICtrlRead($iInput_YMin) * -1 * 20
			if GUICtrlRead($iInput_YMin) >= 0 Then $ax[1] = GUICtrlRead($iInput_YMin) * 20 + 500
			$ax[2] = 500
			$ax[3] = $ax[1]
			;---
			$ay[0] = GUICtrlRead($iInput_XMin) * 20 *-1
			$ay[1] = 500
			$ay[2] = $ay[0]
			$ay[3] = 0
			;---
			GUICtrlSetData($iInput_XMax, GUICtrlRead($iInput_XMin) + 25)
			GUICtrlSetData($iInput_YMax, GUICtrlRead($iInput_YMin) + 25)
			_Create_Axes()
		case $msg = $iButton_addGraphList
			$iList_ReadInput = GUICtrlRead($iFunktion_Input)
			GUICtrlCreateListViewItem($iList_ReadInput, $iList_GraphList)
		Case $msg = $iButton_delGraphList
			_GUICtrlListView_DeleteItemsSelected($iList_GraphList)
		case $msg = $iButton_cleanGraph Or $msg = $iButton_Std_nothing
			GUICtrlSetData($iFunktion_Input, "")
			_GUICtrlListView_DeleteAllItems($hListView)
			_Create_Axes()
		case $msg = $iButton_drawGraph And GUICtrlRead(GUICtrlRead($iList_GraphList)) <> ""
			$iTerm = GUICtrlRead(GUICtrlRead($iList_GraphList))
			$iTerm_Split = StringSplit($iTerm, "|")
			$iTerm = $iTerm_Split[1]
			; ---
			$ax[0] = 0
			$ax[1] = GUICtrlRead($iInput_YMin) * -1 * 20
			$ax[2] = 500
			$ax[3] = $ax[1]
			;---
			$ay[0] = GUICtrlRead($iInput_XMin) * 20 *-1
			$ay[1] = 500
			$ay[2] = $ay[0]
			$ay[3] = 0
			;---
			GUICtrlSetData($iInput_XMax, GUICtrlRead($iInput_XMin) + 25)
			GUICtrlSetData($iInput_YMax, GUICtrlRead($iInput_YMin) + 25)
			$iTerm_start = GUICtrlRead($iInput_XMin)
			$iTerm_end = GUICtrlRead($iInput_XMax)
			$iTerm_YScl = 20
			$iTerm_Step = GUICtrlRead($iInput_RAP) / 20
			$iTerm_DirectlyDraw = GUICtrlRead($iButton_DirectlyDraw)
			if GUICtrlRead($iCheck_SingleDraw) = 1 Then _Create_Axes()
			_Create_Graph()
			$iTerm_print = 1
		case $msg = $iButton_cleanList
			$MsgBox_ID = MsgBox(4, "Clean Graph List", "Delete all items?")
			if $MsgBox_ID = 6 Then
				_GUICtrlListView_DeleteAllItems($iList_GraphList)
			EndIf
		case $msg = $iButton_Std_x Or $msg = $iButton_Std_quad Or $msg = $iButton_Std_cubic Or $msg = $iButton_Std_sin Or $msg = $iButton_Std_cos Or $msg = $iButton_Std_1_x Or $msg = $iButton_Std_1_xh2
			Switch $msg
				case $iButton_Std_nothing
					GUICtrlSetData($iFunktion_Input, "")
				case $iButton_Std_x
					GUICtrlSetData($iFunktion_Input, "x")
				case $iButton_Std_quad
					GUICtrlSetData($iFunktion_Input, "x^2")
				case $iButton_Std_cubic
					GUICtrlSetData($iFunktion_Input, "x^3")
				case $iButton_Std_sin
					GUICtrlSetData($iFunktion_Input, "sin(x)")
				case $iButton_Std_cos
					GUICtrlSetData($iFunktion_Input, "cos(x)")
				case $iButton_Std_1_x
					GUICtrlSetData($iFunktion_Input, "1/x")
				case $iButton_Std_1_xh2
					GUICtrlSetData($iFunktion_Input, "1/x^2")
			EndSwitch
			$iTerm = GUICtrlRead($iFunktion_Input)
			; ---
			$ax[0] = 0
			$ax[1] = GUICtrlRead($iInput_YMin) * -1 * 20
			$ax[2] = 500
			$ax[3] = $ax[1]
			;---
			$ay[0] = GUICtrlRead($iInput_XMin) * 20 *-1
			$ay[1] = 500
			$ay[2] = $ay[0]
			$ay[3] = 0
			;---
			GUICtrlSetData($iInput_XMax, GUICtrlRead($iInput_XMin) + 25)
			GUICtrlSetData($iInput_YMax, GUICtrlRead($iInput_YMin) + 25)
			$iTerm_start = GUICtrlRead($iInput_XMin)
			$iTerm_end = GUICtrlRead($iInput_XMax)
			$iTerm_YScl = 20
			$iTerm_Step = GUICtrlRead($iInput_RAP) / 20
			$iTerm_DirectlyDraw = GUICtrlRead($iButton_DirectlyDraw)
			_Create_Axes()
			_Create_Graph()
			$iTerm_print = 1
	EndSelect
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, $iX, $iY, $iW, $iH)
WEnd
func _Create_Axes()
	_GDIPlus_GraphicsfillRect($hBuffer, 0, 0, $iW, $iH, $hBrush_white)
	_GDIPlus_GraphicsdrawRect($hBuffer, 0, 0, $iW - 1, $iH - 1)
	_GDIPlus_GraphicsDrawLine($hBuffer, $ax[0], $ax[1], $ax[2], $ax[3])
	_GDIPlus_GraphicsDrawLine($hBuffer, $ay[0], $ay[1], $ay[2], $ay[3])
	Return
EndFunc
func _Create_Graph()
	sleep(10)
	Local $iTerm_result
	$iTerm_Old = $iTerm
	GUICtrlSetColor($iStatus_lbl_Front, 0xA00000)
	GUICtrlSetData($iStatus_lbl, "Calculate...")
	$iTerm_new2 = StringRegExpReplace($iTerm, "x", $iTerm_X)
	$iTerm_result2 = Execute($iTerm_new2) * -1 * $iTerm_YScl + $ax[1]
	$iTerm_XAdd = int(int($iTerm_start) - $iTerm_Step)
	_GUICtrlListView_DeleteAllItems($hListView)
    For $iTerm_X = $iTerm_start To $iTerm_end Step +$iTerm_Step
		;X = x*20+250
		;Y = y*-1*20+250
        $iTerm_new = StringRegExpReplace($iTerm, "x", $iTerm_X)
        $iTerm_result = Execute($iTerm_new) * -1 * $iTerm_YScl + $ax[1]
		$iTerm_Xr = int($iTerm_X)
		_GDIPlus_GraphicsDrawLine($hBuffer, $iTerm_X * $iTerm_YScl + $ay[0], $iTerm_result, ($iTerm_X - $iTerm_Step) * $iTerm_YScl + $ay[0], $iTerm_result2)
		$iTerm_new2 = StringRegExpReplace($iTerm, "x", $iTerm_X)
		$iTerm_result2 = Execute($iTerm_new2) * -1 * $iTerm_YScl + $ax[1]
		if $iTerm_Xr = $iTerm_XAdd Then
			GUICtrlCreateListViewItem(round($iTerm_X) & "|" & int(Execute($iTerm_new2)), $hListView)
			$iTerm_XAdd += 1
		EndIf
		switch $iTerm_DirectlyDraw
			case 1
				_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, $iX, $iY, $iW, $iH)
		EndSwitch
		switch $iTerm_StopMode
			case 1
				if GUIGetMsg() = $iButton_Stop Then
					GUICtrlSetData($iStatus_lbl, "Aborted...")
					GUICtrlSetColor($iStatus_lbl_Front, 0x00A000)
					Return
				EndIf
			EndSwitch
    Next
	GUICtrlSetData($iStatus_lbl, "Complete and wait...")
	GUICtrlSetColor($iStatus_lbl_Front, 0x00A000)
	Return
EndFunc