/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Mozilla Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/MPL/
 * 
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 * 
 * The Original Code is the Mozilla browser.
 * 
 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation. Portions created by Netscape are
 * Copyright (C) 1999 Netscape Communications Corporation. All
 * Rights Reserved.
 * 
 * Original Author: David W. Hyatt (hyatt@netscape.com)
 * 
 * Contributor(s): pav
 */

#include "nsISupports.idl"
#include "nsIURL.idl"
#include "nsIEnumerator.idl"
#include "nsISupportsArray.idl"
interface nsIDocShell;

[scriptable, uuid(D8C7D8A1-E84C-11d2-BF87-00105A1B0627)]
interface nsIChromeRegistry : nsISupports
{
  /**
   * Convert a chrome URL into a canonical representation; specifically,
   *
   *   chrome://package/provider/file
   *
   * Chrome URLs are allowed to be specified in "shorthand", leaving the
   * "file" portion off. In that case, the URL is expanded to:
   *
   *   chrome://package/provider/package.ext
   *
   * where "ext" is:
   *
   *   "xul" for a "content" package,
   *   "css" for a "skin" package, and
   *   "dtd" for a "locale" package.
   *
   * @param aChromeURL the URL that is to be canonified.
   */
  void canonify(in nsIURI aChromeURL);

  /**
   * Convert a chrome URL to a "real" using the information in the registry.
   *
   * @param aChromeURL the URL that is to be converted.
   */
  string convertChromeURL(in nsIURI aChromeURL);

  nsISimpleEnumerator getOverlays(in nsIURI aChromeURL);
  nsISupportsArray getStyleSheets(in nsIURI aChromeURL);

  /* Should be called when locales change to reload all chrome (including XUL). */
	void reloadChrome();

  /* Should be called when skins change. Reloads only stylesheets. */
	void refreshSkins();
	
  /* Applies a skin or locale to all possible packages */
  void selectSkin(in wstring skinName, in boolean useProfile);
  void selectLocale(in wstring localeName, in boolean useProfile);
	void deselectSkin(in wstring skinName, in boolean useProfile);
  void deselectLocale(in wstring localeName, in boolean useProfile);
  boolean isSkinSelected(in wstring skinName, in boolean useProfile);
	boolean isLocaleSelected(in wstring localeName, in boolean useProfile);
 
  /* Apply skin/locale to a specific package */
	void selectSkinForPackage(in wstring skinName, in wstring packageName, in boolean useProfile);
	void selectLocaleForPackage(in wstring localeName, in wstring packageName, in boolean useProfile); 
  void deselectSkinForPackage(in wstring skinName, in wstring packageName, in boolean useProfile);
	void deselectLocaleForPackage(in wstring localeName, in wstring packageName, in boolean useProfile); 
  boolean isSkinSelectedForPackage(in wstring skinName, in wstring packageName, in boolean useProfile);
  boolean isLocaleSelectedForPackage(in wstring localeName, in wstring packageName, in boolean useProfile);

 // Special additional APIs for locales only.
  void selectLocaleForProfile(in wstring localeName, in wstring profilePath);
  wstring getSelectedLocale(in wstring packageName);

  /* Installation APIs */
  void installSkin(in string baseURL, in boolean useProfile, in boolean allowScripts);
  void uninstallSkin(in wstring skinName, in boolean useProfile);

  void installLocale(in string baseURL, in boolean useProfile);
  void uninstallLocale(in wstring localeName, in boolean useProfile);

  void installPackage(in string baseURL, in boolean useProfile);
  void uninstallPackage(in wstring packageName, in boolean useProfile);

  void getBackstopSheets(in nsIDocShell docShell, out nsISupportsArray styleSheets);
  void getUserSheets(in boolean useChromeSheets, out nsISupportsArray styleSheets);

  boolean allowScriptsForSkin(in nsIURI url);

  void checkForNewChrome();

  boolean checkThemeVersion(in wstring skinName);

  boolean checkLocaleVersion(in wstring localeName);

};


%{ C++

// for component registration
// {D8C7D8A2-E84C-11d2-BF87-00105A1B0627}
#define NS_CHROMEREGISTRY_CID \
{ 0xd8c7d8a2, 0xe84c, 0x11d2, { 0xbf, 0x87, 0x0, 0x10, 0x5a, 0x1b, 0x6, 0x27 } }

%}
