#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=SpaceBar.ico
#AutoIt3Wrapper_outfile=SpaceBar.exe
#AutoIt3Wrapper_Allow_Decompile=n
#AutoIt3Wrapper_Res_Description=SpaceBar
#AutoIt3Wrapper_Res_Fileversion=3.1.0.1
#AutoIt3Wrapper_Res_LegalCopyright=Ritzelrocker04, Oscar, Xenobiologist, Peethebee, Progandy
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; by Ritzelrocker04, Xenobiologist and Oscar
#NoTrayIcon
Opt('MustDeclareVars', 1)
;[Includes]
#include<Array.au3>
#include<GUIConstants.au3>
#include<String.au3>

If Not IsDeclared('Range') Then Const $Range = 100
If Not IsDeclared('WM_MOVING') Then Const $WM_MOVING = 0x0216
If Not IsDeclared('WM_ENTERSIZEMOVE') Then Const $WM_ENTERSIZEMOVE = 0x0231
If Not IsDeclared('WM_LBUTTONDOWN') Then Global Const $WM_LBUTTONDOWN = 0x0201
If Not IsDeclared('WM_SYSCOMMAND') Then Const $WM_SYSCOMMAND = 0x112
If Not IsDeclared('WM_RBUTTONDOWN') Then Global Const $WM_RBUTTONDOWN = 0x0204

Global $taskbarPos = WinGetPos('[CLASS:Shell_TrayWnd]'), $x_start, $y_start

Global $aFDrive = DriveGetDrive('FIXED'), $aNDrive = DriveGetDrive('NETWORK')
If IsArray($aNDrive) Then
    For $i = 1 To $aNDrive[0]
        _ArrayAdd($aFDrive, $aNDrive[$i])
        $aFDrive[0] += 1
    Next
EndIf
Global $iPosY = IniRead(@ScriptDir & '\SpaceBar.ini', 'Pos', 'iPosY', 27)
Global $bHide = IniRead(@ScriptDir & '\SpaceBar.ini', 'Pos', 'bHide', 1)

Global $aProgress[$aFDrive[0]], $aName[$aFDrive[0]], $hidden = $bHide, $icon, $msg = 0, $aVol = 0, $aPos, $aProzent[$aFDrive[0]], $aGB[$aFDrive[0]]
Global $aZwischenspeicher[$aFDrive[0]]
Global $GUI = GUICreate('SpaceBar v 3.1', 380, 8 + $aFDrive[0] * 50, @DesktopWidth - 382, $iPosY, BitOr($WS_POPUP, $WS_BORDER), BitOr($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
GUISetBKColor(0x444444); Hintergrundfarbe des Fensters

;GUICtrlCreatePic(@ScriptDir & '\bg.png',0,0,500,500)
Global $Colors = _Gradient(0x00CC00,0x00FF00, $aFDrive[0]*2)
Global $hider = GUICtrlCreateLabel(_StringRepeat(':: ', $aFDrive[0] * 4),0,0,6,10 + $aFDrive[0] * 50)
GUICtrlSetBkColor(-1, 0xBBBBBB); Hintergrundfarbe der Seiten-Leiste
Dim $k = 0
For $i = 0 To $aFDrive[0] - 1
		If DriveGetType($aFDrive[$i+1]) = "Fixed" Then $icon = -9
		If DriveGetType($aFDrive[$i+1]) = "Network" Then $icon = -10
		GUICtrlCreateIcon(@SystemDir & "\shell32.dll", $icon, 12, 2 + $i * 50, 32, 32)
    $aProgress[$i] = _ProgressCreate(52, 8 + $i * 50, 230, 20,0xAAAA00,0xFF0000,$Colors[$k],$Colors[$k+1])
    $aProzent[$i] = GUICtrlCreateLabel('', 290, 8 + $i * 50,70,20,$ES_RIGHT,$GUI_WS_EX_PARENTDRAG)
    GUICtrlSetFont(-1,9,700,0,'Arial')
    $aGB[$i] = GUICtrlCreateLabel('', 290, 30 + $i * 50,70,20,$ES_RIGHT,$GUI_WS_EX_PARENTDRAG)
    GUICtrlSetFont(-1,8,800,0,'Arial')
		GUICtrlSetColor(-1, 0xBBBBBB); Farbe der GB-Zahl
    $k+=2
    ;Func _ProgressCreate($x, $y,$w = 204, $h = 24,$Col=0xFFFF00,$BG=0xAAAA00,$GradCol=0x00FF00,$GradBG=0xFF0000)
    $aName[$i] = GUICtrlCreateLabel('', 60, 30 + $i * 50, 230, 21, $ES_READONLY)
    GUICtrlSetFont(-1,8,800,0,'Arial')
		GUICtrlSetColor(-1, 0xBBBBBB); Farbe der Beschriftung unter der Progressbar
Next
Dim $aContext = GUICtrlCreateLabel('  ',290,10,230,-2 + $aFDrive[0] * 50,-1,$GUI_WS_EX_PARENTDRAG)    ;Label for ContextMenu over the otherLabels
    GUICtrlSetState($aContext,$GUI_ONTOP)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    Global $trackmenu = GUICtrlCreateContextMenu($aContext)
        Global $aboutitem = GUICtrlCreateMenuItem('About', $trackmenu)
				Global $hideitem = GUICtrlCreateMenuItem('Hide on Start', $trackmenu, 3)
				If $bHide = 1 Then
					GUICtrlSetState($hideitem, $GUI_CHECKED)
				Else
					GUICtrlSetState($hideitem, $GUI_UNCHECKED)
				EndIf
        GUICtrlCreateMenuItem('', $trackmenu)
        Global $exititem = GUICtrlCreateMenuItem('Exit', $trackmenu)
Dim $aExit = GUICtrlCreateLabel('X',367,0,13,13,$ES_CENTER) ; Label als Exit-Button
    GUICtrlSetBkColor(-1,0xDD4444)
    GUICtrlSetColor(-1,0xFFFFFF)
    GUICtrlSetFont(-1,-1,800)
GUIRegisterMsg($WM_RBUTTONDOWN, '_RightClick')    ; Funktion, um das KontextMenu des Labels auch von der Gui aus aufzurufen
GUIRegisterMsg($WM_LBUTTONDOWN, '_WinMove')    ; Funktion, um das Fenster zu bewegen
GUIRegisterMsg($WM_ENTERSIZEMOVE, 'On_WM_ENTERSIZEMOVE') ; Docking
GUIRegisterMsg($WM_MOVING, 'On_WM_MOVING')    ; Docking

_Update()
AdlibEnable('_Update', 4000) ; Empfehlung AdlibEnable('_Update', 300000) = 5min
If $bHide = 1 Then 
	WinMove($gui,'',@DesktopWidth-8,Default)
Else
	WinMove($gui,'',@DesktopWidth-382,Default)
EndIf

GUISetState()

While 1
    $msg = GUIGetMsg()
		Select
			Case $msg = $exititem Or $msg = -3 Or $msg = -1 Or $msg = $aExit
				$aPos = WinGetPos('')
				IniWrite(@ScriptDir & '\SpaceBar.ini', 'Pos', 'iPosY', $aPos[1])
				Exit
			Case $msg = $hider
				If $hidden Then 
            WinMove($gui,'',@DesktopWidth-382,Default)
        Else
            WinMove($gui,'',@DesktopWidth-8,Default)
        EndIf
        $hidden = Not $hidden
			Case $msg = $hideitem
				If $bHide = 1 Then
					GUICtrlSetState($hideitem, $GUI_UNCHECKED)
					$bHide = 0
				Else
					GUICtrlSetState($hideitem, $GUI_CHECKED)
					$bHide = 1
				EndIf
				IniWrite(@ScriptDir & '\SpaceBar.ini', 'Pos', 'bHide', $bHide)
			Case $msg = $aboutitem
				MsgBox(64, 'About', 'SpaceBar v 3.1.0.1 Build 2007-12-18/28 ' & @CRLF & '' & @CRLF & 'In Zusammenarbeit mit: ' & @CRLF & 'Ritzelrocker04, Oscar, Xenobiologist ' & @CRLF & 'Peethebee, Progandy ' & @CRLF & 'Thx an das www.Autoit.de Team ')
		EndSelect
WEnd
    

Func _Update()
    For $i = 0 To $aFDrive[0] - 1
        $aVol = _DriveFree($aFDrive[$i + 1])
        If $aZwischenspeicher[$i] = $aVol[2] Then ContinueLoop
        $aZwischenspeicher[$i] = $aVol[2]
        ;_GuiCtrlOCXProgressSetValue($aProgress[$i], $aVol[0])
        GUICtrlSetData($aProzent[$i],StringReplace((100-$aVol[0]),'.',',') & '% frei')
        If $aVol[3]/1024 < 20.9 Then 
        Select
            Case $aVol[0] >= 60
                GUICtrlSetColor($aProzent[$i],0xDD0000)
            Case $aVol[0] < 60 And $aVol[0] > 40
                GUICtrlSetColor($aProzent[$i],0xEE8800)
            Case $aVol[0] <= 40
                GUICtrlSetColor($aProzent[$i],0x00CC00)
        EndSelect
        Else
        Select
            Case Round(Number($aVol[2])/1024) < 5
                GUICtrlSetColor($aProzent[$i],0xDD0000)
            Case Round(Number($aVol[2])/1024) <= 10
                GUICtrlSetColor($aProzent[$i],0xEE8800)
            Case Else
                GUICtrlSetColor($aProzent[$i],0x00CC00)
        EndSelect
        EndIf
        GUICtrlSetData($aGB[$i],'von ' & StringReplace(Round(($aVol[3]/1024),1),'.',',') & 'GB')
        ;_ProgressSet($aProgress[$i], 100-Number($aVol[0]))      ;100% = alles frei
        _ProgressSet($aProgress[$i], Number($aVol[0]))      ;100% = alles voll
        If @error Then MsgBox(0, $aVol[0], @error)
        GUICtrlSetData($aName[$i], 'Auf ' & $aVol[1] & ' sind ' & _StringAddComma(StringReplace($aVol[2],'.',','),'.',',') & ' MB frei')
        
    Next
EndFunc   ;==>_Update

Func _DriveFree($LW)
    Local $TOTAL = DriveSpaceTotal($LW), $FREE = DriveSpaceFree($LW), $aDrive[4] = [(Round(($TOTAL - $FREE) / ($TOTAL / 100), 2)), _
            StringUpper($LW) & ' (' & DriveGetLabel($LW) & ')', Round($FREE, 2), $TOTAL]
    Return $aDrive
EndFunc   ;==>_DriveFree

;-------------------------------------------------------------------
#region Moving and Docking
Func _WinMove($HWnd, $Command, $wParam, $lParam)
    If BitAND(WinGetState($HWnd), 32) Then Return $GUI_RUNDEFMSG
    DllCall('user32.dll', 'long', 'SendMessage', 'hwnd', $HWnd, 'int', $WM_SYSCOMMAND, 'int', 0xF009, 'int', 0)
EndFunc   ;==>_WinMove

; Author: Xenobiologist (Mega)
Func On_WM_ENTERSIZEMOVE()
    Local $aMPos = MouseGetPos()
    $x_start = $aMPos[0]
    $y_start = $aMPos[1]
EndFunc   ;==>On_WM_ENTERSIZEMOVE

; Author: Xenobiologist (Mega)
Func On_WM_MOVING($hWnd, $Msg, $wParam, $lParam)
    Local $aMPos = MouseGetPos()
    Local $rect = DllStructCreate('long left; long top; long right; long bottom', $lParam)
    Local $left = DllStructGetData($rect, 'left')
    Local $top = DllStructGetData($rect, 'top')
    Local $right = DllStructGetData($rect, 'right')
    Local $bottom = DllStructGetData($rect, 'bottom')
    If $left <= $Range And $aMPos[0] < $x_start Then
        DllStructSetData($rect, 'left', 0)
        DllStructSetData($rect, 'right', $right - $left)
    EndIf
    If $top <= $Range And $aMPos[1] < $y_start Then
        DllStructSetData($rect, 'top', 0)
        DllStructSetData($rect, 'bottom', $bottom - $top)
    EndIf
    If $right >= (@DesktopWidth - $Range) And $aMPos[0] > $x_start Then
        DllStructSetData($rect, 'right', @DesktopWidth)
        DllStructSetData($rect, 'left', (@DesktopWidth - $right) + $left)
    EndIf
    If $bottom >= ($taskbarPos[1] - $Range) And $aMPos[1] > $y_start Then
        DllStructSetData($rect, 'bottom', $taskbarPos[1])
        DllStructSetData($rect, 'top', ($taskbarPos[1] - $bottom) + $top)
    EndIf
    On_WM_ENTERSIZEMOVE()
EndFunc   ;==>On_WM_MOVING
#endregion
;-------------------------------------------------------------------

;-------------------------------------------------------------------
#region Gradient
;===============================================================================
;
; Function Name:   _Gradient($RGB_Color1 ,$RGB_Color2, $Count)
; Description::    Returns an Array of Gradient Colors
; Parameter(s):    $RGB_Color1 : The Start-Color in RGB Hexadecimal
;                  $RGB_Color2 : The End-Color in RGB Hexadecimal
;                  $Count :      The number of Colors in the Gradient
; Requirement(s):  
; Return Value(s): An Array with the Colors
; Author(s):       Prog@ndy
;
;===============================================================================
;

Func _Gradient($RGB_Color1 ,$RGB_Color2, $Count)
    Dim $Color1_R, $Color1_G, $Color1_B, $Color2_R, $Color2_G, $Color2_B, $NeuCol_R, $NeuCol_G, $NeuCol_B
    
    $Color1_R = BitAND( BitShift($RGB_Color1, 16), 0xff)
    $Color1_G = BitAND( BitShift($RGB_Color1, 8), 0xff)
    $Color1_B = BitAND($RGB_Color1, 0xff)
    
    $Color2_R = BitAND( BitShift($RGB_Color2, 16), 0xff)
    $Color2_G = BitAND( BitShift($RGB_Color2, 8), 0xff)
    $Color2_B = BitAND($RGB_Color2, 0xff)
    
    $Count -= 1 ; 0-basiert !
    Dim $arColors[$Count+1], $pos1
    
    For $i = 0 To $Count
        $pos1 = $Count - $i
        $NeuCol_R = ($Color1_R * $pos1 + $Color2_R * $i) / ($Count)
        $NeuCol_G = ($Color1_G * $pos1 + $Color2_G * $i) / ($Count)
        $NeuCol_B = ($Color1_B * $pos1 + $Color2_B * $i) / ($Count)
        $arColors[$i] = Execute('0x' & Hex($NeuCol_R,2) & Hex($NeuCol_G,2) & Hex($NeuCol_B,2))
    Next
    Return $arColors
EndFunc
#endregion
;-------------------------------------------------------------------

;-------------------------------------------------------------------
#region Colored Progressbar

;Hilfsfunktion für doppelten Verlauf
; Author(s):       Prog@ndy
Func _ZwischenGrad($RGB_c)
    Local $c_R = BitAND( BitShift($RGB_c, 16), 0xff)
    Local $c_G = BitAND( BitShift($RGB_c, 8), 0xff)
    Local $c_B = BitAND($RGB_c, 0xff)
    $c_R  = _MyMax(0,$c_R-99)
    $c_G  = _MyMax(0,$c_G-99)
    $c_B  = _MyMax(0,$c_B-99)
    Return Dec(Hex($c_R,2) & Hex($c_G,2) & Hex($c_B,2))
EndFunc

; Author(s):       Prog@ndy
Func _ProgressCreate($x, $y,$w = 204, $h = 24,$Col=0xFFFF00,$GradCol=0x00FF00,$BG=0xAAAA00,$GradBG=0xFF0000)
    Local $ID[8]
    $ID[0] = GUICtrlCreateGraphic($x,$y,$w,$h)
    Local $error = @error
    Local $extended = @extended
    $ID[1] = $w
    $ID[2] = $h
    If $Col = -1 Then $Col=0xFFFF00
    If $BG = -1 Then $BG=0xAAAA00
    If $GradCol = -1 Then $GradCol=0x00FF00
    If $GradBG = -1 Then $GradBG=0xFF0000
    $ID[3] = $Col
    $ID[4] = $BG
    $ID[5] = $GradCol
    $ID[6] = $GradBG
    _ProgressSet($ID,0)
    Return SetError($error,$extended,$ID)
EndFunc

; Author(s):       Prog@ndy
Func _ProgressDelete(ByRef $ID)
    If Not IsArray($ID) Or UBound($ID) <> 8 Then Return SetError(1,0,0)
    $ID[1] = -1
    $ID[2] = -1
    $ID[3] = -1
    $ID[4] = -1
    $ID[5] = -1
    $ID[6] = -1
    $ID[7] = -1
    Dim $temp = GUICtrlDelete($ID[0])
    Return SetError(@error,0,$temp)
EndFunc

; Author(s):       Prog@ndy
Func _ProgressSetColors(ByRef $ID,$Col,$BG=-1,$GradCol=-1,$GradBG=-1)
    If Not IsArray($ID) Or UBound($ID) <> 8 Then Return SetError(1,0,0)
    $ID[3] = $Col
    If $BG <> -1 Then  $ID[4] = $BG
    If $GradCol <> -1 Then $ID[5] = $GradCol
    If $GradBG <> -1 Then $ID[6] = $GradBG
    MsgBox(0,$ID[6],$ID[7])
    _ProgressSet($ID,$ID[7])
    Return SetError(@error,0,@error)
EndFunc

; Author(s):       Prog@ndy
Func _ProgressSet(ByRef $ID, $value)
    Local $Wechsel = Round((9/20)*$ID[2]-4)
    Local $Hoehe = $ID[2]-4
    Local $Breite = $ID[1]-4
    

    
    If $value <= $ID[7] Then
        GUICtrlSetBkColor($ID[0],0xAAAAAA)
        GUICtrlSetColor($ID[0],0x777777)
        $ID[7] = $value
        Local $temp = _ZwischenGrad($ID[6])
        Local $Gradient = _Gradient($ID[4],$temp, $Wechsel)
        Local $Gradient2 = _Gradient($temp,$ID[6], $Hoehe-$Wechsel)
        For $i = 2 To $Wechsel+1
            GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,$Gradient[$i-2])
            GUICtrlSetGraphic($ID[0],$GUI_GR_RECT, 2,$i,$Breite,1)
        Next
        For $i = $Wechsel+2 To $Hoehe+1
            GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,$Gradient2[$i-$Wechsel-2])
            GUICtrlSetGraphic($ID[0],$GUI_GR_RECT, 2,$i,$Breite,1)
        Next
        Local $start = 2
    Else
        Local $start = $ID[7]+2
        $ID[7] = $value
    EndIf

    Local $Faktor = $Breite/100
    $value *= $Faktor
    If Round($value) >= $Breite Then $value = $Breite
    Local  $temp = _ZwischenGrad($ID[5])
    Local $Gradient = _Gradient($ID[3],$temp, $Wechsel)
    Local $Gradient2 = _Gradient($temp,$ID[5], $Hoehe-$Wechsel)
    ;Local $Gradient = _Gradient(0xFFFF00,0x00AA00, $Wechsel)
    ;Local $Gradient2 = _Gradient(0x00AA00,0x00FF00, $Hoehe-$Wechsel)
    For $i = 2 To $Wechsel+1
        GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,$Gradient[$i-2])
        GUICtrlSetGraphic($ID[0],$GUI_GR_RECT, $start,$i,$value-$start+2,1)
    Next
    For $i = $Wechsel+2 To $Hoehe+1
        GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,$Gradient2[$i-$Wechsel-2])
        GUICtrlSetGraphic($ID[0],$GUI_GR_RECT, $start,$i,$value-$start+2,1)
    Next
    
    GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,0xCCCCCC)
    GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, 2,2)
    GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, 2,$Hoehe+1);19)
    GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, $Breite+1,2)
    GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, $Breite+1,$Hoehe+1)
    GUICtrlSetGraphic($ID[0],$GUI_GR_COLOR,0xEEEEEE)
    GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, 0,$Hoehe+3)
    GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, 0,0)
    GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, $Breite+3,$Hoehe+3)
    GUICtrlSetGraphic($ID[0],$GUI_GR_PIXEL, $Breite+3,0)

    GUICtrlSetGraphic($ID[0],$GUI_GR_REFRESH)
    
EndFunc

; Original _Max() Function, directly included
; Author(s):       Jeremy Landes <jlandes at landeserve dot com>
Func _MyMax($nNum1, $nNum2)
    ; Check to see if the parameters are indeed numbers of some sort.
    If (Not IsNumber($nNum1)) Then
        SetError(1)
        Return (0)
    EndIf
    If (Not IsNumber($nNum2)) Then
        SetError(2)
        Return (0)
    EndIf
    
    If $nNum1 > $nNum2 Then
        Return $nNum1
    Else
        Return $nNum2
    EndIf
EndFunc   ;==>_Max

#endregion
;-------------------------------------------------------------------

;-------------------------------------------------------------------
#region Context Menu Handlers
Func _RightClick($HWnd, $Command, $wParam, $lParam)
    ShowMenu($hWnd,$trackmenu,$aContext,1)
EndFunc


;Author: MsCreatoR in http://www.autoitscript.com/forum/index.php?s=&showtopic=60192&view=findpost&p=453350
;Modified from Help
; Show a menu in a given GUI window which belongs to a given GUI ctrl
Func ShowMenu($hWnd, $nContextID, $nContextControlID, $iMouse=0)
    Local $hMenu = GUICtrlGetHandle($nContextID)
    Local $iCtrlPos = ControlGetPos($hWnd, '', $nContextControlID)
   
    Local $X = $iCtrlPos[0]
    Local $Y = $iCtrlPos[1] + $iCtrlPos[3]
   
    ClientToScreen($hWnd, $X, $Y)
   
    If $iMouse Then
        $X = MouseGetPos(0)
        $Y = MouseGetPos(1)
    EndIf
   
    DllCall('user32.dll', 'int', 'TrackPopupMenuEx', 'hwnd', $hMenu, 'int', 0, 'int', $X, 'int', $Y, 'hwnd', $hWnd, 'ptr', 0)
EndFunc

; Convert the client (GUI) coordinates to screen (desktop) coordinates
;From Help
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
    Local $stPoint = DllStructCreate('int;int')
   
    DllStructSetData($stPoint, 1, $x)
    DllStructSetData($stPoint, 2, $y)

    DllCall('user32.dll', 'int', 'ClientToScreen', 'hwnd', $hWnd, 'ptr', DllStructGetPtr($stPoint))
   
    $x = DllStructGetData($stPoint, 1)
    $y = DllStructGetData($stPoint, 2)
    ; release Struct not really needed as it is a local
    $stPoint = 0
EndFunc    
#endregion
;-------------------------------------------------------------------