Browse Source

Added file extension append to selected path in SaveFileDialog if it wasn't specified by user

pull/230/head
shcherban 11 years ago
parent
commit
aa9c5d2b41
  1. 29
      src/Windows/Perspex.Win32/SystemDialogImpl.cs

29
src/Windows/Perspex.Win32/SystemDialogImpl.cs

@ -40,10 +40,12 @@ namespace Perspex.Win32
filters.CopyTo(0, filterBuffer, 0, filterBuffer.Length); filters.CopyTo(0, filterBuffer, 0, filterBuffer.Length);
var defExt = (dialog as SaveFileDialog)?.DefaultExtension; var defExt = (dialog as SaveFileDialog)?.DefaultExtension;
var buffer = new char[256]; var fileBuffer = new char[256];
dialog.InitialFileName?.CopyTo(0, buffer, 0, dialog.InitialFileName.Length); dialog.InitialFileName?.CopyTo(0, fileBuffer, 0, dialog.InitialFileName.Length);
fixed (char* pBuffer = buffer) string userSelectedExt = null;
fixed (char* pFileBuffer = fileBuffer)
fixed (char* pFilterBuffer = filterBuffer) fixed (char* pFilterBuffer = filterBuffer)
fixed (char* pDefExt = defExt) fixed (char* pDefExt = defExt)
fixed (char* pInitDir = dialog.InitialDirectory) fixed (char* pInitDir = dialog.InitialDirectory)
@ -60,13 +62,13 @@ namespace Perspex.Win32
UnmanagedMethods.OpenFileNameFlags.OFN_EXPLORER | UnmanagedMethods.OpenFileNameFlags.OFN_EXPLORER |
UnmanagedMethods.OpenFileNameFlags.OFN_HIDEREADONLY, UnmanagedMethods.OpenFileNameFlags.OFN_HIDEREADONLY,
nMaxCustFilter = 0, nMaxCustFilter = 0,
nMaxFile = buffer.Length - 1, nMaxFile = fileBuffer.Length - 1,
nMaxFileTitle = 0, nMaxFileTitle = 0,
lpTemplateName = IntPtr.Zero, lpTemplateName = IntPtr.Zero,
lpfnHook = IntPtr.Zero, lpfnHook = IntPtr.Zero,
lpstrCustomFilter = IntPtr.Zero, lpstrCustomFilter = IntPtr.Zero,
lpstrDefExt = new IntPtr(pDefExt), lpstrDefExt = new IntPtr(pDefExt),
lpstrFile = new IntPtr(pBuffer), lpstrFile = new IntPtr(pFileBuffer),
lpstrFileTitle = IntPtr.Zero, lpstrFileTitle = IntPtr.Zero,
lpstrFilter = new IntPtr(pFilterBuffer), lpstrFilter = new IntPtr(pFilterBuffer),
lpstrInitialDir = new IntPtr(pInitDir), lpstrInitialDir = new IntPtr(pInitDir),
@ -89,19 +91,20 @@ namespace Perspex.Win32
if (!res) if (!res)
return null; return null;
userSelectedExt = dialog.Filters[ofn.nFilterIndex - 1].Extensions[0];
} }
var cStart = 0; var cStart = 0;
string dir = null; string dir = null;
var files = new List<string>(); var files = new List<string>();
for (var c = 0; c < buffer.Length; c++) for (var c = 0; c < fileBuffer.Length; c++)
{ {
if (buffer[c] == 0) if (fileBuffer[c] == 0)
{ {
//Encountered double zero char //Encountered double zero char
if (cStart == c) if (cStart == c)
break; break;
var s = new string(buffer, cStart, c - cStart); var s = new string(fileBuffer, cStart, c - cStart);
if (dir == null) if (dir == null)
dir = s; dir = s;
else else
@ -110,7 +113,17 @@ namespace Perspex.Win32
} }
} }
if (files.Count == 0) if (files.Count == 0)
{
if (dialog is SaveFileDialog)
{
if (string.IsNullOrWhiteSpace(Path.GetExtension(dir)) &&
!string.IsNullOrWhiteSpace(userSelectedExt) &&
!userSelectedExt.Contains("*"))
dir = Path.ChangeExtension(dir, userSelectedExt);
}
return new[] {dir}; return new[] {dir};
}
return files.Select(f => Path.Combine(dir, f)).ToArray(); return files.Select(f => Path.Combine(dir, f)).ToArray();
}); });

Loading…
Cancel
Save