5804 lines
218 KiB
AutoIt
5804 lines
218 KiB
AutoIt
#include-once
|
|
|
|
; #INDEX# ============================================================================================================
|
|
; Title .........: GUIListViewEx
|
|
; AutoIt Version : 3.3.10 +
|
|
; Language ......: English
|
|
; Description ...: Permits insertion, deletion, moving, dragging, sorting, editing and colouring of items within ListViews
|
|
; Remarks .......: - It is important to use _GUIListViewEx_Close when a enabled ListView is deleted to free the memory used
|
|
; by the $aGLVEx_Data array which shadows the ListView contents.
|
|
; - _GUIListViewEx_EventMonitor must be placed in the script idel loop if editing or using colour
|
|
; - Windows message handlers required:
|
|
; - WM_NOTIFY: All UDF functions
|
|
; - WM_MOUSEMOVE and WM_LBUTTONUP: Only needed if dragging
|
|
; - WM_SYSCOMMAND: Permits immediate [X] GUI closure while editing
|
|
; - If the script already has WM_NOTIFY, WM_MOUSEMOVE, WM_LBUTTONUP or WM_SYSCOMMAND handlers then only set
|
|
; unregistered messages in _GUIListViewEx_MsgRegister and call the relevant _GUIListViewEx_WM_#####_Handler
|
|
; from within the existing handler
|
|
; - Uses 2 undocumented functions within GUIListView UDF to set and colour insert mark (thanks rover)
|
|
; - Enabling user colours significantly slows ListView redrawing
|
|
; Author ........: Melba23
|
|
; Credits .......: martin (basic drag code), Array.au3 authors (array functions), KaFu and ProgAndy (font function)
|
|
; LarsJ (colouring code)
|
|
; ====================================================================================================================
|
|
|
|
;#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
|
|
|
|
; #INCLUDES# =========================================================================================================
|
|
#include <GuiListView.au3>
|
|
#include <GUIImageList.au3>
|
|
#include <WinAPISys.au3>
|
|
|
|
; #GLOBAL VARIABLES# =================================================================================================
|
|
; Array to hold registered ListView data
|
|
Global $aGLVEx_Data[1][26] = [[0, 0, -1, "", -1, -1, -1, -1, _WinAPI_GetSystemMetrics(2), False, _
|
|
- 1, -1, False, "", 0, True, 0, -1, -1, 0, 0, 0, 0, "08"]]
|
|
; [0][0] = ListView Count [n][0] = ListView handle
|
|
; [0][1] = Active Index [n][1] = Native ListView ControlID / 0
|
|
; [0][2] = Active Column [n][2] = Shadow array
|
|
; [0][3] = Row Depth [n][3] = Shadow array count element (0/1) & 2D return (+ 2)
|
|
; [0][4] = Curr ToolTip Row [n][4] = Sort status
|
|
; [0][5] = Curr ToolTip Col [n][5] = Drag image flag
|
|
; [0][6] = Prev ToolTip Row [n][6] = Checkbox array flag
|
|
; [0][7] = Prev ToolTip Col [n][7] = Editable columns data
|
|
; [0][8] = VScrollbar width [n][8] = Editable header flag
|
|
; [0][9] = SysClose flag [n][9] = Continue edit on click flag
|
|
; [0][10] = RtClick Row [n][10] = Item depth for scrolling
|
|
; [0][11] = RtClick Col [n][11] = Do not "select all" on edit flag
|
|
; [0][12] = Colour Handler Flag [n][12] = Drag/drop status flag
|
|
; [0][13] = Active Colour Array [n][13] = Header drag style flag
|
|
; [0][14] = Curr Redraw Handle [n][14] = Edit width array
|
|
; [0][15] = Allow Redraw Flag [n][15] = ToolTip column range
|
|
; [0][16] = KeyCode [n][16] = ToolTip display time
|
|
; [0][17] = Active Row [n][17] = ToolTip mode
|
|
; [0][18] = Active Column [n][18] = Colour array
|
|
; [0][19] = Sort Flag [n][19] - Colour flag
|
|
; [0][20] = Curr header handle [n][20] - Active row
|
|
; [0][21] = Curr header font [n][21] - Active column
|
|
; [0][22] = Colour redraw flag [n][22] - Single cell flag
|
|
; [0][23] = Start edit keycode [n][23] - Default user colours
|
|
; [0][24] = Separator char [n][24] - Header colour flag (handle)
|
|
; [n][25] - Header data array
|
|
|
|
; Variables for UDF handlers
|
|
Global $hGLVEx_SrcHandle, $cGLVEx_SrcID, $iGLVEx_SrcIndex, $aGLVEx_SrcArray, $aGLVEx_SrcColArray
|
|
Global $hGLVEx_TgtHandle, $cGLVEx_TgtID, $iGLVEx_TgtIndex, $aGLVEx_TgtArray, $aGLVEx_TgtColArray
|
|
Global $iGLVEx_Dragging = 0, $iGLVEx_DraggedIndex, $hGLVEx_DraggedImage = 0, $sGLVEx_DragEvent
|
|
Global $iGLVEx_InsertIndex = -1, $iGLVEx_LastY, $fGLVEx_BarUnder
|
|
; Variables for UDF edit
|
|
Global $hGLVEx_Editing, $cGLVEx_EditID = 9999, $fGLVEx_EditClickFlag = 0, $fGLVEx_HeaderEdit = False
|
|
; Flags for user selection indication
|
|
Global $fGLVEx_SelChangeFlag = 0, $fGLVEx_UserSelFlag = 0
|
|
; Predefined user colours [Normal text, normal field, selected cell text, selected cell field] - BGR
|
|
Global $aGLVEx_DefColours[4] = ["0x000000", "0xFEFEFE", "0xFFFFFF", "0xCC6600"]
|
|
|
|
; #CURRENT# ==========================================================================================================
|
|
; _GUIListViewEx_Init: Enables UDF functions for the ListView and sets various flags
|
|
; _GUIListViewEx_Close: Disables all UDF functions for the specified ListView and clears all memory used
|
|
; _GUIListViewEx_SetActive: Set specified ListView as active for non-specific UDF functions
|
|
; _GUIListViewEx_GetActive: Get index number of active ListView for non-specific UDF functions
|
|
; _GUIListViewEx_ReadToArray: Creates an array from the current ListView content to be loaded in _Init function
|
|
; _GUIListViewEx_ReturnArray: Returns an array of the current content, checkbox state, colour of the ListView
|
|
; _GUIListViewEx_SaveListView: Saves ListView header data, ListView content, checkbox state and colour data to file
|
|
; _GUIListViewEx_LoadListView: Loads ListView header data, ListView content, checkbox state and colour data from file
|
|
; _GUIListViewEx_Up: Moves selected row(s) in active ListView up 1 row
|
|
; _GUIListViewEx_Down: Moves selected row(s) in active ListView down 1 row
|
|
; _GUIListViewEx_Insert: Inserts data in row below selected row in active ListView
|
|
; _GUIListViewEx_InsertSpec: Inserts data in specified row in specified ListView
|
|
; _GUIListViewEx_Delete: Deletes selected row(s) in active ListView
|
|
; _GUIListViewEx_DeleteSpec: Deletes specified row(s) in specified ListView
|
|
; _GUIListViewEx_InsertCol: Inserts blank column to right of selected column in active ListView
|
|
; _GUIListViewEx_InsertColSpec: Inserts specified blank column in specified ListView
|
|
; _GUIListViewEx_DeleteCol: Deletes selected column in active ListView
|
|
; _GUIListViewEx_DeleteColSpec: Deletes specified column in specified ListView
|
|
; _GUIListViewEx_SortCol: Sort specified column in specified ListView
|
|
; _GUIListViewEx_SetEditStatus: Sets edit on doubleclick mode for specified column(s)
|
|
; _GUIListViewEx_SetEditKey: Sets key(s) required to begin edit of selected item
|
|
; _GUIListViewEx_EditItem: Manual edit of specified ListView item
|
|
; _GUIListViewEx_EditWidth: Set required widths for column edit/combo when editing
|
|
; _GUIListViewEx_ChangeItem: Programatic change of specified ListView item
|
|
; _GUIListViewEx_LoadHdrData: Sets header title, text and back colour (if enabled), and sets edit mode (if enabled)
|
|
; _GUIListViewEx_EditHeader: Manual edit of specified ListView header
|
|
; _GUIListViewEx_LoadColour: Uses array to set text/back colours for user colour enabled ListViews
|
|
; _GUIListViewEx_SetDefColours: Sets default colours for user colour/single cell select enabled ListViews
|
|
; _GUIListViewEx_SetColour: Sets text and/or back colour for user colour enabled ListViews
|
|
; _GUIListViewEx_BlockReDraw: Prevents ListView redrawing during looped Insert/Delete/Change calls
|
|
; _GUIListViewEx_UserSort: Sets user defined function to sort specified columns
|
|
; _GUIListViewEx_GetLastSelItem: Get last selected item in active or specified ListView
|
|
; _GUIListViewEx_ContextPos: Returns LV index and row/col of last right click
|
|
; _GUIListViewEx_ToolTipInit: Defines column(s) which will display a tooltip when clicked
|
|
; _GUIListViewEx_EventMonitor: Check for edit, sort, drag/drop and tooltip events - auto colour redraw - returns event results
|
|
; _GUIListViewEx_MsgRegister: Registers Windows messages required for the UDF
|
|
; _GUIListViewEx_WM_NOTIFY_Handler: Windows message handler for WM_NOTIFY - needed for all UDF functions
|
|
; _GUIListViewEx_WM_MOUSEMOVE_Handler: Windows message handler for WM_MOUSEMOVE - needed for drag
|
|
; _GUIListViewEx_WM_LBUTTONUP_Handler: Windows message handler for WM_LBUTTONUP - needed for drag
|
|
; _GUIListViewEx_WM_SYSCOMMAND_Handler: Windows message handler for WM_SYSCOMMAND - speeds GUI closure when editing
|
|
; ====================================================================================================================
|
|
|
|
; #INTERNAL_USE_ONLY#=================================================================================================
|
|
; __GUIListViewEx_ExpandRange: Expands ranges into an array of values
|
|
; __GUIListViewEx_HighLight: Highlights specified ListView item and ensures it is visible
|
|
; __GUIListViewEx_GetLVFont: Gets font details for ListView to be edited
|
|
; __GUIListViewEx_EditProcess: Runs ListView editing process
|
|
; __GUIListViewEx_EditCoords: Ensures item in view then locates and sizes edit control
|
|
; __GUIListViewEx_ReWriteLV: Deletes all ListView content and refills to match array
|
|
; __GUIListViewEx_GetLVCoords: Gets screen coords for ListView
|
|
; __GUIListViewEx_GetCursorWnd: Gets handle of control under the mouse cursor
|
|
; __GUIListViewEx_Array_Add: Adds a specified value at the end of an array
|
|
; __GUIListViewEx_Array_Insert: Adds a value at the specified index of an array
|
|
; __GUIListViewEx_Array_Delete: Deletes a specified index from an array
|
|
; __GUIListViewEx_Array_Swap: Swaps specified elements within an array
|
|
; __GUIListViewEx_ToolTipHide: Called by Adlib to hide tooltip displayed by _GUIListViewEx_ToolTipShow
|
|
; __GUIListViewEx_MakeString: Convert data/check/colour arrays to strings for saving
|
|
; __GUIListViewEx_MakeArray: Convert data/check/colour strings to arrays for loading
|
|
; __GUIListViewEx_ColSort: Sort columns even if colour enabled
|
|
; __GUIListViewEx_RedrawWindow: Redraw ListView after update
|
|
; __GUIListViewEx_CheckUserEditKey: Check keys pressed in ListView
|
|
; ====================================================================================================================
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_Init
|
|
; Description ...: Enables UDF functions for the ListView and sets various flags
|
|
; Syntax.........: _GUIListViewEx_Init($hLV, [$aArray = ""[, $iStart = 0[, $iColour[, $fImage[, $iAdded]]]]])
|
|
; Parameters ....: $hLV - Handle or ControlID of ListView
|
|
; $aArray - Name of array used to fill ListView. "" for empty ListView
|
|
; $iStart - 0 = ListView data starts in [0] element of array (default)
|
|
; 1 = Count in [0] element
|
|
; $iColour - RGB colour for insert mark (default = black)
|
|
; $fImage - True = Shadow image of dragged item when dragging
|
|
; False = No shadow image (default)
|
|
; $iAdded - 0 - No added features (default). To get added features add any of the following values
|
|
; + 1 - Sortable by clicking on column headers
|
|
; + 2 - Do not "select all" when editing item text
|
|
; + 4 - Continue edit within same ListView by triple mouse-click on editable column
|
|
; + 8 - Headers editable by Ctrl-click (only if column editable)
|
|
; + 16 - User coloured header
|
|
; + 32 - User coloured items
|
|
; + 64 - No external drag
|
|
; + 128 - No external drop
|
|
; + 256 - No delete on external drag/drop
|
|
; + 512 - No internal or external drag/drop
|
|
; + 1024 - Single cell highlight (forces single row selection)
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Index number of ListView for use in other GUIListViewEx functions
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - If the ListView is the only one enabled, it is automatically set as active
|
|
; - If no array is passed a shadow array is created automatically
|
|
; - The $iStart parameter determines if a count element will be returned by other GUIListViewEx functions
|
|
; - The _GUIListViewEx_ReadToArray function will read an existing ListView into an array
|
|
; - Only first item of a multiple selection is shadow imaged when dragging (API limitation)
|
|
; - Use the _GUIListViewEx_SetEditStatus function to make columns editable
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_Init($hLV, $aArray = "", $iStart = 0, $iColour = 0, $fImage = False, $iAdded = 0)
|
|
|
|
Local $iLV_Index = 0
|
|
|
|
; See if there is a blank line available in the array
|
|
For $i = 1 To $aGLVEx_Data[0][0]
|
|
If $aGLVEx_Data[$i][0] = 0 Then
|
|
$iLV_Index = $i
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
; If no blank line found then increase array size
|
|
If $iLV_Index = 0 Then
|
|
$aGLVEx_Data[0][0] += 1
|
|
ReDim $aGLVEx_Data[$aGLVEx_Data[0][0] + 1][UBound($aGLVEx_Data, 2)]
|
|
$iLV_Index = $aGLVEx_Data[0][0]
|
|
EndIf
|
|
|
|
; Store ListView handle and ControlID (if it exists)
|
|
If IsHWnd($hLV) Then
|
|
$aGLVEx_Data[$iLV_Index][0] = $hLV
|
|
$aGLVEx_Data[$iLV_Index][1] = 0
|
|
Else
|
|
$aGLVEx_Data[$iLV_Index][0] = GUICtrlGetHandle($hLV)
|
|
$aGLVEx_Data[$iLV_Index][1] = $hLV
|
|
EndIf
|
|
|
|
; Store separator char
|
|
$aGLVEx_Data[0][24] = Opt("GUIDataSeparatorChar")
|
|
|
|
; Store ListView content in shadow array
|
|
$aGLVEx_Data[$iLV_Index][2] = _GUIListViewEx_ReadToArray($hLV, 1)
|
|
|
|
;Set no selected row or column
|
|
$aGLVEx_Data[$iLV_Index][20] = -1
|
|
$aGLVEx_Data[$iLV_Index][21] = -1
|
|
|
|
; Store array count flag
|
|
$aGLVEx_Data[$iLV_Index][3] = $iStart
|
|
; Store 1D/2D array return type flag
|
|
If IsArray($aArray) Then
|
|
If UBound($aArray, 0) = 2 Then $aGLVEx_Data[$iLV_Index][3] += 2
|
|
EndIf
|
|
|
|
; Create and store editable array
|
|
Local $aEditable[4][UBound($aGLVEx_Data[$iLV_Index][2], 2)]
|
|
$aGLVEx_Data[$iLV_Index][7] = $aEditable
|
|
|
|
; Set insert mark colour after conversion to BGR
|
|
_GUICtrlListView_SetInsertMarkColor($hLV, BitOR(BitShift(BitAND($iColour, 0x000000FF), -16), BitAND($iColour, 0x0000FF00), BitShift(BitAND($iColour, 0x00FF0000), 16)))
|
|
; If drag image required
|
|
If $fImage Then
|
|
$aGLVEx_Data[$iLV_Index][5] = 1
|
|
EndIf
|
|
|
|
; If sortable, store sort array
|
|
If BitAND($iAdded, 1) Then
|
|
Local $aLVSortState[_GUICtrlListView_GetColumnCount($hLV)]
|
|
$aGLVEx_Data[$iLV_Index][4] = $aLVSortState
|
|
Else
|
|
$aGLVEx_Data[$iLV_Index][4] = 0
|
|
EndIf
|
|
|
|
; If do not "select all" on opening edit
|
|
If BitAND($iAdded, 2) Then
|
|
; Set flag
|
|
$aGLVEx_Data[$iLV_Index][11] = 1
|
|
EndIf
|
|
|
|
; If continue edit on click
|
|
If BitAND($iAdded, 4) Then
|
|
; Set flag
|
|
$aGLVEx_Data[$iLV_Index][9] = 1
|
|
EndIf
|
|
|
|
; If header editable on Ctrl-click set flag
|
|
If BitAND($iAdded, 8) Then
|
|
$aGLVEx_Data[$iLV_Index][8] = 1
|
|
EndIf
|
|
|
|
; Create default header data array
|
|
Local $iCols = _GUICtrlListView_GetColumnCount($hLV)
|
|
Local $aHdrData[4][$iCols], $aRet
|
|
; If user coloured headers
|
|
If BitAND($iAdded, 16) Then
|
|
; Get header handle to act as flag
|
|
Local $hHeader = _GUICtrlListView_GetHeader($hLV)
|
|
$aGLVEx_Data[$iLV_Index][24] = $hHeader
|
|
; Read in current header titles
|
|
For $i = 0 To $iCols - 1
|
|
$aRet = _GUICtrlListView_GetColumn($hLV, $i)
|
|
$aHdrData[0][$i] = $aRet[5]
|
|
Next
|
|
EndIf
|
|
; Store array
|
|
$aGLVEx_Data[$iLV_Index][25] = $aHdrData
|
|
|
|
; Load default colours
|
|
$aGLVEx_Data[$iLV_Index][23] = $aGLVEx_DefColours
|
|
; If user coloured items
|
|
If BitAND($iAdded, 32) Then
|
|
Local $aColArray = $aGLVEx_Data[$iLV_Index][2]
|
|
For $i = 1 To UBound($aColArray, 1) - 1
|
|
For $j = 0 To UBound($aColArray, 2) - 1
|
|
$aColArray[$i][$j] = ";"
|
|
Next
|
|
Next
|
|
$aGLVEx_Data[$iLV_Index][18] = $aColArray
|
|
; Set user colour flag
|
|
$aGLVEx_Data[$iLV_Index][19] = 1
|
|
EndIf
|
|
|
|
; If no external drag
|
|
If BitAND($iAdded, 64) Then
|
|
$aGLVEx_Data[$iLV_Index][12] = 1
|
|
EndIf
|
|
|
|
; If no external drop
|
|
If BitAND($iAdded, 128) Then
|
|
$aGLVEx_Data[$iLV_Index][12] += 2
|
|
EndIf
|
|
|
|
; If no delete on external drag/drop
|
|
If BitAND($iAdded, 256) Then
|
|
$aGLVEx_Data[$iLV_Index][12] += 4
|
|
EndIf
|
|
|
|
; If no drag/drop
|
|
If BitAND($iAdded, 512) Then
|
|
$aGLVEx_Data[$iLV_Index][12] += 8 + 2 ; Force no external drop
|
|
EndIf
|
|
|
|
; If single cell selection
|
|
If BitAND($iAdded, 1024) Then
|
|
; Force single selection style
|
|
Local $iStyle = _WinAPI_GetWindowLong($aGLVEx_Data[$iLV_Index][0], $GWL_STYLE)
|
|
_WinAPI_SetWindowLong($aGLVEx_Data[$iLV_Index][0], $GWL_STYLE, BitOR($iStyle, $LVS_SINGLESEL))
|
|
; Set flag
|
|
$aGLVEx_Data[$iLV_Index][22] = 1
|
|
; Load default colours
|
|
$aGLVEx_Data[$iLV_Index][23] = $aGLVEx_DefColours
|
|
EndIf
|
|
|
|
; If checkbox extended style
|
|
If BitAND(_GUICtrlListView_GetExtendedListViewStyle($hLV), 4) Then ; $LVS_EX_CHECKBOXES
|
|
$aGLVEx_Data[$iLV_Index][6] = 1
|
|
EndIf
|
|
|
|
; If header drag extended style
|
|
If BitAND(_GUICtrlListView_GetExtendedListViewStyle($hLV), 0x00000010) Then ; $LVS_EX_HEADERDRAGDROP
|
|
$aGLVEx_Data[$iLV_Index][13] = 1
|
|
EndIf
|
|
|
|
; Measure item depth for scroll - if empty reset when filled later
|
|
Local $aRect = _GUICtrlListView_GetItemRect($aGLVEx_Data[$iLV_Index][0], 0)
|
|
$aGLVEx_Data[$iLV_Index][10] = $aRect[3] - $aRect[1]
|
|
|
|
; If only 1 current ListView then activate
|
|
Local $iListView_Count = 0
|
|
For $i = 1 To $iLV_Index
|
|
If $aGLVEx_Data[$i][0] Then $iListView_Count += 1
|
|
Next
|
|
If $iListView_Count = 1 Then _GUIListViewEx_SetActive($iLV_Index)
|
|
|
|
; Return ListView index
|
|
Return $iLV_Index
|
|
|
|
EndFunc ;==>_GUIListViewEx_Init
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_Close
|
|
; Description ...: Disables all UDF functions for the specified ListView and clears all memory used
|
|
; Syntax.........: _GUIListViewEx_Close($iLV_Index)
|
|
; Parameters ....: $iLV_Index - Index number of ListView to close as returned by _GUIListViewEx_Init
|
|
; 0 (default) = Closes all ListViews
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 1
|
|
; Failure: 0 and @error set to 1 - Invalid index number
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_Close($iLV_Index = 0)
|
|
|
|
Local $iEditKeyCode
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, 0)
|
|
|
|
If $iLV_Index = 0 Then
|
|
; Reinitialise data array - retaining selected edit key
|
|
$iEditKeyCode = $aGLVEx_Data[0][23]
|
|
Global $aGLVEx_Data[1][UBound($aGLVEx_Data, 2)] = [[0, 0, -1, "", -1, -1, -1, -1, _WinAPI_GetSystemMetrics(2), False, _
|
|
- 1, -1, False, "", 0, True, 0, -1, -1, 0, 0, 0, 0, $iEditKeyCode]]
|
|
; Note delimiter character reset when ListView next initialised
|
|
Else
|
|
; Reset all data for ListView
|
|
For $i = 0 To UBound($aGLVEx_Data, 2) - 1
|
|
$aGLVEx_Data[$iLV_Index][$i] = 0
|
|
Next
|
|
|
|
; Cancel active index if set to this ListView
|
|
If $aGLVEx_Data[0][1] = $iLV_Index Then
|
|
$aGLVEx_Data[0][1] = 0
|
|
EndIf
|
|
|
|
EndIf
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_Close
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_SetActive
|
|
; Description ...: Set specified ListView as active for non-specific UDF functions
|
|
; Syntax.........: _GUIListViewEx_SetActive($iLV_Index)
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; An index of 0 clears any current setting
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Returns previous active index number, 0 = no previously active ListView
|
|
; Failure: -1 and @error set to 1 - Invalid index number
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: ListViews can also be activated by clicking on them
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_SetActive($iLV_Index)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, -1)
|
|
|
|
Local $iCurr_Index = $aGLVEx_Data[0][1]
|
|
|
|
If $iLV_Index Then
|
|
; Store index of specified ListView
|
|
$aGLVEx_Data[0][1] = $iLV_Index
|
|
; Set values for specified ListView
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
Else
|
|
; Clear active index
|
|
$aGLVEx_Data[0][1] = 0
|
|
$hGLVEx_SrcHandle = 0
|
|
$cGLVEx_SrcID = 0
|
|
EndIf
|
|
|
|
Return $iCurr_Index
|
|
|
|
EndFunc ;==>_GUIListViewEx_SetActive
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_GetActive
|
|
; Description ...: Get index number of ListView active for non-specific UDF functions
|
|
; Syntax.........: _GUIListViewEx_GetActive()
|
|
; Parameters ....: None
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Index number as returned by _GUIListViewEx_Init, 0 = no active ListView
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_GetActive()
|
|
|
|
Return $aGLVEx_Data[0][1]
|
|
|
|
EndFunc ;==>_GUIListViewEx_GetActive
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_ReadToArray
|
|
; Description ...: Creates an array from the current ListView content to be loaded in _Init function
|
|
; Syntax.........: _GUIListViewEx_ReadToArray($hLV[, $iCount = 0])
|
|
; Parameters ....: $hLV - ControlID or handle of ListView
|
|
; $iCount - 0 (default) = ListView data starts in [0] element of array, 1 = Count in [0] element
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 2D array of current ListView content
|
|
; Empty string if ListView empty and no count element
|
|
; Failure: Returns null string and sets @error as follows:
|
|
; 1 = Invalid ListView ControlID or handle
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - Note that this function requires the handle/ControlID of the ListView, not the UDF index
|
|
; - If returned array is used in _GUIListViewEx_Init the $iStart parameters must match in the 2 functions
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_ReadToArray($hLV, $iStart = 0)
|
|
|
|
Local $aLVArray = "", $aRow
|
|
|
|
; Use the ListView handle
|
|
If Not IsHWnd($hLV) Then
|
|
$hLV = GUICtrlGetHandle($hLV)
|
|
If Not IsHWnd($hLV) Then
|
|
Return SetError(1, 0, "")
|
|
EndIf
|
|
EndIf
|
|
; Get ListView row count
|
|
Local $iRows = _GUICtrlListView_GetItemCount($hLV)
|
|
; Get ListView column count
|
|
Local $iCols = _GUICtrlListView_GetColumnCount($hLV)
|
|
; Check for empty ListView with no count
|
|
If ($iRows + $iStart <> 0) And $iCols <> 0 Then
|
|
; Create 2D array to hold ListView content and add count - count overwritten if not needed
|
|
Local $aLVArray[$iRows + $iStart][$iCols] = [[$iRows]]
|
|
; Read ListView content into array
|
|
For $i = 0 To $iRows - 1
|
|
; Read the row content
|
|
$aRow = _GUICtrlListView_GetItemTextArray($hLV, $i)
|
|
For $j = 1 To $aRow[0]
|
|
; Add to the ListView content array
|
|
$aLVArray[$i + $iStart][$j - 1] = $aRow[$j]
|
|
Next
|
|
Next
|
|
Else
|
|
Local $aLVArray[1][1] = [[0]]
|
|
EndIf
|
|
; Return array or empty string
|
|
Return $aLVArray
|
|
|
|
EndFunc ;==>_GUIListViewEx_ReadToArray
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_ReturnArray
|
|
; Description ...: Returns an array reflecting the current content of an activated ListView
|
|
; Syntax.........: _GUIListViewEx_ReturnArray($iLV_Index[, $iMode])
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; $iMode - 0 = Content of ListView
|
|
; 1 - State of the checkboxes
|
|
; 2 - User colours (if initialised)
|
|
; 3 - Content of ListView forced to 2D for saving
|
|
; 4 - ListView header titles
|
|
; 5 - Header colours (if initialised)
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of current ListView content - _GUIListViewEx_Init parameters determine:
|
|
; For modes 0/1:
|
|
; Count in [0]/[0][0] element if $iStart = 1 when intialised
|
|
; 1D/2D array type - as array used to initialise
|
|
; If no array passed then single col => 1D; multiple column => 2D
|
|
; For mode 2/3
|
|
; Always 0-based 2D array
|
|
; For mode 4/5
|
|
; Always 0-based 1D array
|
|
; Failure: Returns empty string and sets @error as follows:
|
|
; 1 = Invalid index number
|
|
; 2 = Empty array (no items in ListView)
|
|
; 3 = $iMode set to 1 but no checkbox style
|
|
; 4 = $iMode set to 2 but user colours not initialised
|
|
; 5 = $iMode set to 5 but header colours not initialised
|
|
; 6 = Invalid $iMode
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: Colours returned as "text;back" - empty values use default colours
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_ReturnArray($iLV_Index, $iMode = 0)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 1 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, "")
|
|
; Get ListView handle
|
|
Local $hLV = $aGLVEx_Data[$iLV_Index][0]
|
|
; Get column order
|
|
Local $aColOrder = StringSplit(_GUICtrlListView_GetColumnOrder($hLV), $aGLVEx_Data[0][24])
|
|
; Extract array and get size
|
|
Local $aData_Colour = $aGLVEx_Data[$iLV_Index][2]
|
|
Local $iDim_1 = UBound($aData_Colour, 1), $iDim_2 = UBound($aData_Colour, 2)
|
|
Local $aCheck[$iDim_1], $aHeader[$iDim_2], $aHdrData
|
|
|
|
; Adjust array depending on mode required
|
|
Switch $iMode
|
|
Case 0, 3 ; Content
|
|
; Array already filled
|
|
|
|
Case 1 ; Checkbox state
|
|
If $aGLVEx_Data[$iLV_Index][6] Then
|
|
For $i = 1 To $iDim_1 - 1
|
|
$aCheck[$i] = _GUICtrlListView_GetItemChecked($hLV, $i - 1)
|
|
Next
|
|
; Remove count element if required
|
|
If BitAND($aGLVEx_Data[$iLV_Index][3], 1) = 0 Then
|
|
; Delete count element
|
|
__GUIListViewEx_Array_Delete($aCheck, 0)
|
|
EndIf
|
|
Return $aCheck
|
|
Else
|
|
Return SetError(3, 0, "")
|
|
EndIf
|
|
|
|
Case 2 ; Colour values
|
|
If $aGLVEx_Data[$iLV_Index][19] Then
|
|
; Load colour array
|
|
$aData_Colour = $aGLVEx_Data[$iLV_Index][18]
|
|
; Convert to RGB
|
|
For $i = 0 To UBound($aData_Colour, 1) - 1
|
|
For $j = 0 To UBound($aData_Colour, 2) - 1
|
|
$aData_Colour[$i][$j] = StringRegExpReplace($aData_Colour[$i][$j], "0x(.{2})(.{2})(.{2})", "0x$3$2$1")
|
|
Next
|
|
Next
|
|
$aData_Colour[0][0] = $iDim_1 - 1
|
|
Else
|
|
Return SetError(4, 0, "")
|
|
EndIf
|
|
|
|
Case 4 ; Headers
|
|
If $aGLVEx_Data[$iLV_Index][24] Then
|
|
; Header colour enabled, so read from header data
|
|
$aHdrData = $aGLVEx_Data[$iLV_Index][25]
|
|
For $i = 0 To $iDim_2 - 1
|
|
$aHeader[$i] = $aHdrData[0][$i]
|
|
Next
|
|
Else
|
|
; Read normal headers
|
|
Local $aRet
|
|
For $i = 0 To $iDim_2 - 1
|
|
$aRet = _GUICtrlListView_GetColumn($hLV, $i)
|
|
$aHeader[$i] = $aRet[5]
|
|
Next
|
|
EndIf
|
|
|
|
Case 5 ; Header colours
|
|
If $aGLVEx_Data[$iLV_Index][24] Then
|
|
; Header colour enabled, so read from header data
|
|
$aHdrData = $aGLVEx_Data[$iLV_Index][25]
|
|
For $i = 0 To $iDim_2 - 1
|
|
$aHeader[$i] = $aHdrData[1][$i]
|
|
Next
|
|
Else
|
|
Return SetError(5, 0, "")
|
|
EndIf
|
|
|
|
Case Else
|
|
Return SetError(6, 0, "")
|
|
EndSwitch
|
|
|
|
; Check if columns can be reordered
|
|
If $aGLVEx_Data[$iLV_Index][13] Then
|
|
Switch $iMode
|
|
Case 0, 2, 3 ; 2D data/colour array
|
|
; Create temp array
|
|
Local $aData_Colour_Ordered[$iDim_1][$iDim_2]
|
|
; Fill temp array in correct column order
|
|
$aData_Colour_Ordered[0][0] = $aData_Colour[0][0]
|
|
For $i = 1 To $iDim_1 - 1
|
|
For $j = 0 To $iDim_2 - 1
|
|
$aData_Colour_Ordered[$i][$j] = $aData_Colour[$i][$aColOrder[$j + 1]]
|
|
Next
|
|
Next
|
|
; Reset main and delete temp
|
|
$aData_Colour = $aData_Colour_Ordered
|
|
$aData_Colour_Ordered = ""
|
|
|
|
Case 4, 5 ; 1D header array
|
|
; Create return array
|
|
Local $aHeader_Ordered[$iDim_2]
|
|
; Fill return array in correct column order
|
|
For $i = 0 To $iDim_2 - 1
|
|
$aHeader_Ordered[$i] = $aHeader[$aColOrder[$i + 1]]
|
|
Next
|
|
; Return reordered array
|
|
Return $aHeader_Ordered
|
|
EndSwitch
|
|
Else
|
|
; No reordering
|
|
If $iMode = 4 Then
|
|
; Return header array
|
|
Return $aHeader
|
|
EndIf
|
|
EndIf
|
|
|
|
; Remove count element of array if required - always for colour return
|
|
Local $iCount = 1
|
|
If BitAND($aGLVEx_Data[$iLV_Index][3], 1) = 0 Or $iMode = 2 Then
|
|
$iCount = 0
|
|
; Delete count element
|
|
__GUIListViewEx_Array_Delete($aData_Colour, 0, True)
|
|
EndIf
|
|
|
|
; Now check if 1D array to be returned - always 2D for colour return and forced content
|
|
If BitAND($aGLVEx_Data[$iLV_Index][3], 2) = 0 And $iMode < 2 Then
|
|
If UBound($aData_Colour, 1) = 0 Then
|
|
Local $aData_Colour[0]
|
|
Else
|
|
; Get number of 2D elements
|
|
Local $iCols = UBound($aData_Colour, 2)
|
|
; Create 1D array - count will be overwritten if not needed
|
|
Local $aData_Colour_1D[UBound($aData_Colour)] = [$aData_Colour[0][0]]
|
|
; Fill with concatenated lines
|
|
For $i = $iCount To UBound($aData_Colour_1D) - 1
|
|
Local $aLine = ""
|
|
For $j = 0 To $iCols - 1
|
|
$aLine &= $aData_Colour[$i][$j] & $aGLVEx_Data[0][24]
|
|
Next
|
|
$aData_Colour_1D[$i] = StringTrimRight($aLine, 1)
|
|
Next
|
|
; Reset array
|
|
$aData_Colour = $aData_Colour_1D
|
|
EndIf
|
|
EndIf
|
|
|
|
; Return array
|
|
Return $aData_Colour
|
|
|
|
EndFunc ;==>_GUIListViewEx_ReturnArray
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_SaveListView
|
|
; Description ...: Saves ListView header data, ListView content, checkbox state and colour data to file
|
|
; Syntax.........: _GUIListViewEx_SaveListView($iLV_Index, $sFileName)
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; $sFileName - File in which to save data
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 1
|
|
; Failure: 0 and sets @error as follows:
|
|
; 1 = Invalid index number
|
|
; 2 = File not written - @extended set:
|
|
; 1 = File not opened
|
|
; 2 = Data not written
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_SaveListView($iLV_Index, $sFileName)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 1 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, 0)
|
|
|
|
; Get ListView parameters
|
|
Local $hLV_Handle = $aGLVEx_Data[$iLV_Index][0]
|
|
Local $iStart = BitAND($aGLVEx_Data[$iLV_Index][3], 1)
|
|
|
|
; Get header data
|
|
Local $sHeader = "", $aRet
|
|
If $aGLVEx_Data[$iLV_Index][24] Then
|
|
; Header colour enabled, so also read from header data
|
|
Local $aHdrData = $aGLVEx_Data[$iLV_Index][25]
|
|
; Create string
|
|
For $i = 0 To _GUICtrlListView_GetColumnCount($hLV_Handle) - 1
|
|
$aRet = _GUICtrlListView_GetColumn($hLV_Handle, $i)
|
|
$sHeader &= $aHdrData[0][$i] & @CR & $aRet[4] & @CR & $aHdrData[1][$i] & @CR & $aHdrData[2][$i] & @CR & $aHdrData[3][$i] & @LF
|
|
Next
|
|
Else
|
|
; Read normal headers and add blank unused elements
|
|
For $i = 0 To _GUICtrlListView_GetColumnCount($hLV_Handle) - 1
|
|
$aRet = _GUICtrlListView_GetColumn($hLV_Handle, $i)
|
|
$sHeader &= $aRet[5] & @CR & $aRet[4] & @CR & @CR & @CR & @LF
|
|
Next
|
|
EndIf
|
|
$sHeader = StringTrimRight($sHeader, 1)
|
|
; Get data/check/colour content
|
|
Local $aData = _GUIListViewEx_ReturnArray($iLV_Index, 3) ; Force 2D return
|
|
If $iStart Then
|
|
_ArrayDelete($aData, 0)
|
|
EndIf
|
|
Local $aCheck = _GUIListViewEx_ReturnArray($iLV_Index, 1)
|
|
If $iStart Then
|
|
_ArrayDelete($aCheck, 0)
|
|
EndIf
|
|
Local $aColour = _GUIListViewEx_ReturnArray($iLV_Index, 2)
|
|
|
|
; Get edit data
|
|
Local $aEditable = $aGLVEx_Data[$iLV_Index][7]
|
|
|
|
; Get sort data
|
|
Local $aSortable = $aGLVEx_Data[$iLV_Index][4]
|
|
|
|
; Convert to strings
|
|
Local $sData = "", $sCheck = "", $sColour = "", $sEditable = "", $sSortable = ""
|
|
If IsArray($aData) Then
|
|
$sData = __GUIListViewEx_MakeString($aData)
|
|
EndIf
|
|
If IsArray($aCheck) Then
|
|
$sCheck = __GUIListViewEx_MakeString($aCheck)
|
|
EndIf
|
|
If IsArray($aColour) Then
|
|
$sColour = __GUIListViewEx_MakeString($aColour)
|
|
EndIf
|
|
If IsArray($aEditable) Then
|
|
$sEditable = __GUIListViewEx_MakeString($aEditable)
|
|
EndIf
|
|
If IsArray($aSortable) Then
|
|
$sSortable = __GUIListViewEx_MakeString($aSortable)
|
|
EndIf
|
|
|
|
; Write data to file
|
|
Local $iError = 0
|
|
Local $hFile = FileOpen($sFileName, $FO_OVERWRITE)
|
|
If @error Then
|
|
$iError = 1
|
|
Else
|
|
FileWrite($hFile, $sHeader & ChrW(0xEF0F) & $sData & ChrW(0xEF0F) & $sCheck & ChrW(0xEF0F) & $sColour & ChrW(0xEF0F) & $sEditable & ChrW(0xEF0F) & $sSortable)
|
|
If @error Then
|
|
$iError = 2
|
|
EndIf
|
|
EndIf
|
|
FileClose($hFile)
|
|
|
|
If $iError Then Return SetError(2, $iError, 0)
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_SaveListView
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_LoadListView
|
|
; Description ...: Loads ListView header data, ListView content, checkbox state and colour data from file
|
|
; Syntax.........: _GUIListViewEx_LoadListView($iLV_Index, $sFileName[, $iDims = 2])
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; $sFileName - File from which to load data
|
|
; $iDims - Force 1/2D return array - normally set by initialising array
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 1
|
|
; Failure: 0 and sets @error as follows:
|
|
; 1 = Invalid index number
|
|
; 2 = Invalid $iDims parameter
|
|
; 3 = File not read
|
|
; 4 = No data to load
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_LoadListView($iLV_Index, $sFileName, $iDims = 2)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 1 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, 0)
|
|
; Check valid $iDims parameter
|
|
Switch $iDims
|
|
Case 1, 2
|
|
; OK
|
|
Case Else
|
|
Return SetError(2, 0, 0)
|
|
EndSwitch
|
|
|
|
; Get ListView parameters
|
|
Local $hLV_Handle = $aGLVEx_Data[$iLV_Index][0]
|
|
Local $cLV_CID = $aGLVEx_Data[$iLV_Index][1]
|
|
Local $iStart = BitAND($aGLVEx_Data[$iLV_Index][3], 1)
|
|
|
|
; Read content
|
|
Local $sContent = FileRead($sFileName)
|
|
If @error Then Return SetError(3, 0, 0)
|
|
|
|
; Split into separate sections
|
|
Local $aSplit = StringSplit($sContent, ChrW(0xEF0F), $STR_ENTIRESPLIT)
|
|
|
|
; Check there is data to load
|
|
If $aSplit[1] = "" Then Return SetError(4, 0, 0)
|
|
|
|
; Convert to arrays
|
|
Local $aHeader = __GUIListViewEx_MakeArray($aSplit[1])
|
|
Local $aData = __GUIListViewEx_MakeArray($aSplit[2])
|
|
Local $aCheck = __GUIListViewEx_MakeArray($aSplit[3])
|
|
Local $aColour = __GUIListViewEx_MakeArray($aSplit[4])
|
|
Local $aEditable = __GUIListViewEx_MakeArray($aSplit[5])
|
|
Local $aSortable = __GUIListViewEx_MakeArray($aSplit[6])
|
|
|
|
; If required, convert data and colour arrays into 2D for load
|
|
If UBound($aData, 0) = 1 Then
|
|
Local $aTempData[UBound($aData)][1]
|
|
Local $aTempCol[UBound($aData)][1]
|
|
For $i = 0 To UBound($aData) - 1
|
|
$aTempData[$i][0] = $aData[$i]
|
|
$aTempCol[$i][0] = $aColour[$i]
|
|
Next
|
|
$aData = $aTempData
|
|
$aColour = $aTempCol
|
|
EndIf
|
|
|
|
; Reset header data if required
|
|
If $aGLVEx_Data[$iLV_Index][24] Then
|
|
; Create and fill header data array
|
|
Local $aHdrData[4][UBound($aHeader, 2)]
|
|
For $i = 0 To UBound($aHeader) - 1
|
|
$aHdrData[0][$i] = $aHeader[$i][0]
|
|
$aHdrData[1][$i] = $aHeader[$i][2]
|
|
$aHdrData[2][$i] = $aHeader[$i][3]
|
|
$aHdrData[3][$i] = $aHeader[$i][4]
|
|
Next
|
|
; Store array
|
|
$aGLVEx_Data[$iLV_Index][25] = $aHdrData
|
|
EndIf
|
|
|
|
; Set no colour redraw flag and prevent any normal redraw
|
|
$aGLVEx_Data[0][12] = 1
|
|
$aGLVEx_Data[0][15] = False
|
|
_GUICtrlListView_BeginUpdate($hLV_Handle)
|
|
|
|
; Clear current content of ListView
|
|
_GUICtrlListView_DeleteAllItems($hLV_Handle)
|
|
|
|
; Check correct number of columns
|
|
Local $iCol_Count = _GUICtrlListView_GetColumnCount($hLV_Handle)
|
|
If $iCol_Count < UBound($aHeader) Then
|
|
; Add columns
|
|
For $i = $iCol_Count To UBound($aHeader) - 1
|
|
_GUICtrlListView_AddColumn($hLV_Handle, "", 100)
|
|
Next
|
|
EndIf
|
|
If $iCol_Count > UBound($aHeader) Then
|
|
; Delete columns
|
|
For $i = $iCol_Count To UBound($aHeader) Step -1
|
|
_GUICtrlListView_DeleteColumn($hLV_Handle, $i)
|
|
Next
|
|
EndIf
|
|
|
|
; Reset header titles and widths
|
|
For $i = 0 To UBound($aHeader) - 1
|
|
_GUICtrlListView_SetColumn($hLV_Handle, $i, $aHeader[$i][0], $aHeader[$i][1])
|
|
Next
|
|
|
|
; Load ListView content
|
|
If $cLV_CID Then
|
|
; Native ListView
|
|
Local $sLine, $iLastCol = UBound($aData, 2) - 1
|
|
For $i = 0 To UBound($aData) - 1
|
|
$sLine = ""
|
|
For $j = 0 To $iLastCol
|
|
$sLine &= $aData[$i][$j] & "|"
|
|
Next
|
|
GUICtrlCreateListViewItem(StringTrimRight($sLine, 1), $cLV_CID)
|
|
Next
|
|
Else
|
|
; UDF ListView
|
|
_GUICtrlListView_AddArray($hLV_Handle, $aData)
|
|
EndIf
|
|
|
|
_GUICtrlListView_EndUpdate($hLV_Handle)
|
|
|
|
; Add required count row to shadow array
|
|
_ArrayInsert($aData, 0, UBound($aData))
|
|
; Store content array
|
|
$aGLVEx_Data[$iLV_Index][2] = $aData
|
|
; Store editable array
|
|
$aGLVEx_Data[$iLV_Index][7] = $aEditable
|
|
; Store sortable array
|
|
$aGLVEx_Data[$iLV_Index][4] = $aSortable
|
|
|
|
; Set 1/2D return flag as required
|
|
$aGLVEx_Data[$iLV_Index][3] = $iStart + (($iDims = 2) ? (2) : (0))
|
|
|
|
; Reset checkboxes if required
|
|
If IsArray($aCheck) Then
|
|
; Reset checkboxes
|
|
For $i = 0 To UBound($aCheck) - 1
|
|
If $aCheck[$i] = "True" Then
|
|
_GUICtrlListView_SetItemChecked($hLV_Handle, $i, True)
|
|
EndIf
|
|
Next
|
|
EndIf
|
|
|
|
; Clear no colour redraw flag and allow normal redraw
|
|
$aGLVEx_Data[0][12] = 0
|
|
$aGLVEx_Data[0][15] = True
|
|
|
|
; Reset data colours if required
|
|
If $aGLVEx_Data[$iLV_Index][19] Then
|
|
If IsArray($aColour) Then
|
|
; Load colour
|
|
_GUIListViewEx_LoadColour($iLV_Index, $aColour)
|
|
Else
|
|
; Create empty array
|
|
$aColour = $aData
|
|
For $i = 0 To UBound($aData) - 1
|
|
For $j = 0 To UBound($aData, 2) - 1
|
|
$aColour[$i][$j] = ";"
|
|
Next
|
|
Next
|
|
$aGLVEx_Data[$iLV_Index][18] = $aColour
|
|
EndIf
|
|
EndIf
|
|
|
|
; Redraw ListView
|
|
__GUIListViewEx_RedrawWindow($iLV_Index)
|
|
|
|
; Set active
|
|
$aGLVEx_Data[0][1] = $iLV_Index
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_LoadListView
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_Up
|
|
; Description ...: Moves selected item(s) in active ListView up 1 row
|
|
; Syntax.........: _GUIListViewEx_Up()
|
|
; Parameters ....: None
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of active ListView with count in [0] element
|
|
; Failure: Returns "" and sets @error as follows:
|
|
; 1 = No ListView active
|
|
; 2 = No item selected
|
|
; 3 = Item already at top
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If multiple items are selected, only the top consecutive block is moved
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_Up()
|
|
|
|
Local $iGLVExMove_Index, $iGLVEx_Moving = 0
|
|
|
|
; Set data for active ListView
|
|
Local $iLV_Index = $aGLVEx_Data[0][1]
|
|
; If no ListView active then return
|
|
If $iLV_Index = 0 Then Return SetError(1, 0, 0)
|
|
|
|
; Load active ListView details
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
Local $fCheckBox = $aGLVEx_Data[$iLV_Index][6]
|
|
|
|
; Copy array for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
$aGLVEx_SrcColArray = $aGLVEx_Data[$iLV_Index][18]
|
|
|
|
; Create Local array for checkboxes (if no checkboxes makes no difference)
|
|
Local $aCheck_Array[UBound($aGLVEx_SrcArray)]
|
|
For $i = 1 To UBound($aCheck_Array) - 1
|
|
$aCheck_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $i - 1)
|
|
Next
|
|
|
|
; Check for selected items
|
|
Local $iIndex
|
|
; Check if colour single cell selection enabled
|
|
If $aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22] Then
|
|
; Use stored value
|
|
$iIndex = $aGLVEx_Data[$iLV_Index][20]
|
|
Else
|
|
; Check actual values
|
|
$iIndex = _GUICtrlListView_GetSelectedIndices($hGLVEx_SrcHandle)
|
|
EndIf
|
|
If $iIndex == "" Then
|
|
Return SetError(2, 0, "")
|
|
EndIf
|
|
Local $aIndex = StringSplit($iIndex, "|")
|
|
$iGLVExMove_Index = $aIndex[1]
|
|
; Check if item is part of a multiple selection
|
|
If $aIndex[0] > 1 Then
|
|
; Check for consecutive items
|
|
For $i = 1 To $aIndex[0] - 1
|
|
If $aIndex[$i + 1] = $aIndex[1] + $i Then
|
|
$iGLVEx_Moving += 1
|
|
Else
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
Else
|
|
$iGLVExMove_Index = $aIndex[1]
|
|
EndIf
|
|
|
|
; Check not top item
|
|
If $iGLVExMove_Index < 1 Then
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, 0)
|
|
Return SetError(3, 0, "")
|
|
EndIf
|
|
|
|
; Remove all highlighting
|
|
_GUICtrlListView_SetItemSelected($hGLVEx_SrcHandle, -1, False)
|
|
|
|
; Set no redraw flag - prevents problems while colour arrays are updated
|
|
$aGLVEx_Data[0][12] = True
|
|
|
|
; Move consecutive items
|
|
For $iIndex = $iGLVExMove_Index To $iGLVExMove_Index + $iGLVEx_Moving
|
|
; Swap array elements
|
|
__GUIListViewEx_Array_Swap($aGLVEx_SrcArray, $iIndex, $iIndex + 1)
|
|
__GUIListViewEx_Array_Swap($aCheck_Array, $iIndex, $iIndex + 1)
|
|
__GUIListViewEx_Array_Swap($aGLVEx_SrcColArray, $iIndex, $iIndex + 1)
|
|
Next
|
|
|
|
; Amend stored row
|
|
$aGLVEx_Data[$iLV_Index][20] -= 1
|
|
|
|
; Rewrite ListView
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_SrcHandle, $aGLVEx_SrcArray, $aCheck_Array, $iLV_Index, $fCheckBox)
|
|
|
|
; Set highlight
|
|
For $i = 0 To $iGLVEx_Moving
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, $iGLVExMove_Index + $i - 1)
|
|
Next
|
|
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][2] = $aGLVEx_SrcArray
|
|
$aGLVEx_Data[$iLV_Index][18] = $aGLVEx_SrcColArray
|
|
; Delete copied array
|
|
$aGLVEx_SrcArray = 0
|
|
$aGLVEx_SrcColArray = 0
|
|
|
|
; Clear no redraw flag
|
|
$aGLVEx_Data[0][12] = False
|
|
|
|
; If colour used or single cell selection
|
|
__GUIListViewEx_RedrawWindow($iLV_Index)
|
|
|
|
; Return amended array
|
|
Return _GUIListViewEx_ReturnArray($iLV_Index)
|
|
|
|
EndFunc ;==>_GUIListViewEx_Up
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_Down
|
|
; Description ...: Moves selected item(s) in active ListView down 1 row
|
|
; Syntax.........: _GUIListViewEx_Down()
|
|
; Parameters ....: None
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of active ListView with count in [0] element
|
|
; Failure: Returns "" and sets @error as follows:
|
|
; 1 = No ListView active
|
|
; 2 = No item selected
|
|
; 3 = Item already at bottom
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If multiple items are selected, only the bottom consecutive block is moved
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_Down()
|
|
|
|
Local $iGLVExMove_Index, $iGLVEx_Moving = 0
|
|
|
|
; Set data for active ListView
|
|
Local $iLV_Index = $aGLVEx_Data[0][1]
|
|
; If no ListView active then return
|
|
If $iLV_Index = 0 Then Return SetError(1, 0, 0)
|
|
|
|
; Load active ListView details
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
Local $fCheckBox = $aGLVEx_Data[$iLV_Index][6]
|
|
|
|
; Copy array for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
$aGLVEx_SrcColArray = $aGLVEx_Data[$iLV_Index][18]
|
|
|
|
; Create Local array for checkboxes (if no checkboxes makes no difference)
|
|
Local $aCheck_Array[UBound($aGLVEx_SrcArray)]
|
|
For $i = 1 To UBound($aCheck_Array) - 1
|
|
$aCheck_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $i - 1)
|
|
Next
|
|
|
|
; Check for selected items
|
|
Local $iIndex
|
|
; Check if colour or single cell selection enabled
|
|
If $aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22] Then
|
|
; Use stored value
|
|
$iIndex = $aGLVEx_Data[$iLV_Index][20]
|
|
Else
|
|
; Check actual values
|
|
$iIndex = _GUICtrlListView_GetSelectedIndices($hGLVEx_SrcHandle)
|
|
EndIf
|
|
If $iIndex == "" Then
|
|
Return SetError(2, 0, "")
|
|
EndIf
|
|
Local $aIndex = StringSplit($iIndex, "|")
|
|
; Check if item is part of a multiple selection
|
|
If $aIndex[0] > 1 Then
|
|
$iGLVExMove_Index = $aIndex[$aIndex[0]]
|
|
; Check for consecutive items
|
|
For $i = 1 To $aIndex[0] - 1
|
|
If $aIndex[$aIndex[0] - $i] = $aIndex[$aIndex[0]] - $i Then
|
|
$iGLVEx_Moving += 1
|
|
Else
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
Else
|
|
$iGLVExMove_Index = $aIndex[1]
|
|
EndIf
|
|
|
|
; Remove all highlighting
|
|
_GUICtrlListView_SetItemSelected($hGLVEx_SrcHandle, -1, False)
|
|
|
|
; Check not last item
|
|
If $iGLVExMove_Index = _GUICtrlListView_GetItemCount($hGLVEx_SrcHandle) - 1 Then
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, $iIndex)
|
|
Return SetError(3, 0, "")
|
|
EndIf
|
|
|
|
; Set no redraw flag - prevents problems while colour arrays are updated
|
|
$aGLVEx_Data[0][12] = True
|
|
|
|
; Move consecutive items
|
|
For $iIndex = $iGLVExMove_Index To $iGLVExMove_Index - $iGLVEx_Moving Step -1
|
|
; Swap array elements
|
|
__GUIListViewEx_Array_Swap($aGLVEx_SrcArray, $iIndex + 1, $iIndex + 2)
|
|
__GUIListViewEx_Array_Swap($aCheck_Array, $iIndex + 1, $iIndex + 2)
|
|
__GUIListViewEx_Array_Swap($aGLVEx_SrcColArray, $iIndex + 1, $iIndex + 2)
|
|
Next
|
|
|
|
; Amend stored row
|
|
$aGLVEx_Data[$iLV_Index][20] += 1
|
|
|
|
; Rewrite ListView
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_SrcHandle, $aGLVEx_SrcArray, $aCheck_Array, $iLV_Index, $fCheckBox)
|
|
|
|
; Set highlight
|
|
For $i = 0 To $iGLVEx_Moving
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, $iGLVExMove_Index - $iGLVEx_Moving + $i + 1)
|
|
Next
|
|
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][2] = $aGLVEx_SrcArray
|
|
$aGLVEx_Data[$iLV_Index][18] = $aGLVEx_SrcColArray
|
|
; Delete copied array
|
|
$aGLVEx_SrcArray = 0
|
|
$aGLVEx_SrcColArray = 0
|
|
|
|
; Clear no redraw flag
|
|
$aGLVEx_Data[0][12] = False
|
|
|
|
; If colour used or single cell selection
|
|
__GUIListViewEx_RedrawWindow($iLV_Index)
|
|
|
|
; Return amended array
|
|
Return _GUIListViewEx_ReturnArray($iLV_Index)
|
|
|
|
EndFunc ;==>_GUIListViewEx_Down
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_Insert
|
|
; Description ...: Inserts data just below selected item in active ListView - if no selection, data added at end
|
|
; Syntax.........: _GUIListViewEx_Insert($vData[, $fMultiRow = False[, $fRetainWidth = False]])
|
|
; Parameters ....: $vData - Data to insert, can be in array or delimited string format
|
|
; $fMultiRow - (Optional) If $vData is a 1D array:
|
|
; - False (default) - elements added as subitems to a single row
|
|
; - True - elements added as rows containing a single item
|
|
; Ignored if $vData is a single item or a 2D array
|
|
; $fRetainWidth - (Optional) True = native ListView column width is retained on insert
|
|
; False = native ListView columns expand to fit data (default)
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of current ListView content with count in [0] element
|
|
; Failure: If no ListView active then returns "" and sets @error to 1
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - New data is inserted after the selected item. If no item is selected then the data is added at
|
|
; the end of the ListView. If multiple items are selected, the data is inserted after the first
|
|
; - $vData can be passed in string or array format - it is automatically transformed if required
|
|
; - $vData as single item - item added to all columns
|
|
; - $vData as 1D array - see $fMultiRow above
|
|
; - $vData as 2D array - added as rows/columns
|
|
; - Native ListViews automatically expand subitem columns to fit inserted data. Setting the
|
|
; $fRetainWidth parameter resets the original width after insertion
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_Insert($vData, $fMultiRow = False, $fRetainWidth = False)
|
|
|
|
;Local $vInsert
|
|
|
|
; Set data for active ListView
|
|
Local $iLV_Index = $aGLVEx_Data[0][1]
|
|
; If no ListView active then return
|
|
If $iLV_Index = 0 Then Return SetError(1, 0, "")
|
|
|
|
; Check for selected items
|
|
Local $iIndex
|
|
; Check if colour or single cell selection enabled
|
|
If $aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22] Then
|
|
; Use stored value
|
|
$iIndex = $aGLVEx_Data[$iLV_Index][20]
|
|
Else
|
|
; Check actual values
|
|
$iIndex = _GUICtrlListView_GetSelectedIndices($hGLVEx_SrcHandle)
|
|
EndIf
|
|
Local $iInsert_Index = $iIndex
|
|
; If no selection
|
|
If $iIndex == "" Then $iInsert_Index = -1
|
|
|
|
; Check for multiple selections
|
|
If StringInStr($iIndex, "|") Then
|
|
Local $aIndex = StringSplit($iIndex, "|")
|
|
; Use first selection
|
|
$iIndex = $aIndex[1]
|
|
; Cancel all other selections
|
|
For $i = 2 To $aIndex[0]
|
|
_GUICtrlListView_SetItemSelected($hGLVEx_SrcHandle, $aIndex[$i], False)
|
|
Next
|
|
EndIf
|
|
|
|
Local $vRet = _GUIListViewEx_InsertSpec($iLV_Index, $iInsert_Index + 1, $vData, $fMultiRow, $fRetainWidth)
|
|
|
|
Return SetError(@error, 0, $vRet)
|
|
|
|
EndFunc ;==>_GUIListViewEx_Insert
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_InsertSpec
|
|
; Description ...: Inserts data in specified row in specified ListView
|
|
; Syntax.........: _GUIListViewEx_InsertSpec($iLV_Index, $iRow, $vData[, $fMultiRow = False[, $fRetainWidth = False]])
|
|
; Parameters ....: $iLV_Index - Index of ListView as returned by _GUIListViewEx_Init
|
|
; $iRow - Row which will be inserted - setting -1 adds at end
|
|
; $vData - Data to insert, can be in array or delimited string format
|
|
; $fMultiRow - (Optional) If $vData is a 1D array:
|
|
; - False (default) - elements added as subitems to a single row
|
|
; - True - elements added as rows containing a single item
|
|
; Ignored if $vData is a single item or a 2D array
|
|
; $fRetainWidth - (Optional) True = native ListView column width is retained on insert
|
|
; False = native ListView columns expand to fit data (default)
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of specified ListView content with count in [0] element
|
|
; Failure: Returns "" and sets @error to 1
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - New data is inserted after the specified row.
|
|
; - $vData can be passed in string or array format - it is automatically transformed if required
|
|
; - $vData as single item - item added to all columns
|
|
; - $vData as 1D array - see $fMultiRow above
|
|
; - $vData as 2D array - added as rows/columns
|
|
; - Native ListViews automatically expand subitem columns to fit inserted data. Setting the
|
|
; - $fRetainWidth parameter resets the original width after insertion
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_InsertSpec($iLV_Index, $iRow, $vData, $fMultiRow = False, $fRetainWidth = False)
|
|
|
|
Local $vInsert
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, "")
|
|
|
|
; Load active ListView details
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
Local $fCheckBox = $aGLVEx_Data[$iLV_Index][6]
|
|
|
|
; Copy array for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
$aGLVEx_SrcColArray = $aGLVEx_Data[$iLV_Index][18]
|
|
|
|
; Create Local array for checkboxes (if no checkboxes makes no difference)
|
|
Local $aCheck_Array[UBound($aGLVEx_SrcArray)]
|
|
For $i = 1 To UBound($aCheck_Array) - 1
|
|
$aCheck_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $i - 1)
|
|
Next
|
|
|
|
; If empty array insert at 0
|
|
If $aGLVEx_SrcArray[0][0] = 0 Then $iRow = 0
|
|
; Get data into array format for insert
|
|
If IsArray($vData) Then
|
|
$vInsert = $vData
|
|
Else
|
|
Local $aData = StringSplit($vData, $aGLVEx_Data[0][24])
|
|
Switch $aData[0]
|
|
Case 1
|
|
$vInsert = $aData[1]
|
|
Case Else
|
|
Local $vInsert[$aData[0]]
|
|
For $i = 0 To $aData[0] - 1
|
|
$vInsert[$i] = $aData[$i + 1]
|
|
Next
|
|
EndSwitch
|
|
EndIf
|
|
|
|
; Set no redraw flag - prevents problems while colour arrays are updated
|
|
$aGLVEx_Data[0][12] = True
|
|
|
|
; Insert data into arrays
|
|
If $iRow = -1 Then
|
|
__GUIListViewEx_Array_Add($aGLVEx_SrcArray, $vInsert, $fMultiRow)
|
|
__GUIListViewEx_Array_Add($aCheck_Array, $vInsert, $fMultiRow)
|
|
__GUIListViewEx_Array_Add($aGLVEx_SrcColArray, ";", $fMultiRow)
|
|
Else
|
|
__GUIListViewEx_Array_Insert($aGLVEx_SrcArray, $iRow + 1, $vInsert, $fMultiRow)
|
|
;~ ConsoleWrite("__GUIListViewEx_Array_Insert($aGLVEx_SrcArray, $iRow + 1, $vInsert, $fMultiRow)" & @CRLF )
|
|
__GUIListViewEx_Array_Insert($aCheck_Array, $iRow + 1, $vInsert, $fMultiRow)
|
|
;~ ConsoleWrite("__GUIListViewEx_Array_Insert($aCheck_Array, $iRow + 1, $vInsert, $fMultiRow" & @CRLF )
|
|
__GUIListViewEx_Array_Insert($aGLVEx_SrcColArray, $iRow + 1, ";", $fMultiRow)
|
|
;~ ConsoleWrite('__GUIListViewEx_Array_Insert($aGLVEx_SrcColArray, $iRow + 1, ";", $fMultiRow)' & @CRLF )
|
|
EndIf
|
|
|
|
; If Loop No Redraw flag set
|
|
If $aGLVEx_Data[0][15] Then
|
|
; Rewrite ListView
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_SrcHandle, $aGLVEx_SrcArray, $aCheck_Array, $iLV_Index, $fCheckBox, $fRetainWidth)
|
|
EndIf
|
|
|
|
; Set highlight
|
|
If $iRow = -1 Then
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, _GUICtrlListView_GetItemCount($hGLVEx_SrcHandle) - 1)
|
|
Else
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, $iRow)
|
|
EndIf
|
|
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][2] = $aGLVEx_SrcArray
|
|
$aGLVEx_Data[$iLV_Index][18] = $aGLVEx_SrcColArray
|
|
; Delete copied array
|
|
$aGLVEx_SrcArray = 0
|
|
$aGLVEx_SrcColArray = 0
|
|
|
|
; Clear no redraw flag
|
|
$aGLVEx_Data[0][12] = False
|
|
|
|
; If colour used or single cell selection
|
|
__GUIListViewEx_RedrawWindow($iLV_Index)
|
|
|
|
; Return amended array
|
|
Return _GUIListViewEx_ReturnArray($iLV_Index)
|
|
|
|
EndFunc ;==>_GUIListViewEx_InsertSpec
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_Delete
|
|
; Description ...: Deletes selected row(s) in active ListView
|
|
; Syntax.........: _GUIListViewEx_Delete([$vRange = ""])
|
|
; Parameters ....: $vRange - items to delete. if no parameter passed any selected items are deleted
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of active ListView content with count in [0] element
|
|
; Failure: Returns "" and sets @error as follows:
|
|
; 1 = No ListView active
|
|
; 2 = No row selected
|
|
; 3 = No items to delete
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If multiple items are selected, all are deleted
|
|
; $vRange must be semicolon-delimited with hypenated consecutive values.
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_Delete($vRange = "")
|
|
|
|
; Set data for active ListView
|
|
Local $iLV_Index = $aGLVEx_Data[0][1]
|
|
; If no ListView active then return
|
|
If $iLV_Index = 0 Then Return SetError(1, 0, "")
|
|
|
|
Local $vRet = _GUIListViewEx_DeleteSpec($iLV_Index, $vRange)
|
|
|
|
Return SetError(@error, 0, $vRet)
|
|
|
|
EndFunc ;==>_GUIListViewEx_Delete
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_DeleteSpec
|
|
; Description ...: Deletes specified row(s) in specified ListView
|
|
; Syntax.........: _GUIListViewEx_DeleteSpec($iLV_Index, $vRange = "")
|
|
; Parameters ....: $iLV_Index - Index of ListView as returned by _GUIListViewEx_Init
|
|
; $vRange - Items to delete.
|
|
; If no parameter passed any selected items are deleted
|
|
; If -1 passed last row is deleted
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of specified ListView content with count in [0] element
|
|
; Failure: Returns "" and sets @error as follows:
|
|
; 1 = Invalid ListView index
|
|
; 2 = No row selected if no range passed
|
|
; 3 = No items to delete
|
|
; 4 = Invaid range parameter
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If multiple items are selected, all are deleted
|
|
; $vRange must be semicolon-delimited with hypenated consecutive values.
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_DeleteSpec($iLV_Index, $vRange = "")
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, "")
|
|
|
|
; Load active ListView details
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
If UBound($hGLVEx_SrcHandle) = 1 Then Return SetError(3, 0, "")
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
Local $fCheckBox = $aGLVEx_Data[$iLV_Index][6]
|
|
|
|
; Copy array for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
$aGLVEx_SrcColArray = $aGLVEx_Data[$iLV_Index][18]
|
|
|
|
; Create Local array for checkboxes (if no checkboxes makes no difference)
|
|
Local $aCheck_Array[UBound($aGLVEx_SrcArray)]
|
|
For $i = 1 To UBound($aCheck_Array) - 1
|
|
$aCheck_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $i - 1)
|
|
Next
|
|
|
|
If $vRange = "-1" Then
|
|
$vRange = UBound($aGLVEx_SrcArray) - 2
|
|
EndIf
|
|
|
|
Local $iIndex, $aIndex
|
|
|
|
; Check for range
|
|
If String($vRange) <> "" Then
|
|
$aIndex = __GUIListViewEx_ExpandRange($vRange, $iLV_Index, 0) ; Rows not columns
|
|
If @error Then Return SetError(4, 0, 0)
|
|
Else
|
|
; Check if colour or single cell selection enabled
|
|
If $aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22] Then
|
|
; Use stored value
|
|
$iIndex = $aGLVEx_Data[$iLV_Index][20]
|
|
Else
|
|
; Check actual values
|
|
$iIndex = _GUICtrlListView_GetSelectedIndices($hGLVEx_SrcHandle)
|
|
EndIf
|
|
|
|
If $iIndex == "" Then
|
|
Return SetError(2, 0, "")
|
|
EndIf
|
|
; Extract all selected items
|
|
$aIndex = StringSplit($iIndex, $aGLVEx_Data[0][24])
|
|
EndIf
|
|
|
|
For $i = 1 To $aIndex[0]
|
|
; Remove highlighting from items
|
|
_GUICtrlListView_SetItemSelected($hGLVEx_SrcHandle, $i, False)
|
|
Next
|
|
|
|
; Set no redraw flag - prevents problems while colour arrays are updated
|
|
$aGLVEx_Data[0][12] = True
|
|
|
|
; Delete elements from array - start from bottom
|
|
For $i = $aIndex[0] To 1 Step -1
|
|
; Check element exists in array
|
|
If $aIndex[$i] <= UBound($aGLVEx_SrcArray) - 2 Then
|
|
__GUIListViewEx_Array_Delete($aGLVEx_SrcArray, $aIndex[$i] + 1)
|
|
__GUIListViewEx_Array_Delete($aCheck_Array, $aIndex[$i] + 1)
|
|
__GUIListViewEx_Array_Delete($aGLVEx_SrcColArray, $aIndex[$i] + 1)
|
|
EndIf
|
|
Next
|
|
|
|
; If Loop No Redraw flag set
|
|
If $aGLVEx_Data[0][15] Then
|
|
; Rewrite ListView
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_SrcHandle, $aGLVEx_SrcArray, $aCheck_Array, $iLV_Index, $fCheckBox)
|
|
; Set highlight
|
|
If $aIndex[1] = 0 Then
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, 0)
|
|
Else
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, $aIndex[1] - 1)
|
|
EndIf
|
|
EndIf
|
|
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][2] = $aGLVEx_SrcArray
|
|
$aGLVEx_Data[$iLV_Index][18] = $aGLVEx_SrcColArray
|
|
; Delete copied array
|
|
$aGLVEx_SrcArray = 0
|
|
$aGLVEx_SrcColArray = 0
|
|
|
|
; Clear no redraw flag
|
|
$aGLVEx_Data[0][12] = False
|
|
|
|
; If colour used or single cell selection
|
|
__GUIListViewEx_RedrawWindow($iLV_Index)
|
|
|
|
; Return amended array
|
|
Return _GUIListViewEx_ReturnArray($iLV_Index)
|
|
|
|
EndFunc ;==>_GUIListViewEx_DeleteSpec
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_InsertCol
|
|
; Description ...: Inserts blank column to right of selected column in active ListView
|
|
; Syntax.........: _GUIListViewEx_InsertCol([$sTitle = ""[, $iWidth = 50]])
|
|
; Parameters ....: $sTitle - (Optional) Title of column - default none
|
|
; $iWidth - (Optional) Width of new column - default = 50
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of active ListView content with count in [0] element
|
|
; Failure: If no ListView active then returns "" and sets @error to 1
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_InsertCol($sTitle = "", $iWidth = 50)
|
|
|
|
; Set data for active ListView
|
|
Local $iLV_Index = $aGLVEx_Data[0][1]
|
|
; If no ListView active then return
|
|
If $iLV_Index = 0 Then Return SetError(1, 0, "")
|
|
|
|
; Pass active column
|
|
Local $vRet = _GUIListViewEx_InsertColSpec($iLV_Index, $aGLVEx_Data[0][2] + 1, $sTitle, $iWidth)
|
|
|
|
Return SetError(@error, 0, $vRet)
|
|
|
|
EndFunc ;==>_GUIListViewEx_InsertCol
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_InsertColSpec
|
|
; Description ...: Inserts specified blank column in specified ListView
|
|
; Syntax.........: _GUIListViewEx_InsertColSpec($iLV_Index[, $iCol = -1[, $sTitle = ""[, $iWidth = 50]]])
|
|
; Parameters ....: $iLV_Index - Index of ListView as returned by _GUIListViewEx_Init
|
|
; $iCol - (Optional) Column to be be inserted - default -1 adds at right
|
|
; $sTitle - (Optional) Title of column - default none
|
|
; $iWidth - (Optional) Width of new column - default = 50
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of active ListView content with count in [0] element
|
|
; Failure: Empty string sets @error to
|
|
; 1 = Invalid ListView index
|
|
; 2 = invalid column
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_InsertColSpec($iLV_Index, $iCol = -1, $sTitle = "", $iWidth = 75)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, "")
|
|
|
|
; Load active ListView details
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
Local $fCheckBox = $aGLVEx_Data[$iLV_Index][6]
|
|
Local $fColourEnabled = $aGLVEx_Data[$iLV_Index][19]
|
|
Local $fHdrColourEnabled = $aGLVEx_Data[$iLV_Index][24], $aHdrData
|
|
|
|
; Copy arrays for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
If $fColourEnabled Then
|
|
$aGLVEx_SrcColArray = $aGLVEx_Data[$iLV_Index][18]
|
|
EndIf
|
|
Local $aEditable = $aGLVEx_Data[$iLV_Index][7]
|
|
Local $aHdrData[4][UBound($aGLVEx_SrcArray, 2)]
|
|
If $fHdrColourEnabled Then
|
|
$aHdrData = $aGLVEx_Data[$iLV_Index][25]
|
|
EndIf
|
|
|
|
; Check if valid column
|
|
Local $iMax_Col = UBound($aGLVEx_SrcArray, 2) - 1
|
|
If $iCol = -1 Then $iCol = $iMax_Col + 1
|
|
If $iCol < 0 Or $iCol > $iMax_Col + 1 Then Return SetError(2, 0, "")
|
|
|
|
; Create Local array for checkboxes (if no checkboxes makes no difference)
|
|
Local $aCheck_Array[UBound($aGLVEx_SrcArray)]
|
|
For $i = 1 To UBound($aCheck_Array) - 1
|
|
$aCheck_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $i - 1)
|
|
Next
|
|
|
|
; Set no redraw flag - prevents problems while colour arrays are updated
|
|
$aGLVEx_Data[0][12] = True
|
|
|
|
; Add column to array
|
|
ReDim $aGLVEx_SrcArray[UBound($aGLVEx_SrcArray)][UBound($aGLVEx_SrcArray, 2) + 1]
|
|
If $fColourEnabled Then
|
|
ReDim $aGLVEx_SrcColArray[UBound($aGLVEx_SrcColArray)][UBound($aGLVEx_SrcColArray, 2) + 1]
|
|
EndIf
|
|
; Move data and blank new column
|
|
For $i = 0 To UBound($aGLVEx_SrcArray) - 1
|
|
For $j = UBound($aGLVEx_SrcArray, 2) - 2 To $iCol Step -1
|
|
$aGLVEx_SrcArray[$i][$j + 1] = $aGLVEx_SrcArray[$i][$j]
|
|
If $fColourEnabled Then
|
|
$aGLVEx_SrcColArray[$i][$j + 1] = $aGLVEx_SrcColArray[$i][$j]
|
|
EndIf
|
|
Next
|
|
$aGLVEx_SrcArray[$i][$iCol] = ""
|
|
If $fColourEnabled Then
|
|
$aGLVEx_SrcColArray[$i][$iCol] = ";"
|
|
EndIf
|
|
Next
|
|
|
|
; And now for the editable columns and header data (fixed number of rows)
|
|
ReDim $aEditable[4][UBound($aEditable, 2) + 1]
|
|
ReDim $aHdrData[4][UBound($aHdrData, 2) + 1]
|
|
For $i = 0 To 3
|
|
For $j = UBound($aEditable, 2) - 2 To $iCol Step -1
|
|
$aEditable[$i][$j + 1] = $aEditable[$i][$j]
|
|
$aHdrData[$i][$j + 1] = $aHdrData[$i][$j]
|
|
Next
|
|
$aEditable[$i][$iCol] = ""
|
|
Next
|
|
; Set new column title with default data
|
|
$aHdrData[0][$iCol] = $sTitle
|
|
$aHdrData[1][$iCol] = ";"
|
|
$aHdrData[2][$iCol] = ""
|
|
$aHdrData[3][$iCol] = 0
|
|
|
|
; Store amended arrays
|
|
$aGLVEx_Data[$iLV_Index][2] = $aGLVEx_SrcArray
|
|
If $fColourEnabled Then
|
|
$aGLVEx_Data[$iLV_Index][18] = $aGLVEx_SrcColArray
|
|
EndIf
|
|
$aGLVEx_Data[$iLV_Index][7] = $aEditable
|
|
If $fHdrColourEnabled Then
|
|
$aGLVEx_Data[$iLV_Index][25] = $aHdrData
|
|
EndIf
|
|
|
|
; Add column to ListView
|
|
_GUICtrlListView_InsertColumn($hGLVEx_SrcHandle, $iCol, $sTitle, $iWidth)
|
|
|
|
; If Loop No Redraw flag set
|
|
If $aGLVEx_Data[0][15] Then
|
|
; Rewrite ListView
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_SrcHandle, $aGLVEx_SrcArray, $aCheck_Array, $iLV_Index, $fCheckBox)
|
|
EndIf
|
|
|
|
; Clear no redraw flag
|
|
$aGLVEx_Data[0][12] = False
|
|
|
|
; If colour used or single cell selection
|
|
__GUIListViewEx_RedrawWindow($iLV_Index)
|
|
|
|
; Delete copied array
|
|
$aGLVEx_SrcArray = 0
|
|
$aGLVEx_SrcColArray = 0
|
|
|
|
; Reset sort array
|
|
Local $aLVSortState[_GUICtrlListView_GetColumnCount($hGLVEx_SrcHandle)]
|
|
$aGLVEx_Data[$iLV_Index][4] = $aLVSortState
|
|
|
|
; Return amended array
|
|
Return _GUIListViewEx_ReturnArray($iLV_Index)
|
|
|
|
EndFunc ;==>_GUIListViewEx_InsertColSpec
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_DeleteCol
|
|
; Description ...: Deletes selected column in active ListView
|
|
; Syntax.........: _GUIListViewEx_DeleteCol()
|
|
; Parameters ....: None
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of active ListView content with count in [0] element
|
|
; Failure: If no ListView active then returns "" and sets @error to 1
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_DeleteCol()
|
|
|
|
; Set data for active ListView
|
|
Local $iLV_Index = $aGLVEx_Data[0][1]
|
|
; If no ListView active then return
|
|
If $iLV_Index = 0 Then Return SetError(1, 0, "")
|
|
|
|
; Delete active column
|
|
Local $vRet = _GUIListViewEx_DeleteColSpec($iLV_Index, $aGLVEx_Data[0][2])
|
|
|
|
Return SetError(@error, 0, $vRet)
|
|
|
|
EndFunc ;==>_GUIListViewEx_DeleteCol
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_DeleteColSpec
|
|
; Description ...: Deletes specified column in specified ListView
|
|
; Syntax.........: _GUIListViewEx_DeleteCol($iLV_Index[, $iCol = -1])
|
|
; Parameters ....: $iLV_Index - Index of ListView as returned by _GUIListViewEx_Init
|
|
; $iCol - (Optional) Column to delete - default -1 deletes rightmost column
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array of active ListView content with count in [0] element
|
|
; Failure: Empty string and sets @error to
|
|
; 1 = Invalid ListView index
|
|
; 2 = Invalid column
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_DeleteColSpec($iLV_Index, $iCol = -1)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, "")
|
|
|
|
; Load active ListView details
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
Local $fCheckBox = $aGLVEx_Data[$iLV_Index][6]
|
|
Local $fColourEnabled = $aGLVEx_Data[$iLV_Index][19]
|
|
Local $fHdrColourEnabled = $aGLVEx_Data[$iLV_Index][24]
|
|
|
|
; Copy array for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
If $fColourEnabled Then
|
|
$aGLVEx_SrcColArray = $aGLVEx_Data[$iLV_Index][18]
|
|
EndIf
|
|
Local $aEditable = $aGLVEx_Data[$iLV_Index][7]
|
|
Local $aHdrData[4][UBound($aGLVEx_SrcArray, 2)]
|
|
If $fHdrColourEnabled Then
|
|
$aHdrData = $aGLVEx_Data[$iLV_Index][25]
|
|
EndIf
|
|
|
|
; Check if valid column
|
|
Local $iMax_Col = UBound($aGLVEx_SrcArray, 2) - 1
|
|
If $iCol = -1 Then $iCol = $iMax_Col
|
|
If $iCol < 0 Or $iCol > $iMax_Col Then Return SetError(2, 0, "")
|
|
|
|
; Create Local array for checkboxes (if no checkboxes makes no difference)
|
|
Local $aCheck_Array[UBound($aGLVEx_SrcArray)]
|
|
For $i = 1 To UBound($aCheck_Array) - 1
|
|
$aCheck_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $i - 1)
|
|
Next
|
|
|
|
; Set no redraw flag - prevents problems while colour arrays are updated
|
|
$aGLVEx_Data[0][12] = True
|
|
|
|
; Move data
|
|
For $i = 0 To UBound($aGLVEx_SrcArray) - 1
|
|
For $j = $iCol To UBound($aGLVEx_SrcArray, 2) - 2
|
|
$aGLVEx_SrcArray[$i][$j] = $aGLVEx_SrcArray[$i][$j + 1]
|
|
If $fColourEnabled Then
|
|
$aGLVEx_SrcColArray[$i][$j] = $aGLVEx_SrcColArray[$i][$j + 1]
|
|
EndIf
|
|
Next
|
|
Next
|
|
; Resize arrays
|
|
ReDim $aGLVEx_SrcArray[UBound($aGLVEx_SrcArray)][UBound($aGLVEx_SrcArray, 2) - 1]
|
|
If $fColourEnabled Then
|
|
ReDim $aGLVEx_SrcColArray[UBound($aGLVEx_SrcColArray)][UBound($aGLVEx_SrcColArray, 2) - 1]
|
|
EndIf
|
|
; And now for the editable columns and header data (fixed number of rows)
|
|
For $i = 0 To 3
|
|
For $j = $iCol To UBound($aEditable, 2) - 2
|
|
$aEditable[$i][$j] = $aEditable[$i][$j + 1]
|
|
$aHdrData[$i][$j] = $aHdrData[$i][$j + 1]
|
|
Next
|
|
Next
|
|
ReDim $aEditable[4][UBound($aEditable, 2) - 1]
|
|
ReDim $aHdrData[4][UBound($aHdrData, 2) - 1]
|
|
|
|
; Delete column from ListView
|
|
_GUICtrlListView_DeleteColumn($hGLVEx_SrcHandle, $iCol)
|
|
|
|
; Store amended arrays
|
|
$aGLVEx_Data[$iLV_Index][2] = $aGLVEx_SrcArray
|
|
If $fColourEnabled Then
|
|
$aGLVEx_Data[$iLV_Index][18] = $aGLVEx_SrcColArray
|
|
EndIf
|
|
$aGLVEx_Data[$iLV_Index][7] = $aEditable
|
|
If $fHdrColourEnabled Then
|
|
$aGLVEx_Data[$iLV_Index][25] = $aHdrData
|
|
EndIf
|
|
|
|
; If Loop No Redraw flag set
|
|
If $aGLVEx_Data[0][15] Then
|
|
; Rewrite ListView
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_SrcHandle, $aGLVEx_SrcArray, $aCheck_Array, $iLV_Index, $fCheckBox)
|
|
EndIf
|
|
|
|
; Clear no redraw flag
|
|
$aGLVEx_Data[0][12] = False
|
|
|
|
; If colour used or single cell selection
|
|
__GUIListViewEx_RedrawWindow($iLV_Index)
|
|
|
|
; Delete copied array
|
|
$aGLVEx_SrcArray = 0
|
|
$aGLVEx_SrcColArray = 0
|
|
|
|
; Reset sort array
|
|
Local $aLVSortState[_GUICtrlListView_GetColumnCount($hGLVEx_SrcHandle)]
|
|
$aGLVEx_Data[$iLV_Index][4] = $aLVSortState
|
|
|
|
; Return amended array
|
|
Return _GUIListViewEx_ReturnArray($iLV_Index)
|
|
|
|
EndFunc ;==>_GUIListViewEx_DeleteColSpec
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_SortCol
|
|
; Description ...: Sort specified column in specified ListView
|
|
; Syntax.........: _GUIListViewEx_SortCol($iLV_Index[, $iCol = -1])
|
|
; Parameters ....: $iLV_Index - Index of ListView as returned by _GUIListViewEx_Init
|
|
; $iCol - (Optional) Column to sort - default -1 sorts active column
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 1
|
|
; Failure: 0 and sets @error to
|
|
; 1 = Invalid ListView index
|
|
; 2 = Invalid column
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_SortCol($iLV_Index, $iCol = -1)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, 0)
|
|
|
|
; Load array
|
|
Local $aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
; Check if valid column
|
|
Local $iMax_Col = UBound($aGLVEx_SrcArray, 2) - 1
|
|
If $iCol = -1 Then
|
|
; Use active column
|
|
$iCol = $aGLVEx_Data[$iLV_Index][21]
|
|
EndIf
|
|
If $iCol < 0 Or $iCol > $iMax_Col Then Return SetError(2, 0, 0)
|
|
|
|
; Load current ListView sort state array
|
|
Local $aLVSortState = $aGLVEx_Data[$iLV_Index][4]
|
|
; Sort column
|
|
__GUIListViewEx_ColSort($aGLVEx_Data[$iLV_Index][0], $iLV_Index, $aLVSortState, $iCol)
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_SortCol
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_SetEditStatus
|
|
; Description ...: Sets edit on doubleclick mode for specified column(s)
|
|
; Syntax.........: _GUIListViewEx_SetEditStatus($iLV_Index, $vCol [, $iMode = 1 , $vParam1 = Default [, $vParam2 = Default]]])
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; $vCol - Column of ListView to set (string or single number)
|
|
; All columns: "*"
|
|
; Range string example: "1;2;5-6;8-9;10" - expanded automatically
|
|
; $iMode - 0 = Not editable
|
|
; $vParam1 & $vParam2 ignored
|
|
; $iMode - 1 = Editable using manual input
|
|
; $vParam1 = 0: (default) Standard text edit
|
|
; 1: Add UpDown
|
|
; $vParam2 = Only used if $vParam set to 1
|
|
; Delimited string: "Min value|Max value|0/1" - final value 1 = UpDown wrap
|
|
; $iMode - 2 = Editable using combo
|
|
; $vParam1 = Content of combo - either delimited string or 0-based array
|
|
; $vParam2 = 0: editable combo (default); 1: readonly
|
|
; + 2 - Combo list automatically drops down on edit
|
|
; $iMode - 3 = Editable using date control
|
|
; $vParam1 = Preselected date (yyyy\MM\dd) - default current date. Trailing # for auto dropdown
|
|
; $vParam2 = Required display format for DTP control (see below) - default system date setting
|
|
; $iMode - 9 = Editable with user-defined function
|
|
; $vParam1 = Function as object
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 1
|
|
; Failure: 0 and sets @error as follows:
|
|
; 1 - Invalid ListView Index
|
|
; 2 - Invalid column parameter
|
|
; 3 - Invalid mode
|
|
; 4 - Invalid $vParam1/2 - @extended set as follows
|
|
; 11 = Mode 1: $vParam1 invalid
|
|
; 12 = Mode 1: $vParam2 invalid
|
|
; 21 = Mode 2: $vParam1 not string or array
|
|
; 22 = Mode 2: $vParam2 not boolean
|
|
; 31 = Mode 3: $vParam1 date string incorrectly formatted
|
|
; 91 = Mode 9: $vParam1 not function
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - Overrides all previous edit settings for the specified column(s).
|
|
; - Columns are non-editable by default so function only required to set editable columns
|
|
; - {ENTER} accepts edit - {TAB} accepts and moves to next cell if EditMode allows
|
|
; - {ESCAPE} abandons edit, and possibly all text edits if EditMode negative
|
|
; - Ctrl-{LEFT}{RIGHT}{UP}{DOWN} moves to next cell if EditMode allows
|
|
; - Accepts input for manual text
|
|
; - Abandons input for combo and date (because they use arrow keys to modify their data)
|
|
; - Display format string for date control uses any of following plus required punctuation/spacing:
|
|
; "d" - One/two digit day
|
|
; "dd" - Two digit day padded with leading zero if required
|
|
; "ddd" - 3-char weekday abbreviation
|
|
; "dddd" - Full weekday name
|
|
; "h" - One/two digit hour - 12-hour format
|
|
; "hh" - Two digit hour padded with leading zero if required - 12-hour format
|
|
; "H" - One/two digit hour - 24-hour format
|
|
; "HH" - Two digit hour padded with leading zero if required - 24 hour format
|
|
; "m" - One/two digit minute
|
|
; "mm" - Two digit minute padded with leading zero if required
|
|
; "M" - One/two digit month number
|
|
; "MM" - Two digit month number padded with leading zero if required
|
|
; "MMM" - 3-char month abbreviation
|
|
; "MMMM" - Full month name
|
|
; "t" - One letter AM/PM abbreviation
|
|
; "tt" - Two letter AM/PM abbreviation
|
|
; "yy" - Last two digits of year
|
|
; "yyyy" - Full year
|
|
; - User-defined function must accept 4 (and only 4) parameters:
|
|
; ListView handle, ListView index within the UDF, clicked row, clicked column
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_SetEditStatus($iLV_Index, $vCol, $iMode = 1, $vParam1 = Default, $vParam2 = Default)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 1 Or $iLV_Index > $aGLVEx_Data[0][0] Then
|
|
Return SetError(1, 0, 0)
|
|
EndIf
|
|
|
|
; Check column index
|
|
Local $aRange = __GUIListViewEx_ExpandRange($vCol, $iLV_Index)
|
|
If @error Then Return SetError(2, 0, 0)
|
|
|
|
; Extract editable array
|
|
Local $aEditable = $aGLVEx_Data[$iLV_Index][7]
|
|
|
|
Switch $iMode
|
|
Case 0, 1 ; Not editable/editable
|
|
If $vParam1 = Default Then $vParam1 = 0
|
|
If $vParam2 = Default Then $vParam2 = ""
|
|
Switch $vParam1
|
|
Case 0
|
|
If $vParam2 Then
|
|
Return SetError(4, 12, 0)
|
|
EndIf
|
|
Case 1
|
|
If $vParam2 And Not StringRegExp($vParam2, "^\d+\|\d+\|(0|1)$") Then
|
|
Return SetError(4, 12, 0)
|
|
EndIf
|
|
Case Else
|
|
Return SetError(4, 11, 0)
|
|
EndSwitch
|
|
|
|
For $i = 1 To $aRange[0]
|
|
; Set/clear status and clear any other edit data
|
|
$aEditable[0][$aRange[$i]] = $iMode
|
|
$aEditable[1][$aRange[$i]] = $vParam1
|
|
$aEditable[2][$aRange[$i]] = $vParam2
|
|
Next
|
|
|
|
Case 2
|
|
If Not (IsArray($vParam1) Or IsString($vParam1)) Then
|
|
Return SetError(4, 21, 0)
|
|
EndIf
|
|
If $vParam2 = Default Then $vParam2 = 0
|
|
Switch $vParam2
|
|
Case 0 To 3
|
|
;
|
|
Case Else
|
|
Return SetError(4, 22, 0)
|
|
EndSwitch
|
|
For $i = 1 To $aRange[0]
|
|
; Set status and combo data/format
|
|
$aEditable[0][$aRange[$i]] = 2
|
|
$aEditable[1][$aRange[$i]] = $vParam1
|
|
$aEditable[2][$aRange[$i]] = $vParam2
|
|
Next
|
|
|
|
Case 3
|
|
If $vParam1 = Default Then
|
|
$vParam1 = ""
|
|
EndIf
|
|
If Not StringRegExp($vParam1, "^(\d{4}\/\d{2}\/\d{2})?#?$") Then
|
|
Return SetError(4, 31, 0)
|
|
EndIf
|
|
If $vParam2 = Default Then
|
|
$vParam2 = ""
|
|
EndIf
|
|
For $i = 1 To $aRange[0]
|
|
; Set status and date default/format
|
|
$aEditable[0][$aRange[$i]] = 3
|
|
$aEditable[1][$aRange[$i]] = $vParam1
|
|
$aEditable[2][$aRange[$i]] = $vParam2
|
|
Next
|
|
|
|
Case 9
|
|
If Not IsFunc($vParam1) Then
|
|
Return SetError(4, 91, 0)
|
|
EndIf
|
|
For $i = 1 To $aRange[0]
|
|
; Set flag
|
|
$aEditable[0][$aRange[$i]] = 9
|
|
$aEditable[1][$aRange[$i]] = $vParam1
|
|
Next
|
|
|
|
Case Else
|
|
Return SetError(3, 0, 0)
|
|
EndSwitch
|
|
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][7] = $aEditable
|
|
|
|
; Show success
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_SetEditStatus
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_SetEditKey
|
|
; Description ...: Sets key(s) required to begin edit of selected item
|
|
; Syntax.........: _GUIListViewEx_SetEditKey([$sKey = Default])
|
|
; Parameters ....: $sKey - String of key(s): 0/1/2 modifiers (^ = Ctrl, ! = Alt) plus single main key code from _IsPressed
|
|
; Default - reset default key = BackSpace
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 1
|
|
; Failure: 0 and sets @error as follows:
|
|
; 1 - Invalid string
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: Shift key not available as modifier
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_SetEditKey($sKey = Default)
|
|
|
|
; Check for default reset
|
|
If $sKey = Default Then
|
|
$aGLVEx_Data[0][23] = "08"
|
|
Return 1
|
|
EndIf
|
|
; Check string format
|
|
If Not StringRegExp($sKey, "(?i)^([!^]){0,2}([0-9a-f]{2})$") Then
|
|
Return SetError(1, 0, 0)
|
|
EndIf
|
|
; Replace modifier(s) and store code
|
|
$aGLVEx_Data[0][23] = StringReplace(StringReplace($sKey, "^", "11;"), "!", "12;")
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_SetEditKey
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_EditItem
|
|
; Description ...: Open ListView items for editing programatically
|
|
; Syntax.........: _GUIListViewEx_EditItem($iLV_Index, $iRow, $iCol[, $iEditMode = 0[, $iDelta_X = 0[, $iDelta_Y = 0]]])
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; $iRow - Zero-based row of item to edit
|
|
; $iCol - Zero-based column of item to edit
|
|
; $iEditMode - Only used if using Edit control:
|
|
; Return after single edit - 0 (default)
|
|
; {TAB} and arrow keys move to next item - 2-digit code (row mode/column mode)
|
|
; 1 = Reaching edge terminates edit process
|
|
; 2 = Reaching edge remains in place
|
|
; 3 = Reaching edge loops to opposite edge
|
|
; Positive value = ESC abandons current edit only, previous edits remain
|
|
; Negative value = ESC resets all edits in current session
|
|
; Ignored if using Combo control - return after single edit
|
|
; $iDelta_X - Permits fine adjustment of edit control in X axis if needed
|
|
; $iDelta_Y - Permits fine adjustment of edit control in Y axis if needed
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 2D array of items edited
|
|
; - Total number of edits in [0][0] element, with each edit following:
|
|
; - [zero-based row][zero-based column][original content][new content]
|
|
; @extended set depending on key used to end edit:
|
|
; - True = {ENTER} pressed
|
|
; - False = {ESC} pressed
|
|
; Failure: Sets @error as follows:
|
|
; 1 - Invalid ListView Index
|
|
; 2 - ListView not editable
|
|
; 3 - Invalid row
|
|
; 4 - Invalid column
|
|
; 5 - Invalid edit mode
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - Once edit started, all other script activity is suspended as explained for _GUIListViewEx_EditOnClick
|
|
; - Returned array allows for verification of new value - _GUIListViewEx_ChangeItem can reset original
|
|
; - @extended value can be used to determine if to continue in a loop post-edit
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_EditItem($iLV_Index, $iRow, $iCol, $iEditMode = 0, $iDelta_X = 0, $iDelta_Y = 0)
|
|
|
|
; Activate the ListView
|
|
_GUIListViewEx_SetActive($iLV_Index)
|
|
If @error Then
|
|
Return SetError(1, 0, "")
|
|
EndIf
|
|
; Check row and col values
|
|
Local $iMax = _GUICtrlListView_GetItemCount($hGLVEx_SrcHandle)
|
|
If $iRow < 0 Or $iRow > $iMax - 1 Then
|
|
Return SetError(3, 0, "")
|
|
EndIf
|
|
$iMax = _GUICtrlListView_GetColumnCount($hGLVEx_SrcHandle)
|
|
If $iCol < 0 Or $iCol > $iMax - 1 Then
|
|
Return SetError(4, 0, "")
|
|
EndIf
|
|
; Check edit mode parameter
|
|
Switch Abs($iEditMode)
|
|
Case 0, 11, 12, 13, 21, 22, 23, 31, 32, 33 ; Single edit or both axes set to valid parameter
|
|
; Allow
|
|
Case Else
|
|
Return SetError(5, 0, "")
|
|
EndSwitch
|
|
; Declare location array
|
|
Local $aLocation[2] = [$iRow, $iCol]
|
|
; Start edit - force text edit type
|
|
Local $aEdited = __GUIListViewEx_EditProcess($iLV_Index, $aLocation, $iDelta_X, $iDelta_Y, $iEditMode, True)
|
|
; Check if edits occurred
|
|
If $aEdited[0][0] = 0 Then
|
|
$aEdited = ""
|
|
EndIf
|
|
; Determine key used to exit
|
|
Local $iKeyCode = @extended
|
|
; Wait until return key no longer pressed
|
|
_WinAPI_GetAsyncKeyState($iKeyCode)
|
|
While _WinAPI_GetAsyncKeyState($iKeyCode)
|
|
Sleep(10)
|
|
WEnd
|
|
; Unselect row
|
|
_GUICtrlListView_SetItemSelected($aGLVEx_Data[$iLV_Index][0], -1, False)
|
|
; Set extended value
|
|
SetExtended(($iKeyCode = 0x0D) ? (True) : (False))
|
|
; Return result array
|
|
Return $aEdited
|
|
|
|
EndFunc ;==>_GUIListViewEx_EditItem
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_EditWidth
|
|
; Description ...: Set required widths for column edit/combo when editing
|
|
; Syntax.........: _GUIListViewEx_EditWidth($iLV_Index, $aWidth)
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; $aWidth - Zero-based 1D array of required edit/combo widths where array index = column
|
|
; 0/Default/empty = use actual column width
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 1
|
|
; Failure: 0 and sets @error as follows:
|
|
; 1 - Invalid ListView Index
|
|
; 2 - Invalid $aWidth array
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - $aWidth will be ReDimmed to match columns - all values converted to Number datatype.
|
|
; - Negative value resizes read-only combo edit control, otherwise only dropdown resized.
|
|
; - Actual column width used if wider than set value
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_EditWidth($iLV_Index, $aWidth)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 1 Or $iLV_Index > $aGLVEx_Data[0][0] Then
|
|
Return SetError(1, 0, 0)
|
|
EndIf
|
|
; Check valid array
|
|
If (Not IsArray($aWidth)) Or (UBound($aWidth, 0) <> 1) Then Return SetError(2, 0, 0)
|
|
; Resize array
|
|
ReDim $aWidth[_GUICtrlListView_GetColumnCount($aGLVEx_Data[$iLV_Index][0])]
|
|
; Store array
|
|
$aGLVEx_Data[$iLV_Index][14] = $aWidth
|
|
|
|
EndFunc ;==>_GUIListViewEx_EditWidth
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_ChangeItem
|
|
; Description ...: Change ListView item content programatically
|
|
; Syntax.........: _GUIListViewEx_ChangeItem($iLV_Index, $iRow, $iCol, $vValue)
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; $iRow - Zero-based row of item to change
|
|
; $iCol - Zero-based column of item to change
|
|
; $vValue - Content to place in ListView item
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Success: Array of current ListView content as returned by _GUIListViewEx_ReturnArray
|
|
; Failure: Sets @error as follows:
|
|
; 1 - Invalid ListView Index
|
|
; 2 - Deprecated
|
|
; 3 - Invalid row
|
|
; 4 - Invalid column
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: This function will change content even if column is not editable
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_ChangeItem($iLV_Index, $iRow, $iCol, $vValue)
|
|
|
|
; Activate the ListView
|
|
_GUIListViewEx_SetActive($iLV_Index)
|
|
If @error Then
|
|
Return SetError(1, 0, "")
|
|
EndIf
|
|
; Check row and col values
|
|
Local $iMax = _GUICtrlListView_GetItemCount($hGLVEx_SrcHandle)
|
|
If $iRow < 0 Or $iRow > $iMax - 1 Then
|
|
Return SetError(3, 0, "")
|
|
EndIf
|
|
$iMax = _GUICtrlListView_GetColumnCount($hGLVEx_SrcHandle)
|
|
If $iCol < 0 Or $iCol > $iMax - 1 Then
|
|
Return SetError(4, 0, "")
|
|
EndIf
|
|
; Load array
|
|
Local $aData_Array = $aGLVEx_Data[$iLV_Index][2]
|
|
; Amend item text
|
|
_GUICtrlListView_SetItemText($hGLVEx_SrcHandle, $iRow, $vValue, $iCol)
|
|
; Amend array element
|
|
$aData_Array[$iRow + 1][$iCol] = $vValue
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][2] = $aData_Array
|
|
|
|
; If colour used or single cell selection
|
|
__GUIListViewEx_RedrawWindow($iLV_Index)
|
|
|
|
; Return changed array
|
|
Return _GUIListViewEx_ReturnArray($iLV_Index)
|
|
|
|
EndFunc ;==>_GUIListViewEx_ChangeItem
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_LoadHdrData
|
|
; Description ...: Sets header title, text and back colour (if enabled), edit mode (if enabled), and width resizing mode
|
|
; Syntax.........: _GUIListViewEx_LoadHdrData($iLV_Index, $aHdrData)
|
|
; Parameters ....: $iLV_Index - Index of ListView
|
|
; $aColArray - 0-based 4-row 2D array containing titles, semicolon delimited colour strings in RGB hex, edit settings, resize settings
|
|
; [0][ColIndex] = Title - only needed if headers colour enabled
|
|
; [1][ColIndex] = Colour strings in RGB hex - only if header colour enabled
|
|
; "text;back" = both colours set
|
|
; "text;" or ";back" = one colour set
|
|
; ";" or "" or Default = use default colours
|
|
; [2][ColIndex] = Empty string or Default = Edit header as text
|
|
; Delimited string = Edit header with combo - leading @TAB = read only
|
|
; [3][ColIndex] = 0 = column resizable
|
|
; Positive integer = fixed width required
|
|
; Default = fix at current width
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Returns 1
|
|
; Failure: Returns 0 and sets @error as follows:
|
|
; 1 = Invalid index
|
|
; 2 = Invalid array - @extended set as follows:
|
|
; 0 - Array not 2D
|
|
; 1 - Not 4 rows
|
|
; 2 - Incorrect number of columns
|
|
; 3 = Header colour not enabled but colour set
|
|
; 4 = Invalid colour string
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: Column resize values forced to positive integers - non-numeric values converted to 0
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_LoadHdrData($iLV_Index, $aHdrData)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, 0)
|
|
; Check array
|
|
If UBound($aHdrData, 0) <> 2 Then
|
|
Return SetError(2, 0, 0)
|
|
EndIf
|
|
If UBound($aHdrData) <> 4 Then
|
|
Return SetError(2, 1, 0)
|
|
EndIf
|
|
If UBound($aHdrData, 2) <> UBound($aGLVEx_Data[$iLV_Index][2], 2) Then
|
|
Return SetError(2, 2, 0)
|
|
EndIf
|
|
; Convert colours to BGR
|
|
Local $sColSet, $aColSplit
|
|
For $i = 0 To UBound($aHdrData, 2) - 1
|
|
|
|
; Check titles
|
|
If $aHdrData[0][$i] = Default Then
|
|
$aHdrData[0][$i] = ""
|
|
EndIf
|
|
|
|
; Convert colours to BGR
|
|
$sColSet = $aHdrData[1][$i]
|
|
; Force empty colour to ;
|
|
If $sColSet = "" Or $sColSet = Default Then
|
|
$sColSet = ";"
|
|
EndIf
|
|
; Check valid colour string
|
|
If Not StringRegExp($sColSet, "^(\Q0x\E[0-9A-Fa-f]{6})?;(\Q0x\E[0-9A-Fa-f]{6})?$") Then
|
|
Return SetError(4, 0, 0)
|
|
EndIf
|
|
$aColSplit = StringSplit($sColSet, ";")
|
|
; Convert colours to BGR
|
|
For $j = 1 To 2
|
|
; If colour set check header colour enabled
|
|
If $aColSplit[$j] And Not $aGLVEx_Data[$iLV_Index][24] Then
|
|
Return SetError(3, 0, 0)
|
|
Else
|
|
$aColSplit[$j] = StringRegExpReplace($aColSplit[$j], "0x(.{2})(.{2})(.{2})", "0x$3$2$1")
|
|
EndIf
|
|
Next
|
|
; Reset to converted colour
|
|
$aHdrData[1][$i] = $aColSplit[1] & ";" & $aColSplit[2]
|
|
|
|
; Check edit parameters
|
|
If $aHdrData[2][$i] = Default Then
|
|
$aHdrData[2][$i] = ""
|
|
EndIf
|
|
|
|
; Check resize parameters
|
|
If $aHdrData[3][$i] = Default Then
|
|
$aHdrData[3][$i] = _GUICtrlListView_GetColumnWidth($aGLVEx_Data[$iLV_Index][0], $i)
|
|
Else
|
|
$aHdrData[3][$i] = Abs(Number($aHdrData[3][$i]))
|
|
EndIf
|
|
|
|
Next
|
|
|
|
; Store header data
|
|
$aGLVEx_Data[$iLV_Index][25] = $aHdrData
|
|
|
|
; Force redraw
|
|
__GUIListViewEx_RedrawWindow($iLV_Index, True)
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_LoadHdrData
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_EditHeader
|
|
; Description ...: Manual edit of specified ListView header
|
|
; Syntax.........: _GUIListViewEx_EditHeader([$iLV_Index = Default[, $iCol = Default[, $iDelta_X = 0[, $iDelta_Y = 0]]]])
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init - default active ListView
|
|
; $iCol - Zero-based column of header to edit
|
|
; $iDelta_X - Permits fine adjustment of edit control in X axis if needed
|
|
; $iDelta_Y - Permits fine adjustment of edit control in Y axis if needed
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Array: 2D array [column][original header text][new header text]
|
|
; Failure: Empty string and sets @error as follows:
|
|
; 1 - Invalid ListView Index
|
|
; 2 - ListView headers not editable
|
|
; 3 - Invalid column
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - Once edit started, all other script activity is suspended until following occurs:
|
|
; {ENTER} = Current edit confirmed and editing ended
|
|
; {ESCAPE} or click on other control = Current edit cancelled and editing ended
|
|
; - Note this function will alter a header even if the column is not editable
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_EditHeader($iLV_Index = Default, $iCol = Default, $iDelta_X = 0, $iDelta_Y = 0)
|
|
|
|
Local $aRet = ""
|
|
|
|
If $iLV_Index = Default Then
|
|
$iLV_Index = $aGLVEx_Data[0][1]
|
|
EndIf
|
|
; Activate the ListView
|
|
_GUIListViewEx_SetActive($iLV_Index)
|
|
If @error Then
|
|
Return SetError(1, 0, $aRet)
|
|
EndIf
|
|
|
|
Local $hLV_Handle = $aGLVEx_Data[$iLV_Index][0]
|
|
Local $cLV_CID = $aGLVEx_Data[$iLV_Index][1]
|
|
|
|
; Check ListView headers are editable
|
|
If $aGLVEx_Data[$iLV_Index][8] = "" Then
|
|
Return SetError(2, 0, $aRet)
|
|
EndIf
|
|
; Check col value
|
|
If $iCol = Default Then
|
|
$iCol = $aGLVEx_Data[0][2]
|
|
EndIf
|
|
Local $iMax = _GUICtrlListView_GetColumnCount($hLV_Handle)
|
|
If $iCol < 0 Or $iCol > $iMax - 1 Then
|
|
Return SetError(3, 0, $aRet)
|
|
EndIf
|
|
|
|
Local $tLVPos = DllStructCreate("struct;long X;long Y;endstruct")
|
|
; Get position of ListView within GUI client area
|
|
__GUIListViewEx_GetLVCoords($hLV_Handle, $tLVPos)
|
|
; Get ListView client area to allow for scrollbars
|
|
Local $aLVClient = WinGetClientSize($hLV_Handle)
|
|
; Get ListView font details
|
|
Local $aLV_FontDetails = __GUIListViewEx_GetLVFont($hLV_Handle)
|
|
; Disable ListView
|
|
WinSetState($hLV_Handle, "", @SW_DISABLE)
|
|
; Load header data
|
|
Local $aHdrData = $aGLVEx_Data[$iLV_Index][25]
|
|
; Get current text of header
|
|
Local $aColData, $sHeaderOrgText
|
|
; Check if header colour enabled
|
|
If $aGLVEx_Data[$iLV_Index][24] Then
|
|
$sHeaderOrgText = $aHdrData[0][$iCol]
|
|
Else
|
|
$aColData = _GUICtrlListView_GetColumn($hLV_Handle, $iCol)
|
|
$sHeaderOrgText = $aColData[5]
|
|
EndIf
|
|
; Get required edit coords for 0 item
|
|
Local $aLocation[2] = [0, $iCol]
|
|
Local $aEdit_Coords = __GUIListViewEx_EditCoords($hLV_Handle, $cLV_CID, $aLocation, $tLVPos, $aLVClient[0] - 5, $iDelta_X, $iDelta_Y)
|
|
; Now get header size and adjust coords for header
|
|
Local $hHeader = _GUICtrlListView_GetHeader($hLV_Handle)
|
|
Local $aHeader_Pos = WinGetPos($hHeader)
|
|
$aEdit_Coords[0] -= 2
|
|
$aEdit_Coords[1] -= $aHeader_Pos[3]
|
|
$aEdit_Coords[3] = $aHeader_Pos[3]
|
|
|
|
Local $hCombo, $hTemp_Edit, $hTemp_List, $hTemp_Combo, $sCombo_Data
|
|
|
|
; Check edit mode
|
|
If $aHdrData[2][$iCol] Then ; Combo
|
|
$sCombo_Data = $aHdrData[2][$iCol]
|
|
; Create temporary combo
|
|
If StringLeft($sCombo_Data, 1) = @TAB Then ; Read only combo
|
|
$cGLVEx_EditID = GUICtrlCreateCombo("", $aEdit_Coords[0], $aEdit_Coords[1], $aEdit_Coords[2], $aEdit_Coords[3], 0x00200043) ; $CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL
|
|
$sCombo_Data = StringTrimLeft($sCombo_Data, 1)
|
|
Else ; Normal combo
|
|
$cGLVEx_EditID = GUICtrlCreateCombo("", $aEdit_Coords[0], $aEdit_Coords[1], $aEdit_Coords[2], $aEdit_Coords[3], 0x00200042) ; $CBS_DROPDOWN, $CBS_AUTOHSCROLL, $WS_VSCROLL
|
|
EndIf
|
|
GUICtrlSetData($cGLVEx_EditID, $sCombo_Data)
|
|
; Get combo data
|
|
$hCombo = GUICtrlGetHandle($cGLVEx_EditID)
|
|
Local $tInfo = DllStructCreate("dword Size;struct;long EditLeft;long EditTop;long EditRight;long EditBottom;endstruct;" & _
|
|
"struct;long BtnLeft;long BtnTop;long BtnRight;long BtnBottom;endstruct;dword BtnState;hwnd hCombo;hwnd hEdit;hwnd hList")
|
|
Local $iInfo = DllStructGetSize($tInfo)
|
|
DllStructSetData($tInfo, "Size", $iInfo)
|
|
_SendMessage($hCombo, 0x164, 0, $tInfo, 0, "wparam", "struct*") ; $CB_GETCOMBOBOXINFO
|
|
$hTemp_Edit = DllStructGetData($tInfo, "hEdit")
|
|
$hTemp_List = DllStructGetData($tInfo, "hList")
|
|
$hTemp_Combo = DllStructGetData($tInfo, "hCombo")
|
|
Else ; Edit
|
|
; Create temporary edit
|
|
$cGLVEx_EditID = GUICtrlCreateEdit($sHeaderOrgText, $aEdit_Coords[0], $aEdit_Coords[1], $aEdit_Coords[2], $aEdit_Coords[3], 0)
|
|
$hTemp_Edit = GUICtrlGetHandle($cGLVEx_EditID)
|
|
EndIf
|
|
; Set font size
|
|
GUICtrlSetFont($cGLVEx_EditID, $aLV_FontDetails[0], Default, Default, $aLV_FontDetails[1])
|
|
; Give keyboard focus
|
|
_WinAPI_SetFocus($hTemp_Edit)
|
|
; Check "select all" flag state
|
|
If Not $aGLVEx_Data[$iLV_Index][11] Then
|
|
GUICtrlSendMsg($cGLVEx_EditID, 0xB1, 0, -1) ; $EM_SETSEL
|
|
EndIf
|
|
|
|
Local $tMouseClick = DllStructCreate($tagPOINT)
|
|
|
|
; Valid keys to action (ENTER, ESC)
|
|
Local $aKeys[2] = [0x0D, 0x1B]
|
|
; Clear key code flag
|
|
Local $iKey_Code = 0
|
|
Local $fCombo_State = False
|
|
; Prevent GUI closure on ESC as needed to exit edit
|
|
Local $iOldESC = Opt("GUICloseOnESC", 0)
|
|
|
|
; Wait for a key press
|
|
While 1
|
|
; Check for SYSCOMMAND Close Event
|
|
If $aGLVEx_Data[0][9] Then
|
|
$aGLVEx_Data[0][9] = False
|
|
ExitLoop
|
|
EndIf
|
|
; Check for valid key or mouse button pressed or combo open/close
|
|
For $i = 0 To 1
|
|
_WinAPI_GetAsyncKeyState($aKeys[$i])
|
|
If _WinAPI_GetAsyncKeyState($aKeys[$i]) Then
|
|
; Set key pressed flag
|
|
$iKey_Code = $aKeys[$i]
|
|
ExitLoop 2
|
|
EndIf
|
|
Next
|
|
; Temp input loses focus
|
|
If _WinAPI_GetFocus() <> $hTemp_Edit Then
|
|
ExitLoop
|
|
EndIf
|
|
; Check for mouse pressed outside edit
|
|
_WinAPI_GetAsyncKeyState(0x01)
|
|
If _WinAPI_GetAsyncKeyState(0x01) Then
|
|
; Look for clicks outside edit/combo control
|
|
DllStructSetData($tMouseClick, "x", MouseGetPos(0))
|
|
DllStructSetData($tMouseClick, "y", MouseGetPos(1))
|
|
Switch _WinAPI_WindowFromPoint($tMouseClick)
|
|
Case $hTemp_Combo, $hTemp_Edit, $hTemp_List
|
|
; Over edit/combo
|
|
Case Else
|
|
ExitLoop
|
|
EndSwitch
|
|
; Wait for mouse button release
|
|
_WinAPI_GetAsyncKeyState(0x01)
|
|
While _WinAPI_GetAsyncKeyState(0x01)
|
|
Sleep(10)
|
|
WEnd
|
|
EndIf
|
|
If $hCombo Then
|
|
; Check for dropdown open and close
|
|
Switch _SendMessage($hCombo, 0x157) ; $CB_GETDROPPEDSTATE
|
|
Case 0
|
|
; If opened and closed
|
|
If $fCombo_State = True Then
|
|
; If no content
|
|
If GUICtrlRead($cGLVEx_EditID) = "" Then
|
|
; Ignore
|
|
$fCombo_State = False
|
|
Else
|
|
; Act as if Enter pressed
|
|
$iKey_Code = 0x0D
|
|
ExitLoop
|
|
EndIf
|
|
EndIf
|
|
Case 1
|
|
; Set flag if opened
|
|
If Not $fCombo_State Then
|
|
$fCombo_State = True
|
|
EndIf
|
|
EndSwitch
|
|
EndIf
|
|
; Save CPU
|
|
Sleep(10)
|
|
WEnd
|
|
; Action keypress
|
|
Switch $iKey_Code
|
|
Case 0x0D
|
|
; Change column header text
|
|
Local $sHeaderNewText = GUICtrlRead($cGLVEx_EditID)
|
|
If $sHeaderNewText <> $sHeaderOrgText Then
|
|
; Check if header colour enabled
|
|
If $aGLVEx_Data[$iLV_Index][24] Then
|
|
$aHdrData[0][$iCol] = $sHeaderNewText
|
|
$aGLVEx_Data[$iLV_Index][25] = $aHdrData
|
|
Else
|
|
_GUICtrlListView_SetColumn($hLV_Handle, $iCol, $sHeaderNewText)
|
|
EndIf
|
|
Local $aRet[1][3] = [[$iCol, $sHeaderOrgText, $sHeaderNewText]]
|
|
EndIf
|
|
Case Else
|
|
; Return empty string
|
|
$aRet = ""
|
|
EndSwitch
|
|
; Wait until key no longer pressed
|
|
_WinAPI_GetAsyncKeyState($iKey_Code)
|
|
While _WinAPI_GetAsyncKeyState($iKey_Code)
|
|
Sleep(10)
|
|
WEnd
|
|
|
|
; Reset user value
|
|
Opt("GUICloseOnESC", $iOldESC)
|
|
; Delete Edit
|
|
GUICtrlDelete($cGLVEx_EditID)
|
|
; Reenable ListView
|
|
WinSetState($hLV_Handle, "", @SW_ENABLE)
|
|
|
|
Return $aRet
|
|
|
|
EndFunc ;==>_GUIListViewEx_EditHeader
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_LoadColour
|
|
; Description ...: Uses array to set text and back colour for a user colour enabled ListView
|
|
; Syntax.........: _GUIListViewEx_LoadColour($iLV_Index, $aColArray)
|
|
; Parameters ....: $iLV_Index - Index of ListView
|
|
; $aColArray - 0-based 2D array containing colour strings in RGB hex
|
|
; "text;back" = both user colours set
|
|
; "text;" or ";back" = one user colour set
|
|
; ";" or "" = default colours
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Returns 1
|
|
; Failure: Returns 0 and sets @error as follows:
|
|
; 1 = Invalid index
|
|
; 2 = ListView not user colour enabled
|
|
; 3 = Array not 2D (@extended = 0) or not correct size for LV (@extended = 1)
|
|
; 4 = Invalid colour string in array
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_LoadColour($iLV_Index, $aColArray)
|
|
|
|
Local $sColSet
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, 0)
|
|
; Check ListView is user colour enabled
|
|
If Not $aGLVEx_Data[$iLV_Index][19] Then
|
|
Return SetError(2, 0, 0)
|
|
EndIf
|
|
If UBound($aColArray, 0) <> 2 Then
|
|
Return SetError(3, 0, 0)
|
|
EndIf
|
|
|
|
; Add a 0-line to match the stored data array
|
|
_ArrayInsert($aColArray, 0)
|
|
; Compare sizes
|
|
If (UBound($aColArray) <> UBound($aGLVEx_Data[$iLV_Index][2])) Or (UBound($aColArray, 2) <> UBound($aGLVEx_Data[$iLV_Index][2], 2)) Then
|
|
Return SetError(3, 1, 0)
|
|
EndIf
|
|
; Convert all colours to BGR
|
|
For $i = 1 To UBound($aColArray, 1) - 1
|
|
For $j = 0 To UBound($aColArray, 2) - 1
|
|
$sColSet = $aColArray[$i][$j]
|
|
If $sColSet = "" Then
|
|
$sColSet = ";"
|
|
$aColArray[$i][$j] = ";"
|
|
EndIf
|
|
If Not StringRegExp($sColSet, "^(\Q0x\E[0-9A-Fa-f]{6})?;(\Q0x\E[0-9A-Fa-f]{6})?$") Then
|
|
Return SetError(4, 0, 0)
|
|
EndIf
|
|
$aColArray[$i][$j] = StringRegExpReplace($sColSet, "0x(.{2})(.{2})(.{2})", "0x$3$2$1")
|
|
Next
|
|
Next
|
|
$aGLVEx_Data[$iLV_Index][18] = $aColArray
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_LoadColour
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_SetDefColours
|
|
; Description ...: Sets default colours for user colour/single cell select enabled ListViews
|
|
; Syntax.........: _GUIListViewEx_SetDefColours($aDefCols)
|
|
; Parameters ....: $aDefCols - 1D 4-element array of hex RGB default colour strings
|
|
; (Normal text, Normal field, Selected text, Selected field)
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Returns 1
|
|
; Failure: Returns 0 and sets @error as follows:
|
|
; 1 = Invalid index
|
|
; 2 = Not user colour or single cell selection enabled
|
|
; 3 = Invalid array
|
|
; 4 - Invalid colour
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: Setting an element to Default resets the original default colour
|
|
; Setting an element to "" maintains current default colour
|
|
; Normal colours are used for all non-user coloured ListView items
|
|
; Selected colours used for row/single cell selection
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_SetDefColours($iLV_Index, $aDefCols)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, 0)
|
|
; Check colour or single cell enabled
|
|
If Not ($aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22]) Then Return SetError(2, 0, 0)
|
|
; Check valid array
|
|
If Not IsArray($aDefCols) Or UBound($aDefCols) <> 4 Or UBound($aDefCols, 0) <> 1 Then Return SetError(3, 0, 0)
|
|
|
|
; Load current colours
|
|
Local $aCurCols = $aGLVEx_Data[$iLV_Index][23]
|
|
; Loop through array
|
|
Local $sCol
|
|
For $i = 0 To 3
|
|
If $aDefCols[$i] = Default Then
|
|
; Reset default colour
|
|
$aDefCols[$i] = $aGLVEx_DefColours[$i]
|
|
ElseIf $aDefCols[$i] = "" Then
|
|
; Maintain current colour
|
|
$aDefCols[$i] = $aCurCols[$i]
|
|
Else
|
|
Switch Number($aDefCols[$i])
|
|
; Check valid colour
|
|
Case 0 To 0xFFFFFF
|
|
; Convert to BGR
|
|
$sCol = '0x' & StringMid($aDefCols[$i], 7, 2) & StringMid($aDefCols[$i], 5, 2) & StringMid($aDefCols[$i], 3, 2)
|
|
; Save in array
|
|
$aDefCols[$i] = $sCol
|
|
Case Else
|
|
Return SetError(4, 0, 0)
|
|
EndSwitch
|
|
EndIf
|
|
Next
|
|
; Store array
|
|
$aGLVEx_Data[$iLV_Index][23] = $aDefCols
|
|
|
|
; Force reload of redraw colour array
|
|
__GUIListViewEx_RedrawWindow($iLV_Index, True)
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_SetDefColours
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_SetColour
|
|
; Description ...: Sets text and/or back colour for a user colour enabled ListView item
|
|
; Syntax.........: _GUIListViewEx_SetColour($iLV_Index, $sColSet, $iRow, $iCol)
|
|
; Parameters ....: $iLV_Index - Index of ListView
|
|
; $sColSet - Colour string in RGB hex (0xRRGGBB)
|
|
; "text;back" = both user colours set
|
|
; "text;" or ";back" = one user colour set, no change to other
|
|
; ";" or "" = reset both to default colours
|
|
; $iRow - Row index (0-based)
|
|
; $iCol - Column index (0-based)
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Returns 1
|
|
; Failure: Returns 0 and sets @error as follows:
|
|
; 1 = Invalid index
|
|
; 2 = Not user colour enabled
|
|
; 3 = Invalid colour
|
|
; 4 - Invalid row/col
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_SetColour($iLV_Index, $sColSet, $iRow, $iCol)
|
|
|
|
; Activate the ListView
|
|
_GUIListViewEx_SetActive($iLV_Index)
|
|
If @error Then
|
|
Return SetError(1, 0, 0)
|
|
EndIf
|
|
; Check ListView is user colour enabled
|
|
If Not $aGLVEx_Data[$iLV_Index][19] Then
|
|
Return SetError(2, 0, 0)
|
|
EndIf
|
|
; Check colour
|
|
If $sColSet = "" Then
|
|
$sColSet = ";"
|
|
EndIf
|
|
; Check for default colour setting and set flag
|
|
Local $fDefCol = (($sColSet = ";") ? (True) : (False))
|
|
; Check for valid colour strings
|
|
If Not StringRegExp($sColSet, "^(\Q0x\E[0-9A-Fa-f]{6})?;(\Q0x\E[0-9A-Fa-f]{6})?$") Then
|
|
Return SetError(3, 0, 0)
|
|
EndIf
|
|
; Load current array
|
|
Local $aColArray = $aGLVEx_Data[$iLV_Index][18]
|
|
; Check position exists in ListView
|
|
If $iRow < 0 Or $iCol < 0 Or $iRow > UBound($aColArray) - 2 Or $iCol > UBound($aColArray, 2) - 1 Then
|
|
Return SetError(4, 0, 0)
|
|
EndIf
|
|
; Current colour
|
|
Local $aCurrSplit = StringSplit($aColArray[$iRow + 1][$iCol], ";")
|
|
; New colour
|
|
Local $aNewSplit = StringSplit($sColSet, ";")
|
|
; Replace if required
|
|
For $i = 1 To 2
|
|
If $aNewSplit[$i] Then
|
|
; Convert to BGR
|
|
$aCurrSplit[$i] = '0x' & StringMid($aNewSplit[$i], 7, 2) & StringMid($aNewSplit[$i], 5, 2) & StringMid($aNewSplit[$i], 3, 2)
|
|
EndIf
|
|
If $fDefCol Then
|
|
; Reset default
|
|
$aCurrSplit[$i] = ""
|
|
EndIf
|
|
Next
|
|
; Store new colour
|
|
$aColArray[$iRow + 1][$iCol] = $aCurrSplit[1] & ";" & $aCurrSplit[2]
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][18] = $aColArray
|
|
|
|
; Force reload of redraw colour array
|
|
$aGLVEx_Data[0][14] = 0
|
|
; Redraw listView item to show colour
|
|
_GUICtrlListView_RedrawItems($aGLVEx_Data[$iLV_Index][0], $iRow, $iRow)
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_SetColour
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_BlockReDraw
|
|
; Description ...: Prevents ListView redrawing during looped Insert/Delete/Change calls
|
|
; Syntax.........: _GUIListViewEx_BlockReDraw($iLV_Index, $fMode)
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; $fMode - True = Prevent redrawing during Insert/Delete/Change calls
|
|
; - False = Allow future redrawing and force a redraw
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 1
|
|
; Failure: 0 and sets @error as follows:
|
|
; 1 - Invalid ListView Index
|
|
; 2 - Invalid $fMode
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: Allows multiple items to be inserted/deleted/changed programatically without redrawing the ListView
|
|
; after each call. When block removed, ListView is redrawn to update with new content
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_BlockReDraw($iLV_Index, $bMode)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 1 Or $iLV_Index > $aGLVEx_Data[0][0] Then
|
|
Return SetError(1, 0, 0)
|
|
EndIf
|
|
Switch $bMode
|
|
Case True
|
|
; Clear redraw flag
|
|
$aGLVEx_Data[0][15] = False
|
|
|
|
Case False
|
|
; Set redraw flag
|
|
$aGLVEx_Data[0][15] = True
|
|
; Force ListView redraw to current content
|
|
Local $aData_Array = $aGLVEx_Data[$iLV_Index][2]
|
|
Local $aCheck_Array[UBound($aData_Array)]
|
|
For $i = 1 To UBound($aCheck_Array) - 1
|
|
$aCheck_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $i - 1)
|
|
Next
|
|
__GUIListViewEx_ReWriteLV($aGLVEx_Data[$iLV_Index][0], $aData_Array, $aCheck_Array, $iLV_Index, $aGLVEx_Data[$iLV_Index][6])
|
|
|
|
Case Else
|
|
Return SetError(2, 0, 0)
|
|
EndSwitch
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_BlockReDraw
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_UserSort
|
|
; Description ...: Sets user defined sort function for specified columns
|
|
; Syntax.........: _GUIListViewEx_UserSort($iLV_Index, $vCol [, $hFunc = -1])
|
|
; Parameters ....: $iLV_Index - Index number of ListView as returned by _GUIListViewEx_Init
|
|
; $vCol - Column of ListView to set (string or single number)
|
|
; All columns: "*"
|
|
; Range string example: "1;2;5-6;8-9;10" - expanded automatically
|
|
; $hFunc - User function as object - set to -1 for no sort (default)
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: 1
|
|
; Failure: 0 and sets @error as follows:
|
|
; 1 - Invalid ListView Index
|
|
; 2 - ListView not sortable
|
|
; 3 - Invalid column parameter
|
|
; 4 - Invalid function object
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If function not specified for a column then default sort function used (standard _ArraySort)
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_UserSort($iLV_Index, $vCol, $hFunc = -1)
|
|
|
|
; Check valid index
|
|
If $iLV_Index < 1 Or $iLV_Index > $aGLVEx_Data[0][0] Then
|
|
Return SetError(1, 0, 0)
|
|
EndIf
|
|
; Check if ListView sortable
|
|
If Not (IsArray($aGLVEx_Data[$iLV_Index][4])) Then
|
|
Return SetError(2, 0, 0)
|
|
EndIf
|
|
; Check column index
|
|
Local $aRange = __GUIListViewEx_ExpandRange($vCol, $iLV_Index)
|
|
If @error Then Return SetError(3, 0, 0)
|
|
; Check function object (or none)
|
|
If Not ($hFunc = -1) And Not (IsFunc($hFunc)) Then
|
|
Return SetError(4, 0, 0)
|
|
EndIf
|
|
|
|
; Extract, amend and store editable array
|
|
Local $aEditable = $aGLVEx_Data[$iLV_Index][7]
|
|
For $i = 1 To $aRange[0]
|
|
$aEditable[3][$aRange[$i]] = $hFunc
|
|
Next
|
|
$aGLVEx_Data[$iLV_Index][7] = $aEditable
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_UserSort
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_GetLastSelItem
|
|
; Description ...: Get last selected item in active or specified ListView
|
|
; Syntax.........: _GUIListViewEx_GetLastSelItem($iLV_Index = 0)
|
|
; Parameters ....: $iLV_Index - Index of ListView as returned by _GUIListViewEx_Init
|
|
; 0 = currently active ListView (default)
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Delimited string ListViewIndex|Row|Col
|
|
; Failure: Returns "" and sets @error as follows:
|
|
; 1 = No ListView currently active
|
|
; 2 = Invalid index
|
|
; 3 = No item yet selected in active or specified ListView
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If multiple items are selected, only the last selected is returned
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_GetLastSelItem($iLV_Index = 0)
|
|
|
|
; Check valid index
|
|
Switch $iLV_Index
|
|
Case 1 To $aGLVEx_Data[0][0]
|
|
; Valid index
|
|
Case 0, Default
|
|
; Get active ListView
|
|
$iLV_Index = _GUIListViewEx_GetActive()
|
|
; If no ListView active
|
|
If $iLV_Index = 0 Then Return SetError(1, 0, "")
|
|
Case Else
|
|
Return SetError(2, 0, "")
|
|
EndSwitch
|
|
|
|
; Read last selected item
|
|
Local $iRow = $aGLVEx_Data[$iLV_Index][20]
|
|
Local $iCol = $aGLVEx_Data[$iLV_Index][21]
|
|
; Check selection has been made
|
|
If $iRow = -1 Or $iCol = -1 Then Return SetError(3, 0, "")
|
|
; Return selection details
|
|
Return $iLV_Index & "|" & $iRow & "|" & $iCol
|
|
|
|
EndFunc ;==>_GUIListViewEx_GetLastSelItem
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_ContextPos
|
|
; Description ...: Returns index and row/col of last right click
|
|
; Syntax.........: _GUIListViewEx_ContextPos()
|
|
; Parameters ....: None
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Returns 3 element array: [ListView_index, Row, Column]
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: Allows user colours to be set via a context menu
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_ContextPos()
|
|
|
|
Local $aPos[3] = [$aGLVEx_Data[0][1], $aGLVEx_Data[0][10], $aGLVEx_Data[0][11]]
|
|
Return $aPos
|
|
|
|
EndFunc ;==>_GUIListViewEx_ContextPos
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_ToolTipInit
|
|
; Description ...: Defines column(s) which will display a tooltip when clicked
|
|
; Syntax.........: _GUIListViewEx_ToolTipInit($iLV_Index, $vRange [, $iTime = 1000 ], $iMode = 1]])
|
|
; Parameters ....: $iLV_Index - Index of ListView holding columns
|
|
; $vRange - Range of columns - see remarks
|
|
; $iTime - Time for tooltip to display (default = 1000)
|
|
; $iMode - Display: 1 (default) = cell content, 2 = 0 column
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success: Returns 1
|
|
; Failure: Returns 0 and sets @error as follows:
|
|
; 1 = Invalid index
|
|
; 2 = Invalid range
|
|
; 3 = Invalid time
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - Function is designed to show:
|
|
; Mode 1: ListView content if column is too narrow for data within
|
|
; Mode 2: 0 column data to allow for row identification when ListView right scrolled
|
|
; - $vRange is a string containing the rows which show tooltips.
|
|
; It can be a single number or a range separated by a hyphen (-).
|
|
; Multiple items are separated by a semi-colon (;).
|
|
; "*" = all columns
|
|
; - _GUIListViewEx_EventMonitor must be placed in the script idle loop for the tooltips to display
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_ToolTipInit($iLV_Index, $vRange, $iTime = 1000, $iMode = 1)
|
|
|
|
; Check valid parameters
|
|
If $iLV_Index < 0 Or $iLV_Index > $aGLVEx_Data[0][0] Then Return SetError(1, 0, 0)
|
|
Local $aRange = __GUIListViewEx_ExpandRange($vRange, $iLV_Index)
|
|
If @error Then Return SetError(2, 0, 0)
|
|
If Not IsInt($iTime) Then Return SetError(3, 0, 0)
|
|
|
|
; Store data
|
|
$aGLVEx_Data[$iLV_Index][15] = $aRange
|
|
$aGLVEx_Data[$iLV_Index][16] = $iTime
|
|
$aGLVEx_Data[$iLV_Index][17] = $iMode
|
|
|
|
Return 1
|
|
|
|
EndFunc ;==>_GUIListViewEx_ToolTipInit
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_EventMonitor
|
|
; Description ...: Check for edit, sort, drag/drop and tooltip events - auto colour redraw - returns event results
|
|
; Syntax.........: _GUIListViewEx_EventMonitor([$iEditMode = 0[, $iDelta_X = 0[, $iDelta_Y = 0]]])
|
|
; Parameters ....: $iEditMode - Only used if editing cells as simple text:
|
|
; Return after single edit - 0 (default)
|
|
; {TAB} and ctrl-arrow keys move to next item - 2-digit code (row mode/column mode)
|
|
; 0 = Cannot move
|
|
; 1 = Reaching edge terminates edit process
|
|
; 2 = Reaching edge remains in place
|
|
; 3 = Reaching edge loops to opposite edge
|
|
; Positive value = ESC abandons current edit only, previous edits remain
|
|
; Negative value = ESC resets all edits in current session
|
|
; $iDelta_X - Permits fine adjustment of edit control in X axis if needed
|
|
; $iDelta_Y - Permits fine adjustment of edit control in Y axis if needed
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: Success:
|
|
; No UDF events detected: Empty string and @extended set to 0
|
|
; Return value is not an empty string, while @extended indicates type of event detected
|
|
; @extended = 1 - Cell(s) edit event
|
|
; Returns 2D array of items edited
|
|
; - Total number of edits in [0][0] element, with each edit following:
|
|
; - [zero-based row][zero-based column][original content][new content]
|
|
; 2 - Header edit event
|
|
; Returns single row 2D array
|
|
; - [column edited][original header text][new header text]
|
|
; 3 - ListView sort event
|
|
; Returns index number of newly sorted ListView
|
|
; 4 - Drag/drop event
|
|
; Returns colon-separated index numbers of "drag" and "drop" ListViews
|
|
; 5-8 (Not used at present)
|
|
; 9 - User selection change event
|
|
; Returns 3-element 1D array
|
|
; - [ListView index, zero-based row, zero-based col]
|
|
; Failure: Sets @error as follows when editing:
|
|
; 1 - Invalid EditMode parameter
|
|
; 2 - Empty ListView
|
|
; 3 - Column not editable
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: - This function must be placed within the script idle loop.
|
|
; - Editing cells:
|
|
; - Using edit mode 1-3:
|
|
; - Once item edit process started, all other script activity is suspended until following occurs:
|
|
; {ENTER} = Current edit confirmed and editing process ended
|
|
; {ESCAPE} = Current or all edits cancelled and editing process ended
|
|
; If $iEditMode non-zero then {TAB} and ctrl-arrow keys =
|
|
; For edit controls: Current edit confirmed & continue editing
|
|
; For cother controls: Current edit cancelled & continue editing
|
|
; If using Edit control:
|
|
; Click outside edit = Editing process ends and
|
|
; If $iAdded + 4 : Current edit accepted
|
|
; Else : Current edit cancelled
|
|
; If using Combo control:
|
|
; Combo actioned = Combo selection accepted and editing process ended
|
|
; Click outside edit = Edit process ended and editing process ended
|
|
; If using DTP control:
|
|
; only {ENTER} & {ESCAPE} will end edit
|
|
; The function only returns an array after an edit process launched by a double-click. If no
|
|
; double-click has occurred, the function returns an empty string. The user should check that a
|
|
; valid array is present before attempting to access it.
|
|
; - Using edit mode 9
|
|
; The function will return the same return values as set by the user-defined function
|
|
; - If "continue edit on triple click elsewhere" ($iAdded = 4) option is set when ListView intitiated
|
|
; the function returns an array after each edit.
|
|
; - Editing header
|
|
; Only {ENTER}, {ESCAPE} and mouse click are actioned - single edit only
|
|
; - Returned array allows verification of new value(s) and _GUIListViewEx_ChangeItem can reset original value
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_EventMonitor($iEditMode = 0, $iDelta_X = 0, $iDelta_Y = 0)
|
|
|
|
Local $aRet, $vRet, $iLV_Index, $iError
|
|
|
|
; Check for a cell Edit double click event
|
|
If $fGLVEx_EditClickFlag <> 0 Then
|
|
|
|
; Set active ListView
|
|
$iLV_Index = $fGLVEx_EditClickFlag
|
|
$aGLVEx_Data[0][1] = $iLV_Index
|
|
|
|
; Clear flag
|
|
$fGLVEx_EditClickFlag = 0
|
|
|
|
; Check Type parameter
|
|
Switch Abs($iEditMode)
|
|
Case 0, 01, 02, 03, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33 ; Single edit or both axes set to valid parameter
|
|
; Allow
|
|
Case Else
|
|
Return SetError(1, 0, "")
|
|
EndSwitch
|
|
|
|
; Get clicked item info
|
|
Local $aLocation[2] = [$aGLVEx_Data[0][17], $aGLVEx_Data[0][18]]
|
|
; Check valid row
|
|
If $aLocation[0] = -1 Then
|
|
Return SetError(2, 0, "")
|
|
EndIf
|
|
; Check for valid editable column
|
|
Local $aEditable = $aGLVEx_Data[$iLV_Index][7]
|
|
; If column not selected as mouse not used...
|
|
If $aLocation[1] = -1 Then
|
|
; ...find first editable column
|
|
For $i = 0 To UBound($aEditable, 2) - 1
|
|
If $aEditable[0][$i] <> 0 Then
|
|
$aLocation[1] = $i
|
|
$aGLVEx_Data[0][18] = $i
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
EndIf
|
|
|
|
Switch $aEditable[0][$aLocation[1]]
|
|
Case 0 ; Not editable
|
|
Return SetError(3, 0, "")
|
|
|
|
Case 9 ; User-defined function
|
|
; Extract user function
|
|
Local $hUserFunction = $aEditable[1][$aLocation[1]]
|
|
; Pass function 4 parameters (LV handle, UDF LV index, row, col)
|
|
$vRet = $hUserFunction($hGLVEx_SrcHandle, $iLV_Index, $aLocation[0], $aLocation[1])
|
|
; Return function return values
|
|
|
|
Return SetError(@error, @extended, $vRet)
|
|
|
|
Case Else
|
|
; Start edit
|
|
$aRet = __GUIListViewEx_EditProcess($iLV_Index, $aLocation, $iDelta_X, $iDelta_Y, $iEditMode)
|
|
$iError = @error
|
|
; Check if edits occurred
|
|
If IsArray($aRet) And $aRet[0][0] Then
|
|
; Return result array
|
|
; _LV_LVAufMa_save2temp()
|
|
Return SetError($iError, 1, $aRet)
|
|
Else
|
|
; Return empty string
|
|
Return SetError($iError, 1, "")
|
|
EndIf
|
|
EndSwitch
|
|
EndIf
|
|
|
|
; Check for a header Edit Ctrl-click
|
|
If $fGLVEx_HeaderEdit Then
|
|
; Clear the flag
|
|
$fGLVEx_HeaderEdit = False
|
|
; Wait until mouse button released as click occurs outside the control or Ctrl key still pressed
|
|
_WinAPI_GetAsyncKeyState(0x01)
|
|
While _WinAPI_GetAsyncKeyState(0x01) Or _WinAPI_GetAsyncKeyState(0x11)
|
|
Sleep(10)
|
|
WEnd
|
|
; Edit header using the default values set by the handler
|
|
$aRet = _GUIListViewEx_EditHeader()
|
|
$iError = @error
|
|
; Check for edit
|
|
If IsArray($aRet) Then
|
|
; Return result array
|
|
Return SetError($iError, 2, $aRet)
|
|
Else
|
|
; Return empty string
|
|
Return SetError($iError, 2, "")
|
|
EndIf
|
|
EndIf
|
|
|
|
; Check for a Sort event
|
|
If $aGLVEx_Data[0][19] Then
|
|
; Save Sort event return
|
|
$vRet = $aGLVEx_Data[0][19]
|
|
; Clear flag
|
|
$aGLVEx_Data[0][19] = ""
|
|
;Check for colour event
|
|
If $aGLVEx_Data[0][22] = 1 Then
|
|
; Redraw ListView and reset flag
|
|
__GUIListViewEx_RedrawWindow($vRet, True)
|
|
$aGLVEx_Data[0][22] = 0
|
|
EndIf
|
|
Return SetError(0, 3, $vRet)
|
|
EndIf
|
|
|
|
; Check for a Drag event
|
|
If $sGLVEx_DragEvent Then
|
|
$vRet = $sGLVEx_DragEvent
|
|
; Clear flag
|
|
$sGLVEx_DragEvent = ""
|
|
;Check for colour event
|
|
If $aGLVEx_Data[0][22] Then
|
|
; Redraw ListView(s) and reset flag
|
|
Local $aIndex = StringSplit($vRet, ":")
|
|
__GUIListViewEx_RedrawWindow($aIndex[1], True)
|
|
If $aIndex[2] <> $aIndex[1] Then
|
|
__GUIListViewEx_RedrawWindow($aIndex[2], True)
|
|
EndIf
|
|
$aGLVEx_Data[0][22] = 0
|
|
EndIf
|
|
|
|
; Return drag/drop index string
|
|
Return SetError(0, 4, $vRet)
|
|
EndIf
|
|
|
|
; Check if tooltips initiated
|
|
Local $iMode = $aGLVEx_Data[$aGLVEx_Data[0][1]][17]
|
|
If $iMode Then
|
|
$iLV_Index = $aGLVEx_Data[0][1]
|
|
Local $fToolTipCol = False
|
|
; Get active cell if single cell selection
|
|
If $aGLVEx_Data[$iLV_Index][21] Then
|
|
$aGLVEx_Data[0][4] = $aGLVEx_Data[0][17]
|
|
$aGLVEx_Data[0][5] = $aGLVEx_Data[0][18]
|
|
EndIf
|
|
; If new item clicked
|
|
If $aGLVEx_Data[0][4] <> $aGLVEx_Data[0][6] Or $aGLVEx_Data[0][5] <> $aGLVEx_Data[0][7] Then
|
|
; Check range
|
|
If $aGLVEx_Data[$iLV_Index][15] = "*" Then
|
|
$fToolTipCol = True
|
|
Else
|
|
If IsArray($aGLVEx_Data[$iLV_Index][15]) Then
|
|
Local $vRange = $aGLVEx_Data[$iLV_Index][15]
|
|
For $i = 1 To $vRange[0]
|
|
; If initiated column
|
|
If $aGLVEx_Data[0][2] = $vRange[$i] Then
|
|
$fToolTipCol = True
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
EndIf
|
|
EndIf
|
|
EndIf
|
|
If $fToolTipCol Then
|
|
; Read all row text
|
|
Local $aItemText = _GUICtrlListView_GetItemTextArray($aGLVEx_Data[$iLV_Index][0], $aGLVEx_Data[0][4])
|
|
If Not @error Then
|
|
Local $sText
|
|
Switch $iMode
|
|
Case 1
|
|
$sText = $aItemText[$aGLVEx_Data[0][5] + 1]
|
|
Case 2
|
|
$sText = $aItemText[1]
|
|
EndSwitch
|
|
; Create ToolTip
|
|
ToolTip($sText)
|
|
; Set up clearance
|
|
AdlibRegister("__GUIListViewEx_ToolTipHide", $aGLVEx_Data[$iLV_Index][16])
|
|
; Store location to prevent repeat showing
|
|
$aGLVEx_Data[0][6] = $aGLVEx_Data[0][4]
|
|
$aGLVEx_Data[0][7] = $aGLVEx_Data[0][5]
|
|
EndIf
|
|
EndIf
|
|
EndIf
|
|
|
|
; Check for selection change
|
|
If $fGLVEx_SelChangeFlag Then
|
|
; Get selecton data
|
|
Local $aRetArray[3] = [$fGLVEx_SelChangeFlag, $aGLVEx_Data[0][17], $aGLVEx_Data[0][18]]
|
|
; Clear flag
|
|
$fGLVEx_SelChangeFlag = 0
|
|
; Check if user selection
|
|
If $fGLVEx_UserSelFlag Then
|
|
; Clear flag
|
|
$fGLVEx_UserSelFlag = 0
|
|
; Return selection data
|
|
;;; hier geht es los klick usw.
|
|
;~ ConsoleWrite("asdfas" & @CRLF)
|
|
;~ Global $vRet[3]
|
|
;~ $vRet[1] = $aGLVEx_Data[0][17]
|
|
;~ $aGLVEx_Data[0][17], $aGLVEx_Data[0][18]
|
|
$sString = _GUIListViewEx_GetActive()
|
|
;~ MsgBox(64, "", $sString)
|
|
If $sString = 2 Then
|
|
_GUIListViewEx_SetActive($iLV_Aufma_Index)
|
|
_LV_LVPostliste_load_txt($aGLVEx_Data[0][17])
|
|
EndIf
|
|
;~ $vRet = 0
|
|
Return SetError(0, 9, $aRetArray)
|
|
EndIf
|
|
EndIf
|
|
|
|
; If no events
|
|
Return SetError(0, 0, "")
|
|
|
|
EndFunc ;==>_GUIListViewEx_EventMonitor
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_MsgRegister
|
|
; Description ...: Registers Windows messages required for the UDF
|
|
; Syntax.........: _GUIListViewEx_MsgRegister([$fNOTIFY = True, [$fMOUSEMOVE = True, [$fLBUTTONUP = True, [ $fSYSCOMMAND = True]]]])
|
|
; Parameters ....: $fNOTIFY - True = Register WM_NOTIFY message
|
|
; $fMOUSEMOVE - True = Register WM_MOUSEMOVE message
|
|
; $fLBUTTONUP - True = Register WM_LBUTTONUP message
|
|
; $fSYSCOMMAND - True = Register WM_SYSCOMAMND message
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: None
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If message handlers already registered, then call the relevant handler function from within that handler
|
|
; WM_NOTIFY handler required for all UDF functions
|
|
; WM_MOUSEMOVE and WM_LBUTTONUP handlers required for drag
|
|
; WM_SYSCOMMAND required for single click [X] GUI closure while editing
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_MsgRegister($fNOTIFY = True, $fMOUSEMOVE = True, $fLBUTTONUP = True, $fSYSCOMMAND = True)
|
|
|
|
; Register required messages
|
|
If $fNOTIFY Then GUIRegisterMsg(0x004E, "_GUIListViewEx_WM_NOTIFY_Handler") ; $WM_NOTIFY
|
|
If $fMOUSEMOVE Then GUIRegisterMsg(0x0200, "_GUIListViewEx_WM_MOUSEMOVE_Handler") ; $WM_MOUSEMOVE
|
|
If $fLBUTTONUP Then GUIRegisterMsg(0x0202, "_GUIListViewEx_WM_LBUTTONUP_Handler") ; $WM_LBUTTONUP
|
|
If $fSYSCOMMAND Then GUIRegisterMsg(0x0112, "_GUIListViewEx_WM_SYSCOMMAND_Handler") ; $WM_SYSCOMMAND
|
|
|
|
EndFunc ;==>_GUIListViewEx_MsgRegister
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_WM_NOTIFY_Handler
|
|
; Description ...: Windows message handler for WM_NOTIFY
|
|
; Syntax.........: _GUIListViewEx_WM_NOTIFY_Handler()
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: None
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If a WM_NOTIFY handler already registered, then call this function from within that handler
|
|
; If user colours are enabled, the handler return value must be returned on handler exit
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_WM_NOTIFY_Handler($hWnd, $iMsg, $wParam, $lParam)
|
|
|
|
#forceref $hWnd, $iMsg, $wParam
|
|
|
|
Local $dwDrawStage, $iCol, $aHdrData
|
|
|
|
; Struct = $tagNMHDR and "int Item;int SubItem" from $tagNMLISTVIEW
|
|
Local $tStruct = DllStructCreate("hwnd;uint_ptr;int_ptr;int;int", $lParam)
|
|
If @error Then Return
|
|
|
|
Local $hLV = DllStructGetData($tStruct, 1)
|
|
Local $iItem = DllStructGetData($tStruct, 4)
|
|
Local $iCode = BitAND(DllStructGetData($tStruct, 3), 0xFFFFFFFF)
|
|
|
|
; Deal with drawing quickly
|
|
If $iCode = -12 Then ; $NM_CUSTOMDRAW
|
|
|
|
; Prevent redraw if still changing ListView arrays
|
|
If $aGLVEx_Data[0][12] Then Return
|
|
|
|
; Check if enabled ListView
|
|
For $iLV_Index = 1 To $aGLVEx_Data[0][0]
|
|
If $aGLVEx_Data[$iLV_Index][0] = DllStructGetData($tStruct, 1) Then
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
|
|
; It is an enabled ListView
|
|
If $iLV_Index <= $aGLVEx_Data[0][0] Then
|
|
|
|
Local Static $aDefCols = $aGLVEx_DefColours
|
|
|
|
; Check if ListView to be redrawn has changed
|
|
If $aGLVEx_Data[0][14] <> DllStructGetData($tStruct, 1) Then
|
|
; Store new handle
|
|
$aGLVEx_Data[0][14] = DllStructGetData($tStruct, 1)
|
|
If $aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22] Then
|
|
; Copy new colour array
|
|
$aGLVEx_Data[0][13] = $aGLVEx_Data[$iLV_Index][18]
|
|
; Set new default colours
|
|
$aDefCols = $aGLVEx_Data[$iLV_Index][23]
|
|
EndIf
|
|
EndIf
|
|
; If colour or single cell selection
|
|
If $aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22] Then
|
|
Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
|
|
$dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")
|
|
Switch $dwDrawStage ; Holds a value that specifies the drawing stage
|
|
Case 1 ; $CDDS_PREPAINT
|
|
; Before the paint cycle begins
|
|
Return 32 ; $CDRF_NOTIFYITEMDRAW - Notify the parent window of any item-related drawing operations
|
|
|
|
Case 65537 ; $CDDS_ITEMPREPAINT
|
|
; Before painting an item
|
|
Return 32 ; $CDRF_NOTIFYSUBITEMDRAW - Notify the parent window of any subitem-related drawing operations
|
|
|
|
Case 196609 ; BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
|
|
; Before painting a subitem
|
|
$iItem = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Row index
|
|
Local $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Column index
|
|
; Check if selected row
|
|
Local $bSelColour = False
|
|
If $iItem = $aGLVEx_Data[$iLV_Index][20] Then
|
|
; If single sel also check for column
|
|
If $aGLVEx_Data[$iLV_Index][22] Then
|
|
If $iSubItem = $aGLVEx_Data[$iLV_Index][21] Then
|
|
$bSelColour = True
|
|
EndIf
|
|
Else
|
|
$bSelColour = True
|
|
EndIf
|
|
EndIf
|
|
; Set default colours
|
|
Local $iTextColour = $aDefCols[0]
|
|
Local $iBackColour = $aDefCols[1]
|
|
; Set selected colours if required
|
|
If $bSelColour Then
|
|
; Set selected item colours
|
|
$iTextColour = $aDefCols[2]
|
|
$iBackColour = $aDefCols[3]
|
|
Else
|
|
; If colour enabled
|
|
If $aGLVEx_Data[$iLV_Index][19] Then
|
|
; Check for user colours
|
|
If StringInStr(($aGLVEx_Data[0][13])[$iItem + 1][$iSubItem], ";") Then
|
|
; Get required user colours
|
|
Local $aSplitColour = StringSplit(($aGLVEx_Data[0][13])[$iItem + 1][$iSubItem], ";")
|
|
If $aSplitColour[1] Then $iTextColour = $aSplitColour[1]
|
|
If $aSplitColour[2] Then $iBackColour = $aSplitColour[2]
|
|
EndIf
|
|
EndIf
|
|
EndIf
|
|
|
|
; Set required colours
|
|
DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", $iTextColour)
|
|
DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", $iBackColour)
|
|
Return 2 ; $CDRF_NEWFONT must be returned after changing font or colors
|
|
EndSwitch
|
|
EndIf
|
|
|
|
Else
|
|
|
|
; Check if colour enabled header
|
|
For $iLV_Index = 1 To $aGLVEx_Data[0][0]
|
|
If DllStructGetData($tStruct, 1) = $aGLVEx_Data[$iLV_Index][24] Then
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
; It is a colour enabled header
|
|
If $iLV_Index <= $aGLVEx_Data[0][0] Then
|
|
|
|
Local $tNMCustomDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
|
|
Local $hDC = DllStructGetData($tNMCustomDraw, "hdc")
|
|
|
|
; Check if ListView to be redrawn has changed
|
|
If $aGLVEx_Data[0][20] <> DllStructGetData($tStruct, 1) Then
|
|
; Store new handle
|
|
$aGLVEx_Data[0][20] = DllStructGetData($tStruct, 1)
|
|
; Get header font
|
|
Local $hFont = _SendMessage(DllStructGetData($tStruct, 1), 0x0031) ; $WM_GETFONT
|
|
Local $hObject = _WinAPI_SelectObject($hDC, $hFont)
|
|
Local $tLogFont = DllStructCreate($tagLOGFONT)
|
|
; Get header font
|
|
_WinAPI_GetObject($hFont, DllStructGetSize($tLogFont), DllStructGetPtr($tLogFont))
|
|
_WinAPI_SelectObject($hDC, $hObject)
|
|
_WinAPI_ReleaseDC(DllStructGetData($tStruct, 1), $hDC)
|
|
; Set to medium weight
|
|
DllStructSetData($tLogFont, "Weight", 600) ; $FW_SEMIBOLD
|
|
; Store font handle
|
|
$aGLVEx_Data[0][21] = _WinAPI_CreateFontIndirect($tLogFont)
|
|
EndIf
|
|
|
|
; Check drawing stage
|
|
$dwDrawStage = DllStructGetData($tNMCustomDraw, "dwDrawStage")
|
|
Switch $dwDrawStage
|
|
Case 1 ; $CDDS_PREPAINT ; Before the paint cycle begins
|
|
Return 32 ; $CDRF_NOTIFYITEMDRAW ; Notify parent window of coming item related drawing operations
|
|
|
|
Case 65537 ; $CDDS_ITEMPREPAINT ; Before an item is drawn: Default painting (frames and background)
|
|
Return 0x00000010 ; $CDRF_NOTIFYPOSTPAINT ; Notify parent window of coming post item related drawing operations
|
|
|
|
Case 0x00010002 ; $CDDS_ITEMPOSTPAINT ; After an item is drawn: Custom painting
|
|
Local $iColumnIndex = DllStructGetData($tNMCustomDraw, "dwItemSpec") ; Column
|
|
$aHdrData = $aGLVEx_Data[$iLV_Index][25] ; Header data
|
|
Local $aColSplit = StringSplit($aHdrData[1][$iColumnIndex], ";")
|
|
; Set default colours
|
|
Local $aHdrDefCols = $aGLVEx_Data[$iLV_Index][23]
|
|
Local $iHdrTextColour, $iHdrBackColour
|
|
; Set user or default colours
|
|
If $aColSplit[1] == "" Then
|
|
$iHdrTextColour = $aHdrDefCols[0]
|
|
Else
|
|
$iHdrTextColour = $aColSplit[1]
|
|
EndIf
|
|
If $aColSplit[2] == "" Then
|
|
$iHdrBackColour = $aHdrDefCols[1]
|
|
Else
|
|
$iHdrBackColour = $aColSplit[2]
|
|
EndIf
|
|
; Set header section size
|
|
Local $tRECT = DllStructCreate($tagRECT)
|
|
DllStructSetData($tRECT, 1, DllStructGetData($tNMCustomDraw, 6) + 1)
|
|
DllStructSetData($tRECT, 2, DllStructGetData($tNMCustomDraw, 7) + 1)
|
|
DllStructSetData($tRECT, 3, DllStructGetData($tNMCustomDraw, 8) - 2)
|
|
DllStructSetData($tRECT, 4, DllStructGetData($tNMCustomDraw, 9) - 2)
|
|
; Set transparent background
|
|
_WinAPI_SetBkMode($hDC, 1) ; $TRANSPARENT
|
|
; Set text font and colour
|
|
_WinAPI_SelectObject($hDC, $aGLVEx_Data[0][21])
|
|
_WinAPI_SetTextColor($hDC, $iHdrTextColour)
|
|
; Set and draw back colour
|
|
Local $hBrush = _WinAPI_CreateSolidBrush($iHdrBackColour)
|
|
_WinAPI_FillRect($hDC, $tRECT, $hBrush)
|
|
; Write text
|
|
If $iColumnIndex < _GUICtrlListView_GetColumnCount($aGLVEx_Data[$iLV_Index][0]) Then
|
|
; Get column alignment
|
|
Local $aRet = _GUICtrlListView_GetColumn($aGLVEx_Data[$iLV_Index][0], $iColumnIndex)
|
|
Local $iColAlign = 2 * $aRet[0]
|
|
_WinAPI_DrawText($hDC, $aHdrData[0][$iColumnIndex], $tRECT, $iColAlign)
|
|
EndIf
|
|
Return 2 ; $CDRF_NEWFONT must be returned after changing font or colors
|
|
EndSwitch
|
|
EndIf
|
|
EndIf
|
|
|
|
Else ; Not a drawing message
|
|
|
|
; Flag to indicate use of Edit HotKey
|
|
Local $fEditHotKey = False
|
|
|
|
; Check if enabled ListView
|
|
For $iLV_Index = 1 To $aGLVEx_Data[0][0]
|
|
If $aGLVEx_Data[$iLV_Index][0] = DllStructGetData($tStruct, 1) Then
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
|
|
Local $iRow
|
|
|
|
; It is an enabled ListView
|
|
If $iLV_Index <= $aGLVEx_Data[0][0] Then
|
|
|
|
; Check if changed from current ListView
|
|
If $iLV_Index <> $aGLVEx_Data[0][1] Then
|
|
; Reset current index and row/column data
|
|
$aGLVEx_Data[0][1] = $iLV_Index
|
|
$aGLVEx_Data[0][17] = $aGLVEx_Data[$iLV_Index][20]
|
|
$aGLVEx_Data[0][18] = $aGLVEx_Data[$iLV_Index][21]
|
|
EndIf
|
|
|
|
; Check message
|
|
Switch $iCode
|
|
|
|
Case $LVN_BEGINSCROLL
|
|
|
|
; if editing then abandon
|
|
If $cGLVEx_EditID <> 9999 Then
|
|
; Delete temp edit control and set placeholder
|
|
GUICtrlDelete($cGLVEx_EditID)
|
|
$cGLVEx_EditID = 9999
|
|
; Reactivate ListView
|
|
WinSetState($hGLVEx_Editing, "", @SW_ENABLE)
|
|
EndIf
|
|
|
|
Case $LVN_BEGINDRAG
|
|
|
|
; Check if drag permitted for this ListView
|
|
If Not BitAND($aGLVEx_Data[$iLV_Index][12], 8) Then
|
|
|
|
; Set values for this ListView
|
|
$aGLVEx_Data[0][1] = $iLV_Index
|
|
|
|
; Store source & target ListView data for eventual inter-LV drag
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
$iGLVEx_SrcIndex = $iLV_Index
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
$hGLVEx_TgtHandle = $hGLVEx_SrcHandle
|
|
$cGLVEx_TgtID = $cGLVEx_SrcID
|
|
$iGLVEx_TgtIndex = $iGLVEx_SrcIndex
|
|
$aGLVEx_TgtArray = $aGLVEx_SrcArray
|
|
|
|
; Copy array for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
|
|
; Set drag image flag
|
|
Local $fImage = $aGLVEx_Data[$iLV_Index][5]
|
|
|
|
; Check if Native or UDF and set focus
|
|
If $cGLVEx_SrcID Then
|
|
GUICtrlSetState($cGLVEx_SrcID, 256) ; $GUI_FOCUS
|
|
Else
|
|
_WinAPI_SetFocus($hGLVEx_SrcHandle)
|
|
EndIf
|
|
|
|
; Get dragged item index
|
|
$iGLVEx_DraggedIndex = DllStructGetData($tStruct, 4) ; Item
|
|
; Set dragged item count
|
|
$iGLVEx_Dragging = 1
|
|
|
|
; Check for selected items
|
|
Local $iIndex
|
|
; Check if colour or single cell selection enabled
|
|
If $aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22] Then
|
|
; Use stored value
|
|
$iIndex = $aGLVEx_Data[$iLV_Index][20]
|
|
Else
|
|
; Check actual values
|
|
$iIndex = _GUICtrlListView_GetSelectedIndices($hGLVEx_SrcHandle)
|
|
EndIf
|
|
; Check if item is part of a multiple selection
|
|
If StringInStr($iIndex, $iGLVEx_DraggedIndex) And StringInStr($iIndex, "|") Then
|
|
; Extract all selected items
|
|
Local $aIndex = StringSplit($iIndex, "|")
|
|
For $i = 1 To $aIndex[0]
|
|
If $aIndex[$i] = $iGLVEx_DraggedIndex Then ExitLoop
|
|
Next
|
|
; Now check for consecutive items
|
|
If $i <> 1 Then ; Up
|
|
For $j = $i - 1 To 1 Step -1
|
|
; Consecutive?
|
|
If $aIndex[$j] <> $aIndex[$j + 1] - 1 Then ExitLoop
|
|
; Adjust dragged index to this item
|
|
$iGLVEx_DraggedIndex -= 1
|
|
; Increase number to drag
|
|
$iGLVEx_Dragging += 1
|
|
Next
|
|
EndIf
|
|
If $i <> $aIndex[0] Then ; Down
|
|
For $j = $i + 1 To $aIndex[0]
|
|
; Consecutive
|
|
If $aIndex[$j] <> $aIndex[$j - 1] + 1 Then ExitLoop
|
|
; Increase number to drag
|
|
$iGLVEx_Dragging += 1
|
|
Next
|
|
EndIf
|
|
Else ; Either no selection or only a single
|
|
; Set flag
|
|
$iGLVEx_Dragging = 1
|
|
EndIf
|
|
|
|
; Remove all highlighting
|
|
_GUICtrlListView_SetItemSelected($hGLVEx_SrcHandle, -1, False)
|
|
|
|
; Create drag image
|
|
If $fImage Then
|
|
Local $aImageData = _GUICtrlListView_CreateDragImage($hGLVEx_SrcHandle, $iGLVEx_DraggedIndex)
|
|
$hGLVEx_DraggedImage = $aImageData[0]
|
|
_GUIImageList_BeginDrag($hGLVEx_DraggedImage, 0, 0, 0)
|
|
EndIf
|
|
|
|
EndIf
|
|
|
|
Case $LVN_COLUMNCLICK, -2 ; $NM_CLICK
|
|
|
|
; Set values for active ListView
|
|
$aGLVEx_Data[0][1] = $iLV_Index
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
; Get and store row index
|
|
$iRow = DllStructGetData($tStruct, 4)
|
|
$aGLVEx_Data[0][4] = $iRow
|
|
$aGLVEx_Data[0][17] = $iRow
|
|
$aGLVEx_Data[$iLV_Index][20] = $iRow
|
|
; Get and store column index
|
|
$iCol = DllStructGetData($tStruct, 5)
|
|
; Tooltip use
|
|
$aGLVEx_Data[0][2] = $iCol
|
|
; Normal use
|
|
$aGLVEx_Data[0][5] = $iCol
|
|
$aGLVEx_Data[0][18] = $iCol
|
|
$aGLVEx_Data[$iLV_Index][21] = $iCol
|
|
; If a column was clicked
|
|
If $iCode = $LVN_COLUMNCLICK Then
|
|
; Load editable column array
|
|
Local $aEditable = $aGLVEx_Data[$iLV_Index][7]
|
|
|
|
; Scroll column into view
|
|
; Get X coord of first item in column
|
|
Local $aRect = _GUICtrlListView_GetSubItemRect($hGLVEx_SrcHandle, 0, $iCol)
|
|
; Get col width
|
|
Local $aLV_Pos = WinGetPos($hGLVEx_SrcHandle)
|
|
; Scroll to left edge if all column not in view
|
|
If $aRect[0] < 0 Or $aRect[2] > $aLV_Pos[2] - $aGLVEx_Data[0][8] Then ; Reduce by scrollbar width
|
|
_GUICtrlListView_Scroll($hGLVEx_SrcHandle, $aRect[0], 0)
|
|
EndIf
|
|
|
|
; Look for Ctrl key pressed
|
|
_WinAPI_GetAsyncKeyState(0x11)
|
|
If _WinAPI_GetAsyncKeyState(0x11) Then
|
|
; Check column is editable
|
|
If $aEditable[0][$iCol] Then
|
|
; Set header edit flag
|
|
$fGLVEx_HeaderEdit = True
|
|
EndIf
|
|
Else
|
|
; If ListView sortable
|
|
If IsArray($aGLVEx_Data[$iLV_Index][4]) Then
|
|
; Load array
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
; Load current ListView sort state array
|
|
Local $aLVSortState = $aGLVEx_Data[$iLV_Index][4]
|
|
; Sort the ListView - passing a possible user sort function
|
|
__GUIListViewEx_ColSort($hGLVEx_SrcHandle, $iLV_Index, $aLVSortState, $iCol, $aEditable[3][$iCol])
|
|
; Store new ListView sort state array
|
|
$aGLVEx_Data[$iLV_Index][4] = $aLVSortState
|
|
; Reread listview items into array
|
|
Local $iDim2 = UBound($aGLVEx_SrcArray, 2) - 1
|
|
For $j = 1 To $aGLVEx_SrcArray[0][0]
|
|
For $k = 0 To $iDim2
|
|
$aGLVEx_SrcArray[$j][$k] = _GUICtrlListView_GetItemText($hGLVEx_SrcHandle, $j - 1, $k)
|
|
Next
|
|
Next
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][2] = $aGLVEx_SrcArray
|
|
; Delete array
|
|
$aGLVEx_SrcArray = 0
|
|
EndIf
|
|
EndIf
|
|
Else
|
|
; It was a mouseclick so set user selection flag
|
|
$fGLVEx_UserSelFlag = 1
|
|
|
|
|
|
;~ MsgBox(64, "asdfgasg", "asdfasgasdg")
|
|
EndIf
|
|
;###############################################
|
|
;eigene Funktion beim Click auf Listview mit Mouseclick Links
|
|
_testlistclick()
|
|
Case $LVN_KEYDOWN
|
|
|
|
; Determine which key pressed
|
|
Local $tKey = DllStructCreate($tagNMHDR & ";WORD KeyCode", $lParam)
|
|
; Store key value
|
|
$aGLVEx_Data[0][16] = DllStructGetData($tKey, "KeyCode")
|
|
; Check if manual edit key(s) pressed
|
|
If __GUIListViewEx_CheckUserEditKey() Then
|
|
; Set flag to show HotKey pressed and so struct does not give valid row/column
|
|
$fEditHotKey = True
|
|
ContinueCase
|
|
EndIf
|
|
|
|
; If single cell selection
|
|
If $aGLVEx_Data[$iLV_Index][22] Then
|
|
; Remove selected state
|
|
_GUICtrlListView_SetItemSelected($hLV, $aGLVEx_Data[0][17], False)
|
|
; Act on left/right keys
|
|
Switch $aGLVEx_Data[0][16]
|
|
Case 37 ; Left
|
|
; Adjust column and prevent overrun
|
|
If $aGLVEx_Data[0][18] > 0 Then $aGLVEx_Data[0][18] -= 1
|
|
; Store new column
|
|
$aGLVEx_Data[$iLV_Index][21] = $aGLVEx_Data[0][18]
|
|
; Redraw row
|
|
_GUICtrlListView_RedrawItems($hLV, $aGLVEx_Data[0][17], $aGLVEx_Data[0][17])
|
|
; Set user selection and change flags
|
|
$fGLVEx_UserSelFlag = 1
|
|
$fGLVEx_SelChangeFlag = $iLV_Index
|
|
|
|
Case 39 ; Right
|
|
If $aGLVEx_Data[0][18] < _GUICtrlListView_GetColumnCount($hLV) - 1 Then $aGLVEx_Data[0][18] += 1
|
|
$aGLVEx_Data[$iLV_Index][21] = $aGLVEx_Data[0][18]
|
|
_GUICtrlListView_RedrawItems($hLV, $aGLVEx_Data[0][17], $aGLVEx_Data[0][17])
|
|
; Set user selection and change flags
|
|
$fGLVEx_UserSelFlag = 1
|
|
$fGLVEx_SelChangeFlag = $iLV_Index
|
|
|
|
EndSwitch
|
|
EndIf
|
|
|
|
Case -3 ; $NM_DBLCLK
|
|
If GUICtrlRead($chb_text_edit) = $GUI_CHECKED Then
|
|
_GUIListViewEx_SetEditStatus($iLV_Aufma_Index, "0;2;3;4;5;6;9")
|
|
Else
|
|
_GUIListViewEx_SetEditStatus($iLV_Aufma_Index, "0;2;3;4;5;6")
|
|
_GUIListViewEx_SetEditStatus($iLV_Aufma_Index, 9, 2, $cDatab, True)
|
|
EndIf
|
|
|
|
|
|
; Set values for active ListView
|
|
$aGLVEx_Data[0][1] = $iLV_Index
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
; Set active cell if valid struct - keypress does not set row/column fields
|
|
If Not $fEditHotKey Then
|
|
; Store doubleclicked item row and column
|
|
$iRow = DllStructGetData($tStruct, 4)
|
|
$aGLVEx_Data[0][17] = $iRow
|
|
$aGLVEx_Data[$iLV_Index][20] = $iRow
|
|
$iCol = DllStructGetData($tStruct, 5)
|
|
$aGLVEx_Data[0][18] = $iCol
|
|
$aGLVEx_Data[$iLV_Index][21] = $iCol
|
|
EndIf
|
|
; Copy array for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
; Set editing flag
|
|
$fGLVEx_EditClickFlag = $iLV_Index
|
|
|
|
Case $LVN_ITEMCHANGED
|
|
|
|
; Remove selection state if colour or single cell selection
|
|
If $aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22] Then
|
|
_GUICtrlListView_SetItemSelected($hLV, $iItem, False)
|
|
EndIf
|
|
; If a key was used to change selection need to reset active row
|
|
If $aGLVEx_Data[0][16] <> 0 Then
|
|
; Check key used
|
|
Switch $aGLVEx_Data[0][16]
|
|
Case 38 ; Up
|
|
If $aGLVEx_Data[0][17] > 0 Then $aGLVEx_Data[0][17] -= 1
|
|
$aGLVEx_Data[$iLV_Index][20] = $aGLVEx_Data[0][17]
|
|
; Set user selection flag
|
|
$fGLVEx_UserSelFlag = 1
|
|
|
|
Case 40 ; Down
|
|
If $aGLVEx_Data[0][17] < _GUICtrlListView_GetItemCount($hLV) - 1 Then $aGLVEx_Data[0][17] += 1
|
|
$aGLVEx_Data[$iLV_Index][20] = $aGLVEx_Data[0][17]
|
|
; Set user selection flag
|
|
$fGLVEx_UserSelFlag = 1
|
|
|
|
EndSwitch
|
|
; Clear key flag
|
|
$aGLVEx_Data[0][16] = 0
|
|
Else
|
|
; If mouse button pressed
|
|
_WinAPI_GetAsyncKeyState(0x01)
|
|
If _WinAPI_GetAsyncKeyState(0x01) Then
|
|
; Determine position of mouse within ListView
|
|
Local $aMPos = MouseGetPos()
|
|
Local $tPoint = DllStructCreate("int X;int Y")
|
|
DllStructSetData($tPoint, "X", $aMPos[0])
|
|
DllStructSetData($tPoint, "Y", $aMPos[1])
|
|
_WinAPI_ScreenToClient($hLV, $tPoint)
|
|
Local $aCurPos[2] = [DllStructGetData($tPoint, "X"), DllStructGetData($tPoint, "Y")]
|
|
; Check for cell under mouse
|
|
Local $aHitTest = _GUICtrlListView_SubItemHitTest($hLV, $aCurPos[0], $aCurPos[1])
|
|
; If click on valid cell
|
|
If $aHitTest[0] > -1 And $aHitTest[1] > -1 And $aHitTest[0] = $iItem Then
|
|
; Redraw previously selected row
|
|
If $aGLVEx_Data[0][17] <> $iItem Then _GUICtrlListView_RedrawItems($hLV, $aGLVEx_Data[0][17], $aGLVEx_Data[0][17])
|
|
; Set new row and column
|
|
$aGLVEx_Data[0][17] = $aHitTest[0]
|
|
$aGLVEx_Data[0][18] = $aHitTest[1]
|
|
$aGLVEx_Data[$iLV_Index][20] = $aGLVEx_Data[0][17]
|
|
$aGLVEx_Data[$iLV_Index][21] = $aGLVEx_Data[0][18]
|
|
; Redraw newly selected row
|
|
_GUICtrlListView_RedrawItems($hLV, $iItem, $iItem)
|
|
EndIf
|
|
|
|
; Set user selection flag
|
|
$fGLVEx_UserSelFlag = 1
|
|
|
|
EndIf
|
|
EndIf
|
|
|
|
; Set selection change flag
|
|
$fGLVEx_SelChangeFlag = $iLV_Index
|
|
|
|
Case -5 ; $NM_RCLICK
|
|
|
|
; Set active ListView
|
|
$aGLVEx_Data[0][1] = $iLV_Index
|
|
; Get position of right click within Listview
|
|
$aGLVEx_Data[0][10] = DllStructGetData($tStruct, 4)
|
|
$aGLVEx_Data[0][11] = DllStructGetData($tStruct, 5)
|
|
; Redraw last selected row
|
|
_GUICtrlListView_RedrawItems($hLV, $aGLVEx_Data[0][17], $aGLVEx_Data[0][17])
|
|
; Set new active cell
|
|
$aGLVEx_Data[0][17] = DllStructGetData($tStruct, 4)
|
|
$aGLVEx_Data[0][18] = DllStructGetData($tStruct, 5)
|
|
$aGLVEx_Data[$iLV_Index][20] = $aGLVEx_Data[0][17]
|
|
$aGLVEx_Data[$iLV_Index][21] = $aGLVEx_Data[0][18]
|
|
; Redraw newly selected row
|
|
;
|
|
|
|
_GUICtrlListView_RedrawItems($hLV, $aGLVEx_Data[0][17], $aGLVEx_Data[0][17])
|
|
;;;
|
|
ListView_RClick()
|
|
|
|
EndSwitch
|
|
Else
|
|
|
|
; Check if header of enabled ListView
|
|
For $iLV_Index = 1 To $aGLVEx_Data[0][0]
|
|
If DllStructGetData($tStruct, 1) = _GUICtrlListView_GetHeader($aGLVEx_Data[$iLV_Index][0]) Then
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
|
|
If $iLV_Index <= $aGLVEx_Data[0][0] Then
|
|
; Create header data struct
|
|
Local $tNMHEADER = DllStructCreate($tagNMHEADER, $lParam)
|
|
$iCol = DllStructGetData($tNMHEADER, "Item")
|
|
|
|
Switch $iCol
|
|
Case 0 To _GUICtrlListView_GetColumnCount($aGLVEx_Data[$iLV_Index][0]) - 1
|
|
; Load header data
|
|
$aHdrData = $aGLVEx_Data[$iLV_Index][25]
|
|
; Check if valid data
|
|
If IsArray($aHdrData) And UBound($aHdrData, 2) Then
|
|
; Check header resizing status
|
|
Local $iHdrResize = $aHdrData[3][$iCol]
|
|
Switch $iCode
|
|
Case -306, -326 ; $HDN_BEGINTRACK(W)
|
|
If $iHdrResize Then
|
|
; Prevent resizing
|
|
Return True
|
|
Else
|
|
; Allow resizing
|
|
Return False
|
|
EndIf
|
|
Case -305, -325 ; $HDN_DIVIDERDBLCLICK(W)
|
|
If $iHdrResize Then
|
|
; Instant resize of column to fixed width
|
|
_GUICtrlListView_SetColumnWidth($aGLVEx_Data[$iLV_Index][0], $iCol, $iHdrResize)
|
|
; Redraw header
|
|
_WinAPI_RedrawWindow(DllStructGetData($tStruct, 1))
|
|
EndIf
|
|
EndSwitch
|
|
EndIf
|
|
EndSwitch
|
|
EndIf
|
|
EndIf
|
|
EndIf
|
|
|
|
EndFunc ;==>_GUIListViewEx_WM_NOTIFY_Handler
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_WM_MOUSEMOVE_Handler
|
|
; Description ...: Windows message handler for WM_NOTIFY
|
|
; Syntax.........: _GUIListViewEx_WM_MOUSEMOVE_Handler()
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: None
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If a WM_MOUSEMOVE handler already registered, then call this function from within that handler
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_WM_MOUSEMOVE_Handler($hWnd, $iMsg, $wParam, $lParam)
|
|
|
|
#forceref $hWnd, $iMsg, $wParam
|
|
|
|
Local $iVertScroll
|
|
|
|
If $iGLVEx_Dragging = 0 Then
|
|
Return "GUI_RUNDEFMSG"
|
|
EndIf
|
|
|
|
; Get item depth to make sure scroll is enough to get next item into view
|
|
If $aGLVEx_Data[$aGLVEx_Data[0][1]][10] Then
|
|
$iVertScroll = $aGLVEx_Data[$aGLVEx_Data[0][1]][10]
|
|
Else
|
|
Local $aRect = _GUICtrlListView_GetItemRect($hGLVEx_SrcHandle, 0)
|
|
$iVertScroll = $aRect[3] - $aRect[1]
|
|
EndIf
|
|
|
|
; Get window under mouse cursor
|
|
Local $hCurrent_Wnd = __GUIListViewEx_GetCursorWnd()
|
|
|
|
; If not over the current tgt ListView
|
|
If $hCurrent_Wnd <> $hGLVEx_TgtHandle Then
|
|
|
|
; Check if external drag permitted
|
|
If BitAND($aGLVEx_Data[$iGLVEx_TgtIndex][12], 1) Then
|
|
Return "GUI_RUNDEFMSG"
|
|
EndIf
|
|
|
|
; Is it another initiated ListView
|
|
For $i = 1 To $aGLVEx_Data[0][0]
|
|
If $aGLVEx_Data[$i][0] = $hCurrent_Wnd Then
|
|
; Check if external drop permitted
|
|
If BitAND($aGLVEx_Data[$i][12], 2) Then
|
|
Return "GUI_RUNDEFMSG"
|
|
EndIf
|
|
; Check same column count for Src and Tgt ListViews
|
|
If _GUICtrlListView_GetColumnCount($hGLVEx_SrcHandle) = _GUICtrlListView_GetColumnCount($hCurrent_Wnd) Then
|
|
; Compatible so switch to new target
|
|
; Clear insert mark in current tgt ListView
|
|
_GUICtrlListView_SetInsertMark($hGLVEx_TgtHandle, -1, True)
|
|
; Set data for new tgt ListView
|
|
$hGLVEx_TgtHandle = $hCurrent_Wnd
|
|
$cGLVEx_TgtID = $aGLVEx_Data[$i][1]
|
|
$iGLVEx_TgtIndex = $i
|
|
$aGLVEx_TgtArray = $aGLVEx_Data[$i][2]
|
|
$aGLVEx_Data[0][3] = $aGLVEx_Data[$i][10] ; Set item depth
|
|
; No point in looping further
|
|
ExitLoop
|
|
EndIf
|
|
EndIf
|
|
Next
|
|
EndIf
|
|
|
|
; Get current mouse Y coord
|
|
Local $iCurr_Y = BitShift($lParam, 16)
|
|
|
|
; Set insert mark to correct side of items depending on sense of movement when cursor within range
|
|
If $iGLVEx_InsertIndex <> -1 Then
|
|
If $iGLVEx_LastY = $iCurr_Y Then
|
|
Return "GUI_RUNDEFMSG"
|
|
ElseIf $iGLVEx_LastY > $iCurr_Y Then
|
|
$fGLVEx_BarUnder = False
|
|
_GUICtrlListView_SetInsertMark($hGLVEx_TgtHandle, $iGLVEx_InsertIndex, False)
|
|
Else
|
|
$fGLVEx_BarUnder = True
|
|
_GUICtrlListView_SetInsertMark($hGLVEx_TgtHandle, $iGLVEx_InsertIndex, True)
|
|
EndIf
|
|
EndIf
|
|
|
|
; Store current Y coord
|
|
$iGLVEx_LastY = $iCurr_Y
|
|
|
|
; Get ListView item under mouse
|
|
Local $aLVHit = _GUICtrlListView_HitTest($hGLVEx_TgtHandle)
|
|
Local $iCurr_Index = $aLVHit[0]
|
|
|
|
; If mouse is above or below ListView then scroll ListView
|
|
If $iCurr_Index = -1 Then
|
|
If $fGLVEx_BarUnder Then
|
|
_GUICtrlListView_Scroll($hGLVEx_TgtHandle, 0, $iVertScroll)
|
|
Else
|
|
_GUICtrlListView_Scroll($hGLVEx_TgtHandle, 0, -$iVertScroll)
|
|
EndIf
|
|
Sleep(10)
|
|
EndIf
|
|
|
|
; Check if over same item
|
|
If $iGLVEx_InsertIndex <> $iCurr_Index Then
|
|
; Show insert mark on current item
|
|
_GUICtrlListView_SetInsertMark($hGLVEx_TgtHandle, $iCurr_Index, $fGLVEx_BarUnder)
|
|
; Store current item
|
|
$iGLVEx_InsertIndex = $iCurr_Index
|
|
EndIf
|
|
|
|
Return "GUI_RUNDEFMSG"
|
|
|
|
EndFunc ;==>_GUIListViewEx_WM_MOUSEMOVE_Handler
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_WM_LBUTTONUP_Handler
|
|
; Description ...: Windows message handler for WM_NOTIFY
|
|
; Syntax.........: _GUIListViewEx_WM_LBUTTONUP_Handler()
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: None
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If a WM_LBUTTONUP handler already registered, then call this function from within that handler
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_WM_LBUTTONUP_Handler($hWnd, $iMsg, $wParam, $lParam)
|
|
|
|
#forceref $hWnd, $iMsg, $wParam, $lParam
|
|
|
|
If Not $iGLVEx_Dragging Then
|
|
Return "GUI_RUNDEFMSG"
|
|
EndIf
|
|
|
|
; Get item count
|
|
Local $iMultipleItems = $iGLVEx_Dragging - 1
|
|
|
|
; Reset flag
|
|
$iGLVEx_Dragging = 0
|
|
|
|
; Check for valid insert index (set to -1 if dropping into empty space)
|
|
If $iGLVEx_InsertIndex = -1 Then
|
|
; Set to bottom
|
|
$iGLVEx_InsertIndex = _GUICtrlListView_GetItemCount($hGLVEx_TgtHandle) - 1
|
|
EndIf
|
|
|
|
; Get window under mouse cursor
|
|
Local $hCurrent_Wnd = __GUIListViewEx_GetCursorWnd()
|
|
|
|
; Abandon if mouse not within tgt ListView
|
|
If $hCurrent_Wnd <> $hGLVEx_TgtHandle Then
|
|
; Clear insert mark
|
|
_GUICtrlListView_SetInsertMark($hGLVEx_TgtHandle, -1, True)
|
|
; Reset highlight to original items in Src ListView
|
|
For $i = 0 To $iMultipleItems
|
|
__GUIListViewEx_HighLight($hGLVEx_TgtHandle, $cGLVEx_TgtID, $iGLVEx_DraggedIndex + $i)
|
|
Next
|
|
; Delete copied arrays
|
|
$aGLVEx_SrcArray = 0
|
|
$aGLVEx_TgtArray = 0
|
|
Return
|
|
EndIf
|
|
|
|
; Clear insert mark
|
|
_GUICtrlListView_SetInsertMark($hGLVEx_TgtHandle, -1, True)
|
|
|
|
; Clear drag image
|
|
If $hGLVEx_DraggedImage Then
|
|
_GUIImageList_DragLeave($hGLVEx_SrcHandle)
|
|
_GUIImageList_EndDrag()
|
|
_GUIImageList_Destroy($hGLVEx_DraggedImage)
|
|
$hGLVEx_DraggedImage = 0
|
|
EndIf
|
|
|
|
; Dropping within same ListView
|
|
If $hGLVEx_SrcHandle = $hGLVEx_TgtHandle Then
|
|
; Determine position to insert
|
|
If $fGLVEx_BarUnder Then
|
|
If $iGLVEx_DraggedIndex > $iGLVEx_InsertIndex Then $iGLVEx_InsertIndex += 1
|
|
Else
|
|
If $iGLVEx_DraggedIndex < $iGLVEx_InsertIndex Then $iGLVEx_InsertIndex -= 1
|
|
EndIf
|
|
|
|
; Check not dropping on dragged item(s)
|
|
Switch $iGLVEx_InsertIndex
|
|
Case $iGLVEx_DraggedIndex To $iGLVEx_DraggedIndex + $iMultipleItems
|
|
; Reset highlight to original items
|
|
For $i = 0 To $iMultipleItems
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, $iGLVEx_DraggedIndex + $i)
|
|
Next
|
|
; Delete copied arrays
|
|
$aGLVEx_SrcArray = 0
|
|
$aGLVEx_TgtArray = 0
|
|
Return
|
|
EndSwitch
|
|
|
|
; Create Local array for checkboxes (if no checkboxes makes no difference)
|
|
Local $aCheck_Array[UBound($aGLVEx_SrcArray)]
|
|
For $i = 1 To UBound($aCheck_Array) - 1
|
|
$aCheck_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $i - 1)
|
|
Next
|
|
|
|
; Create Local array for dragged items checkbox state
|
|
Local $aCheckDrag_Array[$iMultipleItems + 1]
|
|
|
|
; Create Local colour array
|
|
$aGLVEx_SrcColArray = $aGLVEx_Data[$iGLVEx_SrcIndex][18]
|
|
Local $bUserCol = ((IsArray($aGLVEx_SrcColArray)) ? (True) : (False))
|
|
|
|
; Amend arrays
|
|
; Get data from dragged element(s)
|
|
If $iMultipleItems Then
|
|
; Multiple dragged elements
|
|
Local $aInsertData[$iMultipleItems + 1]
|
|
Local $aColData[$iMultipleItems + 1]
|
|
Local $aItemData[UBound($aGLVEx_SrcArray, 2)]
|
|
For $i = 0 To $iMultipleItems
|
|
; Data
|
|
For $j = 0 To UBound($aGLVEx_SrcArray, 2) - 1
|
|
$aItemData[$j] = $aGLVEx_SrcArray[$iGLVEx_DraggedIndex + 1 + $i][$j]
|
|
Next
|
|
$aInsertData[$i] = $aItemData
|
|
; Colours if required
|
|
If $bUserCol Then
|
|
For $j = 0 To UBound($aGLVEx_SrcColArray, 2) - 1
|
|
$aItemData[$j] = $aGLVEx_SrcColArray[$iGLVEx_DraggedIndex + 1 + $i][$j]
|
|
Next
|
|
$aColData[$i] = $aItemData
|
|
EndIf
|
|
; Checkboxes
|
|
$aCheckDrag_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $iGLVEx_DraggedIndex + $i)
|
|
Next
|
|
Else
|
|
; Single dragged element
|
|
Local $aInsertData[1]
|
|
Local $aColData[1]
|
|
Local $aItemData[UBound($aGLVEx_SrcArray, 2)]
|
|
For $i = 0 To UBound($aGLVEx_SrcArray, 2) - 1
|
|
$aItemData[$i] = $aGLVEx_SrcArray[$iGLVEx_DraggedIndex + 1][$i]
|
|
Next
|
|
$aInsertData[0] = $aItemData
|
|
If $bUserCol Then
|
|
For $i = 0 To UBound($aGLVEx_SrcColArray, 2) - 1
|
|
$aItemData[$i] = $aGLVEx_SrcColArray[$iGLVEx_DraggedIndex + 1][$i]
|
|
Next
|
|
$aColData[0] = $aItemData
|
|
EndIf
|
|
$aCheckDrag_Array[0] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $iGLVEx_DraggedIndex)
|
|
EndIf
|
|
|
|
; Set no redraw flag - prevents problems while colour arrays are updated
|
|
$aGLVEx_Data[0][12] = True
|
|
|
|
; Delete dragged element(s) from arrays
|
|
For $i = 0 To $iMultipleItems
|
|
__GUIListViewEx_Array_Delete($aGLVEx_SrcArray, $iGLVEx_DraggedIndex + 1)
|
|
__GUIListViewEx_Array_Delete($aCheck_Array, $iGLVEx_DraggedIndex + 1)
|
|
If $bUserCol Then __GUIListViewEx_Array_Delete($aGLVEx_SrcColArray, $iGLVEx_DraggedIndex + 1)
|
|
Next
|
|
|
|
; Amend insert positon for multiple items deleted above
|
|
If $iGLVEx_DraggedIndex < $iGLVEx_InsertIndex Then
|
|
$iGLVEx_InsertIndex -= $iMultipleItems
|
|
EndIf
|
|
|
|
; Re-insert dragged element(s) into array
|
|
For $i = $iMultipleItems To 0 Step -1
|
|
__GUIListViewEx_Array_Insert($aGLVEx_SrcArray, $iGLVEx_InsertIndex + 1, $aInsertData[$i])
|
|
__GUIListViewEx_Array_Insert($aCheck_Array, $iGLVEx_InsertIndex + 1, $aCheckDrag_Array[$i])
|
|
If $bUserCol Then __GUIListViewEx_Array_Insert($aGLVEx_SrcColArray, $iGLVEx_InsertIndex + 1, $aColData[$i], False, False)
|
|
Next
|
|
|
|
; Rewrite ListView to match array
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_SrcHandle, $aGLVEx_SrcArray, $aCheck_Array, $iGLVEx_SrcIndex)
|
|
|
|
; Set highlight to inserted item(s)
|
|
For $i = 0 To $iMultipleItems
|
|
__GUIListViewEx_HighLight($hGLVEx_SrcHandle, $cGLVEx_SrcID, $iGLVEx_InsertIndex + $i)
|
|
Next
|
|
|
|
; Store amended array
|
|
$aGLVEx_Data[$aGLVEx_Data[0][1]][2] = $aGLVEx_SrcArray
|
|
$aGLVEx_Data[$iGLVEx_SrcIndex][18] = $aGLVEx_SrcColArray
|
|
|
|
Else ; Dropping in another ListView
|
|
|
|
; Check checkbox status
|
|
Local $bCheckbox = (($aGLVEx_Data[$iGLVEx_SrcIndex][6] And $aGLVEx_Data[$iGLVEx_TgtIndex][6]) ? (True) : (False))
|
|
|
|
; Determine position to insert
|
|
If $fGLVEx_BarUnder Then
|
|
$iGLVEx_InsertIndex += 1
|
|
EndIf
|
|
|
|
; Colour arrays for manipulation
|
|
$aGLVEx_SrcColArray = $aGLVEx_Data[$iGLVEx_SrcIndex][18]
|
|
Local $bUserColSrc = ((IsArray($aGLVEx_SrcColArray)) ? (True) : (False))
|
|
$aGLVEx_TgtColArray = $aGLVEx_Data[$iGLVEx_TgtIndex][18]
|
|
Local $bUserColTgt = ((IsArray($aGLVEx_TgtColArray)) ? (True) : (False))
|
|
|
|
; Create Local arrays for checkboxes (if no checkboxes makes no difference)
|
|
Local $aCheck_SrcArray[UBound($aGLVEx_SrcArray)]
|
|
For $i = 1 To UBound($aCheck_SrcArray) - 1
|
|
$aCheck_SrcArray[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $i - 1)
|
|
Next
|
|
Local $aCheck_TgtArray[UBound($aGLVEx_TgtArray)]
|
|
For $i = 1 To UBound($aCheck_TgtArray) - 1
|
|
$aCheck_TgtArray[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_TgtHandle, $i - 1)
|
|
Next
|
|
|
|
; Create Local array for dragged items checkbox state
|
|
Local $aCheckDrag_Array[$iMultipleItems + 1]
|
|
|
|
; Amend arrays
|
|
; Get data from dragged element(s)
|
|
If $iMultipleItems Then
|
|
; Multiple dragged elements
|
|
Local $aInsertData[$iMultipleItems + 1]
|
|
Local $aColData[$iMultipleItems + 1]
|
|
Local $aItemData[UBound($aGLVEx_SrcArray, 2)]
|
|
For $i = 0 To $iMultipleItems
|
|
; Data
|
|
For $j = 0 To UBound($aGLVEx_SrcArray, 2) - 1
|
|
$aItemData[$j] = $aGLVEx_SrcArray[$iGLVEx_DraggedIndex + 1 + $i][$j]
|
|
Next
|
|
$aInsertData[$i] = $aItemData
|
|
; Colours if required
|
|
If $bUserColTgt Then
|
|
For $j = 0 To UBound($aGLVEx_SrcArray, 2) - 1
|
|
If $bUserColSrc Then
|
|
$aItemData[$j] = $aGLVEx_SrcColArray[$iGLVEx_DraggedIndex + 1 + $i][$j]
|
|
Else
|
|
$aItemData[$j] = ";"
|
|
EndIf
|
|
Next
|
|
$aColData[$i] = $aItemData
|
|
EndIf
|
|
; Checkboxes
|
|
$aCheckDrag_Array[$i] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $iGLVEx_DraggedIndex + $i)
|
|
Next
|
|
Else
|
|
; Single dragged element
|
|
Local $aInsertData[1]
|
|
Local $aColData[1]
|
|
Local $aItemData[UBound($aGLVEx_SrcArray, 2)]
|
|
For $i = 0 To UBound($aGLVEx_SrcArray, 2) - 1
|
|
$aItemData[$i] = $aGLVEx_SrcArray[$iGLVEx_DraggedIndex + 1][$i]
|
|
Next
|
|
$aInsertData[0] = $aItemData
|
|
If $bUserColTgt Then
|
|
For $i = 0 To UBound($aGLVEx_SrcArray, 2) - 1
|
|
If $bUserColSrc Then
|
|
$aItemData[$i] = $aGLVEx_SrcColArray[$iGLVEx_DraggedIndex + 1][$i]
|
|
Else
|
|
$aItemData[$i] = ";"
|
|
EndIf
|
|
Next
|
|
$aColData[0] = $aItemData
|
|
EndIf
|
|
$aCheckDrag_Array[0] = _GUICtrlListView_GetItemChecked($hGLVEx_SrcHandle, $iGLVEx_DraggedIndex)
|
|
EndIf
|
|
|
|
; Set no redraw flag - prevents problems while colour arrays are updated
|
|
$aGLVEx_Data[0][12] = True
|
|
|
|
; Delete dragged element(s) from source array
|
|
If Not BitAND($aGLVEx_Data[$iGLVEx_SrcIndex][12], 4) Then
|
|
For $i = 0 To $iMultipleItems
|
|
__GUIListViewEx_Array_Delete($aGLVEx_SrcArray, $iGLVEx_DraggedIndex + 1)
|
|
__GUIListViewEx_Array_Delete($aCheck_SrcArray, $iGLVEx_DraggedIndex + 1, $aCheckDrag_Array[$i])
|
|
If $bUserColSrc Then __GUIListViewEx_Array_Delete($aGLVEx_SrcColArray, $iGLVEx_DraggedIndex + 1)
|
|
Next
|
|
EndIf
|
|
|
|
; Check if insert index is valid
|
|
If $iGLVEx_InsertIndex < 0 Then
|
|
$iGLVEx_InsertIndex = _GUICtrlListView_GetItemCount($hGLVEx_TgtHandle)
|
|
EndIf
|
|
|
|
; Insert dragged element(s) into target array
|
|
For $i = $iMultipleItems To 0 Step -1
|
|
__GUIListViewEx_Array_Insert($aGLVEx_TgtArray, $iGLVEx_InsertIndex + 1, $aInsertData[$i])
|
|
__GUIListViewEx_Array_Insert($aCheck_TgtArray, $iGLVEx_InsertIndex + 1, $aCheckDrag_Array[$i])
|
|
If $bUserColTgt Then __GUIListViewEx_Array_Insert($aGLVEx_TgtColArray, $iGLVEx_InsertIndex + 1, $aColData[$i], False, False)
|
|
Next
|
|
|
|
; Rewrite ListViews to match arrays
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_SrcHandle, $aGLVEx_SrcArray, $aCheck_SrcArray, $iGLVEx_SrcIndex, $bCheckbox)
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_TgtHandle, $aGLVEx_TgtArray, $aCheck_TgtArray, $iGLVEx_TgtIndex, $bCheckbox)
|
|
|
|
; Set highlight to inserted item(s)
|
|
_GUIListViewEx_SetActive($iGLVEx_TgtIndex)
|
|
For $i = 0 To $iMultipleItems
|
|
__GUIListViewEx_HighLight($hGLVEx_TgtHandle, $cGLVEx_TgtID, $iGLVEx_InsertIndex + $i)
|
|
Next
|
|
|
|
; Store amended arrays
|
|
$aGLVEx_Data[$iGLVEx_SrcIndex][2] = $aGLVEx_SrcArray
|
|
$aGLVEx_Data[$iGLVEx_SrcIndex][18] = $aGLVEx_SrcColArray
|
|
$aGLVEx_Data[$iGLVEx_TgtIndex][2] = $aGLVEx_TgtArray
|
|
$aGLVEx_Data[$iGLVEx_TgtIndex][18] = $aGLVEx_TgtColArray
|
|
|
|
EndIf
|
|
|
|
; Delete copied arrays
|
|
$aGLVEx_SrcArray = 0
|
|
$aGLVEx_TgtArray = 0
|
|
$aGLVEx_SrcColArray = 0
|
|
$aGLVEx_TgtColArray = 0
|
|
|
|
; Set DragEvent details
|
|
$sGLVEx_DragEvent = $iGLVEx_SrcIndex & ":" & $iGLVEx_TgtIndex
|
|
; Set colour redraw flag
|
|
$aGLVEx_Data[0][22] = 1
|
|
|
|
; Clear no redraw flag
|
|
$aGLVEx_Data[0][12] = False
|
|
|
|
; If colour used or single cell selection
|
|
__GUIListViewEx_RedrawWindow($iGLVEx_SrcIndex)
|
|
If $hGLVEx_TgtHandle <> $hGLVEx_SrcHandle Then
|
|
__GUIListViewEx_RedrawWindow($iGLVEx_TgtIndex)
|
|
EndIf
|
|
|
|
EndFunc ;==>_GUIListViewEx_WM_LBUTTONUP_Handler
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_WM_SYSCOMMAND_Handler
|
|
; Description ...: Windows message handler for WM_SYSCOMMAND
|
|
; Syntax.........: _GUIListViewEx_WM_SYSCOMMAND_Handler()
|
|
; Requirement(s).: v3.3.10 +
|
|
; Return values .: None
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; Remarks .......: If a WM_SYSCOMMAND handler already registered, then call this function from within that handler
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_WM_SYSCOMMAND_Handler($hWnd, $iMsg, $wParam, $lParam)
|
|
|
|
#forceref $hWnd, $iMsg, $lParam, $lParam
|
|
|
|
; Check correct event from ListView GUI
|
|
If $hWnd = _WinAPI_GetParent($hGLVEx_SrcHandle) And $wParam = 0xF060 Then ; $SC_CLOSE
|
|
$aGLVEx_Data[0][9] = True
|
|
EndIf
|
|
|
|
EndFunc ;==>_GUIListViewEx_WM_SYSCOMMAND_Handler
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_ExpandRange
|
|
; Description ...: Expands ranges into an array of values - $iMode determines if columns or rows
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_ExpandRange($vRange, $iLV_Index, $iMode = 1)
|
|
|
|
; Check for valid range string
|
|
If StringRegExp($vRange, "[^*0-9-;]") <> 0 Then
|
|
Return SetError(1, 0, 0)
|
|
EndIf
|
|
|
|
; Get column/row count and create an array
|
|
Local $iCount
|
|
If $iMode = 1 Then
|
|
$iCount = _GUICtrlListView_GetColumnCount($aGLVEx_Data[$iLV_Index][0])
|
|
Else
|
|
$iCount = _GUICtrlListView_GetItemCount($aGLVEx_Data[$iLV_Index][0])
|
|
EndIf
|
|
Local $aRet[$iCount + 1]
|
|
|
|
; Strip any whitespace
|
|
$vRange = StringStripWS($vRange, 8)
|
|
; Check if "all"
|
|
If $vRange = "*" Then
|
|
$aRet[0] = $iCount
|
|
For $i = 1 To $iCount
|
|
$aRet[$i] = $i - 1
|
|
Next
|
|
Else
|
|
; Check if there are ranges to be expanded
|
|
If StringInStr($vRange, "-") Then
|
|
; Parse string
|
|
Local $aSplit_1, $aSplit_2, $iNumber
|
|
; Split on ";"
|
|
$aSplit_1 = StringSplit($vRange, ";")
|
|
$vRange = ""
|
|
; Check each element
|
|
For $i = 1 To $aSplit_1[0]
|
|
; Try and split on "-"
|
|
$aSplit_2 = StringSplit($aSplit_1[$i], "-")
|
|
; Add first value in all cases
|
|
$vRange &= $aSplit_2[1] & ";"
|
|
; If a valid range
|
|
If ($aSplit_2[0]) > 1 Then
|
|
; Check valid range
|
|
If (Number($aSplit_2[2]) > Number($aSplit_2[1])) Then
|
|
; Add the full range
|
|
$iNumber = $aSplit_2[1]
|
|
Do
|
|
$iNumber += 1
|
|
$vRange &= $iNumber & ";"
|
|
Until $iNumber = $aSplit_2[2]
|
|
Else
|
|
Return SetError(1, 0, 0)
|
|
EndIf
|
|
EndIf
|
|
Next
|
|
EndIf
|
|
; Split string into array
|
|
Local $aSplit = StringSplit($vRange, ";")
|
|
; Check for valid elements
|
|
For $i = 1 To $aSplit[0]
|
|
If $aSplit[$i] Then
|
|
$aRet[0] += 1
|
|
$aRet[$aRet[0]] = $aSplit[$i]
|
|
EndIf
|
|
Next
|
|
; Remove empty elements
|
|
ReDim $aRet[$aRet[0] + 1]
|
|
EndIf
|
|
; Return array of range values
|
|
Return $aRet
|
|
|
|
EndFunc ;==>__GUIListViewEx_ExpandRange
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_HighLight
|
|
; Description ...: Highlights first item and ensures visible, second item has highlight removed
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_HighLight($hLVHandle, $cLV_CID, $iIndexA, $iIndexB = -1)
|
|
|
|
; Check if Native or UDF and set focus
|
|
If $cLV_CID Then
|
|
GUICtrlSetState($cLV_CID, 256) ; $GUI_FOCUS
|
|
Else
|
|
_WinAPI_SetFocus($hLVHandle)
|
|
EndIf
|
|
; Cancel highlight on other item - needed for multisel listviews
|
|
If $iIndexB <> -1 Then _GUICtrlListView_SetItemSelected($hLVHandle, $iIndexB, False)
|
|
; Set highlight to inserted item and ensure in view
|
|
_GUICtrlListView_SetItemState($hLVHandle, $iIndexA, $LVIS_SELECTED, $LVIS_SELECTED)
|
|
_GUICtrlListView_EnsureVisible($hLVHandle, $iIndexA)
|
|
|
|
EndFunc ;==>__GUIListViewEx_HighLight
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_GetLVFont
|
|
; Description ...: Gets font details for ListView to be edited
|
|
; Author ........: Based on _GUICtrlGetFont by KaFu & Prog@ndy
|
|
; Modified ......: Melba23
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_GetLVFont($hLVHandle)
|
|
|
|
Local $iError = 0, $aFontDetails[2] = [Default, Default]
|
|
|
|
; Check handle
|
|
If Not IsHWnd($hLVHandle) Then
|
|
$hLVHandle = GUICtrlGetHandle($hLVHandle)
|
|
EndIf
|
|
If Not IsHWnd($hLVHandle) Then
|
|
$iError = 1
|
|
Else
|
|
Local $hFont = _SendMessage($hLVHandle, 0x0031) ; WM_GETFONT
|
|
If Not $hFont Then
|
|
$iError = 2
|
|
Else
|
|
Local $hDC = _WinAPI_GetDC($hLVHandle)
|
|
Local $hObjOrg = _WinAPI_SelectObject($hDC, $hFont)
|
|
Local $tFONT = DllStructCreate($tagLOGFONT)
|
|
Local $aRet = DllCall('gdi32.dll', 'int', 'GetObjectW', 'ptr', $hFont, 'int', DllStructGetSize($tFONT), 'ptr', DllStructGetPtr($tFONT))
|
|
If @error Or $aRet[0] = 0 Then
|
|
$iError = 3
|
|
Else
|
|
; Get font size
|
|
$aFontDetails[0] = Round((-1 * DllStructGetData($tFONT, 'Height')) * 72 / _WinAPI_GetDeviceCaps($hDC, 90), 1) ; $LOGPIXELSY = 90 => DPI aware
|
|
; Now look for font name
|
|
$aRet = DllCall("gdi32.dll", "int", "GetTextFaceW", "handle", $hDC, "int", 0, "ptr", 0)
|
|
Local $iCount = $aRet[0]
|
|
Local $tBuffer = DllStructCreate("wchar[" & $iCount & "]")
|
|
Local $pBuffer = DllStructGetPtr($tBuffer)
|
|
$aRet = DllCall("Gdi32.dll", "int", "GetTextFaceW", "handle", $hDC, "int", $iCount, "ptr", $pBuffer)
|
|
If @error Then
|
|
$iError = 4
|
|
Else
|
|
$aFontDetails[1] = DllStructGetData($tBuffer, 1) ; FontFacename
|
|
EndIf
|
|
EndIf
|
|
_WinAPI_SelectObject($hDC, $hObjOrg)
|
|
_WinAPI_ReleaseDC($hLVHandle, $hDC)
|
|
EndIf
|
|
EndIf
|
|
|
|
Return SetError($iError, 0, $aFontDetails)
|
|
|
|
EndFunc ;==>__GUIListViewEx_GetLVFont
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_EditProcess
|
|
; Description ...: Runs ListView editing process
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_EditProcess($iLV_Index, $aLocation, $iDelta_X, $iDelta_Y, $iEditMode, $iForce = False)
|
|
|
|
Local $hTemp_Combo = 9999, $hTemp_Edit = 9999, $hTemp_List = 9999, $iKey_Code, $fCombo_State, $aSplit, $sInsert
|
|
Local $iEditType, $fEdit, $fCombo, $fRead_Only, $fAuto_Drop, $fDTP, $fClick_Move = False, $cUpDown, $hUpDown
|
|
|
|
; Force ListView GUI to become current GUI for control creation and store previous GUI handle
|
|
Local $hPrevCurrGUI = GUISwitch(_WinAPI_GetParent($hGLVEx_SrcHandle))
|
|
|
|
; Unselect item
|
|
_GUICtrlListView_SetItemSelected($hGLVEx_SrcHandle, $aLocation[0], False)
|
|
|
|
; Declare return array
|
|
Local $aEdited[1][4] = [[0]] ; [[Number of edited items, blank, blank, blank]]
|
|
|
|
; Load active ListView details
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iLV_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iLV_Index][1]
|
|
|
|
; Store handle of ListView concerned
|
|
$hGLVEx_Editing = $hGLVEx_SrcHandle
|
|
Local $cEditingID = $cGLVEx_SrcID
|
|
|
|
; Valid keys to action ; TAB, ENTER, ESC, left/right/up/down arrows
|
|
Local $aKeys[7] = [0x09, 0x0D, 0x1B, 0x25, 0x27, 0x26, 0x28]
|
|
|
|
; Set Reset-on-ESC mode
|
|
Local $fReset_Edits = False
|
|
If $iEditMode < 0 Then
|
|
$fReset_Edits = True
|
|
$iEditMode = Abs($iEditMode)
|
|
EndIf
|
|
|
|
; Set row/col edit mode - default single edit
|
|
Local $iEditRow = 0, $iEditCol = 0
|
|
If $iEditMode Then
|
|
; Separate axis settings - force leading 0 if required
|
|
$aSplit = StringSplit(StringFormat("%02s", $iEditMode), "")
|
|
$iEditRow = $aSplit[1]
|
|
$iEditCol = $aSplit[2]
|
|
EndIf
|
|
|
|
; Extract editable array
|
|
Local $aEditable = $aGLVEx_Data[$iLV_Index][7]
|
|
|
|
; Check if edit to move on click
|
|
If $aGLVEx_Data[$iLV_Index][9] Then
|
|
$fClick_Move = True
|
|
EndIf
|
|
|
|
Local $tLVPos = DllStructCreate("struct;long X;long Y;endstruct")
|
|
; Get position of ListView within GUI client area
|
|
__GUIListViewEx_GetLVCoords($hGLVEx_Editing, $tLVPos)
|
|
; Get ListView client area to allow for scrollbars
|
|
Local $aLVClient = WinGetClientSize($hGLVEx_Editing)
|
|
; Get ListView font details
|
|
Local $aLV_FontDetails = __GUIListViewEx_GetLVFont($hGLVEx_Editing)
|
|
; Disable ListView
|
|
WinSetState($hGLVEx_Editing, "", @SW_DISABLE)
|
|
|
|
; Load edit width data array
|
|
Local $aWidth = ($aGLVEx_Data[$iLV_Index][14])
|
|
; Create dummy array if required
|
|
If Not IsArray($aWidth) Then Local $aWidth[_GUICtrlListView_GetColumnCount($aGLVEx_Data[$iLV_Index][0])]
|
|
|
|
; Define variables
|
|
Local $iWidth, $fExitLoop, $tMouseClick = DllStructCreate($tagPOINT)
|
|
; Set default mousecoordmode
|
|
Local $iOldMouseOpt = Opt("MouseCoordMode", 1)
|
|
; Prevent GUI closure on ESC as needed to exit edit
|
|
Local $iOldESC = Opt("GUICloseOnESC", 0)
|
|
; Wait for mouse button release
|
|
_WinAPI_GetAsyncKeyState(0x01)
|
|
While _WinAPI_GetAsyncKeyState(0x01)
|
|
Sleep(10)
|
|
WEnd
|
|
|
|
; Start the edit loop
|
|
While 1
|
|
|
|
|
|
|
|
; Clear all type flags
|
|
$fEdit = False
|
|
$fCombo = False
|
|
$fRead_Only = False
|
|
$fAuto_Drop = False
|
|
$fDTP = False
|
|
|
|
; Determine type of control required for this cell and extract data if required
|
|
$iEditType = $aEditable[0][$aLocation[1]]
|
|
Switch $iEditType
|
|
Case 0, 1 ; Edit
|
|
$fEdit = True
|
|
If $iForce Then
|
|
$iEditType = 1 ; Force text edit if called by _GUIListViewEx_EditItem
|
|
EndIf
|
|
|
|
Case 2 ; Combo
|
|
$fCombo = True
|
|
Local $sCombo_Data = $aEditable[1][$aLocation[1]]
|
|
$fRead_Only = (BitAND($aEditable[2][$aLocation[1]], 1) = 1)
|
|
$fAuto_Drop = (BitAND($aEditable[2][$aLocation[1]], 2) = 2)
|
|
|
|
Case 3 ; DTP
|
|
$fDTP = True
|
|
Local $sDTP_Default = $aEditable[1][$aLocation[1]]
|
|
If StringRight($sDTP_Default, 1) = "#" Then
|
|
$sDTP_Default = StringTrimRight($sDTP_Default, 1)
|
|
$fAuto_Drop = True
|
|
EndIf
|
|
If $sDTP_Default = Default Then
|
|
$sDTP_Default = @YEAR & "/" & @MON & "/" & @MDAY
|
|
EndIf
|
|
Local $sDTP_Format = $aEditable[2][$aLocation[1]]
|
|
If $sDTP_Format = Default Then
|
|
$sDTP_Format = ""
|
|
EndIf
|
|
EndSwitch
|
|
|
|
; Read current text of clicked item
|
|
Local $sItemOrgText = _GUICtrlListView_GetItemText($hGLVEx_Editing, $aLocation[0], $aLocation[1])
|
|
; Ensure item is visible and get required edit coords
|
|
Local $aEdit_Pos = __GUIListViewEx_EditCoords($hGLVEx_Editing, $cEditingID, $aLocation, $tLVPos, $aLVClient[0] - 5, $iDelta_X, $iDelta_Y)
|
|
; Get required edit width - force to number so non-digits are set to 0
|
|
$iWidth = Number($aWidth[$aLocation[1]])
|
|
; Alter edit/combo width if required value less than current width
|
|
If $iWidth > $aEdit_Pos[2] Then
|
|
If $fRead_Only Then ; Only adjust read-only combo edit width if value is negative
|
|
If $iWidth < 0 Then
|
|
$aEdit_Pos[2] = Abs($iWidth)
|
|
EndIf
|
|
Else ; Always adjust for if manual input accepted
|
|
$aEdit_Pos[2] = Abs($iWidth)
|
|
EndIf
|
|
EndIf
|
|
|
|
; Create control
|
|
Switch $iEditType
|
|
Case 1 ; Edit
|
|
; Create temporary edit - get handle, set font size, give keyboard focus and select all text
|
|
$cGLVEx_EditID = GUICtrlCreateInput($sItemOrgText, $aEdit_Pos[0], $aEdit_Pos[1], $aEdit_Pos[2], $aEdit_Pos[3], 128) ; $ES_AUTOHSCROLL
|
|
$hTemp_Edit = GUICtrlGetHandle($cGLVEx_EditID)
|
|
; Check if UpDown required
|
|
If $aEditable[1][$aLocation[1]] = 1 Then
|
|
Local $iWrap = -1 ; Default no wrap
|
|
; Check if limits to be applied
|
|
If $aEditable[2][$aLocation[1]] Then
|
|
$aSplit = StringSplit($aEditable[2][$aLocation[1]], "|")
|
|
; Check valid syntax
|
|
If UBound($aSplit) = 4 Then
|
|
$iWrap = (($aSplit[3] = 1) ? (0x05) : (-1)) ; ($UDS_ALIGNRIGHT, $UDS_WRAP), (Default)
|
|
EndIf
|
|
EndIf
|
|
; Create UpDowm
|
|
$cUpDown = GUICtrlCreateUpdown($cGLVEx_EditID, $iWrap)
|
|
$hUpDown = GUICtrlGetHandle($cUpDown)
|
|
; Check for limits
|
|
If UBound($aSplit) = 4 Then
|
|
GUICtrlSetLimit($cUpDown, $aSplit[2], $aSplit[1])
|
|
EndIf
|
|
; Ensure visible
|
|
_WinAPI_RedrawWindow($hUpDown)
|
|
EndIf
|
|
|
|
Case 2 ; Combo
|
|
; Create temporary combo - get handle, set font size, give keyboard focus
|
|
If $fRead_Only Then
|
|
$cGLVEx_EditID = GUICtrlCreateCombo("", $aEdit_Pos[0], $aEdit_Pos[1], $aEdit_Pos[2], $aEdit_Pos[3], 0x00200043) ; $CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL
|
|
Else
|
|
$cGLVEx_EditID = GUICtrlCreateCombo("", $aEdit_Pos[0], $aEdit_Pos[1], $aEdit_Pos[2], $aEdit_Pos[3], 0x00200042) ; $CBS_DROPDOWN, $CBS_AUTOHSCROLL, $WS_VSCROLL
|
|
EndIf
|
|
GUICtrlSetData($cGLVEx_EditID, $sCombo_Data, $sItemOrgText)
|
|
Local $tInfo = DllStructCreate("dword Size;struct;long EditLeft;long EditTop;long EditRight;long EditBottom;endstruct;" & _
|
|
"struct;long BtnLeft;long BtnTop;long BtnRight;long BtnBottom;endstruct;dword BtnState;hwnd hCombo;hwnd hEdit;hwnd hList")
|
|
Local $iInfo = DllStructGetSize($tInfo)
|
|
DllStructSetData($tInfo, "Size", $iInfo)
|
|
Local $hCombo = GUICtrlGetHandle($cGLVEx_EditID)
|
|
; Set readonly combo dropped width if required
|
|
If $fRead_Only And Abs($iWidth) > $aEdit_Pos[2] Then
|
|
_SendMessage($hCombo, 0x160, Abs($iWidth)) ; $CB_SETDROPPEDWIDTH
|
|
EndIf
|
|
; Get combo data
|
|
_SendMessage($hCombo, 0x164, 0, $tInfo, 0, "wparam", "struct*") ; $CB_GETCOMBOBOXINFO
|
|
$hTemp_Edit = DllStructGetData($tInfo, "hEdit")
|
|
$hTemp_List = DllStructGetData($tInfo, "hList")
|
|
$hTemp_Combo = DllStructGetData($tInfo, "hCombo")
|
|
|
|
Case 3 ; DTP
|
|
; Create temp date picker
|
|
$cGLVEx_EditID = GUICtrlCreateDate($sDTP_Default, $aEdit_Pos[0], $aEdit_Pos[1], $aEdit_Pos[2], $aEdit_Pos[3])
|
|
$hTemp_Edit = GUICtrlGetHandle($cGLVEx_EditID)
|
|
; Set format if required
|
|
If $sDTP_Format Then
|
|
GUICtrlSendMsg($cGLVEx_EditID, 0x1032, 0, $sDTP_Format) ; $DTM_SETFORMATW
|
|
EndIf
|
|
|
|
EndSwitch
|
|
|
|
; Set font
|
|
GUICtrlSetFont($cGLVEx_EditID, $aLV_FontDetails[0], Default, Default, $aLV_FontDetails[1])
|
|
|
|
; Set focus to editing control
|
|
_WinAPI_SetFocus($hTemp_Edit)
|
|
; Check "select all" flag state
|
|
If Not $aGLVEx_Data[$iLV_Index][11] Then
|
|
GUICtrlSendMsg($cGLVEx_EditID, 0xB1, 0, -1) ; $EM_SETSEL
|
|
EndIf
|
|
; Check for auto "drop-down" combo
|
|
If $fAuto_Drop Then
|
|
Switch $iEditType
|
|
Case 2
|
|
_SendMessage($hCombo, 0x14F, True) ; $$CB_SHOWDROPDOWN
|
|
Case 3
|
|
_SendMessage($hTemp_Edit, 0x0201, 1, $aEdit_Pos[2] - 10) ; WM_LBUTTONDOWN
|
|
EndSwitch
|
|
EndIf
|
|
|
|
; Copy array for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iLV_Index][2]
|
|
; Clear key code flag
|
|
$iKey_Code = 0
|
|
; Set combo down/up flag depending on initial state
|
|
$fCombo_State = (($fAuto_Drop) ? (True) : (False))
|
|
|
|
; Wait for a key press or combo down/up
|
|
While 1
|
|
|
|
; Clear flag
|
|
$fExitLoop = False
|
|
|
|
; Check for SYSCOMMAND Close Event
|
|
If $aGLVEx_Data[0][9] Then
|
|
$fExitLoop = True
|
|
$aGLVEx_Data[0][9] = False
|
|
EndIf
|
|
|
|
; Mouse pressed
|
|
_WinAPI_GetAsyncKeyState(0x01)
|
|
If _WinAPI_GetAsyncKeyState(0x01) Then
|
|
; Look for clicks outside edit/combo control
|
|
DllStructSetData($tMouseClick, "x", MouseGetPos(0))
|
|
DllStructSetData($tMouseClick, "y", MouseGetPos(1))
|
|
Switch _WinAPI_WindowFromPoint($tMouseClick)
|
|
Case $hTemp_Combo, $hTemp_Edit, $hTemp_List, $hUpDown
|
|
; Over edit/combo
|
|
Case Else
|
|
; Ignore if using date control
|
|
If Not $fDTP Then
|
|
$fExitLoop = True
|
|
EndIf
|
|
EndSwitch
|
|
; Wait for mouse button release
|
|
_WinAPI_GetAsyncKeyState(0x01)
|
|
While _WinAPI_GetAsyncKeyState(0x01)
|
|
Sleep(10)
|
|
WEnd
|
|
EndIf
|
|
|
|
; Exit loop
|
|
If $fExitLoop Then
|
|
; If standard edit control
|
|
If $fEdit Then
|
|
; Set appropriate behaviour
|
|
If $fClick_Move Then
|
|
$iKey_Code = 0x02 ; Confirm edit and move to next cell
|
|
Else
|
|
;~ $iKey_Code = 0x01 ; Abandon editing process Stabdart
|
|
$iKey_Code = 0x02 ; Abandon editing process wie oben
|
|
EndIf
|
|
EndIf
|
|
ExitLoop
|
|
EndIf
|
|
|
|
If $fCombo Then
|
|
; Check for dropdown open and close
|
|
Switch _SendMessage($hCombo, 0x157) ; $CB_GETDROPPEDSTATE
|
|
|
|
Case 0
|
|
; If opened and closed
|
|
If $fCombo_State = True Then
|
|
; If no content
|
|
If GUICtrlRead($cGLVEx_EditID) = "" Then
|
|
; Ignore
|
|
;$fCombo_State = False
|
|
$iKey_Code = 0x0D
|
|
ExitLoop
|
|
Else
|
|
; Act as if Enter pressed
|
|
$iKey_Code = 0x0D
|
|
ExitLoop
|
|
EndIf
|
|
EndIf
|
|
|
|
Case 1
|
|
; Set flag if opened
|
|
If Not $fCombo_State Then
|
|
$fCombo_State = True
|
|
EndIf
|
|
|
|
EndSwitch
|
|
EndIf
|
|
|
|
; Check for valid key pressed
|
|
For $i = 0 To 2 ; TAB, ENTER, ESC
|
|
_WinAPI_GetAsyncKeyState($aKeys[$i])
|
|
If _WinAPI_GetAsyncKeyState($aKeys[$i]) Then
|
|
; Set key pressed flag
|
|
$iKey_Code = $aKeys[$i]
|
|
ExitLoop 2
|
|
EndIf
|
|
Next
|
|
For $i = 3 To 6 ; l/r/u/d with ctrl pressed
|
|
_WinAPI_GetAsyncKeyState($aKeys[$i])
|
|
If _WinAPI_GetAsyncKeyState($aKeys[$i]) And _WinAPI_GetAsyncKeyState(0x11) Then
|
|
; Set key pressed flag
|
|
$iKey_Code = $aKeys[$i]
|
|
ExitLoop 2
|
|
EndIf
|
|
Next
|
|
|
|
; Temp input lost focus
|
|
If _WinAPI_GetFocus() <> $hTemp_Edit Then
|
|
ExitLoop
|
|
EndIf
|
|
|
|
; Save CPU
|
|
Sleep(10)
|
|
WEnd
|
|
|
|
; Check if edit to be confirmed
|
|
Switch $iKey_Code
|
|
Case 0x25, 0x26, 0x27, 0x28 ; arrow keys
|
|
; If not standard edit control then abandon edit
|
|
If $fEdit Then
|
|
ContinueCase
|
|
EndIf
|
|
|
|
Case 0x02, 0x09, 0x0D ; Mouse (with Click_Move), TAB, ENTER
|
|
; Read edit content
|
|
;~ MsgBox(64, "", "")
|
|
Local $sItemNewText = GUICtrlRead($cGLVEx_EditID)
|
|
;~ ; Check replacement required
|
|
;~ If $sItemNewText = $sItemOrgText Then
|
|
;~
|
|
;~ Else
|
|
; Amend item text
|
|
_GUICtrlListView_SetItemText($hGLVEx_Editing, $aLocation[0], $sItemNewText, $aLocation[1])
|
|
; Amend array element
|
|
$aGLVEx_SrcArray[$aLocation[0] + 1][$aLocation[1]] = $sItemNewText
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][2] = $aGLVEx_SrcArray
|
|
; Add item data to return array
|
|
$aEdited[0][0] += 1
|
|
ReDim $aEdited[$aEdited[0][0] + 1][4]
|
|
; Save location & original content
|
|
$aEdited[$aEdited[0][0]][0] = $aLocation[0]
|
|
$aEdited[$aEdited[0][0]][1] = $aLocation[1]
|
|
$aEdited[$aEdited[0][0]][2] = $sItemOrgText
|
|
$aEdited[$aEdited[0][0]][3] = $sItemNewText
|
|
|
|
_LV_LVAufMa_save2temp()
|
|
;~ EndIf
|
|
EndSwitch
|
|
|
|
; Delete temporary edit and set place holder
|
|
GUICtrlDelete($cGLVEx_EditID)
|
|
GUICtrlDelete($cUpDown)
|
|
$cGLVEx_EditID = 9999
|
|
; Reset user mousecoord mode
|
|
Opt("MouseCoordMode", $iOldMouseOpt)
|
|
|
|
; Check edit mode
|
|
If $iEditMode = 0 Then ; Single edit
|
|
; Exit edit process
|
|
ExitLoop
|
|
Else
|
|
Switch $iKey_Code
|
|
Case 0x02
|
|
$iKey_Code = 0x01
|
|
ContinueCase
|
|
|
|
Case 0x00, 0x01, 0x0D ; Edit lost focus, mouse button outside edit, ENTER pressed
|
|
; Wait until key/button no longer pressed
|
|
_WinAPI_GetAsyncKeyState($iKey_Code)
|
|
While _WinAPI_GetAsyncKeyState($iKey_Code)
|
|
Sleep(10)
|
|
WEnd
|
|
; Exit Edit process
|
|
ExitLoop
|
|
|
|
Case 0x1B ; ESC pressed
|
|
; Check Reset-on-ESC mode
|
|
If $fReset_Edits Then
|
|
; Reset previous confirmed edits starting with most recent
|
|
For $i = $aEdited[0][0] To 1 Step -1
|
|
_GUICtrlListView_SetItemText($hGLVEx_Editing, $aEdited[$i][0], $aEdited[$i][2], $aEdited[$i][1])
|
|
Switch UBound($aGLVEx_SrcArray, 0)
|
|
Case 1
|
|
$aSplit = StringSplit($aGLVEx_SrcArray[$aEdited[$i][0] + 1], $aGLVEx_Data[0][24])
|
|
$aSplit[$aEdited[$i][1] + 1] = $aEdited[$i][2]
|
|
$sInsert = ""
|
|
For $j = 1 To $aSplit[0]
|
|
$sInsert &= $aSplit[$j] & $aGLVEx_Data[0][24]
|
|
Next
|
|
$aGLVEx_SrcArray[$aEdited[$i][0] + 1] = StringTrimRight($sInsert, 1)
|
|
|
|
Case 2
|
|
$aGLVEx_SrcArray[$aEdited[$i][0] + 1][$aEdited[$i][1]] = $aEdited[$i][2]
|
|
EndSwitch
|
|
Next
|
|
; Store amended array
|
|
$aGLVEx_Data[$iLV_Index][2] = $aGLVEx_SrcArray
|
|
; Empty return array as no edits were made
|
|
Local $aEdited[1][4] = [[0]]
|
|
EndIf
|
|
; Wait until key no longer pressed
|
|
_WinAPI_GetAsyncKeyState(0x1B)
|
|
While _WinAPI_GetAsyncKeyState(0x1B)
|
|
Sleep(10)
|
|
WEnd
|
|
; Exit Edit process
|
|
ExitLoop
|
|
|
|
Case 0x09, 0x27 ; TAB or right arrow
|
|
While 1
|
|
If $iEditCol <> 0 Then
|
|
; Set next column
|
|
$aLocation[1] += 1
|
|
; Check column exists
|
|
If $aLocation[1] = _GUICtrlListView_GetColumnCount($hGLVEx_Editing) Then
|
|
; Does not exist so check required action
|
|
Switch $iEditCol
|
|
Case 1
|
|
; Exit edit process
|
|
ExitLoop 2
|
|
Case 2
|
|
; Stay on same location
|
|
$aLocation[1] -= 1
|
|
ExitLoop
|
|
Case 3
|
|
; Loop
|
|
$aLocation[1] = 0
|
|
EndSwitch
|
|
EndIf
|
|
; Check this column is editable
|
|
If $aEditable[0][$aLocation[1]] <> 0 Then
|
|
; Editable column
|
|
ExitLoop
|
|
Else
|
|
; Not editable column
|
|
ExitLoop 2
|
|
EndIf
|
|
Else
|
|
; End edit
|
|
ExitLoop 2
|
|
EndIf
|
|
WEnd
|
|
|
|
Case 0x25 ; Left arrow
|
|
While 1
|
|
If $iEditCol <> 0 Then
|
|
$aLocation[1] -= 1
|
|
If $aLocation[1] < 0 Then
|
|
Switch $iEditCol
|
|
Case 1
|
|
ExitLoop 2
|
|
Case 2
|
|
$aLocation[1] += 1
|
|
ExitLoop
|
|
Case 3
|
|
$aLocation[1] = _GUICtrlListView_GetColumnCount($hGLVEx_Editing) - 1
|
|
EndSwitch
|
|
EndIf
|
|
; Check this column is editable
|
|
If $aEditable[0][$aLocation[1]] <> 0 Then
|
|
ExitLoop
|
|
Else
|
|
ExitLoop 2
|
|
EndIf
|
|
Else
|
|
; End edit
|
|
ExitLoop 2
|
|
EndIf
|
|
WEnd
|
|
|
|
Case 0x28 ; Down key
|
|
While 1
|
|
If $iEditRow <> 0 Then
|
|
; Set next row
|
|
$aLocation[0] += 1
|
|
; Check column exists
|
|
If $aLocation[0] = _GUICtrlListView_GetItemCount($hGLVEx_Editing) Then
|
|
; Does not exist so check required action
|
|
Switch $iEditRow
|
|
Case 1
|
|
; Exit edit process
|
|
ExitLoop 2
|
|
Case 2
|
|
; Stay on same location
|
|
$aLocation[0] -= 1
|
|
ExitLoop
|
|
Case 3
|
|
; Loop
|
|
$aLocation[0] = -1
|
|
EndSwitch
|
|
Else
|
|
; All rows editable
|
|
ExitLoop
|
|
EndIf
|
|
Else
|
|
; End edit
|
|
ExitLoop 2
|
|
EndIf
|
|
WEnd
|
|
|
|
Case 0x26 ; Up key
|
|
While 1
|
|
If $iEditRow <> 0 Then
|
|
$aLocation[0] -= 1
|
|
If $aLocation[0] < 0 Then
|
|
Switch $iEditRow
|
|
Case 1
|
|
ExitLoop 2
|
|
Case 2
|
|
$aLocation[0] += 1
|
|
ExitLoop
|
|
Case 3
|
|
$aLocation[0] = _GUICtrlListView_GetItemCount($hGLVEx_Editing)
|
|
EndSwitch
|
|
Else
|
|
ExitLoop
|
|
EndIf
|
|
Else
|
|
; End edit
|
|
ExitLoop 2
|
|
EndIf
|
|
WEnd
|
|
EndSwitch
|
|
; Wait until key no longer pressed
|
|
_WinAPI_GetAsyncKeyState($iKey_Code)
|
|
While _WinAPI_GetAsyncKeyState($iKey_Code)
|
|
Sleep(10)
|
|
WEnd
|
|
; Continue edit loop on next item
|
|
EndIf
|
|
WEnd
|
|
; Delete copied array
|
|
$aGLVEx_SrcArray = 0
|
|
; Reenable ListView
|
|
WinSetState($hGLVEx_Editing, "", @SW_ENABLE)
|
|
; Reselect item
|
|
_GUICtrlListView_SetItemState($hGLVEx_Editing, $aLocation[0], $LVIS_SELECTED, $LVIS_SELECTED)
|
|
|
|
; Set extended to key value
|
|
SetExtended($iKey_Code)
|
|
; Reset user value
|
|
Opt("GUICloseOnESC", $iOldESC)
|
|
|
|
; Reset current GUI to previous handle
|
|
GUISwitch($hPrevCurrGUI)
|
|
|
|
; Reset focus to the ListView
|
|
_WinAPI_SetFocus($hGLVEx_Editing)
|
|
|
|
; Return array
|
|
Return $aEdited
|
|
|
|
EndFunc ;==>__GUIListViewEx_EditProcess
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_EditCoords
|
|
; Description ...: Ensures item in view then locates and sizes edit control
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_EditCoords($hLV_Handle, $cLV_CID, $aLocation, $tLVPos, $iLVWidth, $iDelta_X, $iDelta_Y)
|
|
|
|
; Declare array to hold return data
|
|
Local $aEdit_Data[4]
|
|
; Ensure row visible
|
|
_GUICtrlListView_EnsureVisible($hLV_Handle, $aLocation[0])
|
|
; Get size of item
|
|
Local $aRect = _GUICtrlListView_GetSubItemRect($hLV_Handle, $aLocation[0], $aLocation[1])
|
|
; Set required edit height
|
|
$aEdit_Data[3] = $aRect[3] - $aRect[1] + 1
|
|
; Set required edit width
|
|
$aEdit_Data[2] = _GUICtrlListView_GetColumnWidth($hLV_Handle, $aLocation[1])
|
|
; Ensure column visible - scroll to left edge if all column not in view
|
|
If $aRect[0] < 0 Or $aRect[2] > $iLVWidth Then
|
|
_GUICtrlListView_Scroll($hLV_Handle, $aRect[0], 0)
|
|
; Redetermine item coords
|
|
$aRect = _GUICtrlListView_GetSubItemRect($hLV_Handle, $aLocation[0], $aLocation[1])
|
|
; Check available column width and limit if required
|
|
If $aRect[0] + $aEdit_Data[2] > $iLVWidth Then
|
|
$aEdit_Data[2] = $iLVWidth - $aRect[0]
|
|
EndIf
|
|
EndIf
|
|
; Adjust Y coord if Native ListView
|
|
If $cLV_CID Then
|
|
$iDelta_Y += 1
|
|
EndIf
|
|
; Determine screen coords for edit control
|
|
$aEdit_Data[0] = DllStructGetData($tLVPos, "X") + $aRect[0] + $iDelta_X + 2
|
|
$aEdit_Data[1] = DllStructGetData($tLVPos, "Y") + $aRect[1] + $iDelta_Y
|
|
|
|
; Return edit data
|
|
Return $aEdit_Data
|
|
|
|
EndFunc ;==>__GUIListViewEx_EditCoords
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_ReWriteLV
|
|
; Description ...: Deletes all ListView content and refills to match array
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_ReWriteLV($hLVHandle, ByRef $aLV_Array, ByRef $aCheck_Array, $iLV_Index, $fCheckBox = True, $fRetainWidth = True)
|
|
|
|
Local $iVertScroll, $iColCount
|
|
Local $iLV_CID = $aGLVEx_Data[$iLV_Index][1]
|
|
|
|
; Get item depth
|
|
If $aGLVEx_Data[$iLV_Index][10] Then
|
|
$iVertScroll = $aGLVEx_Data[$iLV_Index][10]
|
|
Else
|
|
; If not already set then ListView was empty so determine
|
|
Local $aRect = _GUICtrlListView_GetItemRect($hLVHandle, 0)
|
|
$aGLVEx_Data[$iLV_Index][10] = $aRect[3] - $aRect[1]
|
|
; If still empty set a placeholder for this instance
|
|
If $iVertScroll = 0 Then
|
|
; And make sure scroll is likely to be enough to get next item into view
|
|
$iVertScroll = 20
|
|
EndIf
|
|
EndIf
|
|
|
|
; Get top item
|
|
Local $iTopIndex_Org = _GUICtrlListView_GetTopIndex($hLVHandle)
|
|
|
|
; If native ListView column width to be retained then save column widths - normally widened if data too wide for existing width
|
|
If $fRetainWidth And $iLV_CID Then
|
|
$iColCount = _GUICtrlListView_GetColumnCount($hGLVEx_SrcHandle)
|
|
; Store column widths
|
|
Local $aCol_Width[$iColCount]
|
|
For $i = 1 To $iColCount - 1
|
|
$aCol_Width[$i] = _GUICtrlListView_GetColumnWidth($hGLVEx_SrcHandle, $i)
|
|
Next
|
|
EndIf
|
|
|
|
_GUICtrlListView_BeginUpdate($hLVHandle)
|
|
|
|
; Empty ListView
|
|
_GUICtrlListView_DeleteAllItems($hLVHandle)
|
|
|
|
; Check array to fill ListView
|
|
If UBound($aLV_Array, 2) Then
|
|
|
|
; Remove count line from stored array
|
|
Local $aArray = $aLV_Array
|
|
_ArrayDelete($aArray, 0)
|
|
|
|
; Load ListView content
|
|
Local $cLV_CID = $aGLVEx_Data[$iLV_Index][1]
|
|
If $cLV_CID Then
|
|
; Native ListView
|
|
Local $sLine, $iLastCol = UBound($aArray, 2) - 1
|
|
For $i = 0 To UBound($aArray) - 1
|
|
$sLine = ""
|
|
For $j = 0 To $iLastCol
|
|
$sLine &= $aArray[$i][$j] & "|"
|
|
Next
|
|
GUICtrlCreateListViewItem(StringTrimRight($sLine, 1), $cLV_CID)
|
|
Next
|
|
Else
|
|
; UDF ListView
|
|
_GUICtrlListView_AddArray($hLVHandle, $aArray)
|
|
EndIf
|
|
|
|
; Reset checkbox if required
|
|
For $i = 1 To $aLV_Array[0][0]
|
|
If $fCheckBox And $aCheck_Array[$i] Then
|
|
_GUICtrlListView_SetItemChecked($hLVHandle, $i - 1)
|
|
EndIf
|
|
Next
|
|
|
|
; Now scroll to same place or max possible
|
|
Local $iTopIndex_Curr = _GUICtrlListView_GetTopIndex($hLVHandle)
|
|
While $iTopIndex_Curr < $iTopIndex_Org
|
|
_GUICtrlListView_Scroll($hLVHandle, 0, $iVertScroll)
|
|
; If scroll had no effect then max scroll up
|
|
If _GUICtrlListView_GetTopIndex($hLVHandle) = $iTopIndex_Curr Then
|
|
ExitLoop
|
|
Else
|
|
; Reset current top index
|
|
$iTopIndex_Curr = _GUICtrlListView_GetTopIndex($hLVHandle)
|
|
EndIf
|
|
WEnd
|
|
EndIf
|
|
|
|
; Reset column widths if needed
|
|
If $fRetainWidth And $iLV_CID Then
|
|
For $i = 1 To $iColCount - 1
|
|
$aCol_Width[$i] = _GUICtrlListView_SetColumnWidth($hGLVEx_SrcHandle, $i, $aCol_Width[$i])
|
|
Next
|
|
EndIf
|
|
|
|
_GUICtrlListView_EndUpdate($hLVHandle)
|
|
|
|
EndFunc ;==>__GUIListViewEx_ReWriteLV
|
|
|
|
; #FUNCTION# =========================================================================================================
|
|
; Name...........: _GUIListViewEx_DeleteAll
|
|
; Description ...: Deletes all item(s) in active ListView
|
|
; Syntax.........: _GUIListViewEx_DeleteAll()
|
|
; Parameters ....: None
|
|
; Requirement(s).: v3.3 +
|
|
; Return values .: Success: Array of active ListView with count in [0] element
|
|
; Failure: Returns "" and sets @error as follows:
|
|
; Author ........: Melba23
|
|
; Modified ......: Detefon
|
|
; Remarks .......:
|
|
; Example........: Yes
|
|
;=====================================================================================================================
|
|
Func _GUIListViewEx_DeleteAll()
|
|
|
|
; Set data for active ListView
|
|
Local $iArray_Index = $aGLVEx_Data[0][1]
|
|
; If no ListView active then return
|
|
If $iArray_Index = 0 Then Return SetError(1, 0, "")
|
|
|
|
; Load active ListView details
|
|
$hGLVEx_SrcHandle = $aGLVEx_Data[$iArray_Index][0]
|
|
$cGLVEx_SrcID = $aGLVEx_Data[$iArray_Index][1]
|
|
|
|
; Copy array for manipulation
|
|
$aGLVEx_SrcArray = $aGLVEx_Data[$iArray_Index][2]
|
|
|
|
Local $aCheck_Array = $aGLVEx_SrcArray
|
|
|
|
For $ii = 1 To UBound($aGLVEx_SrcArray, 1) - 1
|
|
__GUIListViewEx_Array_Delete($aGLVEx_SrcArray, $ii)
|
|
__GUIListViewEx_Array_Delete($aCheck_Array, $ii)
|
|
$aGLVEx_SrcArray[0][0] = UBound($aGLVEx_SrcArray, 1) - 1
|
|
Next
|
|
__GUIListViewEx_ReWriteLV($hGLVEx_SrcHandle, $cGLVEx_SrcID, $aGLVEx_SrcArray, $aCheck_Array, $iArray_Index)
|
|
$aGLVEx_Data[$iArray_Index][2] = $aGLVEx_SrcArray
|
|
$aGLVEx_SrcArray = 0
|
|
Return _GUIListViewEx_ReturnArray($iArray_Index)
|
|
|
|
EndFunc ;==>_GUIListViewEx_DeleteAll
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_GetLVCoords
|
|
; Description ...: Gets screen coords for ListView
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_GetLVCoords($hLV_Handle, ByRef $tLVPos)
|
|
|
|
; Get handle of ListView parent
|
|
Local $aWnd = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", $hLV_Handle)
|
|
Local $hWnd = $aWnd[0]
|
|
; Get position of ListView within GUI client area
|
|
Local $aLVPos = WinGetPos($hLV_Handle)
|
|
DllStructSetData($tLVPos, "X", $aLVPos[0])
|
|
DllStructSetData($tLVPos, "Y", $aLVPos[1])
|
|
_WinAPI_ScreenToClient($hWnd, $tLVPos)
|
|
|
|
EndFunc ;==>__GUIListViewEx_GetLVCoords
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_GetCursorWnd
|
|
; Description ...: Gets handle of control under the mouse cursor
|
|
; Author ........: Melba23
|
|
; Modified ......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_GetCursorWnd()
|
|
|
|
Local $iOldMouseOpt = Opt("MouseCoordMode", 1)
|
|
Local $tMPos = DllStructCreate("struct;long X;long Y;endstruct")
|
|
DllStructSetData($tMPos, "X", MouseGetPos(0))
|
|
DllStructSetData($tMPos, "Y", MouseGetPos(1))
|
|
Opt("MouseCoordMode", $iOldMouseOpt)
|
|
Return _WinAPI_WindowFromPoint($tMPos)
|
|
|
|
EndFunc ;==>__GUIListViewEx_GetCursorWnd
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_Array_Add
|
|
; Description ...: Adds a specified value at the end of an existing 1D or 2D array.
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_Array_Add(ByRef $avArray, $vAdd, $fMultiRow = False, $bCount = True)
|
|
|
|
; Get size of the Array to modify
|
|
Local $iIndex_Max = UBound($avArray)
|
|
Local $iAdd_Dim
|
|
|
|
; Get type of array
|
|
Switch UBound($avArray, 0)
|
|
Case 1 ; Checkbox array
|
|
If UBound($vAdd, 0) = 2 Or $fMultiRow Then ; 2D or 1D as rows
|
|
$iAdd_Dim = UBound($vAdd, 1)
|
|
ReDim $avArray[$iIndex_Max + $iAdd_Dim]
|
|
Else ; 1D as columns
|
|
ReDim $avArray[$iIndex_Max + 1]
|
|
EndIf
|
|
|
|
Case 2 ; Data array
|
|
; Get column count of data array
|
|
Local $iDim2 = UBound($avArray, 2)
|
|
If UBound($vAdd, 0) = 2 Then ; 2D add
|
|
; Redim the Array
|
|
$iAdd_Dim = UBound($vAdd, 1)
|
|
ReDim $avArray[$iIndex_Max + $iAdd_Dim][$iDim2]
|
|
$avArray[0][0] += $iAdd_Dim
|
|
; Add new elements
|
|
Local $iAdd_Max = UBound($vAdd, 2)
|
|
For $i = 0 To $iAdd_Dim - 1
|
|
For $j = 0 To $iDim2 - 1
|
|
; If Insert array is too small to fill Array then continue with blanks
|
|
If $j > $iAdd_Max - 1 Then
|
|
$avArray[$iIndex_Max + $i][$j] = ""
|
|
Else
|
|
$avArray[$iIndex_Max + $i][$j] = $vAdd[$i][$j]
|
|
EndIf
|
|
Next
|
|
Next
|
|
|
|
ElseIf $fMultiRow Then ; 1D add as rows
|
|
; Redim the Array
|
|
$iAdd_Dim = UBound($vAdd, 1)
|
|
ReDim $avArray[$iIndex_Max + $iAdd_Dim][$iDim2]
|
|
$avArray[0][0] += $iAdd_Dim
|
|
; Add new elements
|
|
For $i = 0 To $iAdd_Dim - 1
|
|
$avArray[$iIndex_Max + $i][0] = $vAdd[$i]
|
|
Next
|
|
|
|
Else ; 1D add as columns
|
|
; Redim the Array
|
|
ReDim $avArray[$iIndex_Max + 1][$iDim2]
|
|
If $bCount Then
|
|
$avArray[0][0] += 1
|
|
EndIf
|
|
; Add new elements
|
|
If IsArray($vAdd) Then
|
|
; Get size of Insert array
|
|
Local $vAdd_Max = UBound($vAdd)
|
|
For $j = 0 To $iDim2 - 1
|
|
; If Insert array is too small to fill Array then continue with blanks
|
|
If $j > $vAdd_Max - 1 Then
|
|
$avArray[$iIndex_Max][$j] = ""
|
|
Else
|
|
$avArray[$iIndex_Max][$j] = $vAdd[$j]
|
|
EndIf
|
|
Next
|
|
Else
|
|
; Fill Array with variable
|
|
For $j = 0 To $iDim2 - 1
|
|
$avArray[$iIndex_Max][$j] = $vAdd
|
|
Next
|
|
EndIf
|
|
EndIf
|
|
|
|
EndSwitch
|
|
|
|
EndFunc ;==>__GUIListViewEx_Array_Add
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_Array_Insert
|
|
; Description ...: Adds a value at the specified index of a 1D or 2D array.
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_Array_Insert(ByRef $avArray, $iIndex, $vInsert, $fMultiRow = False, $bCount = True)
|
|
|
|
; Get size of the Array to modify
|
|
Local $iIndex_Max = UBound($avArray)
|
|
Local $iInsert_Dim = UBound($vInsert, 1)
|
|
|
|
; Get type of array
|
|
Switch UBound($avArray, 0)
|
|
Case 1 ; Checkbox array
|
|
If UBound($vInsert, 0) = 2 Or $fMultiRow Then ; 2D or 1D as rows
|
|
; Resize array
|
|
ReDim $avArray[$iIndex_Max + $iInsert_Dim]
|
|
|
|
; Move down all elements below the new index
|
|
For $i = $iIndex_Max + $iInsert_Dim - 1 To $iIndex + 1 Step -1
|
|
$avArray[$i] = $avArray[$i - 1]
|
|
Next
|
|
|
|
Else ; 1D as columns
|
|
|
|
; Resize array
|
|
ReDim $avArray[$iIndex_Max + 1]
|
|
|
|
; Move down all elements below the new index
|
|
For $i = $iIndex_Max To $iIndex + 1 Step -1
|
|
$avArray[$i] = $avArray[$i - 1]
|
|
Next
|
|
|
|
; Insert dragged element state
|
|
;~ _ArrayDisplay($avArray)
|
|
;~ $avArray[$iIndex] = $vInsert ; Fehler
|
|
|
|
EndIf
|
|
|
|
Case 2 ; Data array
|
|
; If at end of array
|
|
If $iIndex > $iIndex_Max - 1 Then
|
|
__GUIListViewEx_Array_Add($avArray, $vInsert, $fMultiRow, $bCount)
|
|
Return
|
|
EndIf
|
|
; Get column count of data array
|
|
Local $iDim2 = UBound($avArray, 2)
|
|
If UBound($vInsert, 0) = 2 Then ; 2D insert
|
|
; Redim the Array
|
|
$iInsert_Dim = UBound($vInsert, 1)
|
|
ReDim $avArray[$iIndex_Max + $iInsert_Dim][$iDim2]
|
|
If $bCount Then
|
|
$avArray[0][0] += $iInsert_Dim
|
|
EndIf
|
|
; Move down all elements below the new index
|
|
For $i = $iIndex_Max + $iInsert_Dim - 1 To $iIndex + $iInsert_Dim Step -1
|
|
For $j = 0 To $iDim2 - 1
|
|
$avArray[$i][$j] = $avArray[$i - $iInsert_Dim][$j]
|
|
Next
|
|
Next
|
|
; Add new elements
|
|
Local $iInsert_Max = UBound($vInsert, 2)
|
|
For $i = 0 To $iInsert_Dim - 1
|
|
For $j = 0 To $iDim2 - 1
|
|
; If Insert array is too small to fill Array then continue with blanks
|
|
If $j > $iInsert_Max - 1 Then
|
|
$avArray[$iIndex + $i][$j] = ""
|
|
Else
|
|
$avArray[$iIndex + $i][$j] = $vInsert[$i][$j]
|
|
EndIf
|
|
Next
|
|
Next
|
|
|
|
ElseIf $fMultiRow Then ; 1D insert as rows
|
|
; Redim the Array
|
|
$iInsert_Dim = UBound($vInsert, 1)
|
|
ReDim $avArray[$iIndex_Max + $iInsert_Dim][$iDim2]
|
|
$avArray[0][0] += $iInsert_Dim
|
|
; Move down all elements below the new index
|
|
For $i = $iIndex_Max + $iInsert_Dim - 1 To $iIndex + $iInsert_Dim Step -1
|
|
For $j = 0 To $iDim2 - 1
|
|
$avArray[$i][$j] = $avArray[$i - $iInsert_Dim][$j]
|
|
Next
|
|
Next
|
|
; Add new items
|
|
For $i = 0 To $iInsert_Dim - 1
|
|
$avArray[$iIndex + $i][0] = $vInsert[$i]
|
|
Next
|
|
|
|
Else ; 1D insert as columns
|
|
; Redim the Array
|
|
ReDim $avArray[$iIndex_Max + 1][$iDim2]
|
|
$avArray[0][0] += 1
|
|
; Move down all elements below the new index
|
|
For $i = $iIndex_Max To $iIndex + 1 Step -1
|
|
For $j = 0 To $iDim2 - 1
|
|
$avArray[$i][$j] = $avArray[$i - 1][$j]
|
|
Next
|
|
Next
|
|
; Insert new elements
|
|
If IsArray($vInsert) Then
|
|
; Get size of Insert array
|
|
Local $vInsert_Max = UBound($vInsert)
|
|
For $j = 0 To $iDim2 - 1
|
|
; If Insert array is too small to fill Array then continue with blanks
|
|
If $j > $vInsert_Max - 1 Then
|
|
$avArray[$iIndex][$j] = ""
|
|
Else
|
|
$avArray[$iIndex][$j] = $vInsert[$j]
|
|
EndIf
|
|
Next
|
|
Else
|
|
; Fill Array with variable
|
|
For $j = 0 To $iDim2 - 1
|
|
$avArray[$iIndex][$j] = $vInsert
|
|
Next
|
|
EndIf
|
|
EndIf
|
|
|
|
EndSwitch
|
|
|
|
EndFunc ;==>__GUIListViewEx_Array_Insert
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_Array_Delete
|
|
; Description ...: Deletes a specified index from an existing 1D or 2D array.
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_Array_Delete(ByRef $avArray, $iIndex, $bDelCount = False)
|
|
|
|
; Get size of the Array to modify
|
|
Local $iIndex_Max = UBound($avArray)
|
|
If $iIndex_Max = 0 Then Return
|
|
|
|
; Get type of array
|
|
Switch UBound($avArray, 0)
|
|
Case 1 ; Checkbox array
|
|
; Move up all elements below the new index
|
|
For $i = $iIndex To $iIndex_Max - 2
|
|
$avArray[$i] = $avArray[$i + 1]
|
|
Next
|
|
; Redim the Array
|
|
ReDim $avArray[$iIndex_Max - 1]
|
|
|
|
Case 2 ; Data array
|
|
; Get size of second dimension
|
|
Local $iDim2 = UBound($avArray, 2)
|
|
; Move up all elements below the new index
|
|
For $i = $iIndex To $iIndex_Max - 2
|
|
For $j = 0 To $iDim2 - 1
|
|
$avArray[$i][$j] = $avArray[$i + 1][$j]
|
|
Next
|
|
Next
|
|
; Redim the Array
|
|
ReDim $avArray[$iIndex_Max - 1][$iDim2]
|
|
; If count element not being deleted
|
|
If Not $bDelCount Then
|
|
$avArray[0][0] -= 1
|
|
EndIf
|
|
|
|
EndSwitch
|
|
|
|
EndFunc ;==>__GUIListViewEx_Array_Delete
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_Array_Swap
|
|
; Description ...: Swaps specified elements within a 1D or 2D array
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_Array_Swap(ByRef $avArray, $iIndex1, $iIndex2)
|
|
|
|
Local $vTemp
|
|
|
|
; Get type of array
|
|
Switch UBound($avArray, 0)
|
|
Case 1
|
|
; Swap the elements via a temp variable
|
|
$vTemp = $avArray[$iIndex1]
|
|
$avArray[$iIndex1] = $avArray[$iIndex2]
|
|
$avArray[$iIndex2] = $vTemp
|
|
|
|
Case 2
|
|
; Get size of second dimension
|
|
Local $iDim2 = UBound($avArray, 2)
|
|
; Swap the elements via a temp variable
|
|
For $i = 0 To $iDim2 - 1
|
|
$vTemp = $avArray[$iIndex1][$i]
|
|
$avArray[$iIndex1][$i] = $avArray[$iIndex2][$i]
|
|
$avArray[$iIndex2][$i] = $vTemp
|
|
Next
|
|
EndSwitch
|
|
|
|
Return 0
|
|
|
|
EndFunc ;==>__GUIListViewEx_Array_Swap
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_ToolTipHide
|
|
; Description ...: Called by Adlib to hide a tooltip displayed by _GUIListViewEx_ToolTipShow
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_ToolTipHide()
|
|
; Cancel Adlib
|
|
AdlibUnRegister("__GUIListViewEx_ToolTipHide")
|
|
; Clear tooltip
|
|
ToolTip("")
|
|
EndFunc ;==>__GUIListViewEx_ToolTipHide
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_MakeString
|
|
; Description ...: Convert data/check/colour arrays to strings for saving
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_MakeString($aArray)
|
|
|
|
If Not IsArray($aArray) Then Return SetError(1, 0, "")
|
|
|
|
Local $sRet = ""
|
|
Local $sDelim_Col = @CR
|
|
Local $sDelim_Row = @LF
|
|
|
|
Switch UBound($aArray, $UBOUND_DIMENSIONS)
|
|
Case 1
|
|
For $i = 0 To UBound($aArray, $UBOUND_ROWS) - 1
|
|
$sRet &= $aArray[$i] & $sDelim_Row
|
|
Next
|
|
Return StringTrimRight($sRet, StringLen($sDelim_Col))
|
|
|
|
Case 2
|
|
For $i = 0 To UBound($aArray, $UBOUND_ROWS) - 1
|
|
For $j = 0 To UBound($aArray, $UBOUND_COLUMNS) - 1
|
|
$sRet &= $aArray[$i][$j] & $sDelim_Col
|
|
Next
|
|
$sRet = StringTrimRight($sRet, StringLen($sDelim_Col)) & $sDelim_Row
|
|
Next
|
|
Return StringTrimRight($sRet, StringLen($sDelim_Row))
|
|
|
|
Case Else
|
|
Return SetError(2, 0, "")
|
|
EndSwitch
|
|
|
|
EndFunc ;==>__GUIListViewEx_MakeString
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_MakeArray
|
|
; Description ...: Convert data/check/colour strings to arrays for loading
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_MakeArray($sString)
|
|
|
|
If $sString = "" Then Return SetError(1, 0, "")
|
|
|
|
Local $aRetArray, $aRows, $aItems
|
|
Local $sRowDelimiter = @LF
|
|
Local $sColDelimiter = @CR
|
|
|
|
If StringInStr($sString, $sColDelimiter) Then
|
|
; 2D array
|
|
$aRows = StringSplit($sString, $sRowDelimiter)
|
|
; Get column count
|
|
StringReplace($aRows[1], $sColDelimiter, "")
|
|
; Create array
|
|
Local $aRetArray[$aRows[0]][@extended + 1]
|
|
; Fill array
|
|
For $i = 1 To $aRows[0]
|
|
$aItems = StringSplit($aRows[$i], $sColDelimiter)
|
|
For $j = 1 To $aItems[0]
|
|
$aRetArray[$i - 1][$j - 1] = $aItems[$j]
|
|
Next
|
|
Next
|
|
Else
|
|
; 1D array
|
|
$aRetArray = StringSplit($sString, $sRowDelimiter, $STR_NOCOUNT)
|
|
EndIf
|
|
|
|
Return $aRetArray
|
|
|
|
EndFunc ;==>__GUIListViewEx_MakeArray
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_ColSort
|
|
; Description ...: Sort columns even if colour enabled
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_ColSort($hLV, $iLV_Index, ByRef $vSortSense, $iCol, $hUserSortFunction = 0, $bToggleSense = True)
|
|
|
|
Local $aListViewContent = $aGLVEx_Data[$iLV_Index][2]
|
|
Local $aColourSettings = $aGLVEx_Data[$iLV_Index][18]
|
|
; Check there are items to sort
|
|
Local $iItemCount = $aListViewContent[0][0]
|
|
If $iItemCount Then
|
|
; Set sort order
|
|
Local $iDescending = 0
|
|
If UBound($vSortSense) Then
|
|
$iDescending = $vSortSense[$iCol]
|
|
Else
|
|
$iDescending = $vSortSense
|
|
EndIf
|
|
; Get column count
|
|
Local $iColumnCount = UBound($aListViewContent, 2)
|
|
; Check if colour enabled
|
|
Local $fColourEnabled = ((IsArray($aGLVEx_Data[$iLV_Index][18])) ? (True) : (False))
|
|
If $fColourEnabled Then
|
|
; ReDim data to add columns for index value, ItemParam and colour settings
|
|
ReDim $aListViewContent[UBound($aListViewContent)][($iColumnCount * 2) + 2]
|
|
; Add colour data to array
|
|
For $i = 1 To $iItemCount
|
|
For $j = 0 To $iColumnCount - 1
|
|
$aListViewContent[$i][$iColumnCount + $j + 2] = $aColourSettings[$i][$j]
|
|
Next
|
|
Next
|
|
Else
|
|
; ReDim data to add coluns for index value and ItemParam
|
|
ReDim $aListViewContent[UBound($aListViewContent)][$iColumnCount + 2]
|
|
EndIf
|
|
; Determine indices for index and param elements
|
|
Local Enum $iIndexValue = $iColumnCount, $iItemParam
|
|
; Get selected items
|
|
Local $sSelectedItems = _GUICtrlListView_GetSelectedIndices($hLV)
|
|
Local $aSelectedItems
|
|
If $sSelectedItems = "" Then
|
|
; If no selection (colour enabled) then use stored value
|
|
Local $aSelectedItems[2] = [1, $aGLVEx_Data[0][17]]
|
|
Else
|
|
$aSelectedItems = StringSplit($sSelectedItems, Opt('GUIDataSeparatorChar'))
|
|
EndIf
|
|
; Get checked items
|
|
Local $aCheckedItems[$iItemCount + 1] = [0]
|
|
For $i = 0 To $iItemCount - 1
|
|
If _GUICtrlListView_GetItemChecked($hLV, $i) Then
|
|
$aCheckedItems[0] += 1
|
|
$aCheckedItems[$aCheckedItems[0]] = $i
|
|
EndIf
|
|
Next
|
|
ReDim $aCheckedItems[$aCheckedItems[0] + 1]
|
|
; Clear current focused and selected items and save item data in array
|
|
Local $iFocused = -1
|
|
For $i = 0 To $iItemCount - 1
|
|
If $iFocused = -1 Then
|
|
If _GUICtrlListView_GetItemFocused($hLV, $i) Then $iFocused = $i
|
|
EndIf
|
|
_GUICtrlListView_SetItemSelected($hLV, $i, False)
|
|
_GUICtrlListView_SetItemChecked($hLV, $i, False)
|
|
; Store index and param values
|
|
$aListViewContent[$i + 1][$iIndexValue] = $i
|
|
$aListViewContent[$i + 1][$iItemParam] = _GUICtrlListView_GetItemParam($hLV, $i)
|
|
Next
|
|
|
|
; Check which sort function to use on the clicked column within the array
|
|
If IsFunc($hUserSortFunction) Then
|
|
; Pass user function the standard 5 parameters
|
|
; (ByRef LV content array, Descending variable, Start = 1 , End = 0, Column to sort)
|
|
$hUserSortFunction($aListViewContent, $iDescending, 1, 0, $iCol)
|
|
ElseIf $hUserSortFunction = -1 Then
|
|
; Do nothing
|
|
Else
|
|
; Use standard sort function
|
|
_ArraySort($aListViewContent, $iDescending, 1, 0, $iCol)
|
|
EndIf
|
|
|
|
; Enter the sorted ListView data
|
|
For $i = 1 To $iItemCount ; Rows
|
|
For $j = 0 To $iColumnCount - 1 ; Columns
|
|
_GUICtrlListView_SetItemText($hLV, $i - 1, $aListViewContent[$i][$j], $j)
|
|
; Reset the colour array if colour enabled
|
|
If $fColourEnabled Then
|
|
$aColourSettings[$i][$j] = $aListViewContent[$i][$iColumnCount + $j + 2]
|
|
EndIf
|
|
Next
|
|
; Reset item param
|
|
_GUICtrlListView_SetItemParam($hLV, $i - 1, $aListViewContent[$i][$iItemParam])
|
|
; Reset selected states
|
|
For $j = 1 To $aSelectedItems[0]
|
|
If $aListViewContent[$i][$iIndexValue] = $aSelectedItems[$j] Then
|
|
$aGLVEx_Data[0][17] = $i - 1
|
|
$aGLVEx_Data[$iLV_Index][20] = $i - 1
|
|
If Not ($aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22]) Then
|
|
If $aListViewContent[$i - 1][$iIndexValue] = $iFocused Then
|
|
_GUICtrlListView_SetItemSelected($hLV, $i - 1, True, True)
|
|
Else
|
|
_GUICtrlListView_SetItemSelected($hLV, $i - 1, True)
|
|
EndIf
|
|
ExitLoop
|
|
EndIf
|
|
EndIf
|
|
Next
|
|
; Reset checked states
|
|
For $j = 1 To $aCheckedItems[0]
|
|
If $aListViewContent[$i][$iIndexValue] = $aCheckedItems[$j] Then
|
|
_GUICtrlListView_SetItemChecked($hLV, $i - 1, True)
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
Next
|
|
; Check automatic sort sense toggle and adjust if required
|
|
If $bToggleSense Then
|
|
If UBound($vSortSense) Then
|
|
$vSortSense[$iCol] = Not $iDescending
|
|
Else
|
|
$vSortSense = Not $iDescending
|
|
EndIf
|
|
EndIf
|
|
|
|
; ReDim content array to remove additional columns
|
|
ReDim $aListViewContent[UBound($aListViewContent)][$iColumnCount]
|
|
; Store sorted arrays
|
|
$aGLVEx_Data[$iLV_Index][2] = $aListViewContent
|
|
$aGLVEx_Data[$iLV_Index][18] = $aColourSettings
|
|
|
|
; Set flags using ListView index
|
|
$aGLVEx_Data[0][19] = $iLV_Index ; SortEvent
|
|
$aGLVEx_Data[0][22] = 1 ; ColourEvent
|
|
|
|
EndIf
|
|
|
|
EndFunc ;==>__GUIListViewEx_ColSort
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_RedrawWindow
|
|
; Description ...: Redraw ListView after update
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_RedrawWindow($iLV_Index, $fForce = False)
|
|
|
|
; Force redraw if colour used or single cell selection
|
|
If $fForce Or $aGLVEx_Data[$iLV_Index][19] Or $aGLVEx_Data[$iLV_Index][22] Then
|
|
; Force reload of redraw colour array
|
|
$aGLVEx_Data[0][14] = 0
|
|
; If Redraw flag set
|
|
If $aGLVEx_Data[0][15] Then
|
|
; Redraw ListView
|
|
_WinAPI_RedrawWindow($aGLVEx_Data[$iLV_Index][0])
|
|
EndIf
|
|
EndIf
|
|
|
|
EndFunc ;==>__GUIListViewEx_RedrawWindow
|
|
|
|
; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|
; Name...........: __GUIListViewEx_CheckUserEditKey
|
|
; Description ...: Check keys pressed in ListView
|
|
; Author ........: Melba23
|
|
; Remarks .......:
|
|
; ===============================================================================================================================
|
|
Func __GUIListViewEx_CheckUserEditKey()
|
|
|
|
Local $aKey = StringSplit($aGLVEx_Data[0][23], ";"), $iKeyValue
|
|
; Set flag
|
|
Local $fCheck = True
|
|
; Check if keys required are pressed
|
|
For $i = 1 To $aKey[0]
|
|
; Convert to number
|
|
$iKeyValue = Dec($aKey[$i])
|
|
If Not _WinAPI_GetAsyncKeyState($iKeyValue) Then
|
|
; Required key not pressed so clear flag
|
|
$fCheck = False
|
|
; No point in looking further
|
|
ExitLoop
|
|
EndIf
|
|
Next
|
|
|
|
Return $fCheck
|
|
|
|
EndFunc ;==>__GUIListViewEx_CheckUserEditKey
|