/**************************************************************
 * 
 * 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_i18n_XExtendedCalendar_idl__
#define __com_sun_star_i18n_XExtendedCalendar_idl__

#include <com/sun/star/i18n/XCalendar.idl>

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

module com { module sun { module star { module i18n {

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


/**
    This interface provides access to locale specific calendar
    systems.

    <p> It is derived from
    <type scope="::com::sun::star::i18n">XCalendar</type> and provides
    additional functionality to display parts of the date currently
    set at the calendar. </p>

	 @since OOo 1.1.2
 */
published interface XExtendedCalendar : ::com::sun::star::i18n::XCalendar
{
    //-------------------------------------------------------------------------
    /**
        Returns a string (number or name to display) matching the
        given code constant.

        <p> Note that the string returned depends completely on the
        locale's calendar. It is not predictable if the string will be
        numeric or a name, or if in case it retuns a numeric string
        how many digits that will have. For example, a short year
        display string will normally be two digits with a Gregorian
        calendar, but with a Jewish calendar it will have three
        digits. <p/>

        @param nCalendarDisplayCode
            One of <type>CalendarDisplayCode</type>

        @param nNativeNumberMode
            One of <type>NativeNumberMode</type>. <br/>
            This argument designates the basic transliteration mode as
            if specified for the year representation. However, depending
            on the locale, different conversions for year and month, for
            example, may be chosen internally. This is beyond the user's
            control and depends on locale specific conventions of how a
            date is assembled.
     */
    string  getDisplayString( [in] long nCalendarDisplayCode, [in] short nNativeNumberMode );

};

//=============================================================================
}; }; }; };

#endif
