/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * The contents of this file are subject to the Netscape 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/NPL/
 *
 * 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 mozilla.org code.
 *
 * 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.
 *
 * Contributor(s): 
 */
 
#include "nsISupports.idl"
#include "nsIEnumerator.idl"
#include "nsIRDFDataSource.idl"
#include "domstubs.idl"

%{C++
#define NS_WINDOWMEDIATOR_CID \
{ 0x0659cb83, 0xfaad, 0x11d2, { 0x8e, 0x19, 0xb2, 0x06, 0x62, 0x0a, 0x65, 0x7c } }
%}

interface nsIXULWindow;
interface nsIWidget;


[scriptable, uuid(0659cb81-faad-11d2-8e19-b206620a657c)]
interface nsIWindowMediator: nsIRDFDataSource
{

	/*
		iterates over the windows of type inType in the order that they were created. if inType  is null
		iterates over all windows.  This enumerator returns domWindows.
	*/
	
	nsISimpleEnumerator getEnumerator( in wstring inType );

	/*
		iterates over the XUL windows of type inType in the order that they were created.  If 
		inType is null iterates over all windows.  This enumerator returns xulWindows.
	*/

	nsISimpleEnumerator getXULWindowEnumerator( in wstring inType); 

	/*
		Returns the window of type inType ( if null return any window type ) which has the most recent
		time stamp
	*/
	nsIDOMWindow getMostRecentWindow( in wstring inType );
	
	/*
		Get window given an RDF resource.
	*/
	nsIDOMWindow getWindowForResource( in wstring inResource );
	
	/* */
	nsIDOMWindow convertISupportsToDOMWindow( in nsISupports inWindow );
	
	/* Add the webshellwindow to the list */
	[noscript] void registerWindow( in nsIXULWindow inWindow);
	
	/* remove the window from the list */
	[noscript] void unregisterWindow( in nsIXULWindow inWindow );
	
	/* Call when the window gains focus. Used to determine the most recent window */
	[noscript] void  updateWindowTimeStamp( in nsIXULWindow inWindow );
	
	/* */
	[noscript] void updateWindowTitle(in nsIXULWindow inWindow, in wstring inTitle );

        /* z-ordering: */

        const unsigned long zLevelTop    = 1;
        const unsigned long zLevelBottom = 2;
        const unsigned long zLevelBelow  = 3; // below some window

        /*   A window wants to be moved in z-order. calculate whether and how
           it should be constrained. Note this method is advisory only:
           it changes nothing either in WindowMediator's internal state
           or with the window.
             Note it compares the nsIXULWindow to nsIWidgets. A pure interface
           would use all nsIXULWindows. But we expect this to be called from
           callbacks originating in native window code. They are expected to
           hand us comparison values which are pulled from general storage
           in the native widget, and may not correspond to an nsIWidget at all.
           For that reason this interface requires only objects one step
           removed from the native window (nsIWidgets), and its implementation
           must be very understanding of what may be completely invalid
           pointers in those parameters.

           @param inWindow the window in question
           @param inPosition requested position
                  values: zLevelTop: topmost window. zLevelBottom: bottom.
                  zLevelBelow: below ioBelow.  (the value of ioBelow will be
                  ignored for zLevelTop and Bottom.)
           @param inBelow if inPosition==zLevelBelow, the window
                  below which inWindow wants to be placed. Otherwise this
                  variable is ignored.
           @param outPosition constrained position. values like inPosition.
           @param outBelow if outPosition==zLevelBelow, the window
                  below which inWindow should be placed. Otherwise this
                  this value will be null.
           @return PR_TRUE if the position returned is different from
                   the position given.
        */

        [noscript] PRBool calculateZPosition(in nsIXULWindow inWindow,
                            in unsigned long  inPosition,
                            in nsIWidget      inBelow,
                            out unsigned long outPosition,
                            out nsIWidget     outBelow);

	/* a window has been positioned behind another. Inform WindowMediator

	   @param inWindow the window in question
           @param inPosition new position
                  values: zLevelTop: topmost window. zLevelBottom: bottom.
                  zLevelBelow: below inBelow. (inBelow is ignored for
                  other values of inPosition.)
	   @param inBelow the window inWindow is behind, if zLevelBelow
	*/
	[noscript] void setZPosition(in nsIXULWindow inWindow,
                          in unsigned long inPosition,
                          in nsIXULWindow inBelow);
};

%{C++
extern nsresult NS_NewWindowMediatorFactory(nsIFactory** aResult);
%}
