More work

svn path=/trunk/; revision=1628
This commit is contained in:
Arturo Espinosa
2000-01-25 08:43:24 +00:00
parent ed7345eec7
commit 670f57583d
10 changed files with 780 additions and 5 deletions

30
mail/Mail.idl Normal file
View File

@ -0,0 +1,30 @@
/*
* mail.idl: Mail interfaces for Evolution
*
* Author:
* Miguel de Icaza (miguel@helixcode.com)
*
* (C) 2000 Helix Code, Inc.
*/
#include <bonobo.idl>
module Evolution {
interface MessageList : GNOME::Unknown {
void select_message (in long message_number);
void open_message (in long message_number);
};
/*
* FolderBrowser object.
*
* configuration of this widget is done trough
* Bonobo Properties
*/
interface FolderBrowser : GNOME::Unknown {
MessageList get_message_list ();
};
};

View File

@ -8,13 +8,27 @@ INCLUDES = \
-I$(srcdir)/../widgets \
$(BONOBO_GNOME_CFLAGS)
EVOLUTION_CORBA_GENERATED = \
Mail.h \
Mail-common.c \
Mail-skels.c \
Mail-stubs.c
evolution_mail_SOURCES = \
html-stream.c \
html-stream.h \
mail-display.h \
mail-display.c \
main.c
main.c \
message-list.c \
message-list.h \
$(EVOLUTION_CORBA_GENERATED)
evolution_mail_LDADD = \
../e-util/libeutil.a \
$(BONOBO_GNOME_LIBS)
$(EVOLUTION_MAIL_CORBA_GENERATED): Mail.idl
orbit-idl -I`$(GNOME_CONFIG) --datadir`/idl -I$(srcdir) $(srcdir)/Mail.idl
EXTRA_DIST = Mail.idl

90
mail/folder-browser.c Normal file
View File

@ -0,0 +1,90 @@
/*
* folder-browser.c: Folder browser top level component
*
* Author:
* Miguel de Icaza (miguel@kernel.org)
*
* (C) 2000 Helix Code, Inc.
*/
#include <config.h>
#include "folder-browser.h"
#define PARENT_TYPE (gtk_table_get_type ())
static GtkObjectClass *folder_browser_parent_class;
#define PROPERTY_FOLDER_URI "folder_uri"
static void
folder_browser_destroy (GtkObject *object)
{
FolderBrowser *folder_browser = FOLDER_BROWSER (object);
folder_browser_parent_class->destroy (object);
}
static void
folder_browser_class_init (GtkObjectClass *object_class)
{
object_class->destroy = folder_browser_destroy;
folder_browser_parent_class = gtk_type_class (PARENT_TYPE);
}
#define EQUAL(a,b) (strcmp (a,b) == 0)
void
folder_browser_set_uri (FolderBrowser *folder_browser, const char *uri)
{
g_free (folder_browser->uri);
folder_browser->uri = g_strudp (uri);
}
static void
folder_browser_property_changed (GnomePropertyBag *properties,
const char *name,
const char *type,
gpointer old_value,
gpointer new_value,
gpointer user_data)
{
FolderBrowser *folder_browser = FOLDER_BROWSER (user_data);
if (EQUAL (name, PROPERTY_FOLDER_URI)){
folder_browser_set_uri (folder_browser, new_value);
return;
}
}
static void
folder_browser_init (GtkObject *object)
{
FolderBrowser *fb = FOLDER_BROWSER (object);
fb->properties = gnome_property_bag_new ();
gnome_property_bag_add (
fb->properties, PROPERTY_FOLDER_URI, "string",
NULL, NULL, _("The URI that the Folder Browser will display", 0);
gtk_signal_connect (GTK_OBJECT (fb->properties), "value_changed",
property_changed, fb);
}
GtkWidget *
folder_browser_new (void)
{
FolderBrowser *folder_browser = gtk_type_new (folder_browser_get_type ());
GtkTable *table = GTK_TABLE (folder_browser);
table->homogeous = FALSE;
gtk_table_resize (table, 1, 2);
return GTK_WIDGET (folder_browser);
}
E_MAKE_TYPE (folder_browser, "FolderBrowser", FolderBrowser, folder_browser_class_init, folder_browser_init, PARENT_TYPE);

31
mail/folder-browser.h Normal file
View File

@ -0,0 +1,31 @@
#ifndef _FOLDER_BROWSER_H_
#define _FOLDER_BROWSER_H_
#include <gtk/gtktable.h>
#include "camel/camel-stream.h"
#define FOLDER_BROWSER_TYPE (folder_browser_get_type ())
#define FOLDER_BROWSER(o) (GTK_CHECK_CAST ((o), FOLDER_BROWSER_TYPE, FolderBrowser))
#define FOLDER_BROWSER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), FOLDER_BROWSER_TYPE, FolderBrowserClass))
#define IS_FOLDER_BROWSER(o) (GTK_CHECK_TYPE ((o), FOLDER_BROWSER_TYPE))
#define IS_FOLDER_BROWSER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), FOLDER_BROWSER_TYPE))
typedef struct {
GtkTable parent;
GnomePropertyBag *properties;
/*
* The current URI being displayed by the FolderBrowser
*/
char *uri;
} FolderBrowser;
typedef struct {
GtkTableClass parent_class;
} FolderBrowserClass;
GtkType folder_browser_get_type (void);
GtkWidget *folder_browser_new (void);
#endif /* _FOLDER_BROWSER_H_ */

48
mail/mail-component.c Normal file
View File

@ -0,0 +1,48 @@
/*
* mail-component.c: The core of the mail component
*
* Author:
* Miguel de Icaza (miguel@helixcode.com)
*
* (C) 2000 Helix Code, Inc.
*/
#include <config.h>
#include <gnome.h>
#include <bonobo/gnome-main.h>
#include "e-util/e-gui-utils.h"
CORBA_Environment ev;
CORBA_ORB orb;
static void
init_bonobo (int argc, char **argv)
{
gnome_CORBA_init_with_popt_table (
"evolution-mail-component", "1.0",
&argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
orb = gnome_CORBA_ORB ();
if (bonobo_init (orb, NULL, NULL) == FALSE){
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
_("Mail Component: I could not initialize Bonobo"));
exit (1);
}
}
static void
main (int argc, char *argv [])
{
bindtextdomain (PACKAGE, EVOLUTION_LOCALEDIR);
textdomain (PACKAGE);
CORBA_exception_init (&ev);
init_bonobo (argc, argv);
mail_display_factory_init ();
bonobo_main ();
return 0;
}

68
mail/mail-display.c Normal file
View File

@ -0,0 +1,68 @@
/*
* mail-display.c: Mail display widget
*
* Author:
* Miguel de Icaza
*
* (C) 2000 Helix Code, Inc.
*/
#include <config.h>
#include <gnome.h>
#include "e-util/e-util.h"
#include "mail-display.h"
#define PARENT_TYPE (gtk_table_get_type ())
static GtkObjectClass *mail_display_parent_class;
static void
mail_display_init (GtkObject *object)
{
MailDisplay *mail_display = MAIL_DISPLAY (object);
mail_display->html = gtk_html_new ();
gtk_widget_show (mail_display->html);
}
static void
mail_display_destroy (GtkObject *object)
{
MailDisplay *mail_display = MAIL_DISPLAY (object);
mail_display_parent_class->destroy (object);
}
static void
mail_display_class_init (GtkObjectClass *object_class)
{
object_class->destroy = mail_display_destroy;
mail_display_parent_class = gtk_type_class (PARENT_TYPE);
}
GtkWidget *
mail_display_new (void)
{
MailDisplay *mail_display = gtk_type_new (mail_display_get_type ());
GtkTable *table = GTK_TABLE (mail_display);
table->homogeous = FALSE;
gtk_table_resize (table, 1, 2);
gtk_table_attach (table, mail_display->html,
0, 1, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL);
return GTK_WIDGET (mail_display);
}
CamelStream *
mail_display_get_stream (MailDisplay *mail_display)
{
g_return_val_if_fail (mail_display != NULL, NULL);
g_return_val_if_fail (IS_MAIL_DISPLAY (mail_display), NULL);
return html_stream_new (mail_display->html);
}
E_MAKE_TYPE (mail_display, "MailDisplay", MailDisplay, mail_display_class_init, mail_display_init, PARENT_TYPE);

View File

@ -2,6 +2,7 @@
#define _MAIL_DISPLAY_H_
#include <gtk/gtktable.h>
#include "camel/camel-stream.h"
#define MAIL_DISPLAY_TYPE (mail_display_get_type ())
#define MAIL_DISPLAY(o) (GTK_CHECK_CAST ((o), MAIL_DISPLAY_TYPE, MailDisplay))
@ -19,5 +20,9 @@ typedef struct {
GtkTableClass parent_class;
} MailDisplayClass;
GtkType mail_display_get_type (void);
GtkType mail_display_get_type (void);
GtkWidget *mail_display_new (void);
CamelStream *mail_display_get_stream (MailDisplay *display);
#endif /* _MAIL_DISPLAY_H_ */

View File

@ -1,14 +1,49 @@
/*
* main.c: Evolution mail reading component
* mail-component.c: The core of the mail component
*
* Authors:
* Author:
* Miguel de Icaza (miguel@helixcode.com)
*
* (C) 2000 Helix Code, Inc.
*/
#include <config.h>
#include <gnome.h>
#include <bonobo/gnome-main.h>
#include "e-util/e-gui-utils.h"
#include "main.h"
main ()
CORBA_Environment ev;
CORBA_ORB orb;
static void
init_bonobo (int argc, char **argv)
{
gnome_CORBA_init_with_popt_table (
"evolution-mail-component", "1.0",
&argc, argv, NULL, 0, NULL, GNORBA_INIT_SERVER_FUNC, &ev);
orb = gnome_CORBA_ORB ();
if (bonobo_init (orb, NULL, NULL) == FALSE){
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
_("Mail Component: I could not initialize Bonobo"));
exit (1);
}
}
static void
main (int argc, char *argv [])
{
bindtextdomain (PACKAGE, EVOLUTION_LOCALEDIR);
textdomain (PACKAGE);
CORBA_exception_init (&ev);
init_bonobo (argc, argv);
mail_folder_browser_factory_init ();
bonobo_main ();
return 0;
}

394
mail/message-list.c Normal file
View File

@ -0,0 +1,394 @@
/*
* message-list.c: Displays the messages.
* Implements CORBA's Evolution::MessageList
*
* Author:
* Miguel de Icaza (miguel@helixcode.com)
*
* (C) 2000 Helix Code, Inc.
*/
#include <config.h>
#include <gnome.h>
#include <bonobo/gnome-main.h>
#include "camel/camel-folder.h"
#include "e-table/e-table.h"
#include "e-table/e-table-simple.h"
#include "e-table/e-cell-text.h"
#include "e-table/e-cell-toggle.h"
#include "e-table/e-cell-checkbox.h"
#include "message-list.h"
#include "Mail.h"
/*
* Default sizes for the ETable display
*
*/
#define N_CHARS(x) (CHAR_WIDTH * (x))
#define COL_ICON_WIDTH 16
#define COL_FROM_WIDTH N_CHARS(24)
#define COL_FROM_WIDTH_MIN 32
#define COL_SUBJECT_WIDTH N_CHARS(30)
#define COL_SUBJECT_WIDTH_MIN 32
#define COL_SENT_WIDTH N_CHARS(20)
#define COL_SENT_WIDTH_MIN 32
#define COL_RECEIVE_WIDTH N_CHARS(20)
#define COL_RECEIVE_WIDTH_MIN 32
#define COL_TO_WIDTH N_CHARS(24)
#define COL_TO_WIDTH_MIN 32
#define COL_SIZE_WIDTH N_CHARS(6)
#define COL_SIZE_WIDTH_MIN 32
#define PARENT_TYPE (gnome_object_get_type ())
static GnomeObjectClass *message_list_parent_class;
static POA_Evolution_MessageList__vepv evolution_message_list_vepv;
/*
* SimpleTableModel::col_count
*/
static int
ml_col_count (ETableModel *etm, void *data)
{
return COL_LAST;
}
/*
* SimpleTableModel::row_count
*/
static int
ml_row_count (ETableModel *etm, void *data)
{
MessageList *message_list = data;
CamelException ex;
return camel_folder_get_message_count (message_list->folder, &ex);
}
static void *
ml_value_at (ETableModel *etm, int col, int row, void *data)
{
static char buffer [10];
switch (col){
case COL_ONLINE_STATUS:
return GINT_TO_POINTER (0);
case COL_MESSAGE_STATUS:
return GINT_TO_POINTER (1);
case COL_PRIORITY:
return GINT_TO_POINTER (10);
case COL_ATTACHMENT:
return GINT_TO_POINTER (0);
case COL_FROM:
return "miguel@dudical.com";
case COL_SUBJECT:
return "MONEY FAST!";
case COL_SENT:
return "sent";
case COL_RECEIVE:
return "receive";
case COL_TO:
return "dudes@server";
case COL_SIZE:
sprintf (buffer, "%d", 20);
return buffer;
default:
g_assert_not_reached ();
}
return NULL;
}
static void
ml_set_value_at (ETableModel *etm, int col, int row, const void *value, void *data)
{
}
static gboolean
ml_is_cell_editable (ETableModel *etm, int col, int row, void *data)
{
return FALSE;
}
static void
message_list_init_renderers (MessageList *message_list)
{
g_assert (message_list);
g_assert (message_list->table_model);
message_list->render_text = e_cell_text_new (
message_list->table_model,
NULL, GTK_JUSTIFY_LEFT);
message_list->render_online_status = e_cell_checkbox_new ();
message_list->render_message_status = e_cell_checkbox_new ();
message_list->render_priority = e_cell_checkbox_new ();
message_list->render_attachment = e_cell_checkbox_new ();
}
static void
message_list_init_header (MessageList *message_list)
{
/*
* FIXME:
*
* Use the font metric to compute this.
*/
#define CHAR_WIDTH 10
message_list->header_model = e_table_header_new ();
message_list->table_cols [COL_ONLINE_STATUS] =
e_table_col_new (COL_ONLINE_STATUS, _("Online status"),
COL_ICON_WIDTH, COL_ICON_WIDTH,
message_list->render_online_status,
g_int_equal, FALSE);
message_list->table_cols [COL_MESSAGE_STATUS] =
e_table_col_new (COL_MESSAGE_STATUS, _("Message status"),
COL_ICON_WIDTH, COL_ICON_WIDTH,
message_list->render_message_status,
g_int_equal, FALSE);
message_list->table_cols [COL_PRIORITY] =
e_table_col_new (COL_PRIORITY, _("Priority"),
COL_ICON_WIDTH, COL_ICON_WIDTH,
message_list->render_priority,
g_int_equal, FALSE);
message_list->table_cols [COL_ATTACHMENT] =
e_table_col_new (COL_ATTACHMENT, _("Attachment"),
COL_ICON_WIDTH, COL_ICON_WIDTH,
message_list->render_attachment,
g_int_equal, FALSE);
message_list->table_cols [COL_FROM] =
e_table_col_new (COL_FROM, _("From"),
COL_FROM_WIDTH, COL_FROM_WIDTH_MIN,
message_list->render_text,
g_str_equal, TRUE);
message_list->table_cols [COL_SUBJECT] =
e_table_col_new (COL_SUBJECT, _("Subject"),
COL_SUBJECT_WIDTH, COL_SUBJECT_WIDTH_MIN,
message_list->render_text,
g_str_equal, TRUE);
message_list->table_cols [COL_SENT] =
e_table_col_new (COL_SENT, _("Sent"),
COL_SUBJECT_WIDTH, COL_SENT_WIDTH_MIN,
message_list->render_text,
g_str_equal, TRUE);
message_list->table_cols [COL_RECEIVE] =
e_table_col_new (COL_SENT, _("Receive"),
COL_RECEIVE_WIDTH, COL_RECEIVE_WIDTH_MIN,
message_list->render_text,
g_str_equal, TRUE);
message_list->table_cols [COL_TO] =
e_table_col_new (COL_TO, _("To"),
COL_TO_WIDTH, COL_TO_WIDTH_MIN,
message_list->render_text,
g_str_equal, TRUE);
message_list->table_cols [COL_SIZE] =
e_table_col_new (COL_SIZE, _("Size"),
COL_SIZE_WIDTH, COL_SIZE_WIDTH_MIN,
message_list->render_text,
g_str_equal, TRUE);
}
/*
* GtkObject::init
*/
static void
message_list_init (GtkObject *object)
{
MessageList *message_list = MESSAGE_LIST (object);
message_list->table_model = e_table_simple_new (
ml_col_count, ml_row_count, ml_value_at,
ml_set_value_at, ml_is_cell_editable, message_list);
message_list_init_renderers (message_list);
message_list_init_header (message_list);
/*
* The etable
*/
message_list->etable = e_table_new (
message_list->header_model,
message_list->table_model,
"1,2,3,4,5,6,7", NULL);
/*
* We do own the Etable, not some widget container
*/
gtk_object_ref (GTK_OBJECT (message_list->etable));
gtk_object_sink (GTK_OBJECT (message_list->etable));
}
static void
message_list_destroy (GtkObject *object)
{
MessageList *message_list = MESSAGE_LIST (object);
int i;
gtk_object_unref (GTK_OBJECT (message_list->table_model));
gtk_object_unref (GTK_OBJECT (message_list->header_model));
/*
* Renderers
*/
gtk_object_unref (GTK_OBJECT (message_list->render_text));
gtk_object_unref (GTK_OBJECT (message_list->render_online_status));
gtk_object_unref (GTK_OBJECT (message_list->render_message_status));
gtk_object_unref (GTK_OBJECT (message_list->render_priority));
gtk_object_unref (GTK_OBJECT (message_list->render_attachment));
gtk_object_unref (GTK_OBJECT (message_list->etable));
for (i = 0; i < COL_LAST; i++)
gtk_object_unref (GTK_OBJECT (message_list->table_cols [i]));
GTK_OBJECT_CLASS (message_list_parent_class)->destroy (object);
}
/*
* CORBA method: Evolution::MessageList::select_message
*/
static void
MessageList_select_message (PortableServer_Servant _servant,
const CORBA_long message_number,
CORBA_Environment *ev)
{
printf ("FIXME: select message method\n");
}
/*
* CORBA method: Evolution::MessageList::open_message
*/
static void
MessageList_open_message (PortableServer_Servant _servant,
const CORBA_long message_number,
CORBA_Environment *ev)
{
printf ("FIXME: open message method\n");
}
static POA_Evolution_MessageList__epv *
evolution_message_list_get_epv (void)
{
POA_Evolution_MessageList__epv *epv;
epv = g_new0 (POA_Evolution_MessageList__epv, 1);
epv->select_message = MessageList_select_message;
epv->open_message = MessageList_open_message;
return epv;
}
static void
message_list_corba_class_init (void)
{
evolution_message_list_vepv.GNOME_Unknown_epv = gnome_object_get_epv ();
evolution_message_list_vepv.Evolution_MessageList_epv = evolution_message_list_get_epv ();
}
/*
* GtkObjectClass::init
*/
static void
message_list_class_init (GtkObjectClass *object_class)
{
message_list_parent_class = gtk_type_class (PARENT_TYPE);
object_class->destroy = message_list_destroy;
message_list_corba_class_init ();
}
static void
message_list_construct (MessageList *message_list, Evolution_MessageList corba_message_list)
{
gnome_object_construct (GNOME_OBJECT (message_list), corba_message_list);
}
static Evolution_MessageList
create_corba_message_list (GnomeObject *object)
{
POA_Evolution_MessageList *servant;
CORBA_Environment ev;
servant = (POA_Evolution_MessageList *) g_new0 (GnomeObjectServant, 1);
servant->vepv = &evolution_message_list_vepv;
CORBA_exception_init (&ev);
POA_Evolution_MessageList__init ((PortableServer_Servant) servant, &ev);
if (ev._major != CORBA_NO_EXCEPTION){
g_free (servant);
CORBA_exception_free (&ev);
return CORBA_OBJECT_NIL;
}
CORBA_exception_free (&ev);
return (Evolution_MessageList) gnome_object_activate_servant (object, servant);
}
GnomeObject *
message_list_new (void)
{
Evolution_MessageList corba_object;
MessageList *message_list;
message_list = gtk_type_new (message_list_get_type ());
corba_object = create_corba_message_list (GNOME_OBJECT (message_list));
if (corba_object == CORBA_OBJECT_NIL){
gtk_object_destroy (GTK_OBJECT (message_list));
return NULL;
}
message_list_construct (message_list, corba_object);
return GNOME_OBJECT (message_list);
}
void
message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder)
{
g_return_if_fail (message_list != NULL);
g_return_if_fail (camel_folder != NULL);
g_return_if_fail (IS_MESSAGE_LIST (message_list));
g_return_if_fail (CAMEL_IS_FOLDER (camel_folder));
g_return_if_fail (camel_has_summary_capability (camel_folder));
if (message_list->folder)
gtk_object_unref (GTK_OBJECT (message_list->folder));
message_list->folder = camel_folder;
message_list->folder_summary = camel_folder_get_summary (camel_folder);
gtk_object_ref (GTK_OBJECT (camel_folder));
e_table_model_changed (message_list->table_model);
}
GtkWidget *
message_list_get_widget (MessageList *message_list)
{
return message_list->etable;
}
E_MAKE_TYPE (message_list, "MessageList", MessageList, message_list_class_init, message_list_init, PARENT_TYPE);

60
mail/message-list.h Normal file
View File

@ -0,0 +1,60 @@
#ifndef _MESSAGE_LIST_H_
#define _MESSAGE_LIST_H_
#include <bonobo/gnome-main.h>
#include <bonobo/gnome-object.h>
#include "camel/camel-folder.h"
#define MESSAGE_LIST_TYPE (message_list_get_type ())
#define MESSAGE_LIST(o) (GTK_CHECK_CAST ((o), MESSAGE_LIST_TYPE, MessageList))
#define MESSAGE_LIST_CLASS(k) (GTK_CHECK_CLASS_CAST((k), MESSAGE_LIST_TYPE, MessageListClass))
#define IS_MESSAGE_LIST(o) (GTK_CHECK_TYPE ((o), MESSAGE_LIST_TYPE))
#define IS_MESSAGE_LIST_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), MESSAGE_LIST_TYPE))
typedef struct _Renderer Renderer;
enum {
COL_ONLINE_STATUS,
COL_MESSAGE_STATUS,
COL_PRIORITY,
COL_ATTACHMENT,
COL_FROM,
COL_SUBJECT,
COL_SENT,
COL_RECEIVE,
COL_TO,
COL_SIZE,
COL_LAST
};
typedef struct {
GnomeObject parent;
ETableModel *table_model;
ETableHeader *header_model;
ETableCol *table_cols [COL_LAST];
ECell *render_text;
ECell *render_online_status;
ECell *render_message_status;
ECell *render_priority;
ECell *render_attachment;
GtkWidget *etable;
CamelFolder *folder;
CamelFolderSummary *folder_summary;
} MessageList;
typedef struct {
GnomeObjectClass parent_class;
} MessageListClass;
GtkType message_list_get_type (void);
GnomeObject *message_list_new (void);
void message_list_set_folder (MessageList *message_list,
CamelFolder *camel_folder);
GtkWidget *message_list_get_widget (MessageList *message_list);
#endif /* _MESSAGE_LIST_H_ */