/**************************************************************
 * 
 * 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
