* initial code dump into SVN; needs some work
[modest] / src / gtk / modest-edit-window.c
1 /* modest-edit-window.c */
2
3 /* insert (c)/licensing information) */
4
5 #include <gtk/gtk.h>
6 #include <string.h>
7 #include "modest-edit-window.h"
8
9
10 #ifdef HAVE_CONFIG_H
11 #include <config.h>
12 #endif /*HAVE_CONFIG_H*/
13
14 #include <glib/gi18n.h>
15
16 /* include other impl specific header files */
17
18 /* 'private'/'protected' functions */
19 static void                    modest_edit_window_class_init    (ModestEditWindowClass *klass);
20 static void                    modest_edit_window_init          (ModestEditWindow *obj);
21 static void                    modest_edit_window_finalize      (GObject *obj);
22
23
24 static GtkWidget* modest_edit_window_toolbar (void);
25
26 static void on_send_clicked (GtkToolButton *button, gpointer data);
27 static void on_cut_clicked (GtkToolButton *button, gpointer data);
28 static void on_copy_clicked (GtkToolButton *button, gpointer data);
29 static void on_paste_clicked (GtkToolButton *button, gpointer data);
30 static void on_quit_clicked (GtkToolButton *button, gpointer data);
31 static void on_save_clicked (GtkToolButton *button, gpointer data);
32
33
34
35 /* list my signals */
36 enum {
37         /* MY_SIGNAL_1, */
38         /* MY_SIGNAL_2, */
39         LAST_SIGNAL
40 };
41
42 typedef struct _ModestEditWindowPrivate ModestEditWindowPrivate;
43 struct _ModestEditWindowPrivate {
44
45         GtkEntry      *to_entry;
46         GtkEntry      *cc_entry;
47         GtkEntry      *bcc_entry;
48         GtkEntry      *subject_entry;
49
50         GtkTextView   *body_text;
51         GtkStatusbar  *status_bar;
52         
53 };
54 #define MODEST_EDIT_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
55                                                 MODEST_TYPE_EDIT_WINDOW, \
56                                                 ModestEditWindowPrivate))
57 /* globals */
58 static GtkWindowClass *parent_class = NULL;
59
60 /* uncomment the following if you have defined any signals */
61 /* static guint signals[LAST_SIGNAL] = {0}; */
62
63 GType
64 modest_edit_window_get_type (void)
65 {
66         static GType my_type = 0;
67         if (!my_type) {
68                 static const GTypeInfo my_info = {
69                         sizeof(ModestEditWindowClass),
70                         NULL,           /* base init */
71                         NULL,           /* base finalize */
72                         (GClassInitFunc) modest_edit_window_class_init,
73                         NULL,           /* class finalize */
74                         NULL,           /* class data */
75                         sizeof(ModestEditWindow),
76                         1,              /* n_preallocs */
77                         (GInstanceInitFunc) modest_edit_window_init,
78                 };
79                 my_type = g_type_register_static (GTK_TYPE_WINDOW,
80                                                   "ModestEditWindow",
81                                                   &my_info, 0);
82         }
83         return my_type;
84 }
85
86 static void
87 modest_edit_window_class_init (ModestEditWindowClass *klass)
88 {
89         GObjectClass *gobject_class;
90         gobject_class = (GObjectClass*) klass;
91
92         parent_class            = g_type_class_peek_parent (klass);
93         gobject_class->finalize = modest_edit_window_finalize;
94
95         g_type_class_add_private (gobject_class, sizeof(ModestEditWindowPrivate));
96
97         /* signal definitions go here, e.g.: */
98 /*      signals[MY_SIGNAL_1] = */
99 /*              g_signal_new ("my_signal_1",....); */
100 /*      signals[MY_SIGNAL_2] = */
101 /*              g_signal_new ("my_signal_2",....); */
102 /*      etc. */
103 }
104
105 static void
106 modest_edit_window_init (ModestEditWindow *self)
107 {
108         ModestEditWindowPrivate *priv;
109         GtkWidget *vbox;
110         GtkWidget *to_button, *cc_button, *bcc_button;
111         GtkWidget *subject_label;
112         GtkWidget *table;
113         GtkWidget *scrolled_win;
114         GtkWidget *toolbar;
115         
116         priv = MODEST_EDIT_WINDOW_GET_PRIVATE(self);
117         
118         priv->to_entry         = GTK_ENTRY(gtk_entry_new_with_max_length (255));
119         priv->cc_entry         = GTK_ENTRY(gtk_entry_new_with_max_length (255));
120         priv->bcc_entry        = GTK_ENTRY(gtk_entry_new_with_max_length (255));
121         priv->subject_entry    = GTK_ENTRY(gtk_entry_new_with_max_length (255));        
122         priv->status_bar       = GTK_STATUSBAR(gtk_statusbar_new ());
123         
124         toolbar = modest_edit_window_toolbar ();
125         
126         to_button  = gtk_button_new_with_label (_("To..."));
127         cc_button  = gtk_button_new_with_label (_("Cc..."));
128         bcc_button = gtk_button_new_with_label (_("Bcc.."));
129
130         scrolled_win = gtk_scrolled_window_new (NULL, NULL);
131         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrolled_win),
132                                         GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
133         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_win),
134                                              GTK_SHADOW_IN);
135         
136         subject_label = gtk_label_new ("Subject:");
137
138         table = gtk_table_new (4, 2, FALSE);
139
140         gtk_table_attach (GTK_TABLE(table), to_button,
141                           0, 1, 0, 1, 0, 0, 0, 0);
142         gtk_table_attach (GTK_TABLE(table), GTK_WIDGET(priv->to_entry),
143                           1, 2, 0, 1, GTK_EXPAND|GTK_FILL, 0, 0, 0);
144         
145         gtk_table_attach (GTK_TABLE(table), cc_button,
146                           0, 1, 1, 2, 0, 0, 0, 0);
147         gtk_table_attach (GTK_TABLE(table), GTK_WIDGET(priv->cc_entry),
148                           1, 2, 1, 2, GTK_EXPAND|GTK_FILL, 0, 0, 0);
149
150         gtk_table_attach (GTK_TABLE(table), bcc_button,
151                           0, 1, 2, 3, 0, 0, 0, 0);
152         gtk_table_attach (GTK_TABLE(table), GTK_WIDGET(priv->bcc_entry),
153                           1, 2, 2, 3, GTK_EXPAND|GTK_FILL, 0, 0, 0);
154
155         gtk_table_attach (GTK_TABLE(table), subject_label,
156                           0, 1, 3, 4, 0, 0, 0, 0);
157         gtk_table_attach (GTK_TABLE(table), GTK_WIDGET(priv->subject_entry),
158                           1, 2, 3, 4, GTK_EXPAND|GTK_FILL, 0, 0, 0);
159
160         priv->body_text  = GTK_TEXT_VIEW(gtk_text_view_new ());
161
162         gtk_container_add (GTK_CONTAINER(scrolled_win), GTK_WIDGET(priv->body_text));
163         
164         vbox = gtk_vbox_new (FALSE, 5);
165
166         gtk_box_pack_start (GTK_BOX(vbox), toolbar,      FALSE, TRUE,2);        
167         gtk_box_pack_start (GTK_BOX(vbox), table,        FALSE, TRUE,2);
168         gtk_box_pack_start (GTK_BOX(vbox), scrolled_win, TRUE, TRUE, 2);
169         gtk_box_pack_start (GTK_BOX(vbox), GTK_WIDGET(priv->status_bar),
170                             FALSE, TRUE, 2);
171
172         /* make everything but the top level container visible,
173          * so gtk_widget_show will work */
174         gtk_widget_show_all (vbox);
175         gtk_container_add (GTK_CONTAINER(self), vbox);
176         
177 }
178
179 static void
180 modest_edit_window_finalize (GObject *obj)
181 {
182 /*      free/unref instance resources here */
183 }
184
185
186 GtkWidget*
187 modest_edit_window_new   (const gchar *to, const gchar *cc,
188                           const gchar *bcc, const gchar *subject,
189                           const gchar *body, const GSList *attachments)
190 {
191
192         ModestEditWindowPrivate *priv;
193         GObject *obj = g_object_new(MODEST_TYPE_EDIT_WINDOW, NULL);
194         
195         priv = MODEST_EDIT_WINDOW_GET_PRIVATE(obj);
196
197         /* FIXME: valid utf-8 */
198
199         if (to)
200                 gtk_entry_set_text (priv->to_entry, to);
201         if (cc)
202                 gtk_entry_set_text (priv->cc_entry, cc);
203         if (bcc)
204                 gtk_entry_set_text (priv->bcc_entry,bcc);
205
206         if (subject)
207                 gtk_entry_set_text (priv->subject_entry, subject);
208         
209         if (body)
210                 gtk_text_buffer_insert (gtk_text_view_get_buffer(priv->body_text),
211                                         NULL, body, strlen(body));
212
213         /* FIXME: attachments */
214         
215         return GTK_WIDGET(obj);
216 }
217
218
219
220
221 static GtkWidget*
222 modest_edit_window_toolbar (void)
223 {
224         GtkWidget *toolbar;
225         GtkToolItem *send, *save, *cut, *copy, *paste, *quit;
226
227         toolbar = gtk_toolbar_new ();
228
229         /* FIXME: get a better icon */
230         send  = gtk_tool_button_new_from_stock (GTK_STOCK_MEDIA_PLAY); 
231         
232         save  = gtk_tool_button_new_from_stock (GTK_STOCK_SAVE);
233         cut   = gtk_tool_button_new_from_stock (GTK_STOCK_CUT);
234         copy  = gtk_tool_button_new_from_stock (GTK_STOCK_COPY);
235         paste = gtk_tool_button_new_from_stock (GTK_STOCK_PASTE);
236         quit  = gtk_tool_button_new_from_stock (GTK_STOCK_QUIT);
237
238         g_signal_connect (send, "clicked", G_CALLBACK(on_send_clicked),
239                           "send");
240         g_signal_connect (save, "clicked", G_CALLBACK(on_save_clicked),
241                           "save");
242         g_signal_connect (cut, "clicked", G_CALLBACK(on_cut_clicked),
243                           "cut");
244         g_signal_connect (copy, "clicked", G_CALLBACK(on_copy_clicked),
245                           "copy");
246         g_signal_connect (paste, "clicked", G_CALLBACK(on_paste_clicked),
247                           "send");
248         g_signal_connect (quit, "clicked", G_CALLBACK(on_quit_clicked),
249                           "quit");
250
251         gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(send), -1);
252         gtk_toolbar_insert (GTK_TOOLBAR(toolbar),
253                             GTK_TOOL_ITEM(gtk_separator_tool_item_new()),
254                             -1);
255         gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(save), -1);
256         gtk_toolbar_insert (GTK_TOOLBAR(toolbar),
257                             GTK_TOOL_ITEM(gtk_separator_tool_item_new()),
258                             -1);
259         
260         gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(cut), -1);
261         gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(copy), -1);
262         gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(paste), -1);
263
264         gtk_toolbar_insert (GTK_TOOLBAR(toolbar),
265                             GTK_TOOL_ITEM(gtk_separator_tool_item_new()),
266                             -1);
267         gtk_toolbar_insert (GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(quit), -1);
268
269         return toolbar;
270 }
271
272
273 static void
274 on_send_clicked (GtkToolButton *button, gpointer data)
275 {
276         g_warning ("clicked: %s", (gchar *)data);
277 }
278
279 static void
280 on_cut_clicked (GtkToolButton *button, gpointer data)
281 {
282         g_warning (__FUNCTION__);
283 }
284 static void
285 on_copy_clicked (GtkToolButton *button, gpointer data)
286 {
287         g_warning (__FUNCTION__);
288 }
289 static void
290 on_paste_clicked (GtkToolButton *button, gpointer data)
291 {
292         g_warning (__FUNCTION__);
293 }
294
295 static void
296 on_save_clicked (GtkToolButton *button, gpointer data)
297 {
298         g_warning (__FUNCTION__);
299 }
300
301
302
303 static void
304 on_quit_clicked (GtkToolButton *button, gpointer data)
305 {
306         g_warning (__FUNCTION__);
307 }
308
309