/**************************************************************
 * 
 * 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_awt_tab_XTabPageContainer_idl__
#define __com_sun_star_awt_tab_XTabPageContainer_idl__

#include <com/sun/star/awt/tab/XTabPageContainerListener.idl>
#include <com/sun/star/awt/tab/XTabPage.idl>
//=============================================================================

module com {  module sun {  module star {  module awt { module tab {

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

/** An interface to a control that displays tab pages.

	@see UnoControlTabPageContainer
 
	@since OOo 3.4
 */ 
published interface XTabPageContainer
{ 
	/** Returns the number of tab pages.
		@returns
			the number of tab pages.
	*/
	short getTabPageCount();

    //-------------------------------------------------------------------------

    /** Checks whether a tab page is activated.
        @param
            the tab page to be checked.
        @returns
            <TRUE/> if tab page is activated, else <FALSE/>.
    */
    boolean isTabPageActive([in] short tabPageIndex);

    //-------------------------------------------------------------------------

    /** Returns tab page for the given index.
        @param
            tabPageIndex - index of the tab page in the IndexContainer.
        @returns
            tab page which has tabPageIndex.
    */
    XTabPage getTabPage([in] short tabPageIndex);

    //-------------------------------------------------------------------------

    /** Returns tab page for the given ID.
        @param
            tabPageID - ID of the tab page.
        @returns
            tab page which has tabPageID.
    */
    XTabPage getTabPageByID([in] short tabPageID);

    //-------------------------------------------------------------------------

    /** Adds a listener for the <type>TabPageActivedEvent</type> posted after
        the tab page was activated.
        @param listener
            the listener to add.
    */
    [oneway] void addTabPageContainerListener( [in] XTabPageContainerListener  listener);

    //-------------------------------------------------------------------------

    /** Removes a listener previously added with <method>addTabPageListener()</method>.
        @param listener
            the listener to remove.
    */
    [oneway] void removeTabPageContainerListener( [in] XTabPageContainerListener listener);

    //-------------------------------------------------------------------------
    /** Specifies the ID of the current active tab page.
    */
    [attribute] short ActiveTabPageID;
};

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

}; }; }; }; };

#endif
