diff --git a/xpfe/components/prefwindow/resources/content/overrideHandler.js b/xpfe/components/prefwindow/resources/content/overrideHandler.js index 0065184bedc..b008a8cd8d0 100644 --- a/xpfe/components/prefwindow/resources/content/overrideHandler.js +++ b/xpfe/components/prefwindow/resources/content/overrideHandler.js @@ -346,3 +346,42 @@ function unassertMIMEStuff(aMIMEString, aPropertyString, aValueString) gDS.Unassert(mimeSource, valueProperty, mimeLiteral, true); } +function removeOverride(aMIMEType) +{ + dump("*** mimeType = " + aMIMEType + "\n"); + // remove entry from seq + var rdfc = Components.classes["component://netscape/rdf/container"].createInstance(); + if (rdfc) { + rdfc = rdfc.QueryInterface(Components.interfaces.nsIRDFContainer); + if (rdfc) { + var containerRes = gRDF.GetResource("urn:mimetypes:root"); + rdfc.Init(gDS, containerRes); + var element = gRDF.GetResource(MIME_URI(aMIMEType)); + if (rdfc.IndexOf(element) != -1) + rdfc.RemoveElement(element, true); + } + } + + // remove items from the graph + var urns = [ [MIME_URI, ["description", "editable", "value", "smallIcon", "largeIcon"], [HANDLER_URI, "handlerProp"]], + [HANDLER_URI, ["handleInternal", "saveToDisk", "alwaysAsk"], [APP_URI, "externalApplication"]], + [APP_URI, ["path", "prettyName"]] ]; + for (var i = 0; i < urns.length; i++) { + var mimeRes = gRDF.GetResource(urns[i][0](aMIMEType)); + dump("*** mimeRes = " + mimeRes + "\n"); + // unassert the toplevel properties + var properties = urns[i][1]; + for (var j = 0; j < properties.length; j++) { + var propertyRes = gRDF.GetResource(NC_RDF(properties[j]), true); + dump("*** propertyRes = " + propertyRes + "\n"); + var mimeValue = gDS.GetTarget(mimeRes, propertyRes, true); + dump("*** mimeValue = " + mimeValue + "\n"); + gDS.Unassert(mimeRes, propertyRes, mimeValue, true); + } + if (urns[i][2]) { + var linkRes = gRDF.GetResource(NC_RDF(urns[i][2][1]), true); + var linkTarget = gRDF.GetResource(urns[i][2][0](aMIMEType), true); + gDS.Unassert(mimeRes, linkRes, linkTarget); + } + } +} \ No newline at end of file diff --git a/xpfe/components/prefwindow/resources/content/pref-applications-edit.xul b/xpfe/components/prefwindow/resources/content/pref-applications-edit.xul index 5f00207ee2e..53de5a4e2ba 100644 --- a/xpfe/components/prefwindow/resources/content/pref-applications-edit.xul +++ b/xpfe/components/prefwindow/resources/content/pref-applications-edit.xul @@ -133,80 +133,80 @@ doEnabling(); } -var gDS = null; -function onOK() -{ - const mimeTypes = 66638; - var fileLocator = Components.classes["component://netscape/filelocator"].getService(); - if (fileLocator) - fileLocator = fileLocator.QueryInterface(Components.interfaces.nsIFileLocator); - var file = fileLocator.GetFileLocation(mimeTypes); - if (file) - file = file.QueryInterface(Components.interfaces.nsIFileSpec); - gDS = gRDF.GetDataSource(file.URLString); - if (gDS) - gDS = gDS.QueryInterface(Components.interfaces.nsIRDFDataSource); - - // figure out if this mime type already exists. - if (gMIMEField.value != gOldMIME) { - var exists = mimeHandlerExists(gMIMEField.value); - if (exists) { - var titleMsg = gBundle.GetStringFromName("handlerExistsTitle"); - var dialogMsg = gBundle.GetStringFromName("handlerExists"); - dialogMsg = dialogMsg.replace(/%mime%/g, gMIMEField.value); - var commonDialogService = nsJSComponentManager.getService("component://netscape/appshell/commonDialogs", - "nsICommonDialogs"); - var replace = commonDialogService.Confirm(window, titleMsg, dialogMsg); - if (!replace) - window.close(); + var gDS = null; + function onOK() + { + const mimeTypes = 66638; + var fileLocator = Components.classes["component://netscape/filelocator"].getService(); + if (fileLocator) + fileLocator = fileLocator.QueryInterface(Components.interfaces.nsIFileLocator); + var file = fileLocator.GetFileLocation(mimeTypes); + if (file) + file = file.QueryInterface(Components.interfaces.nsIFileSpec); + gDS = gRDF.GetDataSource(file.URLString); + if (gDS) + gDS = gDS.QueryInterface(Components.interfaces.nsIRDFDataSource); + + // figure out if this mime type already exists. + if (gMIMEField.value != gOldMIME) { + var exists = mimeHandlerExists(gMIMEField.value); + if (exists) { + var titleMsg = gBundle.GetStringFromName("handlerExistsTitle"); + var dialogMsg = gBundle.GetStringFromName("handlerExists"); + dialogMsg = dialogMsg.replace(/%mime%/g, gMIMEField.value); + var commonDialogService = nsJSComponentManager.getService("component://netscape/appshell/commonDialogs", + "nsICommonDialogs"); + var replace = commonDialogService.Confirm(window, titleMsg, dialogMsg); + if (!replace) + window.close(); + } + } + + // now save the information + var handlerInfo = new HandlerOverride(MIME_URI(gMIMEField.value)); + handlerInfo.mUpdateMode = mimeHandlerExists(gMIMEField.value); + handlerInfo.mimeType = gMIMEField.value; + + // other info we need to set (not reflected in UI) + if (gHandlerGroup.data == "2") { + handlerInfo.appPath = gAppPath.value; + handlerInfo.setHandlerProcedure("saveToDisk", "false"); + handlerInfo.setHandlerProcedure("handleInternal", "false"); + } + else if (gHandlerGroup.data == "1") + handlerInfo.saveToDisk = true; + else + handlerInfo.handleInternal = true; + + handlerInfo.alwaysAsk = gAskBeforeOpen.checked; + + // need to make the following dynamic to track changes. otherwise the + // app pretty name remains the same. + // better still, find a way to XP dynamically discover the pretty name of the app + // from the OS. + var file = Components.classes["component://mozilla/file/local"].createInstance(); + if (file) + file = file.QueryInterface(Components.interfaces.nsILocalFile); + if (file) { + try { + file.initWithPath(gAppPath.value); + handlerInfo.appDisplayName = file.unicodeLeafName; + } + catch(e) { + handlerInfo.appDisplayName = gAppPath.value; + } + } + // do the rest of the work (ugly yes, but it works) + handlerInfo.buildLinks(); + + // flush the ds to disk. + gDS = gDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); + if (gDS) + gDS.Flush(); + + window.opener.gUpdateTypeRV = true; + window.close(); } - } - - // now save the information - var handlerInfo = new HandlerOverride(MIME_URI(gMIMEField.value)); - handlerInfo.mUpdateMode = mimeHandlerExists(gMIMEField.value); - handlerInfo.mimeType = gMIMEField.value; - - // other info we need to set (not reflected in UI) - if (gHandlerGroup.data == "2") { - handlerInfo.appPath = gAppPath.value; - handlerInfo.setHandlerProcedure("saveToDisk", "false"); - handlerInfo.setHandlerProcedure("handleInternal", "false"); - } - else if (gHandlerGroup.data == "1") - handlerInfo.saveToDisk = true; - else - handlerInfo.handleInternal = true; - - handlerInfo.alwaysAsk = gAskBeforeOpen.checked; - - // need to make the following dynamic to track changes. otherwise the - // app pretty name remains the same. - // better still, find a way to XP dynamically discover the pretty name of the app - // from the OS. - var file = Components.classes["component://mozilla/file/local"].createInstance(); - if (file) - file = file.QueryInterface(Components.interfaces.nsILocalFile); - if (file) { - try { - file.initWithPath(gAppPath.value); - handlerInfo.appDisplayName = file.unicodeLeafName; - } - catch(e) { - handlerInfo.appDisplayName = gAppPath.value; - } - } - // do the rest of the work (ugly yes, but it works) - handlerInfo.buildLinks(); - - // flush the ds to disk. - gDS = gDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); - if (gDS) - gDS.Flush(); - - window.opener.gUpdateTypeRV = true; - window.close(); -} ]]> diff --git a/xpfe/components/prefwindow/resources/content/pref-applications.js b/xpfe/components/prefwindow/resources/content/pref-applications.js index c8336336de7..7cb3c18a002 100644 --- a/xpfe/components/prefwindow/resources/content/pref-applications.js +++ b/xpfe/components/prefwindow/resources/content/pref-applications.js @@ -1,6 +1,5 @@ var gNewTypeRV = null; -var gRemoveTypeRV = null; var gUpdateTypeRV = null; function newType() @@ -16,11 +15,17 @@ function newType() function removeType() { - // implement me - if (gRemoveTypeRV) { - //gTree.builder.rebuild(); + var titleMsg = gBundle.GetStringFromName("removeHandlerTitle"); + var dialogMsg = gBundle.GetStringFromName("removeHandler"); + dialogMsg = dialogMsg.replace(/%n/g, "\n"); + var commonDialogService = nsJSComponentManager.getService("component://netscape/appshell/commonDialogs", + "nsICommonDialogs"); + var remove = commonDialogService.Confirm(window, titleMsg, dialogMsg); + if (remove) { + var uri = gTree.selectedItems[0].id; + var handlerOverride = new HandlerOverride(uri); + removeOverride(handlerOverride.mimeType); gTree.setAttribute("ref", "urn:mimetypes"); - gRemoveTypeRV = null; } } diff --git a/xpfe/components/prefwindow/resources/content/pref-applications.xul b/xpfe/components/prefwindow/resources/content/pref-applications.xul index 873297234d4..1823ae42e32 100644 --- a/xpfe/components/prefwindow/resources/content/pref-applications.xul +++ b/xpfe/components/prefwindow/resources/content/pref-applications.xul @@ -38,6 +38,7 @@ + diff --git a/xpfe/components/prefwindow/resources/locale/en-US/pref-applications.properties b/xpfe/components/prefwindow/resources/locale/en-US/pref-applications.properties index 28075430e85..e70bb087ef7 100644 --- a/xpfe/components/prefwindow/resources/locale/en-US/pref-applications.properties +++ b/xpfe/components/prefwindow/resources/locale/en-US/pref-applications.properties @@ -8,3 +8,6 @@ programsFilter=Programs handlerExists=A helper already exists for the MIME type '%mime%'. Do you want to replace it? handlerExistsTitle=Helper Application Exists + +removeHandlerTitle=Remove File Type +removeHandler=If you remove a registered type, the helper will no longer be able to automatically handle files of this type. %n%nAre you sure you want to remove this file type? \ No newline at end of file