fix for unix file picker not handling null window parents bug 34328 r=brendan, slamm

fix for mailnews' file->save as dialog not saving files on unix in due to its handling of file extentions and filters.  this code now uses nsIFilePicker.  fixes nsbeta2+ bug 31096. r=mscott
This commit is contained in:
pavlov%netscape.com 2000-05-25 00:44:10 +00:00
parent a5516c5d4a
commit 2804c173c5
16 changed files with 186 additions and 204 deletions

View File

@ -171,7 +171,7 @@ var nsOpenCommand =
fp.init(window, window.editorShell.GetString("OpenHTMLFile"), nsIFilePicker.modeOpen);
// While we include "All", include filters that prefer HTML and Text files
fp.setFilters(nsIFilePicker.filterText | nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
fp.appendFilters(nsIFilePicker.filterText | nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
/* doesn't handle *.shtml files */
try {

View File

@ -735,10 +735,10 @@ function GetLocalFileURL(filterType)
fp.init(window, editorShell.GetString("OpenHTMLFile"), nsIFilePicker.modeOpen);
if (filterType == "img")
fp.setFilters(nsIFilePicker.filterImages);
fp.appendFilters(nsIFilePicker.filterImages);
else
// While we allow "All", include filters that prefer HTML and Text files
fp.setFilters(nsIFilePicker.filterText | nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
fp.appendFilters(nsIFilePicker.filterText | nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
/* doesn't handle *.shtml files */
try {

View File

@ -120,8 +120,8 @@ nsPSMUIHandlerImpl::PromptForFile(const PRUnichar *prompt, const char *fileRegEx
fp->Init(nsnull, prompt, nsIFilePicker::modeOpen);
fp->SetFilters(nsIFilePicker::filterAll);
fp->AppendFilter(NS_ConvertASCIItoUCS2(fileRegEx).GetUnicode(), NS_ConvertASCIItoUCS2(fileRegEx).GetUnicode());
fp->AppendFilters(nsIFilePicker::filterAll);
PRInt16 mode;
nsresult rv = fp->Show(&mode);

View File

@ -27,8 +27,8 @@
// xpcom
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsIFileSpecWithUI.h"
#include "nsFileStream.h"
#include "nsIFileSpecWithUI.h"
#include "nsIStringStream.h"
#include "nsEscape.h"
#include "nsXPIDLString.h"
@ -101,9 +101,8 @@
#include "nsMsgPrintEngine.h"
// Save As
#include "nsIFileWidget.h"
#include "nsIFilePicker.h"
#include "nsIStringBundle.h"
#include "nsWidgetsCID.h"
#include "nsINetSupportDialogService.h"
// Find / Find Again
@ -115,7 +114,6 @@ static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
static NS_DEFINE_CID(kMsgSendLaterCID, NS_MSGSENDLATER_CID);
static NS_DEFINE_CID(kMsgCopyServiceCID, NS_MSGCOPYSERVICE_CID);
static NS_DEFINE_CID(kMsgPrintEngineCID, NS_MSG_PRINTENGINE_CID);
static NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID);
static NS_DEFINE_CID(kNetSupportDialogCID, NS_NETSUPPORTDIALOG_CID);
/* This is the next generation string retrieval call */
@ -724,26 +722,9 @@ done:
NS_IMETHODIMP
nsMessenger::SaveAs(const char* url, PRBool asFile, nsIMsgIdentity* identity, nsIMsgWindow *aMsgWindow)
{
nsresult rv = NS_ERROR_FAILURE;
nsresult rv = NS_ERROR_FAILURE;
nsIMsgMessageService* messageService = nsnull;
nsCOMPtr<nsIFileSpec> aSpec;
PRInt16 saveAsFileType = 0; // 0 - raw, 1 = html, 2 = text;
const char *defaultFile = "mail";
nsCOMPtr<nsIFileWidget> fileWidget;
nsAutoString promptString;
nsString* titles = nsnull;
nsString* filters = nsnull;
nsString* nextTitle;
nsString* nextFilter;
nsAutoString HTMLFiles;
nsAutoString TextFiles;
nsFileSpec parentPath;
nsFileDlgResults dialogResult;
nsFileSpec tFileSpec;
nsFileSpec fileSpec;
char *fileName = nsnull;
nsCString tmpFilenameString;
nsCString extString;
nsAutoString defaultFile(NS_ConvertASCIItoUCS2("mail"));
nsCOMPtr<nsIUrlListener> urlListener;
nsSaveAsListener *aListener = nsnull;
nsCOMPtr<nsIURI> aURL;
@ -753,10 +734,9 @@ nsMessenger::SaveAs(const char* url, PRBool asFile, nsIMsgIdentity* identity, ns
nsCOMPtr<nsIStreamListener> convertedListener;
PRBool needDummyHeader = PR_TRUE;
PRBool canonicalLineEnding = PR_FALSE;
NS_WITH_SERVICE(nsIStreamConverterService,
streamConverterService,
kIStreamConverterServiceCID, &rv);
PRInt16 saveAsFileType = 0; // 0 - raw, 1 = html, 2 = text;
nsCOMPtr<nsIStreamConverterService> streamConverterService = do_GetService(kIStreamConverterServiceCID, &rv);
if (NS_FAILED(rv)) goto done;
if (!url) {
@ -767,106 +747,60 @@ nsMessenger::SaveAs(const char* url, PRBool asFile, nsIMsgIdentity* identity, ns
rv = GetMessageServiceFromURI(url, &messageService);
if (NS_FAILED(rv)) goto done;
if (asFile)
{
rv = nsComponentManager::CreateInstance(kCFileWidgetCID, nsnull,
NS_GET_IID(nsIFileWidget),
getter_AddRefs(fileWidget));
if (asFile) {
nsCOMPtr<nsIFilePicker> filePicker = do_CreateInstance("component://mozilla/filepicker", &rv);
if (NS_FAILED(rv)) goto done;
promptString = GetString(NS_ConvertASCIItoUCS2("SaveMailAs").GetUnicode());
titles = new nsString[3];
if (!titles)
{
rv = NS_ERROR_OUT_OF_MEMORY;
goto done;
}
filters = new nsString[3];
if (!filters)
{
rv = NS_ERROR_OUT_OF_MEMORY;
goto done;
}
nextTitle = titles;
nextFilter = filters;
// The names of the file types are localizable
fileWidget->SetDefaultString(NS_ConvertASCIItoUCS2(defaultFile));
filePicker->Init(nsnull, GetString(NS_ConvertASCIItoUCS2("SaveMailAs").GetUnicode()), nsIFilePicker::modeSave);
HTMLFiles = GetString(NS_ConvertASCIItoUCS2("HTMLFiles").GetUnicode());
TextFiles = GetString(NS_ConvertASCIItoUCS2("TextFiles").GetUnicode());
if (HTMLFiles.Length() == 0 || TextFiles.Length() == 0)
goto SkipFilters;
*nextTitle++ = GetString(NS_ConvertASCIItoUCS2("EMLFiles").GetUnicode());
(*nextFilter++).AssignWithConversion("*.eml");
*nextTitle++ = HTMLFiles;
(*nextFilter++).AssignWithConversion("*.htm; *.html; *.shtml");
*nextTitle++ = TextFiles;
(*nextFilter++).AssignWithConversion("*.txt");
fileWidget->SetFilterList(3, titles, filters);
SkipFilters:
filePicker->SetDefaultString(defaultFile.GetUnicode());
filePicker->AppendFilter(GetString(NS_ConvertASCIItoUCS2("EMLFiles").GetUnicode()),
NS_ConvertASCIItoUCS2("*.eml").GetUnicode());
filePicker->AppendFilters(nsIFilePicker::filterHTML | nsIFilePicker::filterText | nsIFilePicker::filterAll);
dialogResult = fileWidget->PutFile(nsnull, promptString, tFileSpec);
delete [] titles;
delete [] filters;
if (dialogResult == nsFileDlgResults_Cancel)
PRInt16 dialogResult;
filePicker->Show(&dialogResult);
if (dialogResult == nsIFilePicker::returnCancel)
goto done;
rv = fileWidget->GetFile(fileSpec);
nsCOMPtr<nsILocalFile> localFile;
rv = filePicker->GetFile(getter_AddRefs(localFile));
if (NS_FAILED(rv)) goto done;
fileName = fileSpec.GetLeafName();
tmpFilenameString = fileName;
nsCRT::free(fileName);
nsXPIDLCString tmpFileName;
rv = localFile->GetLeafName(getter_Copies(tmpFileName));
if (NS_FAILED(rv)) goto done;
nsCAutoString fileName(tmpFileName);
// First, check if they put ANY extension on the file, if not,
// then we should look at the type of file they have chosen and
// tack on the file extension for them.
//
if (tmpFilenameString.RFind(".", PR_TRUE) == -1)
if (fileName.RFind(".", PR_TRUE) != -1)
{
fileWidget->GetSelectedType(saveAsFileType);
switch (saveAsFileType) {
case 2:
extString = ".html";
break;
case 3:
extString = ".txt";
break;
default:
case 1:
extString = ".eml";
break;
}
// Doing this since the GetSelectedType() is not zero
// relative
saveAsFileType--;
// No append the extension and create the output stream
tmpFilenameString.Append(extString);
fileSpec.SetLeafName(tmpFilenameString.GetBuffer());
rv = NS_NewFileSpecWithSpec(fileSpec, getter_AddRefs(aSpec));
}
else
{
if (tmpFilenameString.RFind(".htm", PR_TRUE) != -1)
if (fileName.RFind(".htm", PR_TRUE) != -1)
saveAsFileType = 1;
else if (tmpFilenameString.RFind(".txt", PR_TRUE) != -1)
else if (fileName.RFind(".txt", PR_TRUE) != -1)
saveAsFileType = 2;
else
saveAsFileType = 0; // .eml type
rv = NS_NewFileSpecWithSpec(fileSpec, getter_AddRefs(aSpec));
} else {
saveAsFileType = 0; // .eml type
}
if (NS_FAILED(rv)) goto done;
aListener = new nsSaveAsListener(aSpec, this);
// XXX argh! converting from nsILocalFile to nsFileSpec ... oh baby, lets drop from unicode to ascii too
// nsXPIDLString path;
// localFile->GetUnicodePath(getter_Copies(path));
nsXPIDLCString path;
localFile->GetPath(getter_Copies(path));
nsCOMPtr<nsIFileSpec> fileSpec = do_CreateInstance("component://netscape/filespec", &rv);
if (NS_FAILED(rv)) goto done;
fileSpec->SetNativePath(path);
aListener = new nsSaveAsListener(fileSpec, this);
if (!aListener) {
rv = NS_ERROR_OUT_OF_MEMORY;
goto done;
@ -881,7 +815,7 @@ nsMessenger::SaveAs(const char* url, PRBool asFile, nsIMsgIdentity* identity, ns
switch (saveAsFileType) {
case 0:
default:
rv = messageService->SaveMessageToDisk(url, aSpec, PR_TRUE,
rv = messageService->SaveMessageToDisk(url, fileSpec, PR_TRUE,
urlListener, nsnull,
PR_FALSE, mMsgWindow);
break;
@ -932,15 +866,17 @@ nsMessenger::SaveAs(const char* url, PRBool asFile, nsIMsgIdentity* identity, ns
nsnull, nsnull, nsnull);
break;
}
}
else
{
{
// ** save as Template
fileSpec = "nsmail.tmp";
rv = NS_NewFileSpecWithSpec(fileSpec, getter_AddRefs(aSpec));
nsCOMPtr<nsIFileSpec> fileSpec;
nsFileSpec tmpFileSpec = "nsmail.tmp";
rv = NS_NewFileSpecWithSpec(tmpFileSpec, getter_AddRefs(fileSpec));
if (NS_FAILED(rv)) goto done;
aListener = new nsSaveAsListener(aSpec, this);
aListener = new nsSaveAsListener(fileSpec, this);
if (!aListener) {
rv = NS_ERROR_OUT_OF_MEMORY;
goto done;
@ -949,8 +885,7 @@ nsMessenger::SaveAs(const char* url, PRBool asFile, nsIMsgIdentity* identity, ns
NS_ADDREF(aListener);
if (identity)
rv = identity->GetStationeryFolder(
getter_Copies(aListener->m_templateUri));
rv = identity->GetStationeryFolder(getter_Copies(aListener->m_templateUri));
if (NS_FAILED(rv)) goto done;
needDummyHeader =
@ -964,7 +899,7 @@ nsMessenger::SaveAs(const char* url, PRBool asFile, nsIMsgIdentity* identity, ns
getter_AddRefs(urlListener));
if (NS_FAILED(rv)) goto done;
rv = messageService->SaveMessageToDisk(url, aSpec,
rv = messageService->SaveMessageToDisk(url, fileSpec,
needDummyHeader,
urlListener, nsnull,
canonicalLineEnding, mMsgWindow);

View File

@ -68,7 +68,7 @@ function chooseProfileFolder( aRootFolder )
try {
var fp = Components.classes["component://mozilla/filepicker"].createInstance(Components.interfaces.nsIFilePicker);
fp.init(window, bundle.GetStringFromName("chooseFolder"), Components.interfaces.nsIFilePicker.modeGetFolder);
fp.setFilters(Components.interfaces.nsIFilePicker.filterAll);
fp.appendFilters(Components.interfaces.nsIFilePicker.filterAll);
fp.show();
// later change to
aRootFolder = fp.file.unicodePath;

View File

@ -56,12 +56,12 @@ interface nsIFilePicker : nsISupports
void init(in nsIDOMWindow parent, in wstring title, in short mode);
/**
* Set filter list to something in the predefined list
* Append to the filter list with things from the predefined list
*
* @param filters mask of filters i.e. (filterAll | filterHTML)
*
*/
void setFilters(in long filterMask);
void appendFilters(in long filterMask);
/**
* Add a filter

View File

@ -379,7 +379,7 @@ nsFilePicker::PutLocalFile(Str255 & inTitle, Str255 & inDefaultName, FSSpec* out
//
//-------------------------------------------------------------------------
NS_IMETHODIMP nsFilePicker::SetFilters(PRInt32 filterMask)
NS_IMETHODIMP nsFilePicker::AppendFilters(PRInt32 filterMask)
{
#if USE_IC // FOR NOW JUST BYPASS ALL THIS CODE

View File

@ -57,7 +57,6 @@ nsFilePicker::nsFilePicker()
mUnicodeEncoder = nsnull;
mUnicodeDecoder = nsnull;
mDisplayDirectory = do_CreateInstance("component://mozilla/file/local");
}
//-------------------------------------------------------------------------
@ -204,7 +203,7 @@ NS_IMETHODIMP nsFilePicker::Show(PRInt16 *retval)
//
//-------------------------------------------------------------------------
NS_IMETHODIMP nsFilePicker::SetFilters(PRInt32 aFilterMask)
NS_IMETHODIMP nsFilePicker::AppendFilters(PRInt32 aFilterMask)
{
nsresult rv;
nsCOMPtr<nsIStringBundleService> stringService = do_GetService(kStringBundleServiceCID);
@ -218,7 +217,6 @@ NS_IMETHODIMP nsFilePicker::SetFilters(PRInt32 aFilterMask)
PRUnichar *title;
PRUnichar *filter;
mFilterList.SetLength(0);
if (aFilterMask & filterAll) {
stringBundle->GetStringFromName(NS_ConvertASCIItoUCS2("allTitle").GetUnicode(), &title);
stringBundle->GetStringFromName(NS_ConvertASCIItoUCS2("allFilter").GetUnicode(), &filter);

View File

@ -132,6 +132,15 @@ interface nsIAppShellService : nsISupports
*/
void GetHiddenWindow(out nsIXULWindow aResult);
/**
* Return the (singleton) application hidden window, automatically created
* and maintained by this AppShellService.
* @param aResult the hidden window. Do not unhide hidden window.
* Do not taunt hidden window.
*/
nsIDOMWindow getHiddenDOMWindow();
/**
* Return the (singleton) application hidden window as an nsIDOMWindow,
* and, the corresponding JavaScript context pointer. This is useful

View File

@ -637,6 +637,22 @@ nsAppShellService::GetHiddenWindow(nsIXULWindow **aWindow)
return *aWindow ? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsAppShellService::GetHiddenDOMWindow(nsIDOMWindow **aWindow)
{
nsresult rv;
nsCOMPtr<nsIDocShell> docShell;
rv = mHiddenWindow->GetDocShell(getter_AddRefs(docShell));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIDOMWindow> hiddenDOMWindow(do_GetInterface(docShell, &rv));
if (NS_FAILED(rv)) return rv;
*aWindow = hiddenDOMWindow;
NS_IF_ADDREF(*aWindow);
return NS_OK;
}
NS_IMETHODIMP
nsAppShellService::GetHiddenWindowAndJSContext(nsIDOMWindow **aWindow,
JSContext **aJSContext)

View File

@ -803,7 +803,7 @@ function RevealSearchPanel()
try {
var fp = Components.classes["component://mozilla/filepicker"].createInstance(nsIFilePicker);
fp.init(window, bundle.GetStringFromName("openFile"), nsIFilePicker.modeOpen);
fp.setFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterText |
fp.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterText |
nsIFilePicker.filterAll | nsIFilePicker.filterImages | nsIFilePicker.filterXML);
if (fp.show() == nsIFilePicker.returnOK) {
openNewWindowWith(fp.fileURL.spec);

View File

@ -120,9 +120,9 @@ function onChooseFile()
// When loading into Composer, direct user to prefer HTML files and text files:
if (dialog.openAppList.data == "2")
fp.setFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterText | nsIFilePicker.filterAll);
fp.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterText | nsIFilePicker.filterAll);
else
fp.setFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterText |
fp.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterText |
nsIFilePicker.filterAll | nsIFilePicker.filterImages | nsIFilePicker.filterXML);
if (fp.show() == nsIFilePicker.returnOK && fp.fileURL.spec && fp.fileURL.spec.length > 0)

View File

@ -36,17 +36,21 @@
const DEBUG = true; /* set to false to suppress debug messages */
const FILEPICKER_PROGID = "component://mozilla/filepicker";
const FILEPICKER_CID = Components.ID("{54ae32f8-1dd2-11b2-a209-df7c505370f8}");
const APPSHELL_SERV_PROGID= "component://netscape/appshell/appShellService";
const nsIAppShellService = Components.interfaces.nsIAppShellService;
const nsILocalFile = Components.interfaces.nsILocalFile;
const nsIFileURL = Components.interfaces.nsIFileURL;
const nsISupports = Components.interfaces.nsISupports;
const nsIFactory = Components.interfaces.nsIFactory;
const nsIFilePicker = Components.interfaces.nsIFilePicker;
const bundle = srGetStrBundle("chrome://global/locale/filepicker.properties");
var lastDirectory = "/";
const FILEPICKER_PROGID = "component://mozilla/filepicker";
const FILEPICKER_CID = Components.ID("{54ae32f8-1dd2-11b2-a209-df7c505370f8}");
const APPSHELL_SERV_PROGID = "component://netscape/appshell/appShellService";
const nsIAppShellService = Components.interfaces.nsIAppShellService;
const nsILocalFile = Components.interfaces.nsILocalFile;
const nsIFileURL = Components.interfaces.nsIFileURL;
const nsISupports = Components.interfaces.nsISupports;
const nsIFactory = Components.interfaces.nsIFactory;
const nsIFilePicker = Components.interfaces.nsIFilePicker;
const nsIInterfaceRequestor = Components.interfaces.nsIInterfaceRequestor
const nsIDOMWindow = Components.interfaces.nsIDOMWindow;
const bundle = srGetStrBundle("chrome://global/locale/filepicker.properties");
var lastDirectory = "/";
function nsFilePicker()
{
@ -89,30 +93,30 @@ nsFilePicker.prototype = {
this.mMode = mode;
},
setFilters: function(filterMask) {
appendFilters: function(filterMask) {
if (filterMask & nsIFilePicker.filterHTML) {
this.mFilterTitles.push(bundle.GetStringFromName("htmlTitle"));
this.mFilters.push(bundle.GetStringFromName("htmlFilter"));
this.appendFilter(bundle.GetStringFromName("htmlTitle"),
bundle.GetStringFromName("htmlFilter"));
}
if (filterMask & nsIFilePicker.filterText) {
this.mFilterTitles.push(bundle.GetStringFromName("textTitle"));
this.mFilters.push(bundle.GetStringFromName("textFilter"));
this.appendFilter(bundle.GetStringFromName("textTitle"),
bundle.GetStringFromName("textFilter"));
}
if (filterMask & nsIFilePicker.filterImages) {
this.mFilterTitles.push(bundle.GetStringFromName("imageTitle"));
this.mFilters.push(bundle.GetStringFromName("imageFilter"));
this.appendFilter(bundle.GetStringFromName("imageTitle"),
bundle.GetStringFromName("imageFilter"));
}
if (filterMask & nsIFilePicker.filterXML) {
this.mFilterTitles.push(bundle.GetStringFromName("xmlTitle"));
this.mFilters.push(bundle.GetStringFromName("xmlFilter"));
this.appendFilter(bundle.GetStringFromName("xmlTitle"),
bundle.GetStringFromName("xmlFilter"));
}
if (filterMask & nsIFilePicker.filterXUL) {
this.mFilterTitles.push(bundle.GetStringFromName("xulTitle"));
this.mFilters.push(bundle.GetStringFromName("xulFilter"));
this.appendFilter(bundle.GetStringFromName("xulTitle"),
bundle.GetStringFromName("xulFilter"));
}
if (filterMask & nsIFilePicker.filterAll) {
this.mFilterTitles.push(bundle.GetStringFromName("allTitle"));
this.mFilters.push(bundle.GetStringFromName("allFilter"));
this.appendFilter(bundle.GetStringFromName("allTitle"),
bundle.GetStringFromName("allFilter"));
}
},
@ -132,26 +136,34 @@ nsFilePicker.prototype = {
o.filters.types = this.mFilters;
o.retvals = new Object();
dump("nsIDOMWindow id value = " + nsIDOMWindow.id + "\n");
var parent;
try {
if (this.mParentWindow) {
parent = this.mParentWindow;
} else if (window) {
} else if (typeof(window) == "object" && window != null) {
parent = window;
} else {
var appShellService = Components.classes[APPSHELL_SERV_PROGID].getService(nsIAppShellService);
parent = appShellService.GetHiddenWindow();
try {
var appShellService = Components.classes[APPSHELL_SERV_PROGID].getService(nsIAppShellService);
parent = appShellService.getHiddenDOMWindow();
} catch(ex) {
dump("Can't get parent. xpconnect hates me so we can't get one from the appShellService.\n");
dump(ex + "\n");
}
}
} catch(ex) { }
} catch(ex) { dump("fuck\n"); }
parent.openDialog("chrome://global/content/filepicker.xul",
"",
"chrome,modal,resizeable=yes,dependent=yes",
o);
this.mFile = o.retvals.file;
lastDirectory = o.retvals.directory;
return o.retvals.buttonStatus;
try {
parent.openDialog("chrome://global/content/filepicker.xul",
"",
"chrome,modal,resizeable=yes,dependent=yes",
o);
this.mFile = o.retvals.file;
lastDirectory = o.retvals.directory;
return o.retvals.buttonStatus;
} catch(ex) { dump("unable to open file picker\n" + ex + "\n"); }
}
}

View File

@ -36,17 +36,21 @@
const DEBUG = true; /* set to false to suppress debug messages */
const FILEPICKER_PROGID = "component://mozilla/filepicker";
const FILEPICKER_CID = Components.ID("{54ae32f8-1dd2-11b2-a209-df7c505370f8}");
const APPSHELL_SERV_PROGID= "component://netscape/appshell/appShellService";
const nsIAppShellService = Components.interfaces.nsIAppShellService;
const nsILocalFile = Components.interfaces.nsILocalFile;
const nsIFileURL = Components.interfaces.nsIFileURL;
const nsISupports = Components.interfaces.nsISupports;
const nsIFactory = Components.interfaces.nsIFactory;
const nsIFilePicker = Components.interfaces.nsIFilePicker;
const bundle = srGetStrBundle("chrome://global/locale/filepicker.properties");
var lastDirectory = "/";
const FILEPICKER_PROGID = "component://mozilla/filepicker";
const FILEPICKER_CID = Components.ID("{54ae32f8-1dd2-11b2-a209-df7c505370f8}");
const APPSHELL_SERV_PROGID = "component://netscape/appshell/appShellService";
const nsIAppShellService = Components.interfaces.nsIAppShellService;
const nsILocalFile = Components.interfaces.nsILocalFile;
const nsIFileURL = Components.interfaces.nsIFileURL;
const nsISupports = Components.interfaces.nsISupports;
const nsIFactory = Components.interfaces.nsIFactory;
const nsIFilePicker = Components.interfaces.nsIFilePicker;
const nsIInterfaceRequestor = Components.interfaces.nsIInterfaceRequestor
const nsIDOMWindow = Components.interfaces.nsIDOMWindow;
const bundle = srGetStrBundle("chrome://global/locale/filepicker.properties");
var lastDirectory = "/";
function nsFilePicker()
{
@ -89,30 +93,30 @@ nsFilePicker.prototype = {
this.mMode = mode;
},
setFilters: function(filterMask) {
appendFilters: function(filterMask) {
if (filterMask & nsIFilePicker.filterHTML) {
this.mFilterTitles.push(bundle.GetStringFromName("htmlTitle"));
this.mFilters.push(bundle.GetStringFromName("htmlFilter"));
this.appendFilter(bundle.GetStringFromName("htmlTitle"),
bundle.GetStringFromName("htmlFilter"));
}
if (filterMask & nsIFilePicker.filterText) {
this.mFilterTitles.push(bundle.GetStringFromName("textTitle"));
this.mFilters.push(bundle.GetStringFromName("textFilter"));
this.appendFilter(bundle.GetStringFromName("textTitle"),
bundle.GetStringFromName("textFilter"));
}
if (filterMask & nsIFilePicker.filterImages) {
this.mFilterTitles.push(bundle.GetStringFromName("imageTitle"));
this.mFilters.push(bundle.GetStringFromName("imageFilter"));
this.appendFilter(bundle.GetStringFromName("imageTitle"),
bundle.GetStringFromName("imageFilter"));
}
if (filterMask & nsIFilePicker.filterXML) {
this.mFilterTitles.push(bundle.GetStringFromName("xmlTitle"));
this.mFilters.push(bundle.GetStringFromName("xmlFilter"));
this.appendFilter(bundle.GetStringFromName("xmlTitle"),
bundle.GetStringFromName("xmlFilter"));
}
if (filterMask & nsIFilePicker.filterXUL) {
this.mFilterTitles.push(bundle.GetStringFromName("xulTitle"));
this.mFilters.push(bundle.GetStringFromName("xulFilter"));
this.appendFilter(bundle.GetStringFromName("xulTitle"),
bundle.GetStringFromName("xulFilter"));
}
if (filterMask & nsIFilePicker.filterAll) {
this.mFilterTitles.push(bundle.GetStringFromName("allTitle"));
this.mFilters.push(bundle.GetStringFromName("allFilter"));
this.appendFilter(bundle.GetStringFromName("allTitle"),
bundle.GetStringFromName("allFilter"));
}
},
@ -132,26 +136,34 @@ nsFilePicker.prototype = {
o.filters.types = this.mFilters;
o.retvals = new Object();
dump("nsIDOMWindow id value = " + nsIDOMWindow.id + "\n");
var parent;
try {
if (this.mParentWindow) {
parent = this.mParentWindow;
} else if (window) {
} else if (typeof(window) == "object" && window != null) {
parent = window;
} else {
var appShellService = Components.classes[APPSHELL_SERV_PROGID].getService(nsIAppShellService);
parent = appShellService.GetHiddenWindow();
try {
var appShellService = Components.classes[APPSHELL_SERV_PROGID].getService(nsIAppShellService);
parent = appShellService.getHiddenDOMWindow();
} catch(ex) {
dump("Can't get parent. xpconnect hates me so we can't get one from the appShellService.\n");
dump(ex + "\n");
}
}
} catch(ex) { }
} catch(ex) { dump("fuck\n"); }
parent.openDialog("chrome://global/content/filepicker.xul",
"",
"chrome,modal,resizeable=yes,dependent=yes",
o);
this.mFile = o.retvals.file;
lastDirectory = o.retvals.directory;
return o.retvals.buttonStatus;
try {
parent.openDialog("chrome://global/content/filepicker.xul",
"",
"chrome,modal,resizeable=yes,dependent=yes",
o);
this.mFile = o.retvals.file;
lastDirectory = o.retvals.directory;
return o.retvals.buttonStatus;
} catch(ex) { dump("unable to open file picker\n" + ex + "\n"); }
}
}

View File

@ -126,7 +126,7 @@ function PrefNavSelectFile(prefID) {
var fp = Components.classes["component://mozilla/filepicker"].createInstance(nsIFilePicker);
/* XXX no title here */
fp.init(window, "", nsIFilePicker.modeOpen);
fp.setFilters(nsIFilePicker.filterAll);
fp.appendFilters(nsIFilePicker.filterAll);
fp.show();
var field = document.getElementById(prefID);
field.setAttribute("value", fp.file.unicodePath);
@ -139,7 +139,7 @@ function PrefCacheSelectFolder() {
var fp = Components.classes["component://mozilla/filepicker"].createInstance(nsIFilePicker);
/* XXX no title here */
fp.init(window, "", nsIFilePicker.modeGetFolder);
fp.setFilters(nsIFilePicker.filterAll);
fp.appendFilters(nsIFilePicker.filterAll);
fp.show();
var field = document.getElementById("pref:string:browser.cache.directory");
field.setAttribute("value", fp.file.unicodePath);

View File

@ -41,7 +41,7 @@ function getFileOrFolderSpec( aTitle, aFolder )
mode = nsIFilePicker.modeOpen;
fp.init(window, aTitle, mode);
fp.setFilters(nsIFilePicker.filterAll);
fp.appendFilters(nsIFilePicker.filterAll);
fp.show();
}
catch(e) {