BDateFormat: improve API

* Use a reference rather than a pointer for the output string, removing
the need for NULL checks (which were missing, anyway)
* Adjust callers to that change
* Add new Format variant taking a BDate argument
This commit is contained in:
Adrien Destugues
2014-09-30 09:47:02 +02:00
parent dd21b4666e
commit f188c1defa
7 changed files with 80 additions and 29 deletions
+12 -6
View File
@@ -6,6 +6,7 @@
#define _B_DATE_FORMAT_H_ #define _B_DATE_FORMAT_H_
#include <DateTime.h>
#include <DateTimeFormat.h> #include <DateTimeFormat.h>
#include <FormattingConventions.h> #include <FormattingConventions.h>
#include <Language.h> #include <Language.h>
@@ -38,14 +39,19 @@ public:
// formatting // formatting
ssize_t Format(char* string, size_t maxSize, ssize_t Format(char* string, const size_t maxSize,
time_t time, BDateFormatStyle style) const; const time_t time,
status_t Format(BString* string, time_t time, const BDateFormatStyle style) const;
BDateFormatStyle style, status_t Format(BString& string, const time_t time,
const BDateFormatStyle style,
const BTimeZone* timeZone = NULL) const; const BTimeZone* timeZone = NULL) const;
status_t Format(BString* string, status_t Format(BString& string, const BDate& time,
const BDateFormatStyle style,
const BTimeZone* timeZone = NULL) const;
status_t Format(BString& string,
int*& fieldPositions, int& fieldCount, int*& fieldPositions, int& fieldCount,
time_t time, BDateFormatStyle style) const; const time_t time,
const BDateFormatStyle style) const;
status_t GetFields(BDateElement*& fields, status_t GetFields(BDateElement*& fields,
int& fieldCount, BDateFormatStyle style int& fieldCount, BDateFormatStyle style
+61 -15
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010, Haiku, Inc. All Rights Reserved. * Copyright 2010-2014, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
@@ -24,7 +24,6 @@
#include <vector> #include <vector>
// default constructor
BDateFormat::BDateFormat(const BLanguage* const language, BDateFormat::BDateFormat(const BLanguage* const language,
const BFormattingConventions* const conventions) const BFormattingConventions* const conventions)
{ {
@@ -39,13 +38,14 @@ BDateFormat::BDateFormat(const BLanguage* const language,
BLocale::Default()->GetLanguage(&fLanguage); BLocale::Default()->GetLanguage(&fLanguage);
} }
// copy constructor
BDateFormat::BDateFormat(const BDateFormat &other) BDateFormat::BDateFormat(const BDateFormat &other)
: fConventions(other.fConventions), : fConventions(other.fConventions),
fLanguage(other.fLanguage) fLanguage(other.fLanguage)
{ {
} }
/*static*/ const BDateFormat* /*static*/ const BDateFormat*
BDateFormat::Default() BDateFormat::Default()
{ {
@@ -53,15 +53,14 @@ BDateFormat::Default()
} }
// destructor
BDateFormat::~BDateFormat() BDateFormat::~BDateFormat()
{ {
} }
// Format
ssize_t ssize_t
BDateFormat::Format(char* string, size_t maxSize, time_t time, BDateFormat::Format(char* string, const size_t maxSize, const time_t time,
BDateFormatStyle style) const const BDateFormatStyle style) const
{ {
BAutolock lock(fLock); BAutolock lock(fLock);
if (!lock.IsLocked()) if (!lock.IsLocked())
@@ -87,8 +86,8 @@ BDateFormat::Format(char* string, size_t maxSize, time_t time,
status_t status_t
BDateFormat::Format(BString *string, time_t time, BDateFormatStyle style, BDateFormat::Format(BString& string, const time_t time,
const BTimeZone* timeZone) const const BDateFormatStyle style, const BTimeZone* timeZone) const
{ {
BAutolock lock(fLock); BAutolock lock(fLock);
if (!lock.IsLocked()) if (!lock.IsLocked())
@@ -111,8 +110,8 @@ BDateFormat::Format(BString *string, time_t time, BDateFormatStyle style,
UnicodeString icuString; UnicodeString icuString;
dateFormatter->format((UDate)time * 1000, icuString); dateFormatter->format((UDate)time * 1000, icuString);
string->Truncate(0); string.Truncate(0);
BStringByteSink stringConverter(string); BStringByteSink stringConverter(&string);
icuString.toUTF8(stringConverter); icuString.toUTF8(stringConverter);
return B_OK; return B_OK;
@@ -120,8 +119,55 @@ BDateFormat::Format(BString *string, time_t time, BDateFormatStyle style,
status_t status_t
BDateFormat::Format(BString* string, int*& fieldPositions, int& fieldCount, BDateFormat::Format(BString& string, const BDate& time,
time_t time, BDateFormatStyle style) const const BDateFormatStyle style, const BTimeZone* timeZone) const
{
if (!time.IsValid())
return B_BAD_DATA;
BAutolock lock(fLock);
if (!lock.IsLocked())
return B_ERROR;
BString format;
fConventions.GetDateFormat(style, format);
ObjectDeleter<DateFormat> dateFormatter(_CreateDateFormatter(format));
if (dateFormatter.Get() == NULL)
return B_NO_MEMORY;
UErrorCode err = U_ZERO_ERROR;
ObjectDeleter<Calendar> calendar(Calendar::createInstance(err));
if (!U_SUCCESS(err))
return B_NO_MEMORY;
if (timeZone != NULL) {
ObjectDeleter<TimeZone> icuTimeZone(
TimeZone::createTimeZone(timeZone->ID().String()));
if (icuTimeZone.Get() == NULL)
return B_NO_MEMORY;
dateFormatter->setTimeZone(*icuTimeZone.Get());
calendar->setTimeZone(*icuTimeZone.Get());
}
// Note ICU calendar uses months in range 0..11, while we use the more
// natural 1..12 in BDate.
calendar->set(time.Year(), time.Month() - 1, time.Day());
UnicodeString icuString;
FieldPosition p;
dateFormatter->format(*calendar.Get(), icuString, p);
string.Truncate(0);
BStringByteSink stringConverter(&string);
icuString.toUTF8(stringConverter);
return B_OK;
}
status_t
BDateFormat::Format(BString& string, int*& fieldPositions, int& fieldCount,
const time_t time, const BDateFormatStyle style) const
{ {
BAutolock lock(fLock); BAutolock lock(fLock);
if (!lock.IsLocked()) if (!lock.IsLocked())
@@ -157,8 +203,8 @@ BDateFormat::Format(BString* string, int*& fieldPositions, int& fieldCount,
for (int i = 0 ; i < fieldCount ; i++ ) for (int i = 0 ; i < fieldCount ; i++ )
fieldPositions[i] = fieldPosStorage[i]; fieldPositions[i] = fieldPosStorage[i];
string->Truncate(0); string.Truncate(0);
BStringByteSink stringConverter(string); BStringByteSink stringConverter(&string);
icuString.toUTF8(stringConverter); icuString.toUTF8(stringConverter);
-1
View File
@@ -202,7 +202,6 @@ BTime::SetTime(int32 hour, int32 minute, int32 second, int32 microsecond)
} }
/*! /*!
Adds \c hours to the current time. If the passed value is negative it Adds \c hours to the current time. If the passed value is negative it
will become earlier. Note: The time will wrap if it passes midnight. will become earlier. Note: The time will wrap if it passes midnight.
+1 -1
View File
@@ -214,7 +214,7 @@ TruncTimeBase(BString* outString, int64 value, const View* view, float width)
} }
if (resultWidth > width if (resultWidth > width
&& BDateFormat::Default()->Format(&date, timeValue, && BDateFormat::Default()->Format(date, timeValue,
B_SHORT_DATE_FORMAT) == B_OK) { B_SHORT_DATE_FORMAT) == B_OK) {
resultWidth = view->StringWidth(date.String(), date.Length()); resultWidth = view->StringWidth(date.String(), date.Length());
} }
@@ -361,16 +361,16 @@ FormatSettingsView::_UpdateExamples()
time_t timeValue = (time_t)time(NULL); time_t timeValue = (time_t)time(NULL);
BString result; BString result;
BDateFormat::Default()->Format(&result, timeValue, B_FULL_DATE_FORMAT); BDateFormat::Default()->Format(result, timeValue, B_FULL_DATE_FORMAT);
fFullDateExampleView->SetText(result); fFullDateExampleView->SetText(result);
BDateFormat::Default()->Format(&result, timeValue, B_LONG_DATE_FORMAT); BDateFormat::Default()->Format(result, timeValue, B_LONG_DATE_FORMAT);
fLongDateExampleView->SetText(result); fLongDateExampleView->SetText(result);
BDateFormat::Default()->Format(&result, timeValue, B_MEDIUM_DATE_FORMAT); BDateFormat::Default()->Format(result, timeValue, B_MEDIUM_DATE_FORMAT);
fMediumDateExampleView->SetText(result); fMediumDateExampleView->SetText(result);
BDateFormat::Default()->Format(&result, timeValue, B_SHORT_DATE_FORMAT); BDateFormat::Default()->Format(result, timeValue, B_SHORT_DATE_FORMAT);
fShortDateExampleView->SetText(result); fShortDateExampleView->SetText(result);
BLocale::Default()->FormatTime(&result, timeValue, B_FULL_TIME_FORMAT); BLocale::Default()->FormatTime(&result, timeValue, B_FULL_TIME_FORMAT);
+1 -1
View File
@@ -623,7 +623,7 @@ TDateEdit::_UpdateFields()
free(fFieldPositions); free(fFieldPositions);
fFieldPositions = NULL; fFieldPositions = NULL;
} }
BDateFormat::Default()->Format(&fText, fFieldPositions, fFieldPosCount, BDateFormat::Default()->Format(fText, fFieldPositions, fFieldPosCount,
time, B_SHORT_DATE_FORMAT); time, B_SHORT_DATE_FORMAT);
if (fFields != NULL) { if (fFields != NULL) {
+1 -1
View File
@@ -51,7 +51,7 @@ TimeZoneListView::GetToolTipAt(BPoint point, BToolTip** _tip)
&item->TimeZone()); &item->TimeZone());
BString dateInTimeZone; BString dateInTimeZone;
BDateFormat::Default()->Format(&dateInTimeZone, now, B_SHORT_DATE_FORMAT, BDateFormat::Default()->Format(dateInTimeZone, now, B_SHORT_DATE_FORMAT,
&item->TimeZone()); &item->TimeZone());
BString toolTip = item->Text(); BString toolTip = item->Text();