Files
ZuneShell.dll/ZuneShell/ZuneUI/FileOpenDialog.cs
T

169 lines
6.0 KiB
C#

// Decompiled with JetBrains decompiler
// Type: ZuneUI.FileOpenDialog
// Assembly: ZuneShell, Version=4.7.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: FC8028F3-A47B-4FB4-B35B-11D1752D8264
// Assembly location: C:\Program Files\Zune\ZuneShell.dll
using Microsoft.Iris;
using System;
using System.Runtime.InteropServices;
using System.Threading;
namespace ZuneUI
{
public class FileOpenDialog
{
private string m_filePath;
private FileOpenDialog()
{
}
public string FilePath
{
get => this.m_filePath;
private set => this.m_filePath = value;
}
public static FileOpenDialog Show(
string title,
string initialPath,
Command doneCommand)
{
return Show(title, initialPath, null, doneCommand);
}
public static FileOpenDialog Show(
string title,
string initialPath,
string[] fileFilters,
Command doneCommand)
{
FileOpenDialog dialog = new FileOpenDialog();
Show(title, initialPath, fileFilters, args =>
{
dialog.FilePath = (string)args;
doneCommand?.Invoke();
});
return dialog;
}
public static void Show(string title, string initialPath, DeferredInvokeHandler callback) => Show(title, initialPath, null, callback);
public static void Show(
string title,
string initialPath,
string[] fileFilters,
DeferredInvokeHandler callback)
{
IntPtr winHandle = Application.Window.Handle;
Thread thread = new Thread(args =>
{
OpenFileName ofn = new OpenFileName(winHandle);
try
{
if (!string.IsNullOrEmpty(title))
ofn.lpstrTitle = title;
if (!string.IsNullOrEmpty(initialPath))
ofn.lpstrInitialDir = initialPath;
if (fileFilters != null)
ofn.lpstrFilter = string.Join("\0", fileFilters) + "\0";
string str = null;
if (GetOpenFileName(ofn))
str = Marshal.PtrToStringUni(ofn.lpstrFile);
Application.DeferredInvoke(callback, str);
}
finally
{
ofn?.Dispose();
}
});
thread.TrySetApartmentState(ApartmentState.STA);
thread.Start();
}
public static string MyPicturesPath => Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
[DllImport("comdlg32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
private delegate IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private class OpenFileName : IDisposable
{
public int lStructSize;
public IntPtr hwndOwner;
public IntPtr hInstance;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpstrFilter;
public IntPtr lpstrCustomFilter;
public int nMaxCustFilter;
public int nFilterIndex;
public IntPtr lpstrFile;
public int nMaxFile;
public IntPtr lpstrFileTitle;
public int nMaxFileTitle;
public string lpstrInitialDir;
public string lpstrTitle;
public int Flags;
public short nFileOffset;
public short nFileExtension;
public string lpstrDefExt;
public IntPtr lCustData;
public WndProc lpfnHook;
public string lpTemplateName;
public IntPtr pvReserved;
public int dwReserved;
public int FlagsEx;
public OpenFileName(IntPtr handle)
{
IntPtr ptr = Marshal.AllocHGlobal(520);
Marshal.WriteInt32(ptr, 0);
this.lpstrCustomFilter = IntPtr.Zero;
this.nMaxFile = 260;
this.lpstrFile = ptr;
this.lpstrFileTitle = IntPtr.Zero;
this.nMaxFileTitle = 260;
this.lCustData = IntPtr.Zero;
this.pvReserved = IntPtr.Zero;
this.hwndOwner = handle;
this.lStructSize = Marshal.SizeOf(typeof(OpenFileName));
}
public void Dispose() => Marshal.FreeHGlobal(this.lpstrFile);
}
private enum OpenFileNameFlags
{
OFN_READONLY = 1,
OFN_OVERWRITEPROMPT = 2,
OFN_HIDEREADONLY = 4,
OFN_NOCHANGEDIR = 8,
OFN_SHOWHELP = 16, // 0x00000010
OFN_ENABLEHOOK = 32, // 0x00000020
OFN_ENABLETEMPLATE = 64, // 0x00000040
OFN_ENABLETEMPLATEHANDLE = 128, // 0x00000080
OFN_NOVALIDATE = 256, // 0x00000100
OFN_ALLOWMULTISELECT = 512, // 0x00000200
OFN_EXTENSIONDIFFERENT = 1024, // 0x00000400
OFN_PATHMUSTEXIST = 2048, // 0x00000800
OFN_FILEMUSTEXIST = 4096, // 0x00001000
OFN_CREATEPROMPT = 8192, // 0x00002000
OFN_SHAREAWARE = 16384, // 0x00004000
OFN_NOREADONLYRETURN = 32768, // 0x00008000
OFN_NOTESTFILECREATE = 65536, // 0x00010000
OFN_NONETWORKBUTTON = 131072, // 0x00020000
OFN_NOLONGNAMES = 262144, // 0x00040000
OFN_EXPLORER = 524288, // 0x00080000
OFN_NODEREFERENCELINKS = 1048576, // 0x00100000
OFN_LONGNAMES = 2097152, // 0x00200000
OFN_ENABLEINCLUDENOTIFY = 4194304, // 0x00400000
OFN_ENABLESIZING = 8388608, // 0x00800000
OFN_DONTADDTORECENT = 33554432, // 0x02000000
OFN_FORCESHOWHIDDEN = 268435456, // 0x10000000
}
}
}