From 4eef91b9c8f84625586bdf0e259674363e836b58 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sat, 29 Oct 2011 20:48:41 +0000 Subject: [PATCH] Rework time computations in tracker status window to use localized functions. Result is not as good as the previous implementation, because we need the more advanced BDateFormat API, which is not available yet. Fixes #6930. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42977 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/tracker/StatusWindow.cpp | 50 +++++++++++-------------------- src/kits/tracker/StatusWindow.h | 4 +-- 2 files changed, 19 insertions(+), 35 deletions(-) diff --git a/src/kits/tracker/StatusWindow.cpp b/src/kits/tracker/StatusWindow.cpp index ea53640f28..ece34097a3 100644 --- a/src/kits/tracker/StatusWindow.cpp +++ b/src/kits/tracker/StatusWindow.cpp @@ -42,6 +42,7 @@ All rights reserved. #include #include #include +#include #include #include #include @@ -775,24 +776,17 @@ BStatusView::_TimeStatusString(float availableSpace, float* _width) time_t now = (time_t)real_time_clock(); time_t finishTime = (time_t)(now + secondsRemaining); - tm _time; - tm* time = localtime_r(&finishTime, &_time); - int32 year = time->tm_year + 1900; - char timeText[32]; - // TODO: Localization of time string... - if (now < finishTime - kSecondsPerDay) { - // process is going to take more than a day! - snprintf(timeText, sizeof(timeText), "%0*d:%0*d %0*d/%0*d/%ld", - 2, time->tm_hour, 2, time->tm_min, - 2, time->tm_mon + 1, 2, time->tm_mday, year); + const BLocale* locale = BLocale::Default(); + if (finishTime - now > kSecondsPerDay) { + locale->FormatDateTime(timeText, sizeof(timeText), finishTime, + B_MEDIUM_DATE_FORMAT, B_MEDIUM_TIME_FORMAT); } else { - snprintf(timeText, sizeof(timeText), "%0*d:%0*d", - 2, time->tm_hour, 2, time->tm_min); + locale->FormatTime(timeText, sizeof(timeText), finishTime, + B_MEDIUM_TIME_FORMAT); } - finishTime -= now; - BString string(_FullTimeRemainingString(finishTime, timeText)); + BString string(_FullTimeRemainingString(now, finishTime, timeText)); *_width = StringWidth(string.String()); if (*_width > availableSpace) { string.SetTo(_ShortTimeRemainingString(timeText)); @@ -817,28 +811,18 @@ BStatusView::_ShortTimeRemainingString(const char* timeText) BString -BStatusView::_FullTimeRemainingString(time_t finishTime, const char* timeText) +BStatusView::_FullTimeRemainingString(time_t now, time_t finishTime, + const char* timeText) { + BDurationFormat formatter; BString buffer; - char finishStr[32]; - if (finishTime > kSecondsPerDay) { - buffer.SetTo(B_TRANSLATE("(Finish: %time - Over %finishtime " - "days left)")); - snprintf(finishStr, sizeof(finishStr), "%ld", - finishTime / kSecondsPerDay); - } else if (finishTime > 60 * 60) { - buffer.SetTo(B_TRANSLATE("(Finish: %time - Over %finishtime " - "hours left)")); - snprintf(finishStr, sizeof(finishStr), "%ld", - finishTime / (60 * 60)); - } else if (finishTime > 60) { - buffer.SetTo(B_TRANSLATE("(Finish: %time - %finishtime minutes " - "left)")); - snprintf(finishStr, sizeof(finishStr), "%ld", finishTime / 60); + BString finishStr; + if (finishTime - now > 60 * 60) { + buffer.SetTo(B_TRANSLATE("(Finish: %time - Over %finishtime left)")); + formatter.Format(now * 1000000LL, finishTime * 1000000LL, &finishStr); } else { - buffer.SetTo(B_TRANSLATE("(Finish: %time - %finishtime seconds " - "left)")); - snprintf(finishStr, sizeof(finishStr), "%ld", finishTime); + buffer.SetTo(B_TRANSLATE("(Finish: %time - %finishtime left)")); + formatter.Format(now * 1000000LL, finishTime * 1000000LL, &finishStr); } buffer.ReplaceFirst("%time", timeText); diff --git a/src/kits/tracker/StatusWindow.h b/src/kits/tracker/StatusWindow.h index bf3aa66bec..75019ad4c0 100644 --- a/src/kits/tracker/StatusWindow.h +++ b/src/kits/tracker/StatusWindow.h @@ -141,8 +141,8 @@ private: BString _TimeStatusString(float availableSpace, float* _width); BString _ShortTimeRemainingString(const char* timeText); - BString _FullTimeRemainingString(time_t finishTime, - const char* timeText); + BString _FullTimeRemainingString(time_t now, + time_t finishTime, const char* timeText); BStatusBar* fStatusBar; off_t fTotalSize;