comparison src/ui_help.c @ 9:d907d608745f

Sync to GQview 1.5.9 release. ######## DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS! This CVS is never up to date with current development and is provided solely for reference purposes, please use the latest official release package when making any changes or translation updates. ########
author gqview
date Sat, 26 Feb 2005 00:13:35 +0000
parents
children 6a7298988a7a
comparison
equal deleted inserted replaced
8:e0d0593d519e 9:d907d608745f
1 /*
2 * (SLIK) SimpLIstic sKin functions
3 * (C) 2004 John Ellis
4 *
5 * Author: John Ellis
6 *
7 * This software is released under the GNU General Public License (GNU GPL).
8 * Please read the included file COPYING for more information.
9 * This software comes with no warranty of any kind, use at your own risk!
10 */
11
12 #ifdef HAVE_CONFIG_H
13 # include "config.h"
14 #endif
15 #include "intl.h"
16
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20
21 #include <gtk/gtk.h>
22
23 #include "ui_help.h"
24
25 #include "ui_fileops.h"
26 #include "ui_misc.h"
27
28
29 #define HELP_WINDOW_WIDTH 620
30 #define HELP_WINDOW_HEIGHT 350
31
32
33 /*
34 *-----------------------------------------------------------------------------
35 * 'help' window
36 *-----------------------------------------------------------------------------
37 */
38
39 #define SCROLL_MARKNAME "scroll_point"
40
41 static void help_window_scroll(GtkWidget *text, const gchar *key)
42 {
43 gchar *needle;
44 GtkTextBuffer *buffer;
45 GtkTextIter iter;
46 GtkTextIter start, end;
47
48 if (!text || !key) return;
49
50 needle = g_strdup_printf("[section:%s]", key);
51
52 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
53 gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
54
55 if (gtk_text_iter_forward_search(&iter, needle, GTK_TEXT_SEARCH_TEXT_ONLY,
56 &start, &end, NULL))
57 {
58 gint line;
59 GtkTextMark *mark;
60
61 line = gtk_text_iter_get_line(&start);
62 gtk_text_buffer_get_iter_at_line_offset(buffer, &iter, line, 0);
63 gtk_text_buffer_place_cursor(buffer, &iter);
64
65 #if 0
66 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(text), &iter, 0.0, TRUE, 0, 0);
67 #endif
68
69 /* apparently only scroll_to_mark works when the textview is not visible yet */
70
71 /* if mark exists, move it instead of creating one for every scroll */
72 mark = gtk_text_buffer_get_mark(buffer, SCROLL_MARKNAME);
73 if (mark)
74 {
75 gtk_text_buffer_move_mark(buffer, mark, &iter);
76 }
77 else
78 {
79 mark = gtk_text_buffer_create_mark(buffer, SCROLL_MARKNAME, &iter, FALSE);
80 }
81 gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(text), mark, 0.0, TRUE, 0, 0);
82 }
83
84 g_free(needle);
85 }
86
87 static void help_window_load_text(GtkWidget *text, const gchar *path)
88 {
89 gchar *pathl;
90 FILE *f;
91 gchar s_buf[1024];
92 GtkTextBuffer *buffer;
93 GtkTextIter iter;
94 GtkTextIter start, end;
95
96 if (!text || !path) return;
97
98 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
99
100 gtk_text_buffer_get_bounds(buffer, &start, &end);
101 gtk_text_buffer_delete(buffer, &start, &end);
102
103 gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
104
105 pathl = path_from_utf8(path);
106 f = fopen(pathl, "r");
107 g_free(pathl);
108 if (!f)
109 {
110 gchar *buf;
111 buf = g_strdup_printf(_("Unable to load:\n%s"), path);
112 gtk_text_buffer_insert(buffer, &iter, buf, -1);
113 g_free(buf);
114 }
115 else
116 {
117 while (fgets(s_buf, sizeof(s_buf), f))
118 {
119 gchar *buf;
120 gint l;
121
122 l = strlen(s_buf);
123
124 if (!g_utf8_validate(s_buf, l, NULL))
125 {
126 buf = g_locale_to_utf8(s_buf, strlen(s_buf), NULL, NULL, NULL);
127 if (!buf) buf = g_strdup("\n");
128 }
129 else
130 {
131 buf = NULL;
132 }
133 gtk_text_buffer_insert_with_tags_by_name(buffer, &iter,
134 (buf) ? buf : s_buf, -1,
135 "monospace", NULL);
136 g_free(buf);
137 }
138 fclose(f);
139 }
140
141 gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
142 gtk_text_buffer_place_cursor(buffer, &iter);
143 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(text), &iter, 0.0, TRUE, 0, 0);
144 }
145
146 static gint help_window_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
147 {
148 gtk_widget_destroy(widget);
149 return TRUE;
150 }
151
152 static void help_window_close(GtkWidget *widget, gpointer data)
153 {
154 GtkWidget *window = data;
155 gtk_widget_destroy(window);
156 }
157
158 void help_window_set_key(GtkWidget *window, const gchar *key)
159 {
160 GtkWidget *text;
161
162 if (!window) return;
163
164 text = g_object_get_data(G_OBJECT(window), "text_widget");
165 if (!text) return;
166
167 gdk_window_raise(window->window);
168
169 if (key) help_window_scroll(text, key);
170 }
171
172 void help_window_set_file(GtkWidget *window, const gchar *path, const gchar *key)
173 {
174 GtkWidget *text;
175
176 if (!window || !path) return;
177
178 text = g_object_get_data(G_OBJECT(window), "text_widget");
179 if (!text) return;
180
181 gdk_window_raise(window->window);
182
183 help_window_load_text(text, path);
184 help_window_scroll(text, key);
185 }
186
187 GtkWidget *help_window_new(const gchar *title,
188 const gchar *wmclass, const gchar *subclass,
189 const gchar *path, const gchar *key)
190 {
191 GtkWidget *window;
192 GtkWidget *text;
193 GtkTextBuffer *buffer;
194 GtkWidget *vbox;
195 GtkWidget *hbox;
196 GtkWidget *button;
197 GtkWidget *scrolled;
198
199 /* window */
200
201 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
202 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
203 #if 0
204 gtk_container_set_border_width(GTK_CONTAINER(window), PREF_PAD_BORDER);
205 #endif
206 gtk_window_set_wmclass(GTK_WINDOW(window), subclass, wmclass);
207
208 gtk_window_set_default_size(GTK_WINDOW(window), HELP_WINDOW_WIDTH, HELP_WINDOW_HEIGHT);
209
210 gtk_window_set_title(GTK_WINDOW(window), title);
211
212 g_signal_connect(G_OBJECT(window), "delete_event",
213 G_CALLBACK(help_window_delete_cb), NULL);
214
215 vbox = gtk_vbox_new(FALSE, 0);
216 gtk_container_add(GTK_CONTAINER(window), vbox);
217 gtk_widget_show(vbox);
218
219 g_object_set_data(G_OBJECT(window), "text_vbox", vbox);
220
221 /* text window */
222
223 hbox = gtk_hbox_new(FALSE, 0);
224 gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
225 gtk_widget_show(hbox);
226
227 scrolled = gtk_scrolled_window_new(NULL, NULL);
228 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
229 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
230 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
231 gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0);
232 gtk_widget_show(scrolled);
233
234 text = gtk_text_view_new();
235 gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
236 gtk_container_add(GTK_CONTAINER(scrolled), text);
237 gtk_widget_show(text);
238
239 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
240 gtk_text_buffer_create_tag(buffer, "monospace",
241 "family", "monospace", NULL);
242
243 hbox = gtk_hbutton_box_new();
244 gtk_container_set_border_width(GTK_CONTAINER(hbox), PREF_PAD_BORDER);
245 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
246 gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
247 gtk_widget_show(hbox);
248
249 button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
250 g_signal_connect(G_OBJECT (button), "clicked",
251 G_CALLBACK(help_window_close), window);
252 gtk_container_add(GTK_CONTAINER(hbox), button);
253 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
254 gtk_widget_grab_default(button);
255 gtk_widget_show(button);
256
257 g_object_set_data(G_OBJECT(window), "text_widget", text);
258
259 help_window_load_text(text, path);
260
261 gtk_widget_show(window);
262
263 help_window_scroll(text, key);
264
265 return window;
266 }
267
268 GtkWidget *help_window_get_box(GtkWidget *window)
269 {
270 return g_object_get_data(G_OBJECT(window), "text_vbox");
271 }
272