;-- TIME_STAMP   2019-04-21 16:49:05   v 0.1

#include-once

Global Const $LVIS_VISIBLE = 0x1000, $LVIS_CHECKED = 0x2000

; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlListView_GetItemAttributes
; Description ...: Determines the specified status of all items
; Syntax ........: _GUICtrlListView_GetItemAttributes($hWnd, $iState)
; Parameters ....: $hWnd                - Control ID/Handle to the control
;                  $iState              - Status to be determined - can be linked with BitOR
; Return values .: Success: 1D-Array with the status of all items
;                           $aStates[$n] > 0 - if $iState = True
;                           $aStates[$n] = 0 - if $iState = False
; ...............: Failure: False and set @error to 1
; Author ........: Bitnugger
; Modified ......:
; Remarks .......: This special function uses _GUICtrlListView_GetItemEx and _GUICtrlListView_IsItemVisible (undocumented)!!!
;                  UDF-Flags  : $LVIS_CUT (0x0004), $LVIS_DROPHILITED (0x0008), $LVIS_FOCUSED (0x0001),
;                               $LVIS_OVERLAYMASK (0x0F00), $LVIS_SELECTED (0x0002), $LVIS_STATEIMAGEMASK (0xF000)
;                  User-Flags : $LVIS_VISIBLE (0x1000), $LVIS_CHECKED (0x2000) (Added by Bitnugger!!!)
; Related .......: _GUICtrlListView_GetItemChecked, _GUICtrlListView_GetItemCut, _GUICtrlListView_GetItemDropHilited,
;                  _GUICtrlListView_GetItemEx, _GUICtrlListView_GetItemFocused, _GUICtrlListView_GetItemSelected,
;                  _GUICtrlListView_GetItemState, _GUICtrlListView_IsItemVisible
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _GUICtrlListView_GetItemAttributes($hWnd, $iState)
	Local $iItemCount = _GUICtrlListView_GetItemCount($hWnd), $iStateCount = 0
	If Not $iItemCount Then Return SetError(1, 0, False)

	Local $aStates[$iItemCount], _
		$tLVITEM, $fEx = BitAND($iState, $LVIS_FOCUSED, $LVIS_SELECTED, $LVIS_CUT, $LVIS_DROPHILITED, $LVIS_OVERLAYMASK, $LVIS_STATEIMAGEMASK), _
		$bVisible, $fVisible = BitAND($iState, $LVIS_VISIBLE), $bChecked, $fChecked = BitAND($iState, $LVIS_CHECKED), $bMatch

	If $fEx Then
		$tLVITEM = DllStructCreate($tagLVITEM)
		DllStructSetData($tLVITEM, "Mask", $LVIF_STATE)
		DllStructSetData($tLVITEM, "StateMask", BitAND($iState, $LVIS_VISIBLE))
	EndIf

	For $i = 0 To $iItemCount - 1
		$bMatch = False

		If $fEx Then ; $LVIS_FOCUSED, $LVIS_SELECTED, $LVIS_CUT, $LVIS_DROPHILITED, $LVIS_OVERLAYMASK, $LVIS_STATEIMAGEMASK
			DllStructSetData($tLVITEM, "Item", $i)
			_GUICtrlListView_GetItemEx($hWnd, $tLVITEM)
			$aStates[$i] = DllStructGetData($tLVITEM, "State")
			If BitAND($fEx, $aStates[$i]) Then $bMatch = True
		EndIf

		If $fVisible Then ; $LVIS_VISIBLE
			$bVisible = _GUICtrlListView_IsItemVisible($hWnd, $i) ; NO_DOC_FUNCTION !!!
			If $bVisible Then
				$bMatch = True
				$aStates[$i] = BitOR($aStates[$i], $LVIS_VISIBLE)
			EndIf
		EndIf

		If $fChecked Then ; $LVIS_CHECKED
			$bChecked = _GUICtrlListView_GetItemChecked($hWnd, $i)
			If $bChecked Then
				$bMatch = True
				$aStates[$i] = BitOR($aStates[$i], $LVIS_CHECKED)
			EndIf
		EndIf

		If $bMatch Then $iStateCount += 1
	Next

	Return SetExtended($iStateCount, $aStates)
EndFunc  ;==>_GUICtrlListView_GetItemAttributes
