Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions SteamCloudFileManager/ListViewExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace SteamCloudFileManager
{
[EditorBrowsable(EditorBrowsableState.Never)]
public static class ListViewExtensions
{
[StructLayout(LayoutKind.Sequential)]
public struct HDITEM
{
public Mask mask;
public int cxy;
[MarshalAs(UnmanagedType.LPTStr)] public string pszText;
public IntPtr hbm;
public int cchTextMax;
public Format fmt;
public IntPtr lParam;
// _WIN32_IE >= 0x0300
public int iImage;
public int iOrder;
// _WIN32_IE >= 0x0500
public uint type;
public IntPtr pvFilter;
// _WIN32_WINNT >= 0x0600
public uint state;

[Flags]
public enum Mask
{
Format = 0x4, // HDI_FORMAT
};

[Flags]
public enum Format
{
SortDown = 0x200, // HDF_SORTDOWN
SortUp = 0x400, // HDF_SORTUP
};
};

public const int LVM_FIRST = 0x1000;
public const int LVM_GETHEADER = LVM_FIRST + 31;

public const int HDM_FIRST = 0x1200;
public const int HDM_GETITEM = HDM_FIRST + 11;
public const int HDM_SETITEM = HDM_FIRST + 12;

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, ref HDITEM lParam);

public static void SetSortIcon(this ListView listViewControl, int columnIndex, SortOrder order)
{
IntPtr columnHeader = SendMessage(listViewControl.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);
for (int columnNumber = 0; columnNumber <= listViewControl.Columns.Count - 1; columnNumber++)
{
var columnPtr = new IntPtr(columnNumber);
var item = new HDITEM
{
mask = HDITEM.Mask.Format
};

if (SendMessage(columnHeader, HDM_GETITEM, columnPtr, ref item) == IntPtr.Zero)
{
throw new Win32Exception();
}

if (order != SortOrder.None && columnNumber == columnIndex)
{
switch (order)
{
case SortOrder.Ascending:
item.fmt &= ~HDITEM.Format.SortDown;
item.fmt |= HDITEM.Format.SortUp;
break;
case SortOrder.Descending:
item.fmt &= ~HDITEM.Format.SortUp;
item.fmt |= HDITEM.Format.SortDown;
break;
}
}
else
{
item.fmt &= ~HDITEM.Format.SortDown & ~HDITEM.Format.SortUp;
}

if (SendMessage(columnHeader, HDM_SETITEM, columnPtr, ref item) == IntPtr.Zero)
{
throw new Win32Exception();
}
}
}
}
}
1 change: 1 addition & 0 deletions SteamCloudFileManager/MainForm.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

56 changes: 55 additions & 1 deletion SteamCloudFileManager/MainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace SteamCloudFileManager
{
public partial class MainForm : Form
{
IRemoteStorage storage;
int sortColumn;

public MainForm()
{
Expand Down Expand Up @@ -59,7 +61,14 @@ private void refreshButton_Click(object sender, EventArgs e)
remoteListView.Items.Clear();
foreach (IRemoteFile file in files)
{
ListViewItem itm = new ListViewItem(new string[] { file.Name, file.Timestamp.ToString(), file.Size.ToString(), file.IsPersisted.ToString(), file.Exists.ToString() }) { Tag = file };
ListViewItem itm = new ListViewItem();
itm.SubItems[0].Text = file.Name;
itm.SubItems[0].Tag = file.Name;
itm.SubItems.Add(new ListViewItem.ListViewSubItem(itm, file.Timestamp.ToString()) { Tag = file.Timestamp });
itm.SubItems.Add(new ListViewItem.ListViewSubItem(itm, file.Size.ToString()) { Tag = file.Size });
itm.SubItems.Add(new ListViewItem.ListViewSubItem(itm, file.IsPersisted.ToString()) { Tag = file.IsPersisted });
itm.SubItems.Add(new ListViewItem.ListViewSubItem(itm, file.Exists.ToString()) { Tag = file.Exists });
itm.Tag = file;
remoteListView.Items.Add(itm);
}
updateQuota();
Expand Down Expand Up @@ -154,5 +163,50 @@ private void remoteListView_SelectedIndexChanged(object sender, EventArgs e)
{
downloadButton.Enabled = deleteButton.Enabled = (storage != null && remoteListView.SelectedIndices.Count > 0);
}

private class ListViewItemComparer : IComparer
{
private int column;
private SortOrder sortOrder;

public ListViewItemComparer(int column, SortOrder sortOrder)
{
this.column = column;
this.sortOrder = sortOrder;
}

public int Compare(object x, object y)
{
var xx = ((ListViewItem)x).SubItems[column];
var yy = ((ListViewItem)y).SubItems[column];
var a = xx.Tag as IComparable;
var b = yy.Tag as IComparable;
var order = (sortOrder == SortOrder.Ascending ? 1 : -1);
if (a != null && b != null)
return a.CompareTo(b) * order;

// If the userdata isnt IComparable just fall back to string compare.
return String.Compare(xx.Text, yy.Text) * order;
}
};

private void remoteListView_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (sortColumn != e.Column)
{
// If column is different to last column just sort ascending.
sortColumn = e.Column;
remoteListView.Sorting = SortOrder.Ascending;
}
else
{
// Otherwise toggle between ascending/descending.
remoteListView.Sorting = remoteListView.Sorting == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;
}

remoteListView.SetSortIcon(e.Column, remoteListView.Sorting);
remoteListView.ListViewItemSorter = new ListViewItemComparer(e.Column, remoteListView.Sorting);
remoteListView.Sort();
}
}
}
1 change: 1 addition & 0 deletions SteamCloudFileManager/SteamCloudFileManager.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
<ItemGroup>
<Compile Include="IRemoteFile.cs" />
<Compile Include="IRemoteStorage.cs" />
<Compile Include="ListViewExtensions.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
Expand Down