Base class for a message tag editor.
2002-02-08 Jeffrey Stedfast <fejj@ximian.com> * message-tag-editor.[c,h]: Base class for a message tag editor. * folder-browser.c (on_right_click): Setup the hide/enable masks for "Flag for Follow-up" * mail-callbacks.c (confirm_expunge): Instead of hiding deleted messages and then expunging, disable the use of the message-list completely during the expunge operation. (expunged_folder): Re-enable the use of the message-list widget here. svn path=/trunk/; revision=15626
This commit is contained in:
committed by
Jeffrey Stedfast
parent
a61a6cab20
commit
9fecb732de
@ -1,3 +1,16 @@
|
||||
2002-02-08 Jeffrey Stedfast <fejj@ximian.com>
|
||||
|
||||
* message-tag-editor.[c,h]: Base class for a message tag editor.
|
||||
|
||||
* folder-browser.c (on_right_click): Setup the hide/enable masks
|
||||
for "Flag for Follow-up"
|
||||
|
||||
* mail-callbacks.c (confirm_expunge): Instead of hiding deleted
|
||||
messages and then expunging, disable the use of the message-list
|
||||
completely during the expunge operation.
|
||||
(expunged_folder): Re-enable the use of the message-list widget
|
||||
here.
|
||||
|
||||
2002-02-07 Radek Doulik <rodo@ximian.com>
|
||||
|
||||
* mail-callbacks.c (mail_generate_reply): call set_body later to
|
||||
|
||||
@ -106,6 +106,8 @@ evolution_mail_SOURCES = \
|
||||
main.c \
|
||||
message-list.c \
|
||||
message-list.h \
|
||||
message-tag-editor.c \
|
||||
message-tag-editor.h \
|
||||
subscribe-dialog.c \
|
||||
subscribe-dialog.h \
|
||||
mail.h
|
||||
|
||||
@ -1431,7 +1431,9 @@ enum {
|
||||
IS_MAILING_LIST = 1<<6,
|
||||
CAN_RESEND = 1<<7,
|
||||
CAN_MARK_IMPORTANT = 1<<8,
|
||||
CAN_MARK_UNIMPORTANT = 1<<9
|
||||
CAN_MARK_UNIMPORTANT = 1<<9,
|
||||
CAN_FLAG_FOR_FOLLOWUP = 1<<10,
|
||||
CAN_FLAG_COMPLETED = 1<<11
|
||||
};
|
||||
|
||||
#define MLIST_VFOLDER (3)
|
||||
@ -1466,7 +1468,15 @@ static EPopupMenu context_menu[] = {
|
||||
{ N_("Reply to _List"), NULL, GTK_SIGNAL_FUNC (reply_to_list), NULL, 0 },
|
||||
{ N_("Reply to _All"), NULL, GTK_SIGNAL_FUNC (reply_to_all), NULL, 0 },
|
||||
{ N_("_Forward"), NULL, GTK_SIGNAL_FUNC (forward), NULL, 0 },
|
||||
{ "", NULL, (NULL), NULL, 0 },
|
||||
|
||||
E_POPUP_SEPARATOR,
|
||||
|
||||
{ N_("Flag for Follow-up"), NULL, GTK_SIGNAL_FUNC (flag_for_followup),NULL, CAN_FLAG_FOR_FOLLOWUP },
|
||||
{ N_("Flag Completed"), NULL, GTK_SIGNAL_FUNC (flag_completed), NULL, CAN_FLAG_COMPLETED },
|
||||
{ N_("Clear Flag"), NULL, GTK_SIGNAL_FUNC (flag_clear), NULL, CAN_FLAG_COMPLETED },
|
||||
|
||||
/* separator here? */
|
||||
|
||||
{ N_("Mar_k as Read"), NULL, GTK_SIGNAL_FUNC (mark_as_seen), NULL, CAN_MARK_READ },
|
||||
{ N_("Mark as U_nread"), NULL, GTK_SIGNAL_FUNC (mark_as_unseen), NULL, CAN_MARK_UNREAD },
|
||||
{ N_("Mark as _Important"), NULL, GTK_SIGNAL_FUNC (mark_as_important), NULL, CAN_MARK_IMPORTANT },
|
||||
@ -1511,6 +1521,12 @@ context_menu_position_func (GtkMenu *menu, gint *x, gint *y,
|
||||
*y += ty + th / 2;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
followup_tag_complete (const char *tag)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* handle context menu over message-list */
|
||||
static int
|
||||
on_right_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event, FolderBrowser *fb)
|
||||
@ -1561,6 +1577,10 @@ on_right_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event
|
||||
gboolean have_unseen = FALSE;
|
||||
gboolean have_important = FALSE;
|
||||
gboolean have_unimportant = FALSE;
|
||||
gboolean have_flag_for_followup = FALSE;
|
||||
gboolean have_flag_completed = FALSE;
|
||||
gboolean have_unflagged = FALSE;
|
||||
const char *tag;
|
||||
|
||||
for (i = 0; i < uids->len; i++) {
|
||||
info = camel_folder_get_message_info (fb->folder, uids->pdata[i]);
|
||||
@ -1582,6 +1602,13 @@ on_right_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event
|
||||
else
|
||||
have_unimportant = TRUE;
|
||||
|
||||
if ((tag = camel_tag_get (&info->user_tags, "follow-up"))) {
|
||||
have_flag_for_followup = TRUE;
|
||||
if (followup_tag_complete (tag))
|
||||
have_flag_completed = TRUE;
|
||||
} else
|
||||
have_unflagged = TRUE;
|
||||
|
||||
camel_folder_free_message_info (fb->folder, info);
|
||||
|
||||
if (have_seen && have_unseen && have_deleted && have_undeleted)
|
||||
@ -1603,6 +1630,11 @@ on_right_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event
|
||||
if (!have_important)
|
||||
enable_mask |= CAN_MARK_UNIMPORTANT;
|
||||
|
||||
if (!have_unflagged)
|
||||
enable_mask |= CAN_FLAG_FOR_FOLLOWUP;
|
||||
if (!(have_flag_for_followup && have_flag_completed))
|
||||
enable_mask |= CAN_FLAG_COMPLETED;
|
||||
|
||||
/*
|
||||
* Hide items that wont get used.
|
||||
*/
|
||||
@ -1626,6 +1658,11 @@ on_right_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event
|
||||
else
|
||||
hide_mask |= CAN_MARK_UNIMPORTANT;
|
||||
}
|
||||
|
||||
if (!have_unflagged)
|
||||
enable_mask |= CAN_FLAG_FOR_FOLLOWUP;
|
||||
if (!(have_flag_for_followup && have_flag_completed))
|
||||
enable_mask |= CAN_FLAG_COMPLETED;
|
||||
}
|
||||
|
||||
/* free uids */
|
||||
|
||||
@ -1807,6 +1807,24 @@ toggle_as_important (BonoboUIComponent *uih, void *user_data, const char *path)
|
||||
toggle_flags (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_FLAGGED);
|
||||
}
|
||||
|
||||
void
|
||||
flag_for_followup (BonoboUIComponent *uih, void *user_data, const char *path)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void
|
||||
flag_completed (BonoboUIComponent *uih, void *user_data, const char *path)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void
|
||||
flag_clear (BonoboUIComponent *uih, void *user_data, const char *path)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void
|
||||
zoom_in (BonoboUIComponent *uih, void *user_data, const char *path)
|
||||
{
|
||||
@ -2230,24 +2248,16 @@ previous_flagged_msg (GtkWidget *button, gpointer user_data)
|
||||
CAMEL_MESSAGE_FLAGGED, CAMEL_MESSAGE_FLAGGED, TRUE);
|
||||
}
|
||||
|
||||
struct _expunged_folder_data {
|
||||
FolderBrowser *fb;
|
||||
gboolean hidedeleted;
|
||||
};
|
||||
|
||||
static void
|
||||
expunged_folder (CamelFolder *f, void *data)
|
||||
{
|
||||
FolderBrowser *fb = ((struct _expunged_folder_data *) data)->fb;
|
||||
gboolean hidedeleted = ((struct _expunged_folder_data *) data)->hidedeleted;
|
||||
FolderBrowser *fb = data;
|
||||
|
||||
if (FOLDER_BROWSER_IS_DESTROYED (fb))
|
||||
return;
|
||||
|
||||
fb->expunging = NULL;
|
||||
message_list_set_hidedeleted (fb->message_list, hidedeleted);
|
||||
|
||||
g_free (data);
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (fb->message_list), TRUE);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -2300,15 +2310,10 @@ expunge_folder (BonoboUIComponent *uih, void *user_data, const char *path)
|
||||
return;
|
||||
|
||||
if (fb->folder && (fb->expunging == NULL || fb->folder != fb->expunging) && confirm_expunge (fb)) {
|
||||
struct _expunged_folder_data *data;
|
||||
CamelMessageInfo *info;
|
||||
|
||||
data = g_malloc (sizeof (*data));
|
||||
data->fb = fb;
|
||||
data->hidedeleted = fb->message_list->hidedeleted;
|
||||
|
||||
/* hide the deleted messages so user can't click on them while we expunge */
|
||||
message_list_set_hidedeleted (fb->message_list, TRUE);
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (fb->message_list), FALSE);
|
||||
|
||||
/* Only blank the mail display if the message being
|
||||
viewed is one of those to be expunged */
|
||||
@ -2320,7 +2325,7 @@ expunge_folder (BonoboUIComponent *uih, void *user_data, const char *path)
|
||||
}
|
||||
|
||||
fb->expunging = fb->folder;
|
||||
mail_expunge_folder (fb->folder, expunged_folder, data);
|
||||
mail_expunge_folder (fb->folder, expunged_folder, fb);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -96,6 +96,9 @@ void mark_as_unseen (BonoboUIComponent *uih, void *user_data, const c
|
||||
void mark_as_important (BonoboUIComponent *uih, void *user_data, const char *path);
|
||||
void mark_as_unimportant (BonoboUIComponent *uih, void *user_data, const char *path);
|
||||
void toggle_as_important (BonoboUIComponent *uih, void *user_data, const char *path);
|
||||
void flag_for_followup (BonoboUIComponent *uih, void *user_data, const char *path);
|
||||
void flag_completed (BonoboUIComponent *uih, void *user_data, const char *path);
|
||||
void flag_clear (BonoboUIComponent *uih, void *user_data, const char *path);
|
||||
|
||||
void zoom_in (BonoboUIComponent *uih, void *user_data, const char *path);
|
||||
void zoom_out (BonoboUIComponent *uih, void *user_data, const char *path);
|
||||
|
||||
151
mail/message-tag-editor.c
Normal file
151
mail/message-tag-editor.c
Normal file
@ -0,0 +1,151 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||
/*
|
||||
* Authors: Jeffrey Stedfast <fejj@ximian.com>
|
||||
*
|
||||
* Copyright 2002 Ximain, 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 <libgnomeui/gnome-stock.h>
|
||||
#include "message-tag-editor.h"
|
||||
|
||||
|
||||
static void message_tag_editor_class_init (MessageTagEditorClass *class);
|
||||
static void message_tag_editor_init (MessageTagEditor *editor);
|
||||
static void message_tag_editor_finalise (GtkObject *obj);
|
||||
|
||||
static const char *tag_get_name (MessageTagEditor *editor);
|
||||
static const char *tag_get_value (MessageTagEditor *editor);
|
||||
static void tag_set_value (MessageTagEditor *editor, const char *value);
|
||||
|
||||
static GnomeDialogClass *parent_class;
|
||||
|
||||
enum {
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
GtkType
|
||||
message_tag_editor_get_type (void)
|
||||
{
|
||||
static GtkType type = 0;
|
||||
|
||||
if (!type) {
|
||||
GtkTypeInfo type_info = {
|
||||
"MessageTagEditor",
|
||||
sizeof (MessageTagEditor),
|
||||
sizeof (MessageTagEditorClass),
|
||||
(GtkClassInitFunc) message_tag_editor_class_init,
|
||||
(GtkObjectInitFunc) message_tag_editor_init,
|
||||
(GtkArgSetFunc) NULL,
|
||||
(GtkArgGetFunc) NULL
|
||||
};
|
||||
|
||||
type = gtk_type_unique (gnome_dialog_get_type (), &type_info);
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
static void
|
||||
message_tag_editor_class_init (MessageTagEditorClass *klass)
|
||||
{
|
||||
GtkObjectClass *object_class;
|
||||
|
||||
object_class = (GtkObjectClass *) klass;
|
||||
parent_class = gtk_type_class (gnome_dialog_get_type ());
|
||||
|
||||
object_class->finalize = message_tag_editor_finalise;
|
||||
|
||||
klass->get_name = tag_get_name;
|
||||
klass->get_value = tag_get_value;
|
||||
klass->set_value = tag_set_value;
|
||||
}
|
||||
|
||||
static void
|
||||
message_tag_editor_init (MessageTagEditor *editor)
|
||||
{
|
||||
gtk_window_set_policy (GTK_WINDOW (editor), FALSE, TRUE, FALSE);
|
||||
|
||||
gnome_dialog_append_buttons (GNOME_DIALOG (editor),
|
||||
GNOME_STOCK_BUTTON_OK,
|
||||
GNOME_STOCK_BUTTON_CANCEL,
|
||||
NULL);
|
||||
|
||||
gnome_dialog_set_default (GNOME_DIALOG (editor), 0);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
message_tag_editor_finalise (GtkObject *obj)
|
||||
{
|
||||
MessageTagEditor *editor = (MessageTagEditor *) obj;
|
||||
|
||||
((GtkObjectClass *)(parent_class))->finalize (obj);
|
||||
}
|
||||
|
||||
|
||||
static const char *
|
||||
tag_get_name (MessageTagEditor *editor)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *
|
||||
message_tag_editor_get_name (MessageTagEditor *editor)
|
||||
{
|
||||
g_return_val_if_fail (IS_MESSAGE_TAG_EDITOR (editor), NULL);
|
||||
|
||||
return ((MessageTagEditorClass *)((GtkObject *) editor)->klass)->get_name (editor);
|
||||
}
|
||||
|
||||
|
||||
static const char *
|
||||
tag_get_value (MessageTagEditor *editor)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *
|
||||
message_tag_editor_get_value (MessageTagEditor *editor)
|
||||
{
|
||||
g_return_val_if_fail (IS_MESSAGE_TAG_EDITOR (editor), NULL);
|
||||
|
||||
return ((MessageTagEditorClass *)((GtkObject *) editor)->klass)->get_value (editor);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
tag_set_value (MessageTagEditor *editor, const char *value)
|
||||
{
|
||||
/* no-op */
|
||||
;
|
||||
}
|
||||
|
||||
void
|
||||
message_tag_editor_set_value (MessageTagEditor *editor, const char *value)
|
||||
{
|
||||
g_return_if_fail (IS_MESSAGE_TAG_EDITOR (editor));
|
||||
|
||||
((MessageTagEditorClass *)((GtkObject *) editor)->klass)->set_value (editor, value);
|
||||
}
|
||||
74
mail/message-tag-editor.h
Normal file
74
mail/message-tag-editor.h
Normal file
@ -0,0 +1,74 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||
/*
|
||||
* Authors: Jeffrey Stedfast <fejj@ximian.com>
|
||||
*
|
||||
* Copyright 2002 Ximain, 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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __MESSAGE_TAG_EDITOR_H__
|
||||
#define __MESSAGE_TAG_EDITOR_H__
|
||||
|
||||
#include <gtk/gtkwidget.h>
|
||||
#include <libgnomeui/gnome-dialog.h>
|
||||
#include <camel/camel-folder.h>
|
||||
#include <camel/camel-folder-summary.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#pragma }
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#define MESSAGE_TAG_EDITOR(obj) GTK_CHECK_CAST (obj, message_tag_editor_get_type (), MessageTagEditor)
|
||||
#define MESSAGE_TAG_EDITOR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, message_tag_editor_get_type (), MessageTagEditorClass)
|
||||
#define IS_MESSAGE_TAG_EDITOR(obj) GTK_CHECK_TYPE (obj, message_tag_editor_get_type ())
|
||||
|
||||
typedef struct _MessageTagEditor MessageTagEditor;
|
||||
typedef struct _MessageTagEditorClass MessageTagEditorClass;
|
||||
|
||||
struct _MessageTagEditor {
|
||||
GnomeDialog parent;
|
||||
|
||||
};
|
||||
|
||||
struct _MessageTagEditorClass {
|
||||
GnomeDialogClass parent_class;
|
||||
|
||||
/* virtual methods */
|
||||
const char * (*get_name) (MessageTagEditor *editor);
|
||||
|
||||
const char * (*get_value) (MessageTagEditor *editor);
|
||||
void (*set_value) (MessageTagEditor *editor, const char *value);
|
||||
|
||||
/* signals */
|
||||
};
|
||||
|
||||
|
||||
GtkType message_tag_editor_get_type (void);
|
||||
|
||||
/* methods */
|
||||
const char *message_tag_editor_get_name (MessageTagEditor *editor);
|
||||
const char *message_tag_editor_get_value (MessageTagEditor *editor);
|
||||
void message_tag_editor_set_value (MessageTagEditor *editor, const char *value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __MESSAGE_TAG_EDITOR_H__ */
|
||||
Reference in New Issue
Block a user