;===============================================================================
;
; Description:      Показывает все иконки в указанном файле
; Requirement(s):   Autoit 3.0.103+
; Author(s):        YDY (Lazycat)
;
;===============================================================================

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

; Установка переменных
Global $g_aidIcons[30], $g_aidLabels[30]
Global $g_iStartIndex = 1
Global $g_sFilename = @SystemDir & "\shell32.dll" ; По умолчанию файл "shell32.dll"
Global $g_iOrdinal = -1

Global $g_iPrev

_Main()

Func _Main()
	Local $hGui, $iFile, $iFileSel, $iNext, $iToggle
	Local $iMsg, $sCurFilename, $sTmpFile, $iCurIndex

	; Создаёт GUI и элементы
	$hGui = GUICreate("Выбор иконки в порядке номеров", 385, 435, @DesktopWidth / 2 - 192, _
			@DesktopHeight / 2 - 235, -1, $WS_EX_ACCEPTFILES)
	GUICtrlCreateGroup("", 5, 1, 375, 40)
	GUICtrlCreateGroup("", 5, 50, 375, 380)
	$iFile = GUICtrlCreateInput($g_sFilename, 12, 15, 325, 16, -1, $WS_EX_STATICEDGE)
	GUICtrlSetState(-1, $GUI_DROPACCEPTED)
	GUICtrlSetTip(-1, "Вы можете перетаскивать файлы из оболочки сюда...")
	$iFileSel = GUICtrlCreateButton("...", 345, 14, 26, 18)
	$g_iPrev = GUICtrlCreateButton("Предыдущий", 10, 45, 90, 24, $BS_FLAT)
	GUICtrlSetState(-1, $GUI_DISABLE)
	$iNext = GUICtrlCreateButton("Следующий", 105, 45, 90, 24, $BS_FLAT)
	$iToggle = GUICtrlCreateButton("По имени", 280, 45, 90, 24, $BS_FLAT)

	; Этот код создаёт два массива идентификаторов иконок и надписей (label) для облегчения обновления
	For $iCntRow = 0 To 4
		For $iCntCol = 0 To 5
			$iCurIndex = $iCntRow * 6 + $iCntCol
			$g_aidIcons[$iCurIndex] = GUICtrlCreateIcon($g_sFilename, $g_iOrdinal * ($iCurIndex + 1), _
					60 * $iCntCol + 25, 70 * $iCntRow + 80)
			$g_aidLabels[$iCurIndex] = GUICtrlCreateLabel($g_iOrdinal * ($iCurIndex + 1), _
					60 * $iCntCol + 11, 70 * $iCntRow + 115, 60, 20, $SS_CENTER)
		Next
	Next

	GUISetState()

	While 1
		$iMsg = GUIGetMsg()
		; Код ниже проверяет, брошен ли файл в поле ввода (или выбран ли)
		$sCurFilename = GUICtrlRead($iFile)
		If $sCurFilename <> $g_sFilename Then
			$g_iStartIndex = 1
			$g_sFilename = $sCurFilename
			_GUIUpdate()
		EndIf
		; Основная конструкция "Select", выполняющая другие события
		Select
			Case $iMsg = $iFileSel
				$sTmpFile = FileOpenDialog("Выберите файл:", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "Исполняемые или библиотеки (*.exe;*.dll;*.ocx;*.icl)")
				If @error Then ContinueLoop
				GUICtrlSetData($iFile, $sTmpFile); GUI обновляется со следующего шага цикла
			Case $iMsg = $g_iPrev
				$g_iStartIndex = $g_iStartIndex - 30
				_GUIUpdate()
			Case $iMsg = $iNext
				$g_iStartIndex = $g_iStartIndex + 30
				_GUIUpdate()
			Case $iMsg = $iToggle
				If $g_iOrdinal = -1 Then
					$g_iOrdinal = 1
					GUICtrlSetData($iToggle, "По порядку")
					WinSetTitle($hGui, "", "Выбор иконки по именам")
				Else
					$g_iOrdinal = -1
					GUICtrlSetData($iToggle, "По имени")
					WinSetTitle($hGui, "", "Выбор иконки в порядке номеров")
				EndIf
				_GUIUpdate()
			Case $iMsg = $GUI_EVENT_CLOSE
				Exit
		EndSelect
	WEnd
EndFunc   ;==>_Main

; Обычное обновление GUI значков, надписей и установка состояния кнопки "Предыдущий"
Func _GUIUpdate()
	Local $iCurIndex
	For $iCntRow = 0 To 4
		For $iCntCol = 0 To 5
			$iCurIndex = $iCntRow * 6 + $iCntCol
			GUICtrlSetImage($g_aidIcons[$iCurIndex], $g_sFilename, $g_iOrdinal * ($iCurIndex + $g_iStartIndex))
			If $g_iOrdinal = -1 Then
				GUICtrlSetData($g_aidLabels[$iCurIndex], -($iCurIndex + $g_iStartIndex))
			Else
				GUICtrlSetData($g_aidLabels[$iCurIndex], '"' & ($iCurIndex + $g_iStartIndex) & '"')
			EndIf
		Next
	Next
	; Это потому, что мы не хотим, отрицательные значения
	If $g_iStartIndex = 1 Then
		GUICtrlSetState($g_iPrev, $GUI_DISABLE)
	Else
		GUICtrlSetState($g_iPrev, $GUI_ENABLE)
	EndIf
EndFunc   ;==>_GUIUpdate
