/**************************************************************
 *
 * 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_table_TableColumn_idl__
#define __com_sun_star_table_TableColumn_idl__

#ifndef __com_sun_star_table_XCellRange_idl__
#include <com/sun/star/table/XCellRange.idl>
#endif

#ifndef __com_sun_star_beans_XPropertySet_idl__
#include <com/sun/star/beans/XPropertySet.idl>
#endif

#ifndef __com_sun_star_container_XNamed_idl__
#include <com/sun/star/container/XNamed.idl>
#endif

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

module com {  module sun {  module star {  module table {

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

/** represents a special cell range containing all cells of a single
	specific column in a table or spreadsheet.
 */
published service TableColumn
{
	//-------------------------------------------------------------------------

	/** provides access to the cells of this column.

		@see com::sun::star::table::CellRange
	 */
	interface com::sun::star::table::XCellRange;

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

//!published service PropertySet
	/** provides access to the cell properties of all cells of this column.
	 */
	interface com::sun::star::beans::XPropertySet;

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

	/** provides methods to access the name of the column.

		<p>In spreadsheets, the name of a column cannot be changed.<p/>
	 */
	interface com::sun::star::container::XNamed;

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

	/** contains the width of the column (in 1/100th mm).

		<p>When hidden, it returns the width which the column would have,
		if it were visible. </p>
	 */
	[property] long Width;

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

	/** is <TRUE/>, if the column always keeps its optimal width.
	 */
	[property] boolean OptimalWidth;

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

	/** is <TRUE/>, if the column is visible.
	 */
	[property] boolean IsVisible;

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

	/** is <TRUE/>, if there is a manual horizontal page break attached
		to the column.
	 */
	[property] boolean IsStartOfNewPage;

};

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

}; }; }; };

#endif
