/**************************************************************
 * 
 * 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_Currency_idl__
#define __com_sun_star_i18n_Currency_idl__

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

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

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

/** 
    Symbols, names, and attributes of a specific currency, returned in a
    sequence by <member>XLocaleData::getAllCurrencies()</member>.

    @see XLocaleData
        for links to DTD of XML locale data files.
 */

published struct Currency
{
    /** ISO 4217 currency code identifier, for example, <b>EUR</b> or
        <b>USD</b>. */
    string ID;

    /** Currency symbol, for example, <b>$</b>. */
    string Symbol;

    /** Currency abbreviation used by banks and in money exchange, for
        example, <b>EUR</b> or <b>USD</b>. This usually should be
        identical to the ISO 4217 currency code also used in the
        <member>ID</member>, but doesn't necessarily have to be. */
    string BankSymbol;

    /** Name of the currency, for example, <b>Euro</b> or <b>US
        Dollar</b>. Should be the localized name. */
    string Name;

    /** If this currency is the default currency for a given locale. */
    boolean Default;

    /** If this currency is the one used in compatible number format codes with
        <member>FormatElement::formatIndex</member> values in the range 12..17.
        Those format codes are used to generate some old style currency format
        codes for compatibility with StarOffice5 and StarOffice4.

        @see com::sun::star::i18n::NumberFormatIndex
     */
    boolean UsedInCompatibleFormatCodes;

    /** The number of decimal places, for example, <b>2</b> for US Dollar
        or <b>0</b> for Italian Lira.  */
    short DecimalPlaces;
};

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

#endif
