/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_frame_XFrame_idl__
#define __com_sun_star_frame_XFrame_idl__

#ifndef __com_sun_star_lang_XComponent_idl__
#include <com/sun/star/lang/XComponent.idl>
#endif

#ifndef __com_sun_star_awt_XWindow_idl__
#include <com/sun/star/awt/XWindow.idl>
#endif

//=============================================================================

 module com {  module sun {  module star {  module frame {

 published interface XFrameActionListener;
 published interface XController;
 published interface XFramesSupplier;

//=============================================================================
/** a frame object can be considered to be an "anchor" object where a component
    can be attached to.

    <p>
    A frame can be (it's not a must!) a part of a frame tree. If not this frame willn't be
    accessible by using the api. This mode make sense for previews.
    The root node of the tree can be a <type>Desktop</type> implementation.
    </p>

    @see Desktop
 */
published interface XFrame: com::sun::star::lang::XComponent
{
	//-------------------------------------------------------------------------
    /** is called to initialize the frame within a window - the container window.

        <p>
        This window will be used as parent for the component window and to support
        some UI relevant features of the frame service.
        Note: Re-parenting mustn't supported by a real frame implementation!
        It's designed for initializing - not for setting.
        </p>

		<p>This frame will take over ownership of the window refered from
		<var>xWindow</var>.  Thus, the previous owner is not allowed to 
		dispose this window anymore. </p>

        @param xWindow
            the new container window

        @see XFrame::getContainerWindow()
	 */
    void initialize( [in] com::sun::star::awt::XWindow xWindow );

	//-------------------------------------------------------------------------
    /** provides access to the container window of the frame.

        <p>
        Normally this is used as the parent window of the
        component window.
        </p>

        @return
            the container window of this frame

        @see XFrame::initialize()
	 */
	com::sun::star::awt::XWindow getContainerWindow();

	//-------------------------------------------------------------------------
	/** sets the frame container that created this frame.

        <p>
        Only the creator is allowed to call this method.
        But creator doesn't mean the implementation which creates this instance ...
        it means the parent frame of the frame hierarchy.
        Because; normaly a frame should be created by using the api
        and is neccessary for searches inside the tree (e.g. <member>XFrame::findFrame()</member>)
        </p>

        @param Creator
            the creator (parent) of this frame

        @see XFrame::getCreator()
	 */
    [oneway] void setCreator( [in] XFramesSupplier Creator );

	//-------------------------------------------------------------------------
    /** provides access to the creator (parent) of this frame

        @returns
            the frame container that created and contains this frame.

        @see XFrame::setCreator()
	 */
	XFramesSupplier getCreator();

	//-------------------------------------------------------------------------
    /** access to the name property of this frame

        @returns
            the programmatic name of this frame.

        @see XFrame::setName()
	 */
	string getName();

	//-------------------------------------------------------------------------
	/** sets the name of the frame.

        <p>
        Normally the name of the frame is set initially (e.g. by the creator).
        The name of a frame will be used for identifying it if a frame search was started.
        These searches can be forced by:
        <ul>
            <li><member>XFrame::findFrame()</member>
            <li><member>XDispatchProvider::queryDispatch()</member>
            <li><member>XComponentLoader::loadComponentFromURL()</member>
        </ul>
        Note: Special targets like "_blank", "_self" etc. are not allowed.
        That's why frame names shouldn't start with a sign "_".
        </p>

        @param aName
            the new programmatic name of this frame

        @see XFrame::findFrame()
        @see XFrame::getName()
        @see XDispatchProvider
        @see XComponentLoader
     */
    [oneway] void setName( [in] string aName );

	//-------------------------------------------------------------------------
	/** searches for a frame with the specified name.

        <p>
        Frames may contain other frames (e.g., a frameset) and may
		be contained in other frames. This hierarchy is searched with
        this method.
        First some special names are taken into account, i.e. "",
        "_self", "_top", "_blank" etc. <var>SearchFlags</var> is ignored when
        comparing these names with <var>TargetFrameName</var>; further steps are
        controlled by <var>SearchFlags</var>. If allowed, the name of the frame
		itself is compared with the desired one, and then ( again if allowed )
        the method is called for all children of the frame. Finally may be called
        for the siblings and then for parent frame (if allowed).
        </p>

        <p>
        List of special target names:
        <table border=1>
        <tr><td>""/"_self"</td><td>address the starting frame itself</td></tr>
        <tr><td>"_parent"</td><td>address the direct parent frame only</td></tr>
        <tr><td>"_top"</td><td>address the top frame of this subtree of the frametree</td></tr>
        <tr><td>"_blank"</td><td>creates a new top frame</td></tr>
        </table>
        </p>

        <p>
        If no frame with the given name is found, a new top frame is
        created; if this is allowed by a special flag <const>FrameSearchFlag::CREATE</const>.
        The new frame also gets the desired name.
        </p>

        @param aTargetFrameName
            identify
            <ul><li>(a) a special target ("_blank","_self" ...) or</li>
                <li>(b) any well known frame</li><ul>
            to search it inside the current hierarchy

        @param nSearchFlags
            optional parameter to regulate search if no special target was used for <var>TargetFrameName</var>

         @see FrameSearchFlag
         */
    XFrame findFrame(
        [in] string aTargetFrameName,
        [in] long nSearchFlags);

	//-------------------------------------------------------------------------
	/** determines if the frame is a top frame.

        <p>
        In general a top frame is the frame which is a direct child of
        a task frame or which does not have a parent. Possible frame searches must
        stop the search at such a frame unless the flag <const>FrameSearchFlag::TASKS</const>
        is set.
        </p>

        @return
            <TRUE/> if frame supports top frame specification
            <br>
            <FALSE/> otherwise
	 */
	boolean isTop();

	//-------------------------------------------------------------------------
	/** activates this frame and thus the component within.

        <p>
        At first the frame sets itself as the active frame of its
        creator by calling <member>XFramesSupplier::setActiveFrame()</member>,
		then it broadcasts an <type>FrameActionEvent</type> with
		<const>FrameAction::FRAME_ACTIVATED</const>. The component within
		this frame may listen to this event to grab the focus on activation;
		for simple components this can be done by the <type>FrameLoader</type>.
        </p>

        <p>
        Finally, most frames may grab the focus to one of its windows
		or forward the activation to a sub-frame.
        </p>

        @see XFrame::deactivate()
        @see XFrame::isActive()
    */
	[oneway] void activate();

	//-------------------------------------------------------------------------
	/** is called by the creator frame when another sub-frame gets activated.

        <p>
        At first the frame deactivates its active sub-frame, if any.
		Then broadcasts a <type>FrameActionEvent</type> with
        <const>FrameAction::FRAME_DEACTIVATING</const>.
        </p>

        @see XFrame::activate()
        @see XFrame::isActive()
	 */
	[oneway] void deactivate();

	//-------------------------------------------------------------------------
	/** determines if the frame is active.

        @return
            <TRUE/> for active or UI active frames
            <br>
            <FALSE/> otherwise

        @see XFrame::activate()
        @see XFrame::deactivate()
	 */
	boolean isActive();

	//-------------------------------------------------------------------------
    /** sets a new component into the frame or release an existing one from a frame.

        @param xComponentWindow
            the window of the new component or <NULL/> for release

            <p>
            A valid component window should be a child of the frame container window.
            </p>

        @param xController
            the controller of the new component or <NULL/> for release

            <p>
            Simple components may implement a <type scope="com::sun::star::awt">XWindow</type> only.
            In this case no controller must be given here.
            </p>

        @return
            <TRUE/>if setting of new component or release of an existing one was successfully
            <br>
            <FALSE/> otherwise (especialy, if an existing controller disagree within his
            <member>XController::suspend()</member> call)

        @see XFrame::getComponentWindow()
        @see XFrame::getContainerWindow()
        @see XFrame::getController()
	 */
    boolean setComponent(
        [in] com::sun::star::awt::XWindow xComponentWindow,
        [in] XController xController);

	//-------------------------------------------------------------------------
    /** provides access to the component window

        <p>
        Note: Don't dispose this window - the frame is the owner of it.
        </p>

        @returns
            the current visible component in this frame
            <br>
            or <NULL/> if no one currently exist

        @see XFrame::setComponent()
	 */
	com::sun::star::awt::XWindow getComponentWindow();

	//-------------------------------------------------------------------------
    /** provides access to the controller

        <p>
        Note: Don't dispose it - the frame is the owner of it.
        Use <member>XController::getFrame()</member> to dispose
        the frame after you the controller agreed with a
        <member>XController::suspend()</member> call.
        </p>

        @returns
            the current controller within this frame
            <br>
            or <NULL/> if no one currently exist

        @see XFrame::setComponent()
	 */
	XController getController();

	//-------------------------------------------------------------------------
	/** notifies the frame that the context of the controller within this
		frame changed (i.e. the selection).

        <p>
        According to a call to this interface, the frame calls
        <method>XFrameEventListener::frameAction</method> with
		<const>FrameAction::CONTEXT_CHANGED</const> to all listeners which
        are registered using <member>XFrame::addFrameActionListener</member>.
		For external controllers this event can be used to requery dispatches.

        @see XFrameEventListener
        @see FrameAction
        @see XFrame::addFrameActionListener()
	*/
	void contextChanged();

	//-------------------------------------------------------------------------
	/** registers an event listener, which will be called when certain things
		happen to the components within this frame or within sub-frames of this frame.

        <p>
        E.g., it is possible to determine instantiation/destruction and
        activation/deactivation of components.
        </p>

        @param xListener
            specifies the listener which will be informed

        @see XFrame::removeFrameActionListener()
	 */
    [oneway] void addFrameActionListener( [in]XFrameActionListener xListener );

	//-------------------------------------------------------------------------
    /** unregisters an event listener

        @param xListener
            specifies the listener which willn't be informed any longer

        @see XFrame::addFrameActionListener()
	 */
    [oneway] void removeFrameActionListener( [in] XFrameActionListener xListener );
};

//=============================================================================

}; }; }; };

#endif