aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-menu.c
diff options
context:
space:
mode:
authorMichael Zucci <zucchi@src.gnome.org>2004-09-20 13:59:55 +0800
committerMichael Zucci <zucchi@src.gnome.org>2004-09-20 13:59:55 +0800
commitef6a3af717132e0750f226fa8a0ee0f3c98e19f0 (patch)
treef4ed25f7a247a8ccb855a8d940777e7a3d21a3e3 /mail/em-menu.c
parent96111b1f1487ca3fe454b340a73ba927cc6bfb83 (diff)
downloadgsoc2013-evolution-ef6a3af717132e0750f226fa8a0ee0f3c98e19f0.tar.gz
gsoc2013-evolution-ef6a3af717132e0750f226fa8a0ee0f3c98e19f0.tar.zst
gsoc2013-evolution-ef6a3af717132e0750f226fa8a0ee0f3c98e19f0.zip
Merged notzed-eplugin-2-branch to head.
svn path=/trunk/; revision=27300
Diffstat (limited to 'mail/em-menu.c')
-rw-r--r--mail/em-menu.c338
1 files changed, 338 insertions, 0 deletions
diff --git a/mail/em-menu.c b/mail/em-menu.c
new file mode 100644
index 0000000000..79a5564f51
--- /dev/null
+++ b/mail/em-menu.c
@@ -0,0 +1,338 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors: Michael Zucchi <notzed@ximian.com>
+ *
+ * Copyright 2004 Ximian, Inc. (www.ximian.com)
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <glib.h>
+
+#include <gtk/gtkmenu.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkimagemenuitem.h>
+#include <gtk/gtkcheckmenuitem.h>
+#include <gtk/gtkradiomenuitem.h>
+#include <gtk/gtkseparatormenuitem.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkimage.h>
+
+#include <libgnome/gnome-url.h>
+#include <libgnomevfs/gnome-vfs-mime.h>
+
+#include "em-menu.h"
+#include "e-util/e-msgport.h"
+#include <e-util/e-icon-factory.h>
+#include "em-utils.h"
+#include "em-composer-utils.h"
+
+#include <camel/camel-store.h>
+#include <camel/camel-folder.h>
+#include <camel/camel-mime-message.h>
+#include <camel/camel-string-utils.h>
+#include <camel/camel-mime-utils.h>
+#include <camel/camel-mime-part.h>
+#include <camel/camel-url.h>
+
+#include <camel/camel-vee-folder.h>
+#include <camel/camel-vtrash-folder.h>
+
+#include <gconf/gconf.h>
+#include <gconf/gconf-client.h>
+
+#include <gal/util/e-util.h>
+
+static void emp_standard_menu_factory(EMenu *emp, void *data);
+
+static GObjectClass *emp_parent;
+
+static void
+emp_init(GObject *o)
+{
+ /*EMMenu *emp = (EMMenu *)o; */
+}
+
+static void
+emp_finalise(GObject *o)
+{
+ ((GObjectClass *)emp_parent)->finalize(o);
+}
+
+static void
+emp_target_free(EMenu *ep, EMenuTarget *t)
+{
+ switch (t->type) {
+ case EM_MENU_TARGET_SELECT: {
+ EMMenuTargetSelect *s = (EMMenuTargetSelect *)t;
+
+ if (s->folder)
+ camel_object_unref(s->folder);
+ g_free(s->uri);
+ if (s->uids)
+ em_utils_uids_free(s->uids);
+ break; }
+ }
+
+ ((EMenuClass *)emp_parent)->target_free(ep, t);
+}
+
+static void
+emp_class_init(GObjectClass *klass)
+{
+ printf("em menu class init\n");
+
+ klass->finalize = emp_finalise;
+ ((EMenuClass *)klass)->target_free = emp_target_free;
+
+ e_menu_class_add_factory((EMenuClass *)klass, NULL, (EMenuFactoryFunc)emp_standard_menu_factory, NULL);
+}
+
+GType
+em_menu_get_type(void)
+{
+ static GType type = 0;
+
+ if (type == 0) {
+ static const GTypeInfo info = {
+ sizeof(EMMenuClass),
+ NULL, NULL,
+ (GClassInitFunc)emp_class_init,
+ NULL, NULL,
+ sizeof(EMMenu), 0,
+ (GInstanceInitFunc)emp_init
+ };
+ emp_parent = g_type_class_ref(e_menu_get_type());
+ type = g_type_register_static(e_menu_get_type(), "EMMenu", &info, 0);
+ }
+
+ return type;
+}
+
+EMMenu *em_menu_new(const char *menuid)
+{
+ EMMenu *emp = g_object_new(em_menu_get_type(), 0);
+
+ e_menu_construct(&emp->popup, menuid);
+
+ return emp;
+}
+
+/**
+ * em_menu_target_new_select:
+ * @folder: The selection will ref this for the life of it.
+ * @folder_uri:
+ * @uids: The selection will free this when done with it.
+ *
+ * Create a new selection popup target.
+ *
+ * Return value:
+ **/
+EMMenuTargetSelect *
+em_menu_target_new_select(EMMenu *emp, struct _CamelFolder *folder, const char *folder_uri, GPtrArray *uids)
+{
+ EMMenuTargetSelect *t = e_menu_target_new(&emp->popup, EM_MENU_TARGET_SELECT, sizeof(*t));
+ guint32 mask = ~0;
+ int i;
+ const char *tmp;
+
+ /* NB: This is identical to em-popup-target-new-select function */
+
+ t->uids = uids;
+ t->folder = folder;
+ t->uri = g_strdup(folder_uri);
+
+ if (folder == NULL) {
+ t->target.mask = mask;
+
+ return t;
+ }
+
+ camel_object_ref(folder);
+ mask &= ~EM_MENU_SELECT_FOLDER;
+
+ if (em_utils_folder_is_sent(folder, folder_uri))
+ mask &= ~EM_MENU_SELECT_EDIT;
+
+ if (!(em_utils_folder_is_drafts(folder, folder_uri)
+ || em_utils_folder_is_outbox(folder, folder_uri))
+ && uids->len == 1)
+ mask &= ~EM_MENU_SELECT_ADD_SENDER;
+
+ if (uids->len == 1)
+ mask &= ~EM_MENU_SELECT_ONE;
+
+ if (uids->len >= 1)
+ mask &= ~EM_MENU_SELECT_MANY;
+
+ for (i = 0; i < uids->len; i++) {
+ CamelMessageInfo *info = camel_folder_get_message_info(folder, uids->pdata[i]);
+
+ if (info == NULL)
+ continue;
+
+ if (info->flags & CAMEL_MESSAGE_SEEN)
+ mask &= ~EM_MENU_SELECT_MARK_UNREAD;
+ else
+ mask &= ~EM_MENU_SELECT_MARK_READ;
+
+ if (info->flags & CAMEL_MESSAGE_DELETED)
+ mask &= ~EM_MENU_SELECT_UNDELETE;
+ else
+ mask &= ~EM_MENU_SELECT_DELETE;
+
+ if (info->flags & CAMEL_MESSAGE_FLAGGED)
+ mask &= ~EM_MENU_SELECT_MARK_UNIMPORTANT;
+ else
+ mask &= ~EM_MENU_SELECT_MARK_IMPORTANT;
+
+ if (info->flags & CAMEL_MESSAGE_JUNK)
+ mask &= ~EM_MENU_SELECT_MARK_NOJUNK;
+ else
+ mask &= ~EM_MENU_SELECT_MARK_JUNK;
+
+ tmp = camel_tag_get (&info->user_tags, "follow-up");
+ if (tmp && *tmp) {
+ mask &= ~EM_MENU_SELECT_FLAG_CLEAR;
+ tmp = camel_tag_get(&info->user_tags, "completed-on");
+ if (tmp == NULL || *tmp == 0)
+ mask &= ~EM_MENU_SELECT_FLAG_COMPLETED;
+ } else
+ mask &= ~EM_MENU_SELECT_FLAG_FOLLOWUP;
+
+ if (i == 0 && uids->len == 1
+ && (tmp = camel_message_info_mlist(info))
+ && tmp[0] != 0)
+ mask &= ~EM_MENU_SELECT_MAILING_LIST;
+
+ camel_folder_free_message_info(folder, info);
+ }
+
+ t->target.mask = mask;
+
+ return t;
+}
+
+static void
+emp_standard_menu_factory(EMenu *emp, void *data)
+{
+ /* noop */
+}
+
+/* ********************************************************************** */
+
+/* menu plugin handler */
+
+/*
+<e-plugin
+ class="com.ximian.mail.plugin.popup:1.0"
+ id="com.ximian.mail.plugin.popup.item:1.0"
+ type="shlib"
+ location="/opt/gnome2/lib/camel/1.0/libcamelimap.so"
+ name="imap"
+ description="IMAP4 and IMAP4v1 mail store">
+ <hook class="com.ximian.mail.popupMenu:1.0"
+ handler="HandlePopup">
+ <menu id="any" target="select">
+ <item
+ type="item|toggle|radio|image|submenu|bar"
+ active
+ path="foo/bar"
+ label="label"
+ icon="foo"
+ mask="select_one"
+ activate="emp_view_emacs"/>
+ </menu>
+ </extension>
+
+*/
+
+static void *emph_parent_class;
+#define emph ((EMMenuHook *)eph)
+
+static const EMenuHookTargetMask emph_select_masks[] = {
+ { "one", EM_MENU_SELECT_ONE },
+ { "many", EM_MENU_SELECT_MANY },
+ { "mark_read", EM_MENU_SELECT_MARK_READ },
+ { "mark_unread", EM_MENU_SELECT_MARK_UNREAD },
+ { "delete", EM_MENU_SELECT_DELETE },
+ { "undelete", EM_MENU_SELECT_UNDELETE },
+ { "mailing_list", EM_MENU_SELECT_MAILING_LIST },
+ { "resend", EM_MENU_SELECT_EDIT },
+ { "mark_important", EM_MENU_SELECT_MARK_IMPORTANT },
+ { "mark_unimportant", EM_MENU_SELECT_MARK_UNIMPORTANT },
+ { "flag_followup", EM_MENU_SELECT_FLAG_FOLLOWUP },
+ { "flag_completed", EM_MENU_SELECT_FLAG_COMPLETED },
+ { "flag_clear", EM_MENU_SELECT_FLAG_CLEAR },
+ { "add_sender", EM_MENU_SELECT_ADD_SENDER },
+ { "mark_junk", EM_MENU_SELECT_MARK_JUNK },
+ { "mark_nojunk", EM_MENU_SELECT_MARK_NOJUNK },
+ { "folder", EM_MENU_SELECT_FOLDER },
+ { 0 }
+};
+
+static const EMenuHookTargetMap emph_targets[] = {
+ { "select", EM_MENU_TARGET_SELECT, emph_select_masks },
+ { 0 }
+};
+
+static void
+emph_finalise(GObject *o)
+{
+ /*EPluginHook *eph = (EPluginHook *)o;*/
+
+ ((GObjectClass *)emph_parent_class)->finalize(o);
+}
+
+static void
+emph_class_init(EPluginHookClass *klass)
+{
+ int i;
+
+ ((GObjectClass *)klass)->finalize = emph_finalise;
+ ((EPluginHookClass *)klass)->id = "com.ximian.evolution.mail.bonobomenu:1.0";
+
+ for (i=0;emph_targets[i].type;i++)
+ e_menu_hook_class_add_target_map((EMenuHookClass *)klass, &emph_targets[i]);
+
+ /* FIXME: leaks parent set class? */
+ ((EMenuHookClass *)klass)->menu_class = g_type_class_ref(em_menu_get_type());
+}
+
+GType
+em_menu_hook_get_type(void)
+{
+ static GType type = 0;
+
+ if (!type) {
+ static const GTypeInfo info = {
+ sizeof(EMMenuHookClass), NULL, NULL, (GClassInitFunc) emph_class_init, NULL, NULL,
+ sizeof(EMMenuHook), 0, (GInstanceInitFunc) NULL,
+ };
+
+ emph_parent_class = g_type_class_ref(e_menu_hook_get_type());
+ type = g_type_register_static(e_menu_hook_get_type(), "EMMenuHook", &info, 0);
+ }
+
+ return type;
+}