1 /* -*- Mode: C; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 3 -*- */
2 
3 /*
4  * GImageView
5  * Copyright (C) 2001 Takuro Ashie
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  *
21  * $Id: text_viewer.c,v 1.8 2003/06/13 09:43:38 makeinu Exp $
22  */
23 
24 #include <stdio.h>
25 
26 #include "gimageview.h"
27 #include "charset.h"
28 #include "prefs.h"
29 #include "text_viewer.h"
30 
31 static void
cb_text_viewer_destroy(GtkWidget * widget,TextViewer * text_viewer)32 cb_text_viewer_destroy (GtkWidget *widget, TextViewer *text_viewer)
33 {
34    g_return_if_fail (text_viewer);
35 
36    if (text_viewer->filename)
37       g_free (text_viewer->filename);
38 
39    g_free (text_viewer);
40 }
41 
42 
43 gboolean
text_viewer_load_file(TextViewer * text_viewer,gchar * filename)44 text_viewer_load_file (TextViewer *text_viewer, gchar *filename)
45 {
46    FILE *textfile;
47    gchar *tmpstr;
48    gchar buf[BUF_SIZE];
49 
50    g_return_val_if_fail (text_viewer && filename, FALSE);
51 
52    if (text_viewer->filename) {
53 #ifdef USE_GTK2
54       {
55          GtkTextBuffer *buffer;
56          buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_viewer->textbox));
57          gtk_text_buffer_set_text (buffer, "\0", -1);
58       }
59 #else
60       {
61          GtkText *text = GTK_TEXT (text_viewer->textbox);
62          gtk_text_backward_delete (text, gtk_text_get_length(text));
63       }
64 #endif
65       g_free (text_viewer->filename);
66       text_viewer->filename = NULL;
67    }
68 
69    textfile = fopen (filename, "r");
70    if (!textfile) {
71       g_warning (_("Can't open text file: %s\n"), filename);
72       return FALSE;
73    }
74 
75 #ifdef USE_GTK2
76    {
77       GtkTextBuffer *buffer;
78       gchar *text;
79 
80       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_viewer->textbox));
81 
82       text = g_strdup ("");
83       while (fgets (buf, sizeof(buf), textfile)) {
84          gchar  *tmpstr, *prev;
85          tmpstr = charset_to_internal (buf, NULL, NULL,
86                                        CHARSET_TO_INTERNAL_LOCALE);
87          prev = text;
88          text = g_strconcat (text, tmpstr, NULL);
89          g_free (prev);
90       }
91       gtk_text_buffer_set_text (buffer, text, -1);
92       g_free (text);
93    }
94 #else
95    {
96       GtkText *text = GTK_TEXT (text_viewer->textbox);
97       GdkFont *font;
98 
99       if (conf.textentry_font && *conf.textentry_font)
100          font = gdk_fontset_load (conf.textentry_font);
101       else
102          font = NULL;
103 
104       gtk_text_freeze (text);
105       while (fgets (buf, sizeof(buf), textfile)) {
106          gtk_text_insert (text, font, NULL, NULL, buf, -1);
107       }
108       gtk_text_thaw (text);
109 
110       if (font)
111          gdk_font_unref (font);
112    }
113 #endif
114 
115    fclose (textfile);
116 
117    tmpstr = g_strconcat (_("File Name: "), filename, NULL);
118    gtk_statusbar_push(GTK_STATUSBAR (text_viewer->statusbar), 1, tmpstr);
119    g_free (tmpstr);
120 
121    text_viewer->filename = g_strdup (filename);
122 
123    return TRUE;
124 }
125 
126 
127 TextViewer *
text_viewer_create(gchar * filename)128 text_viewer_create (gchar *filename)
129 {
130    TextViewer *text_viewer;
131    GtkWidget *window, *vbox;
132    GtkWidget *scrolledwin, *text;
133    GtkWidget *statusbar;
134 
135    text_viewer = g_new0 (TextViewer, 1);
136    text_viewer->filename = NULL;
137 
138    /* window */
139    text_viewer->window = window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
140    gtk_window_set_title (GTK_WINDOW (window), GIMV_PROG_NAME" -Text Viewer-");
141    gtk_window_set_default_size (GTK_WINDOW(window), 600, 500);
142    gtk_widget_show (window);
143    gtk_signal_connect (GTK_OBJECT (window), "destroy",
144                        GTK_SIGNAL_FUNC (cb_text_viewer_destroy), text_viewer);
145 
146    /* main vbox */
147    vbox = gtk_vbox_new (FALSE, 0);
148    gtk_container_add (GTK_CONTAINER (window), vbox);
149    gtk_widget_show (vbox);
150 
151    /* text box */
152    scrolledwin = gtk_scrolled_window_new (NULL, NULL);
153    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrolledwin),
154                                    GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
155    gtk_box_pack_start (GTK_BOX (vbox), scrolledwin, TRUE, TRUE, 0);
156    gtk_widget_show (scrolledwin);
157 
158 #ifdef USE_GTK2
159    text = gtk_text_view_new ();
160 #else
161    text = gtk_text_new (gtk_scrolled_window_get_hadjustment
162                         (GTK_SCROLLED_WINDOW (scrolledwin)),
163                         gtk_scrolled_window_get_vadjustment
164                         (GTK_SCROLLED_WINDOW (scrolledwin)));
165 #endif
166    text_viewer->textbox = text;
167    gtk_container_add (GTK_CONTAINER (scrolledwin), text);
168    gtk_widget_show (text);
169 
170    /* statusbar */
171    text_viewer->statusbar = statusbar = gtk_statusbar_new ();
172    gtk_container_border_width (GTK_CONTAINER (statusbar), 1);
173    gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, TRUE, 0);
174    gtk_statusbar_push(GTK_STATUSBAR (statusbar), 1, "New Window");
175    gtk_widget_show (statusbar);
176 
177    /* set text from file */
178    if (filename)
179       text_viewer_load_file (text_viewer, filename);
180 
181    return text_viewer;
182 }
183