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