Browse Source

Merge pull request #230 from tshcherban/master

Fixed #229 Added file extension append to selected path in SaveFileDialog
pull/261/head
Nikita Tsukanov 11 years ago
parent
commit
76aed2a14d
  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);
var defExt = (dialog as SaveFileDialog)?.DefaultExtension;
var buffer = new char[256];
dialog.InitialFileName?.CopyTo(0, buffer, 0, dialog.InitialFileName.Length);
var fileBuffer = new char[256];
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* pDefExt = defExt)
fixed (char* pInitDir = dialog.InitialDirectory)
@ -60,13 +62,13 @@ namespace Perspex.Win32
UnmanagedMethods.OpenFileNameFlags.OFN_EXPLORER |
UnmanagedMethods.OpenFileNameFlags.OFN_HIDEREADONLY,
nMaxCustFilter = 0,
nMaxFile = buffer.Length - 1,
nMaxFile = fileBuffer.Length - 1,
nMaxFileTitle = 0,
lpTemplateName = IntPtr.Zero,
lpfnHook = IntPtr.Zero,
lpstrCustomFilter = IntPtr.Zero,
lpstrDefExt = new IntPtr(pDefExt),
lpstrFile = new IntPtr(pBuffer),
lpstrFile = new IntPtr(pFileBuffer),
lpstrFileTitle = IntPtr.Zero,
lpstrFilter = new IntPtr(pFilterBuffer),
lpstrInitialDir = new IntPtr(pInitDir),
@ -89,19 +91,20 @@ namespace Perspex.Win32
if (!res)
return null;
userSelectedExt = dialog.Filters[ofn.nFilterIndex - 1].Extensions[0];
}
var cStart = 0;
string dir = null;
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
if (cStart == c)
break;
var s = new string(buffer, cStart, c - cStart);
var s = new string(fileBuffer, cStart, c - cStart);
if (dir == null)
dir = s;
else
@ -110,7 +113,17 @@ namespace Perspex.Win32
}
}
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 files.Select(f => Path.Combine(dir, f)).ToArray();
});

Loading…
Cancel
Save