#include-once
; version 2005/01/18 - 1
; ------------------------------------------------------------------------------
;
; AutoIt Version: 3.0
; Language:       English
; Description:    Function to create a simple menu of items to choose from
;
; ==============================================================================
; VERSION       DATE       DESCRIPTION
; -----------------------------------------------------------------------------
; v1.0.00    01/18/20045   Initial release
; ------------------------------------------------------------------------------
;===============================================================================
;
; Description:      Creates a simple menu from which a user can select one or more items
; Parameter(s):     $iRtn -  The maximum number of items you want the user to select  eg 1   D = Add number of days to the given date
;                          $sTxt - Text to instruct user what to do
;                                      This can be up to 20 lines long - just split lines up using @CRLF or @LF or @CR
;                         $sItem0, $sItem1,,,$sItem19 - These are the menu items - you can use up to 20 items
; Requirement(s):   None
; Return Value(s):  Returns an array eg $selected
;                          $selected[0] = number of items selected. This set to Zero if user just exits the GUI
;                          $selected[1] = 1st item selected
;                          $selected[2] = 2nd item selected  etc.
; Author(s):         Steve Hassall
; Note(s):           If a menu item or a line of text is greater that the width of the maximum GUI size then
;                        that line will not display at all.
;
; Examples of use - put menu.au3 in the includes directory in AutoIt directory
;  #include 
;	$x = _menu(1,"Choose a colour","red","blue","green","yellow")
;			Here, only 1 item is returned - if user chose "blue"
;   $x[1] = "blue"
;
;   $x = _menu(1,"This computer cannot be migrated to the domain"  & @CRLF & "This could be due to"  & @CRLF & _
;         "1 - you are not logged on with an account with appropriate permissions"  & @CRLF & _
;         "2 - the computer account has been disabled"  & @CRLF & _
;         "3 - the computer account has not been created"  & @CRLF & @CRLF &_
;         "Please choose form the following options","Pause script and add create conputer account in domain",_
;         "Rename computer then continue script","Exit script and remove all script files","Try migrating again")
;===============================================================================
If Not IsDeclared('WS_CLIPSIBLINGS') Then Global $WS_CLIPSIBLINGS = 0x04000000
If Not IsDeclared('$WS_OVERLAPPEDWINDOW') Then Global $WS_OVERLAPPEDWINDOW = 0x00CF0000
If Not IsDeclared('$WS_VISIBLE') Then Global $WS_VISIBLE = 0x10000000
If Not IsDeclared('$GUI_EVENT_CLOSE') Then Global $GUI_EVENT_CLOSE = -3
Func _Menu($iRtn, $sTxt, $sItem0 = "", $sItem1 = "", $sItem2 = "", $sItem3 = "", $sItem4 = "", $sItem5 = "", $sItem6 = "", $sItem7 = "", $sItem8 = "", $sItem9 = "", $sItem10 = "", $sItem11 = "", $sItem12 = "", $sItem13 = "", $sItem14 = "", $sItem15 = "", $sItem16 = "", $sItem17 = "", $sItem18 = "", $sItem19 = "")
   Local $Max_item_lgth = 0
   Local $iMenuItems = 0
   Local $iTextItems = 1
   Local $menu[20]
   Local $text[20]
   Local $GUI_X
   Local $GUI_Y
   Local $chk
   Local $scaler = 5.8
   If $iRtn = 0 Or $iRtn = "" Or IsNumber($iRtn) = 0 Or $iRtn > 20 Then $iRtn = 1
   If $iRtn = 1 Then
      Local $sTiptext = "Please select just 1 item"
   Else
      Local $sTiptext = "Please select up to  " & $iRtn & "  items"
   EndIf
   Local $selected[21]
   $menu[0] = $sItem0
   $menu[1] = $sItem1
   $menu[2] = $sItem2
   $menu[3] = $sItem3
   $menu[4] = $sItem4
   $menu[5] = $sItem5
   $menu[6] = $sItem6
   $menu[7] = $sItem7
   $menu[8] = $sItem8
   $menu[9] = $sItem9
   $menu[10] = $sItem10
   $menu[11] = $sItem11
   $menu[12] = $sItem12
   $menu[13] = $sItem13
   $menu[14] = $sItem14
   $menu[15] = $sItem15
   $menu[16] = $sItem16
   $menu[17] = $sItem17
   $menu[18] = $sItem18
   $menu[19] = $sItem19
   ;===============================================================================
   ;Get number of items for the menu and check for maximum length of text used
   For $x = 19 To 0 Step - 1
      If $iMenuItems = 0 Then
         If $menu[$x] <> "" Then
            $iMenuItems = $x + 1
         EndIf
      EndIf
      If StringLen($menu[$x]) > $Max_item_lgth Then $Max_item_lgth = StringLen($menu[$x])
   Next
   ;===============================================================================
   ;Size the GUI - part 1
   If @DesktopWidth > ( ($Max_item_lgth * $scaler) + 60) Then
      $GUI_X = ( ($Max_item_lgth * $scaler) + 60)
   Else
      $GUI_X =
   EndIf
   ;===============================================================================
   ;check for number of lines of text used and the lonest line of text
   $sTxt = StringReplace($sTxt, @CRLF, "*@@@@*")
   $sTxt = StringReplace($sTxt, @LF, "*@@@@*")
   $sTxt = StringReplace($sTxt, @CR, "*@@@@*")
   $Max_item_lgth = 0
   For $x = 0 To 19
      $y = StringInStr($sTxt, "*@@@@*")
      If $y = 0 Then
         $text[$x] = $sTxt
         If StringLen($text[$x]) > $Max_item_lgth Then $Max_item_lgth = StringLen($text[$x])
         $iTextItems = $x + 1
         ExitLoop
      Else
         $text[$x] = StringLeft($sTxt, $y - 1)
         If StringLen($text[$x]) > $Max_item_lgth Then $Max_item_lgth = StringLen($text[$x])
         $sTxt = StringTrimLeft($sTxt, $y + 5)
      EndIf
   Next
   ;===============================================================================
   ;Size the GUI - part 2
   If $GUI_X < ( ($Max_item_lgth * $scaler) + 60) Then $GUI_X = ( ($Max_item_lgth * $scaler) + 60)
   If $GUI_X > @DesktopWidth - 20 Then $GUI_X = @DesktopWidth - 20
   If $GUI_X < 180 Then $GUI_X = 180
   ;===============================================================================
   ;Get height of GUI
   $GUI_Y = 115 + $iTextItems * 13 + $iMenuItems * 20
   If $GUI_Y > @DesktopHeight - 60 Then
      $GUI_Y = @DesktopHeight - 60
      $iTextItems = INT( ($GUI_Y - 115 - ($iMenuItems * 20)) / 13)
   EndIf
   ;===============================================================================
   ;Write out the GUI
   GUICreate("MyGUI", $GUI_X, $GUI_Y, (@DesktopWidth - $GUI_X) / 2, (@DesktopHeight - $GUI_Y) / 2, $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS)
   $Button_1 = GUICtrlCreateButton("OK", ( ($GUI_X - 150) * 2) / 3 + 75, $GUI_Y - 45, 75, 25)
   $Button_2 = GUICtrlCreateButton("Quit", ($GUI_X - 150) / 3, $GUI_Y - 45, 75, 25)
   For $x = 0 To $iTextItems - 1
      GUICtrlCreateLabel($text[$x], 30, ($x + 1) * 13 + 20, $GUI_X - 60, 13)
   Next
   If $iMenuItems > 0 Then
      $Checkbox_0 = GUICtrlCreateCheckbox($menu[0], 40, 45 + $iTextItems * 13, $GUI_X + 80, 20)
      GUICtrlSetTip($Checkbox_0, $stiptext)
   EndIf
   For $x = 1 To $iMenuItems - 1
      GUICtrlCreateCheckbox($menu[$x], 40, 45 + $iTextItems * 13 + $x * 20, $GUI_X + 80, 20)
      GUICtrlSetTip(-1, $stiptext)
   Next
   GUISetState()
   While 1
      $msg = GUIGetMsg()
      Select
         Case $msg = $Button_1
            ;===============================================================================
            ;check if correct number of items has been selected
            $chk = 0
            $selected = 0
            Local $selected[21]
            For $x = 0 To 19
               If $iMenuItems > $x Then
                  If GUICtrlRead($Checkbox_0 + $x) = 1 Then
                     $chk = $chk + 1
                     $selected[$chk] = $menu[$x]
                     $selected[0] = $chk
                  EndIf
               EndIf
            Next
            If $chk = 0 Then $selected[0] = 0
            If $chk > $iRtn Then
               If $iRtn = 1 Then
                  MsgBox(0, "Error", "You are required to select only 1 item" & @CRLF & @CRLF & "Please deselect some item(s)")
               Else
                  MsgBox(0, "Error", "You are required to select up to  " & $iRtn & "  items" & @CRLF & @CRLF & "Please deselect some items")
               EndIf
            Else
               ExitLoop
            EndIf
         Case $msg = $Button_2
            $selected[0] = 0
            ExitLoop
         Case $msg = $GUI_EVENT_CLOSE
            $selected[0] = 0
            ExitLoop
         Case Else
      EndSelect
   WEnd
   Return $selected
EndFunc   ;==>_Menu