/* cc-format-preview.c * * Copyright (C) 2013 Red Hat, Inc. * Copyright (C) 2020 System76, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 . * * Written by: * Matthias Clasen * Ian Douglas Scott * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "cc-format-preview.h" #include #include #include #include #include struct _CcFormatPreview { GtkBox parent_instance; GtkWidget *date_format_label; GtkWidget *date_time_format_label; GtkWidget *measurement_format_label; GtkWidget *number_format_label; GtkWidget *paper_format_label; GtkWidget *time_format_label; gchar *region; }; enum { PROP_0, PROP_REGION }; G_DEFINE_TYPE (CcFormatPreview, cc_format_preview, GTK_TYPE_BOX) static void display_date (GtkWidget *label, GDateTime *dt, const gchar *format) { g_autofree gchar *s = g_date_time_format (dt, format); gtk_label_set_text (GTK_LABEL (label), g_strstrip (s)); } static void update_format_examples (CcFormatPreview *self) { const gchar *region = self->region; locale_t locale; locale_t old_locale; g_autoptr(GDateTime) dt = NULL; g_autofree gchar *s = NULL; #ifdef LC_MEASUREMENT const gchar *fmt; #endif g_autoptr(GtkPaperSize) paper = NULL; if (region == NULL || region[0] == '\0') return; locale = newlocale (LC_TIME_MASK, region, (locale_t) 0); if (locale == (locale_t) 0) g_warning ("Failed to create locale %s: %s", region, g_strerror (errno)); else old_locale = uselocale (locale); dt = g_date_time_new_now_local (); display_date (self->date_format_label, dt, "%x"); display_date (self->time_format_label, dt, "%X"); display_date (self->date_time_format_label, dt, "%c"); if (locale != (locale_t) 0) { uselocale (old_locale); freelocale (locale); } locale = newlocale (LC_NUMERIC_MASK, region, (locale_t) 0); if (locale == (locale_t) 0) g_warning ("Failed to create locale %s: %s", region, g_strerror (errno)); else old_locale = uselocale (locale); s = g_strdup_printf ("%'.2f", 123456789.00); gtk_label_set_text (GTK_LABEL (self->number_format_label), s); if (locale != (locale_t) 0) { uselocale (old_locale); freelocale (locale); } #if 0 locale = newlocale (LC_MONETARY_MASK, region, (locale_t) 0); if (locale == (locale_t) 0) g_warning ("Failed to create locale %s: %s", region, g_strerror (errno)); else old_locale = uselocale (locale); num_info = localeconv (); if (num_info != NULL) gtk_label_set_text (GTK_LABEL (self->currency_format_label), num_info->currency_symbol); if (locale != (locale_t) 0) { uselocale (old_locale); freelocale (locale); } #endif #ifdef LC_MEASUREMENT locale = newlocale (LC_MEASUREMENT_MASK, region, (locale_t) 0); if (locale == (locale_t) 0) g_warning ("Failed to create locale %s: %s", region, g_strerror (errno)); else old_locale = uselocale (locale); fmt = nl_langinfo (_NL_MEASUREMENT_MEASUREMENT); if (fmt && *fmt == 2) gtk_label_set_text (GTK_LABEL (self->measurement_format_label), C_("measurement format", "Imperial")); else gtk_label_set_text (GTK_LABEL (self->measurement_format_label), C_("measurement format", "Metric")); if (locale != (locale_t) 0) { uselocale (old_locale); freelocale (locale); } #endif #ifdef LC_PAPER locale = newlocale (LC_PAPER_MASK, region, (locale_t) 0); if (locale == (locale_t) 0) g_warning ("Failed to create locale %s: %s", region, g_strerror (errno)); else old_locale = uselocale (locale); paper = gtk_paper_size_new (gtk_paper_size_get_default ()); gtk_label_set_text (GTK_LABEL (self->paper_format_label), gtk_paper_size_get_display_name (paper)); if (locale != (locale_t) 0) { uselocale (old_locale); freelocale (locale); } #endif } static void cc_format_preview_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { CcFormatPreview *self; self = CC_FORMAT_PREVIEW (object); switch (prop_id) { case PROP_REGION: cc_format_preview_set_region (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void cc_format_preview_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { CcFormatPreview *self; self = CC_FORMAT_PREVIEW (object); switch (prop_id) { case PROP_REGION: g_value_set_string (value, self->region); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void cc_format_preview_finalize (GObject *object) { CcFormatPreview *self = CC_FORMAT_PREVIEW (object); g_clear_pointer (&self->region, g_free); G_OBJECT_CLASS (cc_format_preview_parent_class)->finalize (object); } void cc_format_preview_class_init (CcFormatPreviewClass *klass) { GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->get_property = cc_format_preview_get_property; object_class->set_property = cc_format_preview_set_property; object_class->finalize = cc_format_preview_finalize; g_object_class_install_property (object_class, PROP_REGION, g_param_spec_string ("region", "region", "region", NULL, G_PARAM_READWRITE)); gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/region/cc-format-preview.ui"); gtk_widget_class_bind_template_child (widget_class, CcFormatPreview, date_format_label); gtk_widget_class_bind_template_child (widget_class, CcFormatPreview, date_time_format_label); gtk_widget_class_bind_template_child (widget_class, CcFormatPreview, measurement_format_label); gtk_widget_class_bind_template_child (widget_class, CcFormatPreview, number_format_label); gtk_widget_class_bind_template_child (widget_class, CcFormatPreview, paper_format_label); gtk_widget_class_bind_template_child (widget_class, CcFormatPreview, time_format_label); } void cc_format_preview_init (CcFormatPreview *self) { gtk_widget_init_template (GTK_WIDGET (self)); } void cc_format_preview_set_region (CcFormatPreview *preview, const gchar *region) { g_free (preview->region); preview->region = g_strdup (region); update_format_examples (preview); }