root/headers/os/locale/FormattingConventions.h
/*
 * Copyright 2003-2011, Haiku, Inc.
 * Distributed under the terms of the MIT Licence.
 */
#ifndef _FORMATTING_CONVENTIONS_H_
#define _FORMATTING_CONVENTIONS_H_


#include <Archivable.h>
#include <List.h>
#include <LocaleStrings.h>
#include <String.h>
#include <SupportDefs.h>


class BBitmap;
class BLanguage;
class BMessage;

#ifndef U_ICU_NAMESPACE
  #define U_ICU_NAMESPACE icu
#endif
namespace U_ICU_NAMESPACE {
        class DateFormat;
        class Locale;
}


enum BMeasurementKind {
        B_METRIC = 0,
        B_US
};


enum BDateFormatStyle {
        B_FULL_DATE_FORMAT = 0,
        B_LONG_DATE_FORMAT,
        B_MEDIUM_DATE_FORMAT,
        B_SHORT_DATE_FORMAT,

        B_DATE_FORMAT_STYLE_COUNT
};


enum BTimeFormatStyle {
        B_FULL_TIME_FORMAT = 0,
        B_LONG_TIME_FORMAT,
        B_MEDIUM_TIME_FORMAT,
        B_SHORT_TIME_FORMAT,

        B_TIME_FORMAT_STYLE_COUNT
};


class BFormattingConventions : public BArchivable {
public:
                                                                BFormattingConventions(const char* id = NULL);
                                                                BFormattingConventions(
                                                                        const BFormattingConventions& other);
                                                                BFormattingConventions(const BMessage* archive);

                                                                BFormattingConventions& operator=(
                                                                        const BFormattingConventions& other);

                                                                ~BFormattingConventions();

                                                                bool operator==(
                                                                        const BFormattingConventions& other) const;
                                                                bool operator!=(
                                                                        const BFormattingConventions& other) const;

                        const char*                     ID() const;
                        const char*                     LanguageCode() const;
                        const char*                     CountryCode() const;

                        bool                            AreCountrySpecific() const;

                        status_t                        GetNativeName(BString& name) const;
                        status_t                        GetName(BString& name,
                                                                        const BLanguage* displayLanguage = NULL
                                                                        ) const;

                        const char*                     GetString(uint32 id) const;

                        status_t                        GetDateFormat(BDateFormatStyle style,
                                                                        BString& outFormat) const;
                        status_t                        GetTimeFormat(BTimeFormatStyle style,
                                                                        BString& outFormat) const;
                        status_t                        GetDateTimeFormat(BDateFormatStyle dateStyle,
                                                                        BTimeFormatStyle timeStyle,
                                                                        BString& outFormat) const;
                        status_t                        GetNumericFormat(BString& outFormat) const;
                        status_t                        GetMonetaryFormat(BString& outFormat) const;

                        void                            SetExplicitDateFormat(BDateFormatStyle style,
                                                                        const BString& format);
                        void                            SetExplicitTimeFormat(BTimeFormatStyle style,
                                                                        const BString& format);
                        void                            SetExplicitDateTimeFormat(
                                                                        BDateFormatStyle dateStyle,
                                                                        BTimeFormatStyle timeStyle,
                                                                        const BString& format);
                        void                            SetExplicitNumericFormat(const BString& format);
                        void                            SetExplicitMonetaryFormat(
                                                                        const BString& format);

                        BMeasurementKind        MeasurementKind() const;

                        bool                            UseStringsFromPreferredLanguage() const;
                        void                            SetUseStringsFromPreferredLanguage(bool value);

                        bool                            Use24HourClock() const;
                        void                            SetExplicitUse24HourClock(bool value);
                        void                            UnsetExplicitUse24HourClock();

        virtual status_t                        Archive(BMessage* archive,
                                                                        bool deep = true) const;

                        class Private;
private:
        friend  class Private;

        mutable BString                         fCachedDateFormats[B_DATE_FORMAT_STYLE_COUNT];
        mutable BString                         fCachedTimeFormats[B_TIME_FORMAT_STYLE_COUNT];
        mutable BString                         fCachedDateTimeFormats
                                                                        [B_DATE_FORMAT_STYLE_COUNT]
                                                                        [B_TIME_FORMAT_STYLE_COUNT];
        mutable BString                         fCachedNumericFormat;
        mutable BString                         fCachedMonetaryFormat;
        mutable int8                            fCachedUse24HourClock;

                        BString                         fExplicitDateFormats[B_DATE_FORMAT_STYLE_COUNT];
                        BString                         fExplicitTimeFormats[B_TIME_FORMAT_STYLE_COUNT];
                        BString                         fExplicitDateTimeFormats
                                                                        [B_DATE_FORMAT_STYLE_COUNT]
                                                                        [B_TIME_FORMAT_STYLE_COUNT];
                        BString                         fExplicitNumericFormat;
                        BString                         fExplicitMonetaryFormat;
                        int8                            fExplicitUse24HourClock;

                        bool                            fUseStringsFromPreferredLanguage;

                        U_ICU_NAMESPACE::Locale*                fICULocale;
                        void                            CoerceFormatForClock(BString& outFormat) const;
};


#endif  /* _FORMATTING_CONVENTIONS_H_ */