/**************************************************************
 * 
 * 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_CalendarDisplayCode_idl__
#define __com_sun_star_i18n_CalendarDisplayCode_idl__

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

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

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


/**
    Constants to use with <member>XExtendedCalendar::getDisplayString()</member>.

    <p> The examples given are for an English Gregorian calendar, note
    that other calendars or locales may return completely different
    strings, for example not a four digit year but a CJK name instead.
    <p/>

	 @since OOo 1.1.2
 */
published constants CalendarDisplayCode
{
    /// Day of month, one or two digits, no leading zero.
    const long SHORT_DAY            = 1;
    /// Day of month, two digits, with leading zero.
    const long LONG_DAY             = 2;
    /// Day of week, abbreviated name.
    const long SHORT_DAY_NAME       = 3;
    /// Day of week, full name.
    const long LONG_DAY_NAME        = 4;

    /// Month of year, one or two digits, no leading zero.
    const long SHORT_MONTH          = 5;
    /// Month of year, with leading zero.
    const long LONG_MONTH           = 6;
    /// Full month name.
    const long SHORT_MONTH_NAME     = 7;
    /// Abbreviated month name.
    const long LONG_MONTH_NAME      = 8;

    /// Year, two digits.
    const long SHORT_YEAR           = 9;
    /// Year, four digits.
    const long LONG_YEAR            = 10;
    /// Full era name, for example, "Before Christ" or "Anno Dominus".
    const long SHORT_ERA            = 11;
    /// Abbreviated era name, for example, BC or AD.
    const long LONG_ERA             = 12;
    /// Combined short year and era, order depends on locale/calendar.
    const long SHORT_YEAR_AND_ERA   = 13;
    /// Combined full year and era, order depends on locale/calendar.
    const long LONG_YEAR_AND_ERA    = 14;

    /// Short quarter, for example, "Q1"
    const long SHORT_QUARTER        = 15;
    /// Long quarter, for example, "1st quarter"
    const long LONG_QUARTER         = 16;
};

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

#endif
