/**************************************************************
 * 
 * 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_sheet_Spreadsheet_idl__
#define __com_sun_star_sheet_Spreadsheet_idl__

#ifndef __com_sun_star_sheet_SheetCellRange_idl__
#include <com/sun/star/sheet/SheetCellRange.idl>
#endif

#ifndef __com_sun_star_sheet_XSpreadsheet_idl__
#include <com/sun/star/sheet/XSpreadsheet.idl>
#endif

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

#ifndef __com_sun_star_util_XProtectable_idl__
#include <com/sun/star/util/XProtectable.idl>
#endif

#ifndef __com_sun_star_sheet_XDataPilotTablesSupplier_idl__
#include <com/sun/star/sheet/XDataPilotTablesSupplier.idl>
#endif

#ifndef __com_sun_star_sheet_XScenariosSupplier_idl__
#include <com/sun/star/sheet/XScenariosSupplier.idl>
#endif

#ifndef __com_sun_star_sheet_XSheetAnnotationsSupplier_idl__
#include <com/sun/star/sheet/XSheetAnnotationsSupplier.idl>
#endif

#ifndef __com_sun_star_drawing_XDrawPageSupplier_idl__
#include <com/sun/star/drawing/XDrawPageSupplier.idl>
#endif

#ifndef __com_sun_star_table_XTableChartsSupplier_idl__
#include <com/sun/star/table/XTableChartsSupplier.idl>
#endif

#ifndef __com_sun_star_sheet_XCellRangeMovement_idl__
#include <com/sun/star/sheet/XCellRangeMovement.idl>
#endif

#ifndef __com_sun_star_sheet_XPrintAreas_idl__
#include <com/sun/star/sheet/XPrintAreas.idl>
#endif

#ifndef __com_sun_star_sheet_XSheetPageBreak_idl__
#include <com/sun/star/sheet/XSheetPageBreak.idl>
#endif

#ifndef __com_sun_star_sheet_XSheetOutline_idl__
#include <com/sun/star/sheet/XSheetOutline.idl>
#endif

#ifndef __com_sun_star_sheet_XSheetAuditing_idl__
#include <com/sun/star/sheet/XSheetAuditing.idl>
#endif

#ifndef __com_sun_star_sheet_XSheetLinkable_idl__
#include <com/sun/star/sheet/XSheetLinkable.idl>
#endif

#ifndef __com_sun_star_sheet_Scenario_idl__
#include <com/sun/star/sheet/Scenario.idl>
#endif

#ifndef __com_sun_star_sheet_XExternalSheetName_idl__
#include <com/sun/star/sheet/XExternalSheetName.idl>
#endif

#include <com/sun/star/util/Color.idl>

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

module com {  module sun {  module star {  module sheet {

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

/** represents a complete spreadsheet in a spreadsheet document.

	<p>This service extents the service SheetCellRange. A spreadsheet is
	nothing else than a cell range with extended functionality.</p>

	@see com::sun::star::sheet::SpreadsheetDocument
 */
service Spreadsheet
{
	//-------------------------------------------------------------------------

	/** provides functionality for cell range handling.
	 */
	service com::sun::star::sheet::SheetCellRange;

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

    service com::sun::star::sheet::Scenario;

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

	/** provides methods to create a cell cursor.
	 */
	interface com::sun::star::sheet::XSpreadsheet;

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

	/** provides accessing the spreadsheet name.
	 */
	interface com::sun::star::container::XNamed;

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

	/** provides methods to protect and unprotect the sheet contents.
	 */
	interface com::sun::star::util::XProtectable;

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

	/** provides access to the collection of DataPilot tables.
	 */
	interface com::sun::star::sheet::XDataPilotTablesSupplier;

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

	/** provides access to the collection of scenarios.
	 */
	interface com::sun::star::sheet::XScenariosSupplier;

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

	/** provides access to the collection of annotations.
	 */
	interface com::sun::star::sheet::XSheetAnnotationsSupplier;

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

	/** provides access to the draw page of this spreadsheet.
	 */
	interface com::sun::star::drawing::XDrawPageSupplier;

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

	/** provides access to the collection of chart objects.
	 */
	interface com::sun::star::table::XTableChartsSupplier;

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

	/** provides methods to move cell ranges inside the spreadsheet or to
		other spreadsheets in this document.
	 */
	interface com::sun::star::sheet::XCellRangeMovement;

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

	/** provides access to the print area settings of this sheet.
	 */
	interface com::sun::star::sheet::XPrintAreas;

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

	/** provides access to the page breaks of this sheet.
	 */
	interface com::sun::star::sheet::XSheetPageBreak;

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

	/** provides access to row and column outline settings.
	 */
	interface com::sun::star::sheet::XSheetOutline;

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

	/** provides access to the auditing (detective) functionality.
	 */
	interface com::sun::star::sheet::XSheetAuditing;

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

	/** provides methods for a linked sheet.
	 */
	interface com::sun::star::sheet::XSheetLinkable;

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

    /** provides a method to set an external name at the sheet.

        @since OOo 3.0
     */
    [optional] interface com::sun::star::sheet::XExternalSheetName;

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

	/** specifies if the sheet is visible.
	 */
	[property] boolean IsVisible;

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

	/** specifies the page style of the sheet.
	 */
	[property] string PageStyle;

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

	/** specifies the direction of the columns in the spreadsheet.

	    <p>Possible values are com::sun::star::text::WritingMode2::LR_TB to
	    order the columns from left to right, and
            com::sun::star::text::WritingMode2::RL_TB to order the columns from
	    right to left.</p>

	    @see com::sun::star::text::WritingMode2
	 */
	[optional, property] short TableLayout;

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

	/** specifies whether the sheet has an automatic print area.

    <p> The automatic print area is used to print a sheet without
        explicit print areas, also if other sheets have print areas.</p>

    <p> If the property is true, and there are print areas on other sheets,
        the used area of this sheet is also printed.</p>

    <p> If the property is false, and there are print areas on other sheets,
        only these specified print areas are printed.</p>

    <p> If there are no print areas on the other sheets it does not matter
        whether property is true or false.</p>

	<p> This property can only be true, if there are no print areas given
        on this sheet. If the property is set to true the print areas of
        this sheet will be removed.</p>

        @see XPrintAreas

	 */
	[optional, property] boolean AutomaticPrintArea;

    /** specifies the color of the sheet tab, if any.
     */
    [optional, property] com::sun::star::util::Color TabColor;
};

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

}; }; }; };

#endif

