/**************************************************************
 * 
 * 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_NamedRange_idl__
#define __com_sun_star_sheet_NamedRange_idl__

#ifndef __com_sun_star_sheet_XNamedRange_idl__
#include <com/sun/star/sheet/XNamedRange.idl>
#endif

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

#ifndef __com_sun_star_sheet_XCellRangeReferrer_idl__
#include <com/sun/star/sheet/XCellRangeReferrer.idl>
#endif

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

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

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

/** represents a named range in a spreadsheet document.

	<p>In fact a named range is a named formula expression. A cell range
	address is one possible content of a named range.</p>

	@see com::sun::star::sheet::NamedRanges
 */
published service NamedRange
{
	//-------------------------------------------------------------------------

	/** provides access to the settings of the named range.
	 */
	interface com::sun::star::sheet::XNamedRange;

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

	/** provides access to the cell range object referred by this named range.

		<p>This works only, if the named range contains a single cell range
		address.</p>
	 */
	interface com::sun::star::sheet::XCellRangeReferrer;

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

    /** returns the index used to refer to this name in token arrays.

        <p>A token describing a defined name shall contain the op-code obtained
        from the <const>FormulaMapGroupSpecialOffset::NAME</const> offset and
        this index as data part.</p>

        @see com::sun::star::sheet::FormulaToken
        @see com::sun::star::sheet::FormulaMapGroupSpecialOffset::NAME

        @since OOo 3.0
     */
    [optional, readonly, property] long TokenIndex;

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

    /** Determines if this defined name represents a shared formula.

        <p>This special property shall not be used externally. It is used by
        import and export filters for compatibility with spreadsheet
        documents containing shared formulas. Shared formulas are shared
        by several cells to save memory and to decrease file size.</p>

        <p>A defined name with this property set will not appear in the user
        interface of Calc, and its name will not appear in cell formulas. A
        formula referring to this defined name will show the formula
        definition contained in the name instead.</p>

        @since OOo 3.0
     */
    [optional, property] boolean IsSharedFormula;
};

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

}; }; }; };

#endif

