home *** CD-ROM | disk | FTP | other *** search
/ ftp.swcp.com / ftp.swcp.com.zip / ftp.swcp.com / mac / mozilla-macos9-1.3.1.sea.bin / Mozilla1.3.1 / Chrome / comm.jar / content / communicator / pref / pref-applications-edit.xul < prev    next >
Extensible Markup Language  |  2003-06-08  |  16KB  |  434 lines

  1. <?xml version="1.0"?>
  2. <!--
  3.    The contents of this file are subject to the Netscape Public
  4.    License Version 1.1 (the "License"); you may not use this file
  5.    except in compliance with the License. You may obtain a copy of
  6.    the License at http://www.mozilla.org/NPL/
  7.     
  8.    Software distributed under the License is distributed on an "AS
  9.    IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.    implied. See the License for the specific language governing
  11.    rights and limitations under the License.
  12.     
  13.    The Original Code is Mozilla Communicator client code, released
  14.    March 31, 1998.
  15.    
  16.    The Initial Developer of the Original Code is Netscape
  17.    Communications Corporation. Portions created by Netscape are
  18.    Copyright (C) 1998-1999 Netscape Communications Corporation. All
  19.    Rights Reserved.
  20.    
  21.    Contributor(s): 
  22.      Ben Goodger <ben@netscape.com>, original implementor
  23.   -->
  24.  
  25. <?xml-stylesheet href="chrome://communicator/skin/"?>
  26. <?xml-stylesheet href="chrome://communicator/skin/prefpanels.css" type="text/css"?>
  27.  
  28. <!DOCTYPE dialog SYSTEM "chrome://communicator/locale/pref/pref-applications-edit.dtd">
  29.  
  30. <dialog id="pickAppHandler"
  31.         style="width: 30em;"
  32.         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  33.         title="&editType.label;"
  34.         newtitle="&newType.label;"
  35.         onload="Startup();"
  36.         ondialogaccept="return onAccept();">
  37.  
  38.     <stringbundle id="bundle_prefApplications"
  39.                   src="chrome://communicator/locale/pref/pref-applications.properties"/>
  40.  
  41. <script type="application/x-javascript" src="chrome://global/content/dialogOverlay.js"/>
  42. <script type="application/x-javascript" src="chrome://communicator/content/pref/overrideHandler.js"/>
  43.   <script type="application/x-javascript">
  44.   <![CDATA[
  45.     var gExtension        = null;
  46.     var gMIMEField        = null;
  47.     var gHandlerGroup     = null;
  48.     var gAppPath          = null;
  49.     var gAskBeforeOpen    = null;
  50.     var gDescription      = null;
  51.     var gPrefApplicationsBundle = null;
  52.  
  53.     var gOldMIME          = null;
  54.     var gOldDesc          = null;
  55.     var gOldExtensions   = null;
  56.  
  57.     const nsIMIMEInfo = Components.interfaces.nsIMIMEInfo;
  58.     
  59.     function Startup()
  60.     {     
  61.       gDescription      = document.getElementById("description");
  62.       gExtension        = document.getElementById("extension");
  63.       gMIMEField        = document.getElementById("mimeType");
  64.       gHandlerGroup     = document.getElementById("handler");
  65.       gAppPath          = document.getElementById("appPath");
  66.       gAskBeforeOpen    = document.getElementById("askBeforeOpen");
  67.         
  68.       gPrefApplicationsBundle = document.getElementById("bundle_prefApplications");
  69.  
  70.       // Set values for radio items to nsIMIMEInfo constants
  71.       var rSaveToDisk         = document.getElementById("saveToDisk");
  72.       var rUseHelperApp       = document.getElementById("useHelperApp");
  73.       var rUseSystemDefault   = document.getElementById("useSystemDefault");
  74.       rSaveToDisk.value       = nsIMIMEInfo.saveToDisk;
  75.       rUseHelperApp.value     = nsIMIMEInfo.useHelperApp;
  76.       rUseSystemDefault.value = nsIMIMEInfo.useSystemDefault;
  77.       
  78.       var handlerInfo = window.arguments[0];
  79.  
  80.       // Test to see if this dialog is being called from the helper app dialog.
  81.       if ( !( "URI" in handlerInfo ) ) {
  82.         // Arg is an nsHelperAppDlg object in this case.
  83.         window.gHelperAppDlg = window.arguments[0];
  84.         var info = window.arguments[0].mLauncher.MIMEInfo;
  85.         
  86.         // Update entry (without dialog showing).
  87.         try {
  88.           updateEntry(info);
  89.         } catch(e) { dump("updateEntry failed: " + e + "\n"); }
  90.         
  91.         // Close the dialog.
  92.         window.close();
  93.         
  94.         // Done.
  95.         return;
  96.       }
  97.       
  98.       // Default to true in case the preference cannot be retrieved
  99.       var forceAlwaysAsk = true;
  100.       try {
  101.         var prefService = Components.classes["@mozilla.org/preferences;1"].getService(Components.interfaces.nsIPrefService);
  102.         var prefBranch = prefService.getBranch("browser.helperApps.alwaysAsk.");
  103.         forceAlwaysAsk = prefBranch.getBoolPref("force");
  104.       } catch(e) {
  105.         dump("forceAlwaysAsk defaulting to true since preference couldn't be opened\n");
  106.       }
  107.         
  108.       if ( !handlerInfo.URI )
  109.       {
  110.         // Opening for "New Type".
  111.         var newTitle = document.documentElement.getAttribute("newtitle");
  112.         document.documentElement.setAttribute("title", newTitle);
  113.         
  114.         // Initialize some stuff to blank for new types.
  115.         gOldMIME = gOldDesc = gOldExtensions = "";
  116.         
  117.         // Make default "use system default."
  118.         gHandlerGroup.selectedItem = gHandlerGroup.getElementsByAttribute("value",nsIMIMEInfo.useSystemDefault)[0];
  119.         
  120.         // Always ask box default depends on pref.
  121.         gAskBeforeOpen.checked = forceAlwaysAsk;
  122.         gAskBeforeOpen.disabled = forceAlwaysAsk;
  123.         
  124.         // Put focus on mime type field.
  125.         gMIMEField.focus();
  126.         
  127.         // Size/position the dialog.
  128.         sizeToContent();
  129.         window.moveToAlertPosition();
  130.         
  131.         // Avoid the normal "edit" case code.
  132.         return;
  133.       }
  134.  
  135.       gExtension.setAttribute("value", handlerInfo.extensions);
  136.       gMIMEField.value = handlerInfo.mimeType;
  137.       gOldMIME = handlerInfo.mimeType;
  138.       gOldDesc = handlerInfo.description;
  139.       gOldExtensions = handlerInfo.extensions;
  140.       
  141.       // figure out how this type is handled
  142.       var data = nsIMIMEInfo.saveToDisk;
  143.       if (handlerInfo.saveToDisk == "true")
  144.         data = nsIMIMEInfo.saveToDisk;
  145.       else if (handlerInfo.useSystemDefault == "true")
  146.         data = nsIMIMEInfo.useSystemDefault;
  147.       else 
  148.         data = nsIMIMEInfo.useHelperApp;
  149.         
  150.       gHandlerGroup.selectedItem = gHandlerGroup.getElementsByAttribute("value", data)[0];
  151.       doEnabling();
  152.       
  153.       var appPath = handlerInfo.appPath;
  154.       if (appPath != undefined)
  155.         gAppPath.value = appPath;
  156.  
  157.       if (forceAlwaysAsk)
  158.       {
  159.         gAskBeforeOpen.checked = true;
  160.         gAskBeforeOpen.disabled = true;
  161.       }
  162.       else
  163.       {
  164.         gAskBeforeOpen.checked = handlerInfo.alwaysAsk == "true" ? true : false;
  165.       }
  166.       
  167.       gDescription.setAttribute("value", handlerInfo.description);
  168.       var ext;
  169.       var posOfFirstSpace = handlerInfo.extensions.indexOf(" ");
  170.       if (posOfFirstSpace > -1)
  171.         ext = handlerInfo.extensions.substr(0, posOfFirstSpace);
  172.       else
  173.         ext = handlerInfo.extensions;
  174.       var imageString = "moz-icon://" + "dummy." + ext.toLowerCase() + "?size=32&contentType=" + handlerInfo.mimeType;
  175.       document.getElementById("contentTypeImage").setAttribute("src", imageString);
  176.       
  177.       // If opened from helper app dialog, then focus goes to radio buttons.
  178.       if ( "gHelperAppDlg" in window )
  179.         gHandlerGroup.focus();
  180.       else
  181.         gMIMEField.focus();
  182.  
  183.       sizeToContent();
  184.       moveToAlertPosition();
  185.     }
  186.     
  187.     function doEnabling()
  188.     {
  189.     }
  190.     
  191.     function chooseApp()
  192.     {
  193.       var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance();
  194.       if (filePicker)
  195.         filePicker = filePicker.QueryInterface(Components.interfaces.nsIFilePicker);
  196.       if (filePicker) {
  197.         const FP = Components.interfaces.nsIFilePicker
  198.         var windowTitle = gPrefApplicationsBundle.getString("chooseHandler");
  199.         var programsFilter = gPrefApplicationsBundle.getString("programsFilter");
  200.         filePicker.init(window, windowTitle, FP.modeOpen);
  201.         if (navigator.platform == "Win32")
  202.           filePicker.appendFilter(programsFilter, "*.exe; *.com");
  203.         else
  204.           filePicker.appendFilters(FP.filterAll);
  205.         if ( filePicker.show() == FP.returnOK ) {
  206.           var file = filePicker.file.QueryInterface(Components.interfaces.nsILocalFile);
  207.           gAppPath.value = file.path;
  208.           gAppPath.select();
  209.           selectAppRadio();
  210.         }
  211.       }
  212.     }
  213.     
  214.     function selectAppRadio()
  215.     {
  216.       if (gHandlerGroup.value != nsIMIMEInfo.useHelperApp) 
  217.         gHandlerGroup.selectedItem = gHandlerGroup.getElementsByAttribute("value", nsIMIMEInfo.useHelperApp)[0];
  218.       doEnabling();
  219.     }
  220.  
  221.     var gDS = null;
  222.     function getDS()
  223.     {
  224.       const mimeTypes = "UMimTyp";
  225.       var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"].getService();
  226.       if (fileLocator)
  227.         fileLocator = fileLocator.QueryInterface(Components.interfaces.nsIProperties);
  228.       var file = fileLocator.get(mimeTypes, Components.interfaces.nsIFile);
  229.       var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  230.       var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
  231.       gDS = gRDF.GetDataSource(fileHandler.getURLSpecFromFile(file));
  232.     }
  233.  
  234.     function updateEntry(info)
  235.     {
  236.       // Initialize data source.
  237.       getDS();
  238.       
  239.       // Get mime type from which we can construct a HandlerInfo...
  240.       var mimeType = info.MIMEType.toLowerCase();
  241.       
  242.       // Create HandlerOverride and populate it.
  243.       var entry = new HandlerOverride(MIME_URI(mimeType));
  244.       entry.mUpdateMode = mimeHandlerExists(mimeType);
  245.       entry.mimeType    = mimeType;
  246.       entry.isEditable  = true;
  247.       entry.alwaysAsk   = info.alwaysAskBeforeHandling;
  248.       
  249.       // If not updating (i.e., a newly encountered mime type),
  250.       // then update extension list and description.
  251.       if (!entry.mUpdateMode) {
  252.         var extCount           = { value: 0 };
  253.         var extArray           = { value: null };
  254.         info.GetFileExtensions(extCount, extArray);
  255.         for (var i = 0; i < extArray.value.length; i++) {
  256.           entry.addExtension(extArray.value[i]);
  257.         }
  258.         entry.description = info.Description;
  259.         entry.appDisplayName = "";
  260.       }
  261.       
  262.       if (info.preferredAction == nsIMIMEInfo.saveToDisk) {
  263.         entry.saveToDisk = true;
  264.         if (!entry.mUpdateMode) {
  265.           // Creating a new entry, set path.
  266.           entry.appPath = "";
  267.         }
  268.       } else if (info.preferredAction == nsIMIMEInfo.useSystemDefault ||
  269.                  info.preferredApplicationHandler == null) {
  270.         entry.useSystemDefault = true;
  271.         if (!entry.mUpdateMode) {
  272.           // Creating a new entry, set path.
  273.           entry.appPath = "";
  274.         }
  275.       } else {
  276.         entry.saveToDisk       = false;
  277.         entry.useSystemDefault = false;
  278.         entry.handleInternal   = false;
  279.         entry.appPath = info.preferredApplicationHandler.path;
  280.         entry.appDisplayName = info.applicationDescription;
  281.       }
  282.       
  283.       // Do RDF magic.
  284.       entry.buildLinks();
  285.       
  286.       // flush the ds to disk.
  287.       var remoteDS = gDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
  288.       if (remoteDS)
  289.         remoteDS.Flush();
  290.     }
  291.  
  292.     function onAccept()
  293.     {
  294.       // Validate input.
  295.       if ( !checkInput() ) {
  296.         return false;
  297.       }
  298.       getDS();
  299.       gMIMEField.value = gMIMEField.value.toLowerCase();
  300.       // figure out if this mime type already exists. 
  301.       if (gMIMEField.value != gOldMIME) {
  302.         var exists = mimeHandlerExists(gMIMEField.value);
  303.         if (exists) {
  304.           var titleMsg = gPrefApplicationsBundle.getString("handlerExistsTitle");
  305.           var dialogMsg = gPrefApplicationsBundle.getString("handlerExists");
  306.           dialogMsg = dialogMsg.replace(/%mime%/g, gMIMEField.value);
  307.           var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
  308.           var replace = promptService.confirm(window, titleMsg, dialogMsg);
  309.           if (!replace)
  310.             window.close();
  311.           
  312.           // delete mimetype we're overwriting
  313.           if (gMIMEField.value)
  314.             removeOverride(gMIMEField.value);
  315.         }
  316.       }
  317.       
  318.       if (gOldMIME && gOldMIME != gMIMEField.value)
  319.         removeOverride(gOldMIME); // delete old handler
  320.  
  321.       // now save the information
  322.       var handlerInfo = new HandlerOverride(MIME_URI(gMIMEField.value));
  323.       handlerInfo.mUpdateMode = (gOldMIME == gMIMEField.value);
  324.       handlerInfo.mimeType = gMIMEField.value;
  325.     
  326.       // set description, editable, and extensions
  327.       handlerInfo.isEditable = true;
  328.       handlerInfo.description = gDescription.value;
  329.       handlerInfo.clearExtensions();
  330.       var extensions = gExtension.value.toLowerCase().split(" ");
  331.       for (var i = 0; i < extensions.length; i++) {
  332.         var currExtension = extensions[i];
  333.         handlerInfo.addExtension(currExtension);
  334.       }
  335.     
  336.       // other info we need to set (not reflected in UI)
  337.       if (gHandlerGroup.value == nsIMIMEInfo.useHelperApp) {
  338.         handlerInfo.appPath = gAppPath.value;
  339.         handlerInfo.setHandlerProcedure("saveToDisk", "false");
  340.         handlerInfo.setHandlerProcedure("useSystemDefault", "false");
  341.         handlerInfo.setHandlerProcedure("handleInternal", "false");
  342.       }
  343.       else if (gHandlerGroup.value == nsIMIMEInfo.saveToDisk)
  344.         handlerInfo.saveToDisk = true;
  345.       else if (gHandlerGroup.value == nsIMIMEInfo.useSystemDefault)
  346.         handlerInfo.useSystemDefault = true;
  347.       else
  348.         handlerInfo.handleInternal = true;
  349.     
  350.       handlerInfo.alwaysAsk = gAskBeforeOpen.checked;
  351.     
  352.       // need to make the following dynamic to track changes. otherwise the 
  353.       // app pretty name remains the same.
  354.       // better still, find a way to XP dynamically discover the pretty name of the app
  355.       // from the OS. 
  356.       var file = Components.classes["@mozilla.org/file/local;1"].createInstance();
  357.       if (file)
  358.         file = file.QueryInterface(Components.interfaces.nsILocalFile);
  359.       if (file) {
  360.         try {
  361.           file.initWithPath(gAppPath.value);
  362.           handlerInfo.appDisplayName = file.leafName;
  363.         }
  364.         catch(e) {
  365.           handlerInfo.appDisplayName = gAppPath.value;    
  366.         }
  367.       }
  368.  
  369.       // do the rest of the work (ugly yes, but it works)
  370.       handlerInfo.buildLinks();
  371.       
  372.       // flush the ds to disk.   
  373.       var remoteDS = gDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
  374.       if (remoteDS)
  375.         remoteDS.Flush();
  376.       
  377.       window.opener.gUpdateTypeRV = true;
  378.       return true;
  379.     }
  380.   ]]>
  381.   </script>
  382.   <vbox>
  383.   <hbox align="center">
  384.     <image id="contentTypeImage"/>
  385.     <grid flex="1">
  386.       <columns>
  387.         <column/>
  388.         <column flex="1"/>
  389.       </columns>
  390.       <rows>
  391.         <row align="center">
  392.           <label value="&mimetype.label;" accesskey="&mimetype.accesskey;" control="mimeType"/>
  393.           <textbox id="mimeType"/>
  394.         </row>
  395.         <row align="center">
  396.           <label value="&description.label;" accesskey="&description.accesskey;" control="description"/>
  397.           <textbox id="description" crop="right" flex="1"/>
  398.         </row>
  399.         <row align="center">
  400.           <label value="&extension.label;" accesskey="&extension.accesskey;" control="extension"/>
  401.           <textbox id="extension"/>
  402.         </row>
  403.       </rows>
  404.     </grid>
  405.   </hbox>
  406.   
  407.   <separator class="thin"/>
  408.  
  409.   <groupbox>
  410.     <caption label="&handling.label;"/>
  411.     <radiogroup id="handler">
  412.       <radio id="useSystemDefault" label="&useDefault.label;" accesskey="&useDefault.accesskey;" oncommand="doEnabling();"/>
  413.       <hbox align="center">
  414.         <radio id="useHelperApp" label="&application.label;" accesskey="&application.accesskey;" oncommand="doEnabling();"/>
  415.         <textbox id="appPath" flex="1" onchange="selectAppRadio();"/>
  416.         <button label="&browse.label;" accesskey="&browse.accesskey;"
  417.                 oncommand="chooseApp();"/>
  418.       </hbox>
  419.       <radio id="saveToDisk" label="&saveToDisk.label;" accesskey="&saveToDisk.accesskey;" oncommand="doEnabling();"/>
  420.     </radiogroup>
  421.     
  422.   </groupbox>              
  423.  
  424.   <separator class="thin"/>
  425.  
  426.   <hbox align="center">
  427.     <checkbox id="askBeforeOpen" label="&askBeforeOpen.label;" accesskey="&askBeforeOpen.accesskey;"/>         
  428.   </hbox>  
  429.   </vbox>
  430.  
  431.   <separator class="thin"/>
  432. </dialog>
  433.         
  434.