* Add FormatDateTime function to BLocale
* Use the function to localize the date/time in tracker. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37949 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -39,10 +39,10 @@ public:
|
|||||||
void FormatString(char* target, size_t maxSize,
|
void FormatString(char* target, size_t maxSize,
|
||||||
char* fmt, ...);
|
char* fmt, ...);
|
||||||
void FormatString(BString* buffer, char* fmt, ...);
|
void FormatString(BString* buffer, char* fmt, ...);
|
||||||
void FormatDateTime(char* target, size_t maxSize,
|
status_t FormatDateTime(char* target, size_t maxSize,
|
||||||
const char* fmt, time_t value);
|
time_t time, bool longFormat);
|
||||||
void FormatDateTime(BString* buffer, const char* fmt,
|
status_t FormatDateTime(BString* buffer, time_t time,
|
||||||
time_t value);
|
bool longFormat);
|
||||||
|
|
||||||
// Date
|
// Date
|
||||||
|
|
||||||
|
|||||||
@@ -336,6 +336,37 @@ BLocale::StartOfWeek() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BLocale::FormatDateTime(char* target, size_t maxSize, time_t time,
|
||||||
|
bool longFormat)
|
||||||
|
{
|
||||||
|
ObjectDeleter<DateFormat> dateFormatter = CreateDateFormat(longFormat,
|
||||||
|
*fICULocale, longFormat ? fLongDateFormat : fShortDateFormat);
|
||||||
|
if (dateFormatter.Get() == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
ObjectDeleter<DateFormat> timeFormatter = CreateTimeFormat(longFormat,
|
||||||
|
*fICULocale, longFormat ? fLongTimeFormat : fShortTimeFormat);
|
||||||
|
if (timeFormatter.Get() == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
UnicodeString ICUString;
|
||||||
|
ICUString = dateFormatter->format((UDate)time * 1000, ICUString);
|
||||||
|
|
||||||
|
ICUString.append(UnicodeString::fromUTF8(", "));
|
||||||
|
|
||||||
|
ICUString = timeFormatter->format((UDate)time * 1000, ICUString);
|
||||||
|
|
||||||
|
CheckedArrayByteSink stringConverter(target, maxSize);
|
||||||
|
ICUString.toUTF8(stringConverter);
|
||||||
|
|
||||||
|
if (stringConverter.Overflowed())
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - Time
|
// #pragma mark - Time
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9528,21 +9528,6 @@ BPoseView::UpdateDateColumns(BMessage *message)
|
|||||||
|
|
||||||
BRect columnRect(Bounds());
|
BRect columnRect(Bounds());
|
||||||
|
|
||||||
if (IsFilePanel()) {
|
|
||||||
FormatSeparator separator;
|
|
||||||
DateOrder format;
|
|
||||||
bool clock;
|
|
||||||
|
|
||||||
message->FindInt32("TimeFormatSeparator", (int32*)&separator);
|
|
||||||
message->FindInt32("DateOrderFormat", (int32*)&format);
|
|
||||||
message->FindBool("24HrClock", &clock);
|
|
||||||
|
|
||||||
TrackerSettings settings;
|
|
||||||
settings.SetTimeFormatSeparator(separator);
|
|
||||||
settings.SetDateOrderFormat(format);
|
|
||||||
settings.SetClockTo24Hr(clock);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32 i = 0; i < columnCount; i++) {
|
for (int32 i = 0; i < columnCount; i++) {
|
||||||
BColumn *col = ColumnAt(i);
|
BColumn *col = ColumnAt(i);
|
||||||
if (col && col->AttrType() == B_TIME_TYPE) {
|
if (col && col->AttrType() == B_TIME_TYPE) {
|
||||||
|
|||||||
@@ -72,13 +72,9 @@ class TTrackerState : public Settings {
|
|||||||
BooleanValueSetting *fHideDotFiles;
|
BooleanValueSetting *fHideDotFiles;
|
||||||
BooleanValueSetting *fTypeAheadFiltering;
|
BooleanValueSetting *fTypeAheadFiltering;
|
||||||
|
|
||||||
BooleanValueSetting *f24HrClock;
|
|
||||||
|
|
||||||
ScalarValueSetting *fRecentApplicationsCount;
|
ScalarValueSetting *fRecentApplicationsCount;
|
||||||
ScalarValueSetting *fRecentDocumentsCount;
|
ScalarValueSetting *fRecentDocumentsCount;
|
||||||
ScalarValueSetting *fRecentFoldersCount;
|
ScalarValueSetting *fRecentFoldersCount;
|
||||||
ScalarValueSetting *fTimeFormatSeparator;
|
|
||||||
ScalarValueSetting *fDateOrderFormat;
|
|
||||||
|
|
||||||
BooleanValueSetting *fShowVolumeSpaceBar;
|
BooleanValueSetting *fShowVolumeSpaceBar;
|
||||||
HexScalarValueSetting *fUsedSpaceColor;
|
HexScalarValueSetting *fUsedSpaceColor;
|
||||||
@@ -183,10 +179,6 @@ TTrackerState::LoadSettingsIfNeeded()
|
|||||||
Add(fRecentDocumentsCount = new ScalarValueSetting("RecentDocuments", 10, "", ""));
|
Add(fRecentDocumentsCount = new ScalarValueSetting("RecentDocuments", 10, "", ""));
|
||||||
Add(fRecentFoldersCount = new ScalarValueSetting("RecentFolders", 10, "", ""));
|
Add(fRecentFoldersCount = new ScalarValueSetting("RecentFolders", 10, "", ""));
|
||||||
|
|
||||||
Add(fTimeFormatSeparator = new ScalarValueSetting("TimeFormatSeparator", 3, "", ""));
|
|
||||||
Add(fDateOrderFormat = new ScalarValueSetting("DateOrderFormat", 2, "", ""));
|
|
||||||
Add(f24HrClock = new BooleanValueSetting("24HrClock", false));
|
|
||||||
|
|
||||||
Add(fShowVolumeSpaceBar = new BooleanValueSetting("ShowVolumeSpaceBar", true));
|
Add(fShowVolumeSpaceBar = new BooleanValueSetting("ShowVolumeSpaceBar", true));
|
||||||
|
|
||||||
Add(fUsedSpaceColor = new HexScalarValueSetting("UsedSpaceColor", 0xc000cb00, "", ""));
|
Add(fUsedSpaceColor = new HexScalarValueSetting("UsedSpaceColor", 0xc000cb00, "", ""));
|
||||||
@@ -492,48 +484,6 @@ TrackerSettings::SetRecentFoldersCount(int32 count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FormatSeparator
|
|
||||||
TrackerSettings::TimeFormatSeparator()
|
|
||||||
{
|
|
||||||
return (FormatSeparator)gTrackerState.fTimeFormatSeparator->Value();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
TrackerSettings::SetTimeFormatSeparator(FormatSeparator separator)
|
|
||||||
{
|
|
||||||
gTrackerState.fTimeFormatSeparator->ValueChanged((int32)separator);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DateOrder
|
|
||||||
TrackerSettings::DateOrderFormat()
|
|
||||||
{
|
|
||||||
return (DateOrder)gTrackerState.fDateOrderFormat->Value();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
TrackerSettings::SetDateOrderFormat(DateOrder order)
|
|
||||||
{
|
|
||||||
gTrackerState.fDateOrderFormat->ValueChanged((int32)order);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
|
||||||
TrackerSettings::ClockIs24Hr()
|
|
||||||
{
|
|
||||||
return gTrackerState.f24HrClock->Value();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
TrackerSettings::SetClockTo24Hr(bool enabled)
|
|
||||||
{
|
|
||||||
gTrackerState.f24HrClock->SetValue(enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TrackerSettings::DontMoveFilesToTrash()
|
TrackerSettings::DontMoveFilesToTrash()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -283,129 +283,27 @@ WidgetAttributeText::TruncFileSize(BString *result, int64 value,
|
|||||||
return TruncFileSizeBase(result, value, view, width);
|
return TruncFileSizeBase(result, value, view, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
const char *kTimeFormats[] = {
|
|
||||||
"%A, %B %d %Y, %I:%M:%S %p", // Monday, July 09 1997, 05:08:15 PM
|
|
||||||
"%a, %b %d %Y, %I:%M:%S %p", // Mon, Jul 09 1997, 05:08:15 PM
|
|
||||||
"%a, %b %d %Y, %I:%M %p", // Mon, Jul 09 1997, 05:08 PM
|
|
||||||
"%b %d %Y, %I:%M %p", // Jul 09 1997, 05:08 PM
|
|
||||||
"%m/%d/%y, %I:%M %p", // 07/09/97, 05:08 PM
|
|
||||||
"%m/%d/%y", // 07/09/97
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
status_t
|
|
||||||
TimeFormat(BString &string, int32 index, FormatSeparator separator,
|
|
||||||
DateOrder order, bool clockIs24Hour)
|
|
||||||
{
|
|
||||||
if (index >= 6)
|
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
BString clockString;
|
|
||||||
BString dateString;
|
|
||||||
|
|
||||||
if (index <= 1)
|
|
||||||
if (clockIs24Hour)
|
|
||||||
clockString = "%H:%M:%S";
|
|
||||||
else
|
|
||||||
clockString = "%I:%M:%S %p";
|
|
||||||
else
|
|
||||||
if (clockIs24Hour)
|
|
||||||
clockString = "%H:%M";
|
|
||||||
else
|
|
||||||
clockString = "%I:%M %p";
|
|
||||||
|
|
||||||
if (index <= 3) {
|
|
||||||
switch (order) {
|
|
||||||
case kYMDFormat:
|
|
||||||
dateString = "%Y %! %d";
|
|
||||||
break;
|
|
||||||
case kDMYFormat:
|
|
||||||
dateString = "%d %! %Y";
|
|
||||||
break;
|
|
||||||
case kMDYFormat:
|
|
||||||
// Fall through
|
|
||||||
case kDateFormatEnd:
|
|
||||||
// Fall through
|
|
||||||
default:
|
|
||||||
dateString = "%! %d %Y";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (index == 0)
|
|
||||||
dateString.Replace('!', 'B', 1);
|
|
||||||
else
|
|
||||||
dateString.Replace('!', 'b', 1);
|
|
||||||
} else {
|
|
||||||
switch (order) {
|
|
||||||
case kYMDFormat:
|
|
||||||
dateString = "%y!%m!%d";
|
|
||||||
break;
|
|
||||||
case kDMYFormat:
|
|
||||||
dateString = "%d!%m!%y";
|
|
||||||
break;
|
|
||||||
case kMDYFormat:
|
|
||||||
// Fall through
|
|
||||||
case kDateFormatEnd:
|
|
||||||
// Fall through
|
|
||||||
default:
|
|
||||||
dateString = "%m!%d!%y";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
char separatorArray[] = {' ', '-', '/', '\\', '.'};
|
|
||||||
|
|
||||||
if (separator == kNoSeparator)
|
|
||||||
dateString.ReplaceAll("!", "");
|
|
||||||
else
|
|
||||||
dateString.ReplaceAll('!', separatorArray[separator-1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index == 0)
|
|
||||||
string = "%A, ";
|
|
||||||
else if (index < 3)
|
|
||||||
string = "%a, ";
|
|
||||||
else
|
|
||||||
string = "";
|
|
||||||
|
|
||||||
string << dateString;
|
|
||||||
|
|
||||||
if (index < 5)
|
|
||||||
string << ", " << clockString;
|
|
||||||
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <class View>
|
template <class View>
|
||||||
float
|
float
|
||||||
TruncTimeBase(BString *result, int64 value, const View *view, float width)
|
TruncTimeBase(BString *result, int64 value, const View *view, float width)
|
||||||
{
|
{
|
||||||
TrackerSettings settings;
|
|
||||||
FormatSeparator separator = settings.TimeFormatSeparator();
|
|
||||||
DateOrder order = settings.DateOrderFormat();
|
|
||||||
bool clockIs24hr = settings.ClockIs24Hr();
|
|
||||||
|
|
||||||
float resultWidth = 0;
|
float resultWidth = 0;
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
|
|
||||||
time_t timeValue = (time_t)value;
|
time_t timeValue = (time_t)value;
|
||||||
tm timeData;
|
|
||||||
// use reentrant version of localtime to avoid having to have a semaphore
|
|
||||||
// (localtime uses a global structure to do it's conversion)
|
|
||||||
localtime_r(&timeValue, &timeData);
|
|
||||||
|
|
||||||
BString timeFormat;
|
BLocale here;
|
||||||
|
be_locale_roster->GetDefaultLocale(&here);
|
||||||
|
|
||||||
for (int32 index = 0; ; index++) {
|
if (here.FormatDateTime(buffer, 256, timeValue, true) == B_OK) {
|
||||||
if (TimeFormat(timeFormat, index, separator, order, clockIs24hr)
|
|
||||||
!= B_OK)
|
|
||||||
break;
|
|
||||||
strftime(buffer, 256, timeFormat.String(), &timeData);
|
|
||||||
resultWidth = view->StringWidth(buffer);
|
resultWidth = view->StringWidth(buffer);
|
||||||
if (resultWidth <= width)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (resultWidth > width && here.FormatDateTime(buffer, 256, timeValue,
|
||||||
|
false) == B_OK) {
|
||||||
|
resultWidth = view->StringWidth(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
if (resultWidth > width) {
|
if (resultWidth > width) {
|
||||||
// even the shortest format string didn't do it, insert ellipsis
|
// even the shortest format string didn't do it, insert ellipsis
|
||||||
resultWidth = TruncStringBase(result, buffer, (ssize_t)strlen(buffer),
|
resultWidth = TruncStringBase(result, buffer, (ssize_t)strlen(buffer),
|
||||||
@@ -1115,19 +1013,10 @@ TimeAttributeText::FitValue(BString *result, const BPoseView *view)
|
|||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TimeAttributeText::CheckSettingsChanged()
|
TimeAttributeText::CheckSettingsChanged(void)
|
||||||
{
|
{
|
||||||
bool changed = fLastClockIs24 != fSettings.ClockIs24Hr()
|
// TODO : check against the actual locale settings
|
||||||
|| fLastDateOrder != fSettings.DateOrderFormat()
|
return false;
|
||||||
|| fLastTimeFormatSeparator != fSettings.TimeFormatSeparator();
|
|
||||||
|
|
||||||
if (changed) {
|
|
||||||
fLastClockIs24 = fSettings.ClockIs24Hr();
|
|
||||||
fLastDateOrder = fSettings.DateOrderFormat();
|
|
||||||
fLastTimeFormatSeparator = fSettings.TimeFormatSeparator();
|
|
||||||
}
|
|
||||||
|
|
||||||
return changed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user