/*
* Copyright 2013 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*
* Authors:
* Charles Kerr
*/
#include
#include
#include
#include
namespace unity {
namespace indicator {
namespace datetime {
/***
****
***/
class DesktopFormatter::Impl
{
public:
Impl (DesktopFormatter * owner, const std::shared_ptr& clock):
owner_(owner),
clock_(clock),
settings_(g_settings_new(SETTINGS_INTERFACE))
{
const gchar * const keys[] = { "changed::" SETTINGS_SHOW_SECONDS_S,
"changed::" SETTINGS_TIME_FORMAT_S,
"changed::" SETTINGS_TIME_FORMAT_S,
"changed::" SETTINGS_CUSTOM_TIME_FORMAT_S,
"changed::" SETTINGS_SHOW_DAY_S,
"changed::" SETTINGS_SHOW_DATE_S,
"changed::" SETTINGS_SHOW_YEAR_S };
for (guint i=0, n=G_N_ELEMENTS(keys); i(gself)->rebuildHeaderFormat();
}
void rebuildHeaderFormat()
{
gchar * fmt = getHeaderLabelFormatString (settings_);
owner_->headerFormat.set(fmt);
g_free (fmt);
}
private:
gchar* getHeaderLabelFormatString (GSettings * s) const
{
char * fmt;
const TimeFormatMode mode = (TimeFormatMode) g_settings_get_enum (s, SETTINGS_TIME_FORMAT_S);
if (mode == TIME_FORMAT_MODE_CUSTOM)
{
fmt = g_settings_get_string (s, SETTINGS_CUSTOM_TIME_FORMAT_S);
}
else
{
const bool show_day = g_settings_get_boolean (s, SETTINGS_SHOW_DAY_S);
const bool show_date = g_settings_get_boolean (s, SETTINGS_SHOW_DATE_S);
const bool show_year = show_date && g_settings_get_boolean (s, SETTINGS_SHOW_YEAR_S);
const char * date_fmt = getDateFormat (show_day, show_date, show_year);
const char * time_fmt = getFullTimeFormatString (s);
fmt = joinDateAndTimeFormatStrings (date_fmt, time_fmt);
}
return fmt;
}
const gchar* T_(const gchar* in) const
{
return owner_->T_(in);
}
const gchar* getDateFormat (bool show_day, bool show_date, bool show_year) const
{
const char * fmt;
if (show_day && show_date && show_year)
/* TRANSLATORS: a strftime(3) format showing the weekday, date, and year */
fmt = T_("%a %b %e %Y");
else if (show_day && show_date)
fmt = T_("%a %b %e");
else if (show_day && show_year)
/* TRANSLATORS: a strftime(3) format showing the weekday and year. */
fmt = T_("%a %Y");
else if (show_day)
/* TRANSLATORS: a strftime(3) format showing the weekday. */
fmt = T_("%a");
else if (show_date && show_year)
/* TRANSLATORS: a strftime(3) format showing the date and year */
fmt = T_("%b %e %Y");
else if (show_date)
/* TRANSLATORS: a strftime(3) format showing the date */
fmt = T_("%b %e");
else if (show_year)
/* TRANSLATORS: a strftime(3) format showing the year */
fmt = T_("%Y");
else
fmt = nullptr;
return fmt;
}
const gchar * getFullTimeFormatString (GSettings * settings) const
{
const bool show_seconds = g_settings_get_boolean (settings, SETTINGS_SHOW_SECONDS_S);
bool twelvehour;
switch (g_settings_get_enum (settings, SETTINGS_TIME_FORMAT_S))
{
case TIME_FORMAT_MODE_LOCALE_DEFAULT:
twelvehour = is_locale_12h();
break;
case TIME_FORMAT_MODE_24_HOUR:
twelvehour = FALSE;
break;
default:
twelvehour = TRUE;
break;
}
return owner_->getDefaultHeaderTimeFormat (twelvehour, show_seconds);
}
gchar* joinDateAndTimeFormatStrings (const char * date_string, const char * time_string) const
{
gchar * str;
if (date_string && time_string)
{
/* TRANSLATORS: This is a format string passed to strftime to combine the
* date and the time. The value of "%s\u2003%s" will result in a
* string like this in US English 12-hour time: 'Fri Jul 16 11:50 AM'.
* The space in between date and time is a Unicode en space
* (E28082 in UTF-8 hex). */
str = g_strdup_printf ("%s\u2003%s", date_string, time_string);
}
else if (date_string)
{
str = g_strdup (date_string);
}
else // time_string
{
str = g_strdup (time_string);
}
return str;
}
private:
DesktopFormatter * const owner_;
std::shared_ptr clock_;
GSettings * settings_;
};
/***
****
***/
DesktopFormatter::DesktopFormatter (const std::shared_ptr& clock):
Formatter(clock),
p(new Impl(this, clock))
{
}
DesktopFormatter::~DesktopFormatter() = default;
/***
****
***/
} // namespace datetime
} // namespace indicator
} // namespace unity