mirror of
https://github.com/ZuneDev/ZuneShell.dll.git
synced 2026-07-27 13:11:51 -07:00
169 lines
6.0 KiB
C#
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
|
|
}
|
|
}
|
|
}
|