Skip to content

Commit 8069db0

Browse files
committed
Added the ability to sort the file list
1 parent 8568e8b commit 8069db0

File tree

7 files changed

+259
-28
lines changed

7 files changed

+259
-28
lines changed

DiskImageTool/DiskImageTool.vbproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
<TargetCulture>en-US</TargetCulture>
3030
<ProductName>DiskImageTool</ProductName>
3131
<PublisherName>Digitoxin</PublisherName>
32-
<ApplicationRevision>1</ApplicationRevision>
33-
<ApplicationVersion>1.22.0.%2a</ApplicationVersion>
32+
<ApplicationRevision>0</ApplicationRevision>
33+
<ApplicationVersion>1.23.0.%2a</ApplicationVersion>
3434
<UseApplicationTrust>false</UseApplicationTrust>
3535
<PublishWizardCompleted>true</PublishWizardCompleted>
3636
<BootstrapperEnabled>true</BootstrapperEnabled>
@@ -161,6 +161,8 @@
161161
<Compile Include="Forms\ItemScanForm.vb">
162162
<SubType>Form</SubType>
163163
</Compile>
164+
<Compile Include="ListViewColumnSorter.vb" />
165+
<Compile Include="ListViewExtensions.vb" />
164166
<Compile Include="MyByteProvider.vb" />
165167
<Compile Include="OEMNameLookup.vb" />
166168
<Compile Include="LoadedImageData.vb" />
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
Public Class ListViewColumnSorter
2+
Implements IComparer
3+
4+
Private ColumnToSort As Integer
5+
Private OrderOfSort As SortOrder
6+
Private ReadOnly ObjectCompare As CaseInsensitiveComparer
7+
8+
Public Sub New()
9+
ColumnToSort = -1
10+
OrderOfSort = SortOrder.None
11+
ObjectCompare = New CaseInsensitiveComparer()
12+
End Sub
13+
14+
Public Function Compare(x As Object, y As Object) As Integer Implements IComparer.Compare
15+
Dim Response As Integer = 0
16+
17+
If OrderOfSort <> SortOrder.None And ColumnToSort > -1 Then
18+
Dim ListViewX = CType(x, ListViewItem)
19+
Dim ListViewY = CType(y, ListViewItem)
20+
Dim FileDataX As FileData = ListViewX.Tag
21+
Dim FileDataY As FileData = ListViewY.Tag
22+
Dim ObjX As Object
23+
Dim ObjY As Object
24+
25+
Select Case ColumnToSort
26+
Case 0
27+
ObjX = FileDataX.Index
28+
ObjY = FileDataY.Index
29+
Case ListViewX.SubItems.IndexOfKey("FileName")
30+
ObjX = FileDataX.DirectoryEntry.GetFileName
31+
ObjY = FileDataY.DirectoryEntry.GetFileName
32+
Case ListViewX.SubItems.IndexOfKey("FileExtension")
33+
ObjX = FileDataX.DirectoryEntry.GetFileExtension
34+
ObjY = FileDataY.DirectoryEntry.GetFileExtension
35+
Case ListViewX.SubItems.IndexOfKey("FileSize")
36+
ObjX = FileDataX.DirectoryEntry.FileSize
37+
ObjY = FileDataY.DirectoryEntry.FileSize
38+
Case ListViewX.SubItems.IndexOfKey("FileLastWriteDate")
39+
ObjX = FileDataX.DirectoryEntry.GetLastWriteDate.DateObject
40+
ObjY = FileDataY.DirectoryEntry.GetLastWriteDate.DateObject
41+
Case ListViewX.SubItems.IndexOfKey("FileStartingCluster")
42+
ObjX = FileDataX.DirectoryEntry.StartingCluster
43+
ObjY = FileDataY.DirectoryEntry.StartingCluster
44+
Case ListViewX.SubItems.IndexOfKey("FileCreationDate")
45+
ObjX = FileDataX.DirectoryEntry.GetCreationDate.DateObject
46+
ObjY = FileDataY.DirectoryEntry.GetCreationDate.DateObject
47+
Case ListViewX.SubItems.IndexOfKey("FileLastAccessDate")
48+
ObjX = FileDataX.DirectoryEntry.GetLastAccessDate.DateObject
49+
ObjY = FileDataY.DirectoryEntry.GetLastAccessDate.DateObject
50+
Case Else
51+
ObjX = ListViewX.SubItems(ColumnToSort).Text
52+
ObjY = ListViewY.SubItems(ColumnToSort).Text
53+
End Select
54+
55+
Dim CompareResult = ObjectCompare.Compare(ObjX, ObjY)
56+
57+
If OrderOfSort = SortOrder.Ascending Then
58+
Response = CompareResult
59+
ElseIf OrderOfSort = SortOrder.Descending Then
60+
Response = -CompareResult
61+
End If
62+
End If
63+
64+
Return Response
65+
End Function
66+
67+
Public Property SortColumn As Integer
68+
Set(ByVal value As Integer)
69+
ColumnToSort = value
70+
End Set
71+
Get
72+
Return ColumnToSort
73+
End Get
74+
End Property
75+
76+
Public Property Order As SortOrder
77+
Set(ByVal value As SortOrder)
78+
OrderOfSort = value
79+
End Set
80+
Get
81+
Return OrderOfSort
82+
End Get
83+
End Property
84+
End Class
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
Imports System.ComponentModel
2+
Imports System.Runtime.CompilerServices
3+
Imports System.Runtime.InteropServices
4+
5+
Module ListViewExtensions
6+
7+
<StructLayout(LayoutKind.Sequential)>
8+
Public Structure HDITEM
9+
Public theMask As Mask
10+
Public cxy As Integer
11+
<MarshalAs(UnmanagedType.LPTStr)>
12+
Public pszText As String
13+
Public hbm As IntPtr
14+
Public cchTextMax As Integer
15+
Public fmt As Format
16+
Public lParam As IntPtr
17+
' _WIN32_IE >= 0x0300
18+
Public iImage As Integer
19+
Public iOrder As Integer
20+
' _WIN32_IE >= 0x0500
21+
Public type As UInteger
22+
Public pvFilter As IntPtr
23+
' _WIN32_WINNT >= 0x0600
24+
Public state As UInteger
25+
26+
<Flags()>
27+
Public Enum Mask
28+
Format = &H4 ' HDI_FORMAT
29+
End Enum
30+
31+
<Flags()>
32+
Public Enum Format
33+
SortDown = &H200 ' HDF_SORTDOWN
34+
SortUp = &H400 ' HDF_SORTUP
35+
End Enum
36+
End Structure
37+
38+
Public Const LVM_FIRST As Integer = &H1000
39+
Public Const LVM_GETHEADER As Integer = LVM_FIRST + 31
40+
41+
Public Const HDM_FIRST As Integer = &H1200
42+
Public Const HDM_GETITEM As Integer = HDM_FIRST + 11
43+
Public Const HDM_SETITEM As Integer = HDM_FIRST + 12
44+
45+
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
46+
Public Function SendMessage(hWnd As IntPtr, msg As UInt32, wParam As IntPtr, lParam As IntPtr) As IntPtr
47+
End Function
48+
49+
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
50+
Public Function SendMessage(hWnd As IntPtr, msg As UInt32, wParam As IntPtr, ByRef lParam As HDITEM) As IntPtr
51+
End Function
52+
53+
<Extension()>
54+
Public Sub SetSortIcon(listViewControl As ListView, columnIndex As Integer, order As SortOrder)
55+
Dim columnHeader As IntPtr = SendMessage(listViewControl.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero)
56+
For columnNumber As Integer = 0 To listViewControl.Columns.Count - 1
57+
58+
Dim columnPtr As New IntPtr(columnNumber)
59+
Dim item As New HDITEM With {
60+
.theMask = HDITEM.Mask.Format
61+
}
62+
63+
If SendMessage(columnHeader, HDM_GETITEM, columnPtr, item) = IntPtr.Zero Then Throw New Win32Exception
64+
65+
If order <> SortOrder.None AndAlso columnNumber = columnIndex Then
66+
Select Case order
67+
Case SortOrder.Ascending
68+
item.fmt = item.fmt And Not HDITEM.Format.SortDown
69+
item.fmt = item.fmt Or HDITEM.Format.SortUp
70+
Case SortOrder.Descending
71+
item.fmt = item.fmt And Not HDITEM.Format.SortUp
72+
item.fmt = item.fmt Or HDITEM.Format.SortDown
73+
End Select
74+
Else
75+
item.fmt = item.fmt And Not HDITEM.Format.SortDown And Not HDITEM.Format.SortUp
76+
End If
77+
78+
If SendMessage(columnHeader, HDM_SETITEM, columnPtr, item) = IntPtr.Zero Then Throw New Win32Exception
79+
Next
80+
End Sub
81+
End Module

DiskImageTool/MainForm.Designer.vb

Lines changed: 22 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

DiskImageTool/MainForm.resx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,9 @@
417417
<metadata name="FileMenuSeparatoor2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
418418
<value>False</value>
419419
</metadata>
420+
<metadata name="FileMenuSeparatoor3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
421+
<value>False</value>
422+
</metadata>
420423
<metadata name="ListViewSummary.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
421424
<value>True</value>
422425
</metadata>
@@ -475,9 +478,6 @@
475478
ekV8SQf5AAAAAElFTkSuQmCC
476479
</value>
477480
</data>
478-
<metadata name="FileMenuSeparatoor3.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
479-
<value>False</value>
480-
</metadata>
481481
<metadata name="MenuStripMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
482482
<value>138, 17</value>
483483
</metadata>
@@ -490,6 +490,9 @@
490490
<metadata name="ComboImagesFiltered.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
491491
<value>True</value>
492492
</metadata>
493+
<metadata name="BtnResetSort.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
494+
<value>True</value>
495+
</metadata>
493496
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
494497
<value>53</value>
495498
</metadata>

0 commit comments

Comments
 (0)