~ubuntu-branches/ubuntu/trusty/gtkhtml3.14/trusty-proposed

« back to all changes in this revision

Viewing changes to components/html-editor/htmlsourceview.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2007-03-13 11:26:39 UTC
  • Revision ID: james.westby@ubuntu.com-20070313112639-5calgv5774i4f95v
Tags: upstream-3.14.0
ImportĀ upstreamĀ versionĀ 3.14.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 
2
/*  This file is part of the GtkHTML library.
 
3
 
 
4
    Copyright (C) 2000 Helix Code, Inc.
 
5
 
 
6
    This library is free software; you can redistribute it and/or
 
7
    modify it under the terms of the GNU Library General Public
 
8
    License as published by the Free Software Foundation; either
 
9
    version 2 of the License, or (at your option) any later version.
 
10
 
 
11
    This library is distributed in the hope that it will be useful,
 
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
    Library General Public License for more details.
 
15
 
 
16
    You should have received a copy of the GNU Library General Public License
 
17
    along with this library; see the file COPYING.LIB.  If not, write to
 
18
    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 
19
    Boston, MA 02111-1307, USA.
 
20
 
 
21
    Author: Larry Ewing <lewing@ximian.com>
 
22
 
 
23
*/
 
24
 
 
25
#include <config.h>
 
26
#ifdef GNOME_GTKHTML_EDITOR_SHLIB
 
27
#include <glib/gi18n-lib.h>
 
28
#else
 
29
#include <glib/gi18n.h>
 
30
#endif
 
31
#include <string.h>
 
32
#include <fcntl.h>
 
33
#include <sys/stat.h>
 
34
#include <gtk/gtk.h>
 
35
#include <libgnome/gnome-util.h>
 
36
#include <bonobo/bonobo-stream.h>
 
37
#include <bonobo/bonobo-stream-memory.h>
 
38
#include <bonobo/bonobo-exception.h>
 
39
 
 
40
#include "gtkhtml.h"
 
41
#include "htmlengine.h"
 
42
#include "gtkhtml-stream.h"
 
43
#include "htmlsourceview.h"
 
44
#include "e-html-utils.h"
 
45
 
 
46
struct _HTMLSourceViewPrivate {
 
47
        GtkHTML   *html;
 
48
        CORBA_Object pstream;
 
49
        char    *content_type;
 
50
        gint     current_interval;
 
51
        gint     timer_id;
 
52
        gboolean as_html;
 
53
};
 
54
 
 
55
enum {
 
56
        UPDATE,
 
57
        LAST_SIGNAL
 
58
};
 
59
 
 
60
static GtkObject *parent_class;
 
61
static guint      signals [LAST_SIGNAL] = { 0 };
 
62
 
 
63
static void
 
64
html_source_view_real_update (HTMLSourceView *view)
 
65
{
 
66
}
 
67
 
 
68
static void
 
69
html_source_view_load (HTMLSourceView *view)
 
70
{
 
71
        BonoboObject *smem;
 
72
        GtkHTMLStream *hstream;
 
73
        CORBA_Environment ev;
 
74
        CORBA_Object pstream;
 
75
        const char *text;
 
76
        char *html;
 
77
 
 
78
        CORBA_exception_init (&ev);
 
79
 
 
80
        pstream = view->priv->pstream;
 
81
        smem = bonobo_stream_mem_create (NULL, 1, FALSE, TRUE);
 
82
        Bonobo_PersistStream_save (pstream, BONOBO_OBJREF (smem), view->priv->content_type, &ev);
 
83
        /* Terminate the buffer for e_text_to_html */
 
84
        bonobo_stream_client_write (BONOBO_OBJREF (smem), "", 1, &ev);
 
85
 
 
86
        text = bonobo_stream_mem_get_buffer (BONOBO_STREAM_MEM (smem));
 
87
 
 
88
        if (!view->priv->as_html) {
 
89
                html = e_text_to_html_full (text, E_TEXT_TO_HTML_PRE | E_TEXT_TO_HTML_CONVERT_SPACES, 0);
 
90
        } else {
 
91
                html = g_strdup (text);
 
92
        }
 
93
 
 
94
        hstream = gtk_html_begin (view->priv->html);
 
95
        view->priv->html->engine->newPage = FALSE;
 
96
 
 
97
        gtk_html_stream_write (hstream, html, strlen (html));
 
98
        gtk_html_stream_close (hstream, GTK_HTML_STREAM_OK);
 
99
 
 
100
        bonobo_object_unref (BONOBO_OBJECT (smem));
 
101
        g_free (html);
 
102
 
 
103
        CORBA_exception_free (&ev);
 
104
}
 
105
 
 
106
static gint
 
107
html_source_view_timeout (gpointer *data)
 
108
{
 
109
        HTMLSourceView *view;
 
110
        
 
111
        g_return_val_if_fail (HTML_IS_SOURCE_VIEW (data), FALSE);
 
112
 
 
113
        view = HTML_SOURCE_VIEW (data);
 
114
        html_source_view_load (view);
 
115
 
 
116
        return TRUE;
 
117
}
 
118
 
 
119
void
 
120
html_source_view_set_timeout (HTMLSourceView *view, guint timeout)
 
121
{
 
122
        if (view->priv->timer_id)
 
123
                g_source_remove (view->priv->timer_id);
 
124
        
 
125
        view->priv->current_interval = timeout;
 
126
        view->priv->timer_id = g_timeout_add (timeout, (GtkFunction)html_source_view_timeout, view);
 
127
}
 
128
 
 
129
void
 
130
html_source_view_set_mode (HTMLSourceView *view, gboolean as_html)
 
131
{
 
132
        view->priv->as_html = as_html;
 
133
}
 
134
 
 
135
void
 
136
html_source_view_set_source (HTMLSourceView *view, BonoboWidget *control, char *content_type)
 
137
{
 
138
        CORBA_Object interface;
 
139
        CORBA_Environment ev;
 
140
        g_return_if_fail (HTML_IS_SOURCE_VIEW (view));
 
141
 
 
142
        CORBA_exception_init (&ev);
 
143
        interface = Bonobo_Unknown_queryInterface (bonobo_widget_get_objref (control),
 
144
                                                   "IDL:Bonobo/PersistStream:1.0", &ev);
 
145
        if (BONOBO_EX (&ev) || interface == CORBA_OBJECT_NIL) {
 
146
                g_warning ("Couldn't find persist stream interface");
 
147
                return;
 
148
        }
 
149
 
 
150
        g_free (view->priv->content_type);
 
151
        view->priv->content_type = g_strdup (content_type);
 
152
 
 
153
        view->priv->pstream = interface;
 
154
 
 
155
        html_source_view_set_timeout (view, view->priv->current_interval);
 
156
}
 
157
 
 
158
GtkWidget *
 
159
html_source_view_new (void)
 
160
{
 
161
        GtkWidget *view;
 
162
 
 
163
        view = GTK_WIDGET (g_object_new (html_source_view_get_type (), NULL));
 
164
        
 
165
        return view;
 
166
}
 
167
 
 
168
static void
 
169
html_source_view_init (HTMLSourceView *view)
 
170
{
 
171
        GtkWidget *html;
 
172
        GtkWidget *scroll;
 
173
 
 
174
        view->priv = g_new0 (HTMLSourceViewPrivate, 1);
 
175
 
 
176
        view->priv->content_type = NULL;
 
177
        view->priv->html = GTK_HTML (html = gtk_html_new ());
 
178
        view->priv->current_interval = 500;
 
179
        view->priv->as_html = FALSE;
 
180
        
 
181
        scroll = gtk_scrolled_window_new (NULL, NULL);
 
182
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
 
183
                                        GTK_POLICY_AUTOMATIC,
 
184
                                        GTK_POLICY_AUTOMATIC);
 
185
 
 
186
        gtk_container_add (GTK_CONTAINER (scroll), html);
 
187
 
 
188
        gtk_box_pack_start (GTK_BOX (view), scroll,
 
189
                            TRUE, TRUE, 0);
 
190
 
 
191
        gtk_widget_show_all (scroll);
 
192
}
 
193
 
 
194
static void
 
195
html_source_view_destroy (GtkObject *object)
 
196
{
 
197
        HTMLSourceView *view = HTML_SOURCE_VIEW (object);
 
198
        HTMLSourceViewPrivate *priv = view->priv;
 
199
 
 
200
        if (priv) {
 
201
                if (priv->timer_id)
 
202
                        g_source_remove (priv->timer_id);
 
203
                priv->timer_id = 0;
 
204
                
 
205
                if (priv->pstream != CORBA_OBJECT_NIL) {
 
206
                        CORBA_Environment ev;
 
207
                        
 
208
                        CORBA_exception_init (&ev);
 
209
                        Bonobo_Unknown_unref (priv->pstream, &ev);
 
210
                        CORBA_Object_release (priv->pstream, &ev);
 
211
                        CORBA_exception_free (&ev);
 
212
                }
 
213
                
 
214
                g_free (view->priv);
 
215
                view->priv = NULL;
 
216
        }
 
217
                
 
218
        if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL)
 
219
                (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
 
220
}
 
221
 
 
222
static void
 
223
html_source_view_class_init (HTMLSourceViewClass *klass)
 
224
{
 
225
        GtkObjectClass *object_class;
 
226
 
 
227
        object_class = (GtkObjectClass *) klass;
 
228
        parent_class = gtk_type_class (GTK_TYPE_VBOX);
 
229
 
 
230
        signals [UPDATE] = g_signal_new ("update",
 
231
                                         G_TYPE_FROM_CLASS (object_class),
 
232
                                         G_SIGNAL_RUN_FIRST,
 
233
                                         G_STRUCT_OFFSET (HTMLSourceViewClass, update),
 
234
                                         NULL, NULL,
 
235
                                         g_cclosure_marshal_VOID__VOID,
 
236
                                         G_TYPE_NONE, 0);
 
237
        
 
238
        object_class->destroy = html_source_view_destroy;
 
239
        klass->update = html_source_view_real_update;
 
240
}
 
241
 
 
242
GtkType
 
243
html_source_view_get_type (void)
 
244
{
 
245
        static GType view_type = 0;
 
246
        
 
247
        if (!view_type) {
 
248
                GTypeInfo view_info = {
 
249
                        sizeof (HTMLSourceViewClass),
 
250
                        NULL,
 
251
                        NULL,
 
252
                        (GClassInitFunc) html_source_view_class_init,
 
253
                        NULL,
 
254
                        NULL,
 
255
                        sizeof (HTMLSourceView),
 
256
                        1,
 
257
                        (GInstanceInitFunc) html_source_view_init,
 
258
                };
 
259
 
 
260
                view_type = g_type_register_static (GTK_TYPE_VBOX, "HTMLView", &view_info, 0);
 
261
        }
 
262
        
 
263
        return view_type;
 
264
}