Bonobization of the message composer, part 1.

svn path=/trunk/; revision=2012
This commit is contained in:
Ettore Perazzoli
2000-03-02 11:19:39 +00:00
parent da08b761fb
commit d932fda48b
5 changed files with 188 additions and 36 deletions

View File

@ -1,5 +1,28 @@
2000-03-02 Ettore Perazzoli <ettore@helixcode.com>
* e-msg-composer.c (e_msg_composer_new): Precondition:
gtk_main_level() greater than zero.
(e_msg_composer_construct): Likewise.
(create_menus): New function. Set up menus through
BonoboUIHandler.
(e_msg_composer_construct): Use it.
* main.c (main): Initialize Bonobo.
* e-msg-composer.c (init): Initialize `uih' and `editor' to NULL.
Do not init `text' and `text_scrolled_window' anymore.
(destroy): Unref `uih'.
(e_msg_composer_construct): Create a new BonoboUIHandler and put
it into `uih'.
(create_editor): New helper function.
(e_msg_composer_construct): Use it to set up the editor.
* e-msg-composer.h: New member `uih' in `EMsgComposer'. Removed
members `text', `text_scrolled_window'. New member `editor'.
* Makefile.am (INCLUDES): Add `$(BONOBO_GNOME_CFLAGS)'.
(evolution_msg_composer_LDADD): Add `$(BONOBO_GNOME_LIBS)'.
* e-msg-composer.c (glade_connect): Removed.
(setup_signals): Removed.
(e_msg_composer_construct): Do not use libglade to set the toolbar

View File

@ -9,7 +9,8 @@ INCLUDES = \
-I$(top_builddir) \
-I$(top_srcdir)/camel \
-I$(top_builddir)/camel \
$(GNOME_INCLUDEDIR)
$(GNOME_INCLUDEDIR) \
$(BONOBO_GNOME_CFLAGS)
CPPFLAGS = \
-DE_GLADEDIR=\"$(gladedir)\"
@ -34,6 +35,7 @@ evolution_msg_composer_SOURCES = \
evolution_msg_composer_LDADD = \
$(top_builddir)/camel/libcamel.la \
$(BONOBO_GNOME_LIBS) \
$(GNOME_LIBDIR) \
$(GNOMEUI_LIBS) \
$(INTLLIBS) \

View File

@ -35,7 +35,11 @@
#endif
#include <gnome.h>
#include <libgnorba/gnorba.h>
#include <bonobo.h>
#include <glade/glade.h>
#include <camel/camel.h>
#include "e-msg-composer.h"
@ -58,6 +62,25 @@ static guint signals[LAST_SIGNAL] = { 0 };
static GnomeAppClass *parent_class = NULL;
static GtkWidget *
create_editor (EMsgComposer *composer)
{
GtkWidget *control;
Bonobo_UIHandler corba_uih;
corba_uih = bonobo_object_corba_objref (BONOBO_OBJECT (composer->uih));
/* FIXME: Hardcoded value sucks! */
control = bonobo_widget_new_control ("control:html-editor", corba_uih);
if (control == NULL) {
g_warning ("Cannot get the `control:html-editor' component.");
return NULL;
}
return control;
}
static void
free_string_list (GList *list)
@ -81,7 +104,6 @@ build_message (EMsgComposer *composer)
CamelMimeMessage *new;
CamelMimeBodyPart *body_part;
CamelMultipart *multipart;
gchar *text;
new = camel_mime_message_new_with_session (NULL);
@ -91,9 +113,11 @@ build_message (EMsgComposer *composer)
multipart = camel_multipart_new ();
body_part = camel_mime_body_part_new ();
#if 0
text = gtk_editable_get_chars (GTK_EDITABLE (composer->text), 0, -1);
camel_mime_part_set_text (CAMEL_MIME_PART (body_part), text);
camel_multipart_add_part (multipart, body_part);
#endif
e_msg_composer_attachment_bar_to_multipart
(E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar),
@ -273,6 +297,75 @@ attachment_bar_changed (EMsgComposerAttachmentBar *bar,
e_msg_composer_show_attachments (composer, FALSE);
}
/* Menu bar implementation. */
static GnomeUIInfo file_tree[] = {
GNOMEUIINFO_MENU_OPEN_ITEM (NULL, NULL),
GNOMEUIINFO_MENU_SAVE_ITEM (NULL, NULL),
GNOMEUIINFO_MENU_SAVE_AS_ITEM (NULL, NULL),
GNOMEUIINFO_ITEM_NONE (N_("Save in _folder..."), N_("Save the message in a specified folder"), NULL),
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_ITEM_STOCK (N_("Send"), N_("Send the message"), NULL, GNOME_STOCK_MENU_MAIL_SND),
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_MENU_EXIT_ITEM (NULL, NULL),
GNOMEUIINFO_END
};
static GnomeUIInfo view_tree[] = {
GNOMEUIINFO_ITEM_STOCK (N_("View _attachments"), N_("View/hide attachments"), NULL, GNOME_STOCK_MENU_ATTACH),
GNOMEUIINFO_END
};
static GnomeUIInfo menubar_info[] = {
GNOMEUIINFO_MENU_FILE_TREE (file_tree),
GNOMEUIINFO_MENU_VIEW_TREE (view_tree),
GNOMEUIINFO_END
};
static void
create_menubar (EMsgComposer *composer)
{
BonoboUIHandler *uih;
BonoboUIHandlerMenuItem *list;
uih = composer->uih;
bonobo_ui_handler_create_menubar (uih);
list = bonobo_ui_handler_menu_parse_uiinfo_list (menubar_info);
bonobo_ui_handler_menu_add_list (uih, "/", list);
}
/* Toolbar implementation. */
static GnomeUIInfo toolbar_info[] = {
GNOMEUIINFO_ITEM_STOCK (N_("Send"), N_("Send this message"), NULL, GNOME_STOCK_PIXMAP_MAIL_SND),
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_ITEM_STOCK (N_("Cut"), N_("Cut selected region into the clipboard"), NULL, GNOME_STOCK_PIXMAP_CUT),
GNOMEUIINFO_ITEM_STOCK (N_("Copy"), N_("Copy selected region into the clipboard"), NULL, GNOME_STOCK_PIXMAP_COPY),
GNOMEUIINFO_ITEM_STOCK (N_("Paste"), N_("Paste selected region into the clipboard"), NULL, GNOME_STOCK_PIXMAP_PASTE),
GNOMEUIINFO_ITEM_STOCK (N_("Undo"), N_("Undo last operation"), NULL, GNOME_STOCK_PIXMAP_UNDO),
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_ITEM_STOCK (N_("Attach"), N_("Attach a file"), NULL, GNOME_STOCK_PIXMAP_ATTACH),
GNOMEUIINFO_END
};
static void
create_toolbar (EMsgComposer *composer)
{
BonoboUIHandler *uih;
BonoboUIHandlerToolbarItem *list;
uih = composer->uih;
bonobo_ui_handler_create_toolbar (uih, "Toolbar");
list = bonobo_ui_handler_toolbar_parse_uiinfo_list (toolbar_info);
bonobo_ui_handler_toolbar_add_list (uih, "/Toolbar", list);
}
/* GtkObject methods. */
@ -283,6 +376,11 @@ destroy (GtkObject *object)
composer = E_MSG_COMPOSER (object);
bonobo_object_unref (BONOBO_OBJECT (composer->uih));
/* FIXME? I assume the Bonobo widget will get destroyed
normally? */
if (composer->address_dialog != NULL)
gtk_widget_destroy (composer->address_dialog);
@ -324,10 +422,11 @@ class_init (EMsgComposerClass *klass)
static void
init (EMsgComposer *composer)
{
composer->uih = NULL;
composer->hdrs = NULL;
composer->text = NULL;
composer->text_scrolled_window = NULL;
composer->editor = NULL;
composer->address_dialog = NULL;
@ -371,34 +470,30 @@ e_msg_composer_construct (EMsgComposer *composer)
{
GtkWidget *vbox;
g_return_if_fail (gtk_main_level () > 0);
gtk_window_set_default_size (GTK_WINDOW (composer),
DEFAULT_WIDTH, DEFAULT_HEIGHT);
gnome_app_construct (GNOME_APP (composer), "e-msg-composer",
"Compose a message");
composer->uih = bonobo_ui_handler_new ();
bonobo_ui_handler_set_app (composer->uih, GNOME_APP (composer));
vbox = gtk_vbox_new (FALSE, 0);
composer->hdrs = e_msg_composer_hdrs_new ();
gtk_box_pack_start (GTK_BOX (vbox), composer->hdrs, FALSE, TRUE, 0);
gtk_widget_show (composer->hdrs);
/* GtkText for message body editing, wrapped into a
GtkScrolledWindow. */
/* Editor component. */
composer->text_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy
(GTK_SCROLLED_WINDOW (composer->text_scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
composer->text = gtk_text_new (NULL, NULL);
gtk_text_set_word_wrap (GTK_TEXT (composer->text), FALSE);
gtk_text_set_editable (GTK_TEXT (composer->text), TRUE);
gtk_container_add (GTK_CONTAINER (composer->text_scrolled_window),
composer->text);
gtk_widget_show (composer->text);
gtk_box_pack_start (GTK_BOX (vbox), composer->text_scrolled_window,
TRUE, TRUE, 0);
gtk_widget_show (composer->text_scrolled_window);
composer->editor = create_editor (composer);
gtk_widget_show (composer->editor);
gtk_box_pack_start (GTK_BOX (vbox), composer->editor, TRUE, TRUE, 0);
gtk_widget_show (composer->editor);
/* Attachment editor, wrapped into a GtkScrolledWindow. We don't
show it for now. */
@ -420,12 +515,16 @@ e_msg_composer_construct (EMsgComposer *composer)
gtk_widget_show (vbox);
e_msg_composer_show_attachments (composer, FALSE);
create_menubar (composer);
create_toolbar (composer);
}
/**
* e_msg_composer_new:
*
* Create a new message composer widget.
* Create a new message composer widget. This function must be called
* within the GTK+ main loop, or it will fail.
*
* Return value: A pointer to the newly created widget
**/
@ -433,6 +532,8 @@ GtkWidget *
e_msg_composer_new (void)
{
GtkWidget *new;
g_return_val_if_fail (gtk_main_level () > 0, NULL);
new = gtk_type_new (e_msg_composer_get_type ());
e_msg_composer_construct (E_MSG_COMPOSER (new));

View File

@ -25,7 +25,7 @@
#define ___E_MSG_COMPOSER_H__
#include <gnome.h>
#include <glade/glade.h>
#include <bonobo.h>
#include "e-msg-composer-attachment-bar.h"
#include "e-msg-composer-hdrs.h"
@ -49,10 +49,11 @@ typedef struct _EMsgComposerClass EMsgComposerClass;
struct _EMsgComposer {
GnomeApp parent;
BonoboUIHandler *uih;
GtkWidget *hdrs;
GtkWidget *text;
GtkWidget *text_scrolled_window;
GtkWidget *editor;
GtkWidget *attachment_bar;
GtkWidget *attachment_scrolled_window;
@ -70,11 +71,12 @@ struct _EMsgComposerClass {
};
GtkType e_msg_composer_get_type (void);
void e_msg_composer_construct (EMsgComposer *composer);
GtkWidget *e_msg_composer_new (void);
void e_msg_composer_show_attachments (EMsgComposer *composer, gboolean show);
CamelMimeMessage *e_msg_composer_get_message (EMsgComposer *composer);
GtkType e_msg_composer_get_type (void);
void e_msg_composer_construct (EMsgComposer *composer);
GtkWidget *e_msg_composer_new (void);
void e_msg_composer_show_attachments (EMsgComposer *composer,
gboolean show);
CamelMimeMessage *e_msg_composer_get_message (EMsgComposer *composer);
#ifdef __cplusplus
}

View File

@ -1,6 +1,10 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
#include <gnome.h>
#include <libgnorba/gnorba.h>
#include <bonobo.h>
#include <glade/glade.h>
#include <camel/camel-data-wrapper.h>
#include <camel/camel-stream-fs.h>
@ -32,21 +36,41 @@ send_cb (EMsgComposer *composer,
#endif
}
int
main (int argc, char **argv)
static guint
create_composer (void)
{
GtkWidget *composer;
gnome_init ("test", "0.0", argc, argv);
glade_gnome_init ();
composer = e_msg_composer_new ();
gtk_widget_show (composer);
gtk_signal_connect (GTK_OBJECT (composer), "send",
GTK_SIGNAL_FUNC (send_cb), NULL);
gtk_signal_connect (GTK_OBJECT (composer), "send", GTK_SIGNAL_FUNC (send_cb), NULL);
gtk_main ();
return FALSE;
}
int
main (int argc, char **argv)
{
CORBA_Environment ev;
CORBA_ORB orb;
CORBA_exception_init (&ev);
gnome_CORBA_init ("evolution-test-msg-composer", "0.0", &argc, argv, 0, &ev);
CORBA_exception_free (&ev);
orb = gnome_CORBA_ORB ();
glade_gnome_init ();
if (bonobo_init (orb, NULL, NULL) == FALSE)
g_error ("Could not initialize Bonobo\n");
/* We can't make any CORBA calls unless we're in the main loop. So we
delay creating the container here. */
gtk_idle_add ((GtkFunction) create_composer, NULL);
bonobo_main ();
return 0;
}