aboutsummaryrefslogblamecommitdiffstats
path: root/e-util/e-emoticon-chooser.c
blob: 44ce06ba5552c690c929513e090269ad0c5dc20a (plain) (tree)

















































































































































































                                                                                 
/*
 * e-emoticon-chooser.c
 *
 * Copyright (C) 2008 Novell, Inc.
 * Copyright (C) 2012 Dan Vrátil <dvratil@redhat.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU Lesser General Public
 * License 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 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 Lesser General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "e-emoticon-chooser.h"

#include <glib/gi18n-lib.h>

/* Constant version of EEMoticon. */
typedef struct {
    const gchar *label;
    const gchar *icon_name;
    const gchar *text_face;
} ConstantEmoticon;

static ConstantEmoticon available_emoticons[] = {
    /* Translators: :-) */
    { N_("_Smile"),     "face-smile",       ":-)"   },
    /* Translators: :-( */
    { N_("S_ad"),       "face-sad",     ":-("   },
    /* Translators: ;-) */
    { N_("_Wink"),      "face-wink",        ";-)"   },
    /* Translators: :-P */
    { N_("Ton_gue"),    "face-raspberry",   ":-P"   },
    /* Translators: :-)) */
    { N_("Laug_h"),     "face-laugh",       ":-))"  },
    /* Translators: :-| */
    { N_("_Plain"),     "face-plain",       ":-|"   },
    /* Translators: :-! */
    { N_("Smi_rk"),     "face-smirk",       ":-!"   },
    /* Translators: :"-) */
    { N_("_Embarrassed"),   "face-embarrassed", ":\"-)" },
    /* Translators: :-D */
    { N_("_Big Smile"), "face-smile-big",   ":-D"   },
    /* Translators: :-/ */
    { N_("Uncer_tain"), "face-uncertain",   ":-/"   },
    /* Translators: :-O */
    { N_("S_urprise"),  "face-surprise",    ":-O"   },
    /* Translators: :-S */
    { N_("W_orried"),   "face-worried",     ":-S"   },
    /* Translators: :-* */
    { N_("_Kiss"),      "face-kiss",        ":-*"   },
    /* Translators: X-( */
    { N_("A_ngry"),     "face-angry",       "X-("   },
    /* Translators: B-) */
    { N_("_Cool"),      "face-cool",        "B-)"   },
    /* Translators: O:-) */
    { N_("Ange_l"),     "face-angel",       "O:-)"  },
    /* Translators: :'( */
    { N_("Cr_ying"),    "face-crying",      ":'("   },
    /* Translators: :-Q */
    { N_("S_ick"),      "face-sick",        ":-Q"   },
    /* Translators: |-) */
    { N_("Tire_d"),     "face-tired",       "|-)"   },
    /* Translators: >:-) */
    { N_("De_vilish"),  "face-devilish",    ">:-)"  },
    /* Translators: :-(|) */
    { N_("_Monkey"),    "face-monkey",      ":-(|)" }
};

enum {
    ITEM_ACTIVATED,
    LAST_SIGNAL
};

static guint signals[LAST_SIGNAL];

G_DEFINE_INTERFACE (
    EEmoticonChooser,
    e_emoticon_chooser,
    G_TYPE_OBJECT)

static void
e_emoticon_chooser_default_init (EEmoticonChooserInterface *interface)
{
    g_object_interface_install_property (
        interface,
        g_param_spec_boxed (
            "current-emoticon",
            "Current Emoticon",
            "Currently selected emoticon",
            E_TYPE_EMOTICON,
            G_PARAM_READWRITE));

    signals[ITEM_ACTIVATED] = g_signal_new (
        "item-activated",
        G_TYPE_FROM_INTERFACE (interface),
        G_SIGNAL_RUN_LAST,
        G_STRUCT_OFFSET (EEmoticonChooserInterface, item_activated),
        NULL, NULL,
        g_cclosure_marshal_VOID__VOID,
        G_TYPE_NONE, 0);
}

EEmoticon *
e_emoticon_chooser_get_current_emoticon (EEmoticonChooser *chooser)
{
    EEmoticonChooserInterface *interface;

    g_return_val_if_fail (E_IS_EMOTICON_CHOOSER (chooser), NULL);

    interface = E_EMOTICON_CHOOSER_GET_INTERFACE (chooser);
    g_return_val_if_fail (interface->get_current_emoticon != NULL, NULL);

    return interface->get_current_emoticon (chooser);
}

void
e_emoticon_chooser_set_current_emoticon (EEmoticonChooser *chooser,
                                         EEmoticon *emoticon)
{
    EEmoticonChooserInterface *interface;

    g_return_if_fail (E_IS_EMOTICON_CHOOSER (chooser));

    interface = E_EMOTICON_CHOOSER_GET_INTERFACE (chooser);
    g_return_if_fail (interface->set_current_emoticon != NULL);

    interface->set_current_emoticon (chooser, emoticon);
}

void
e_emoticon_chooser_item_activated (EEmoticonChooser *chooser)
{
    g_return_if_fail (E_IS_EMOTICON_CHOOSER (chooser));

    g_signal_emit (chooser, signals[ITEM_ACTIVATED], 0);
}

GList *
e_emoticon_chooser_get_items (void)
{
    GList *list = NULL;
    gint ii;

    for (ii = 0; ii < G_N_ELEMENTS (available_emoticons); ii++)
        list = g_list_prepend (list, &available_emoticons[ii]);

    return g_list_reverse (list);
}

const EEmoticon *
e_emoticon_chooser_lookup_emoticon (const gchar *icon_name)
{
    gint ii;

    g_return_val_if_fail (icon_name && *icon_name, NULL);

    for (ii = 0; ii < G_N_ELEMENTS (available_emoticons); ii++) {
        if (strcmp (available_emoticons[ii].icon_name, icon_name) == 0) {
            return (const EEmoticon *) &available_emoticons[ii];
        }
    }

    return NULL;
}