/**************************************************************
 * 
 * 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_grid_XGridColumnModel_idl__
#define __com_sun_star_awt_grid_XGridColumnModel_idl__

#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/lang/XComponent.idl>
#include <com/sun/star/util/XCloneable.idl>

#include <com/sun/star/awt/grid/XGridColumn.idl>
#include <com/sun/star/container/XContainer.idl>
#include <com/sun/star/lang/IndexOutOfBoundsException.idl>
#include <com/sun/star/lang/IllegalArgumentException.idl>

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

module com {  module sun {  module star {  module awt { module grid {

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

/** An instance of this interface is used by the <type>UnoControlGrid</type> to
    retrieve the column structure that is displayed in the actual control.

    If you do not need your own model implementation, you can also use the <type>DefaultGridColumnModel</type>.

    @since OOo 3.3
*/
published interface XGridColumnModel
{
    /** implements life time control for the component
    */
    interface ::com::sun::star::lang::XComponent;

    /** allows to register listeners to be notified when columns are inserted or removed
    */
    interface ::com::sun::star::container::XContainer;

    /** allows cloning the complete column model
    */
    interface ::com::sun::star::util::XCloneable;

    /** Returns the number of columns.

        @returns
                the number of columns.
    */
    long getColumnCount();

    /** creates a new column for use with the column model.

        <p>The newly created column is not yet inserted into the column container, you need to call <member>addColumn</member>
        after you initialized the column object.</p>
    */
    XGridColumn
        createColumn();

    /** Adds a column to the model.

        <p>You should use the <member>createColumn</member> member to create a new column. This gives
        implementations of the <code>XGridColumnModel</code> interface the possibility to provide own column
        implementations which extend the basic <type>GridColumn</type> type.</p>

        <p>As soon as the column has been inserted into the model, the model takes ownership of it. This means when the
        column is removed, or when the column model is disposed, the grid column is disposed as well.</p>

        @param column
            the column to add to the model.
        @returns
            the index of new created column.

        @throws ::com::sun::star::lang::IllegalArgumentException
            if the given column is not a valid element for the column container, or if it is <NULL/>.
    */
    long addColumn( [in] XGridColumn column )
        raises ( ::com::sun::star::lang::IllegalArgumentException );

    /** removes a column from the model

        <p>The column object will be disposed upon removal.</p>

        @param ColumnIndex
            denotes the index of the column to remove
        @throws ::com::sun::star::lang::IndexOutOfBoundsException
            if <code>ColumnIndex</code> does not denote a valid column index.
    */
    void removeColumn( [in] long ColumnIndex )
        raises ( ::com::sun::star::lang::IndexOutOfBoundsException );

    /** Returns all columns of the model.
        @returns
                 all columns associated with the model in a sequence of <type>XGridColumn</type>.
    */
    sequence<XGridColumn> getColumns();

    /** Returns a specific column.
        @param index
                the position of the requested column.
        @returns
                 the requested column.
    */
    XGridColumn getColumn( [in] long index)
        raises ( ::com::sun::star::lang::IndexOutOfBoundsException );

    /** Fills the model with the given number of default columns

        <p>Existing columns will be removed before adding new columns. Listeners at the column model will
        be notified one <member scope="com::sun::star::container">XContainerListener::elementRemoved</member> event
        for each removed column, and one <member scope="com::sun::star::container">XContainerListener::elementInserted</member>
        event for each insertion.</p>

        @param elements
            the number of default columns that should be set.
    */
    void setDefaultColumns([in] long elements);
};

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

}; }; }; }; };

#endif
