Matti
Elite Member
    

Script Developer and Helper
Posts: 1646 Reputation: 39
32 / / 
Joined: Apr 2004
|
RE: CommonDialog help
Heh, I could have seen that one coming. Well, have a look at my implementation of matty's code, used in my own script.
Some usage examples:
jscript code: //Open File Dialog
//Opens C:\ first, file filters are text files (*.txt) and all files (*.*)
pm = BrowseForFile("Browse for PM", "C:\\", "Text Files (*.txt)|*.txt|All files (*.*)|*.*||");
//Save File Dialog
//Opens C:\ first, file filters are PNG files (*.png) and all files (*.*)
var file = BrowseForFile("Save picture as", "C:\\", "PNG Files (*.png)|*.png|All files (*.*)|*.*||", true);
if(!file) {
//User didn't specify a file to save to or pressed Cancel.
} else {
//User specified a valid save location. Do something useful here.
}
And here's the implementation:
jscript code: /* FUNCION: BrowseForFile
Original code by Choli from the Messenger Plus! Translator script
Desc: Opens a "Browse for file" dialog with the given settings
Parameters:
title Dialog title
dir Start directory
filter Filter message. Example: "JavaScript file|*.js|Text file|*.txt||"
save True is "Save as", false is "Open"
ext Default extension to append to the filename when no extension is specified
file File to display as default
hwnd_owner Handle of the owner window, used to copy window icon etc.
Return value: File path to open or save to
*/
function BrowseForFile(title, dir, filter, save, ext, file, hwnd_owner) {
save = (save == true);
hwnd_owner = 1*hwnd_owner;
var OFN_ALLOWMULTISELECT = 0x200;
var OFN_ENABLESIZING = 0x800000;
var OFN_EXPLORER = 0x80000;
var OFN_FILEMUSTEXIST = 0x1000;
var OFN_HIDEREADONLY = 0x4;
var OFN_LONGNAMES = 0x200000;
var OFN_PATHMUSTEXIST = 0x800;
var OFN_OVERWRITEPROMPT = 0x2;
var OpenFileName = Interop.Allocate(88);
with (OpenFileName) {
WriteDWORD(0, Size); // lStructSize
WriteDWORD(4, hwnd_owner); // hwndOwner
WriteDWORD(8, 0); // hInstance
if(typeof filter !== "string") filter = "All files (*.*)|*.*||";
var s_filter = Interop.Allocate(2 * (filter.length + 1));
WriteMultiStringW(s_filter, filter);
WriteDWORD(12, s_filter.DataPtr); // lpstrFilter
WriteDWORD(16, 0); // lpstrCustomFilter
WriteDWORD(20, 0); // nMaxCustomFilter
WriteDWORD(24, 1); // nFilterIndex
if(typeof file !== "string") file = "";
var s_file = Interop.Allocate(2 * (1024 + 1));
s_file.WriteString(0, file);
WriteDWORD(28, s_file.DataPtr); // lpstrFile
WriteDWORD(32, (s_file.Size / 2 - 1)); // nMaxFile
WriteDWORD(36, 0); // lpstrFileTitle
WriteDWORD(40, 0); // nMaxFileTitle
if(typeof dir === "string") {
var s_dir = Interop.Allocate(2 * (dir.length + 1));
s_dir.WriteString(0, dir);
WriteDWORD(44, s_dir.DataPtr); // lpstrInitialDir
}
if(typeof title === "string") {
var s_title = Interop.Allocate(2 * (title.length + 1));
s_title.WriteString(0, title);
WriteDWORD(48, s_title.DataPtr); // lpstrTitle
}
WriteDWORD(52, OFN_ENABLESIZING | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_PATHMUSTEXIST | (save ? OFN_OVERWRITEPROMPT : OFN_FILEMUSTEXIST)); // flags
WriteWORD(56, 0); // nFileOffset
WriteWORD(58, 0); // nFileExtension
if(typeof ext === "string") {
var s_ext = Interop.Allocate(2 * (ext.length + 1));
s_ext.WriteString(0, ext);
WriteDWORD(60, s_ext.DataPtr);
} else WriteDWORD(60, 0); // lpstrDefExt
WriteDWORD(64, 0); // lCustData
WriteDWORD(68, 0); // lpfnHook
WriteDWORD(72, 0); // lpTemplateName
WriteDWORD(76, 0); // pvReserved
WriteDWORD(80, 0); // dwReserved
WriteDWORD(84, 0); // FlagsEx
}
var result = Interop.Call("comdlg32.dll", (save ? "GetSaveFileNameW" : "GetOpenFileNameW"), OpenFileName);
var s_return = false;
if (result) {
var p_path = s_file.ReadString(0);
var p_files = new Array();
var p_file = "";
var pos = 2 * (p_path.length + 1);
if(!save) {
while(true) {
p_file = s_file.ReadString(pos);
if(p_file.length > 0) {
p_files.push(p_file);
pos += 2 * (p_file.length + 1);
} else break;
}
}
s_return = (p_files.length > 0) ? new Array(p_path).concat(p_files) : p_path;
}
OpenFileName.Size = 0;
s_filter.Size = 0;
s_file.Size = 0;
s_dir.Size = 0;
return s_return;
function WriteMultiStringW (datablock, string) {
var pos = 0;
datablock.WriteString(0, string);
pos = string.indexOf("|", pos);
while (pos !== -1) {
datablock.WriteWORD(2 * pos, 0);
pos = string.indexOf("|", pos + 1);
}
}
function Space (number) {
var i;
var s = "";
for (i = 0; i < number; i++) {
s += " ";
}
return s;
}
}
This post was edited on 11-24-2008 at 07:42 PM by Matti.
|
|