/**************************************************************
 * 
 * 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_XFormulaOpCodeMapper_idl__
#define __com_sun_star_sheet_XFormulaOpCodeMapper_idl__

#ifndef __com_sun_star_sheet_FormulaOpCodeMapEntry_idl__
#include <com/sun/star/sheet/FormulaOpCodeMapEntry.idl>
#endif

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

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

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

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

/** gives access to spreadsheet compiler token interns.
 */
published interface XFormulaOpCodeMapper
{
    //-------------------------------------------------------------------------

    /** OpCode value used for external Add-In functions.

        <p>Needed to be able to identify which of the function names map to an
        Add-In implementation where this OpCode is used in the returned
        mapping and the programmatical name is available as additional
        information.</p>
     */
    [attribute, readonly] long OpCodeExternal;

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

    /** OpCode value used for unknown functions.

        <p>Used to identify which of the function names queried with
        <member>getMappings</member> are unknown to the implementation.</p>
     */
    [attribute, readonly] long OpCodeUnknown;

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

    /** returns a sequence of tokens matching the input sequence of
        strings in order.

        @param Names
            Sequence of names to be mapped. These can be function names,
            operators, separators and other symbols the formula compiler
            knows.

        @param Language
            Formula language to be used, one of <type>FormulaLanguage</type>
            constants. If a constant unknown to the implementation is passed,
            <type scope="com::sun::star::lang">IllegalArgumentException</type>
            is thrown.

        @returns
            a sequence of <type>FormulaToken</type> matching the input
            sequence in order.

            <p>Each string element in parameter Names according to the formula
            language in parameter Language is mapped to a <type>FormulaToken
            </type> containing the internal OpCode used by the spreadsheet
            application in <member>FormulaToken::OpCode</member> and by
            contract maybe additional information in <member>
            FormulaToken::Data</member>.</p>

            <p>The order of the FormulaToken sequence returned matches the
            input order of the string sequence.</p>

            <p>An unknown Name string gets the OpCode value of <member>
            OpCodeUnknown</member> assigned.</p>

            <p>Additional information in <member>FormulaToken::Data</member>
            is returned for:
            <ul>
            <li>Add-in names: the programmatical name. The OpCode value used
            for add-ins can be queried with the <member>OpCodeExternal</member>
            getter method.</li>
            </ul></p>
     */
    sequence< FormulaToken > getMappings(
            [in] sequence< string > Names,
            [in] long Language )
        raises( com::sun::star::lang::IllegalArgumentException );

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

    /** returns a sequence of map entries for all available elements of
        a given formula language.

        @param Language
            Formula language to be used, one of <type>FormulaLanguage</type>
            constants. If a constant unknown to the implementation is passed,
            <type scope="com::sun::star::lang">IllegalArgumentException</type>
            is thrown.

        @param Groups
            Group of mappings to be returned, a bit mask of <type>
            FormulaMapGroup</type> constants.

        @returns
            Sequence of <type>FormulaOpCodeMapEntry</type>.

            <p>Each element of the formula language in parameter Language is
            mapped to a <type>FormulaToken</type> containing the internal
            OpCode used by the spreadsheet application in <member>
            FormulaToken::OpCode</member> and by contract maybe additional
            information in <member>FormulaToken::Data</member>. See <member>
            getMappings</member> for more details.</p>
     */
    sequence< FormulaOpCodeMapEntry > getAvailableMappings(
            [in] long Language, [in] long Groups )
        raises( com::sun::star::lang::IllegalArgumentException );

};

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

service FormulaOpCodeMapper : XFormulaOpCodeMapper;

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

}; }; }; };

#endif

