8 static void dump_dlg_close(GtkWidget *widget, gpointer data)
10 gulong d = (gulong)data;
11 gtk_widget_destroy(dump.dlg[d]);
15 static void dump_clear_textbuf(GtkTextBuffer *buf)
17 GtkTextIter start, end;
18 gtk_text_buffer_get_bounds(buf, &start, &end);
19 gtk_text_buffer_delete(buf, &start, &end);
22 static void dump_hex_page(GtkWidget *widget, gpointer data)
26 gchar *text, *tmp, *p_hex = NULL, *p_char = NULL, hex_buff[512], char_buff[512];
29 RESULT *res = history_last_result();
34 p = gtk_entry_get_text(GTK_ENTRY(dump.page[DUMP_HEX]));
38 page = strtol(p, NULL, 16);
40 text = ebook_get_raw_text(res->binfo->book, page, 0);
44 dump_clear_textbuf(dump.buf[DUMP_HEX]);
46 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(dump.view[DUMP_HEX]), GTK_WRAP_NONE);
47 tag = gtk_text_buffer_create_tag(dump.buf[DUMP_HEX], NULL, "family", "Monospace", NULL);
48 gtk_text_buffer_get_start_iter(dump.buf[DUMP_HEX], &iter);
49 for(i = 0; i < EB_SIZE_PAGE; i = i + 2)
55 memset(p_hex, 0, 512);
56 memset(p_char, 0, 512);
57 sprintf(p_hex, "0x%02x ",(i / 16));
59 sprintf(p_hex, "(0x%08x) ",(page - 1) * EB_SIZE_PAGE + i);
64 sprintf(p_hex, "%02x ",(unsigned char)text[i]);
66 sprintf(p_hex, "%02x ",(unsigned char)text[i+1]);
68 if(is_jis_printable((guchar*)&text[i]))
70 *p_char = text[i] + 0x80;
72 *p_char = text[i + 1] + 0x80;
84 gtk_text_buffer_insert_with_tags(dump.buf[DUMP_HEX], &iter, hex_buff, -1, tag, NULL);
85 tmp = iconv_convert(ENC_EUC_JP, ENC_UTF8, char_buff);
88 gtk_text_buffer_insert_with_tags(dump.buf[DUMP_HEX], &iter, tmp, -1, tag, NULL);
91 gtk_text_buffer_insert_with_tags(dump.buf[DUMP_HEX], &iter, "\r\0", -1, tag, NULL);
97 static void dump_hex_page_change(gboolean next)
103 p = gtk_entry_get_text(GTK_ENTRY(dump.page[DUMP_HEX]));
104 page = strtol(p, NULL, 16);
107 page += next ? 1 : -1;
109 sprintf(buff, "%08x",page);
110 gtk_entry_set_text(GTK_ENTRY(dump.page[DUMP_HEX]), buff);
111 dump_hex_page(NULL, NULL);
114 static void dump_hex_page_prev(GtkWidget *widget, gpointer data)
116 dump_hex_page_change(FALSE);
119 static void dump_hex_page_next(GtkWidget *widget, gpointer data)
121 dump_hex_page_change(TRUE);
124 static void dump_text_page(GtkWidget *widget, gpointer data)
126 gchar *text, *utf_text;
128 RESULT *res = history_last_result();
132 text = ebook_get_text(res);
136 dump_clear_textbuf(dump.buf[DUMP_TEXT]);
138 gtk_text_buffer_get_start_iter(dump.buf[DUMP_TEXT], &iter);
139 utf_text = iconv_convert(ENC_EUC_JP, ENC_UTF8, text);
140 gtk_text_buffer_insert(dump.buf[DUMP_TEXT], &iter, utf_text, -1);
145 void dump_do_dlg(gulong d)
147 GtkWidget *btn, *hbox, *scroll;
148 gboolean hex = (d == DUMP_HEX);
150 RESULT *res = history_last_result();
154 dump_dlg_close(NULL, (gpointer)d);
158 dump.dlg[d] = gtk_dialog_new();
159 gtk_window_set_title(GTK_WINDOW(dump.dlg[d]), hex ? _("Hex dump") : _("Text dump"));
160 g_signal_connect(G_OBJECT(dump.dlg[d]), "hide", G_CALLBACK(dump_dlg_close), (gpointer)d);
161 gtk_box_set_homogeneous(GTK_BOX(GTK_DIALOG(dump.dlg[d])->vbox), FALSE);
163 hbox = gtk_hbox_new(FALSE, 5);
164 gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
165 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dump.dlg[d])->vbox), hbox, FALSE, FALSE, 0);
167 gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("page")), FALSE, FALSE, 0);
168 dump.page[d] = gtk_entry_new();
169 gtk_editable_set_editable(GTK_EDITABLE(dump.page[d]), FALSE);
170 gtk_box_pack_start(GTK_BOX(hbox), dump.page[d], FALSE, FALSE, 0);
171 g_signal_connect(G_OBJECT(dump.page[d]), "activate", G_CALLBACK(hex ? dump_hex_page : dump_text_page), NULL);
175 btn = gtk_button_new_with_label(" << ");
176 gtk_box_pack_end(GTK_BOX(GTK_DIALOG(dump.dlg[d])->action_area), btn, FALSE, FALSE, 0);
177 g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(dump_hex_page_prev), NULL);
179 btn = gtk_button_new_with_label(" >> ");
180 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dump.dlg[d])->action_area), btn, FALSE, FALSE, 0);
181 g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(dump_hex_page_next), NULL);
185 gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("offset")), FALSE, FALSE, 0);
187 dump.offset = gtk_entry_new();
188 gtk_editable_set_editable(GTK_EDITABLE(dump.offset), FALSE);
189 gtk_box_pack_start(GTK_BOX(hbox), dump.offset, FALSE, FALSE, 0);
190 g_signal_connect(G_OBJECT(dump.offset), "activate", G_CALLBACK(dump_text_page), NULL);
192 scroll = gtk_scrolled_window_new(NULL, NULL);
193 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
194 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_ETCHED_IN);
195 gtk_widget_set_size_request(scroll, 600, 300);
196 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dump.dlg[d])->vbox), scroll, TRUE, TRUE, 0);
198 dump.buf[d] = gtk_text_buffer_new(NULL);
199 dump.view[d] = gtk_text_view_new_with_buffer(dump.buf[d]);
201 gtk_text_view_set_editable(GTK_TEXT_VIEW(dump.view[d]), FALSE);
202 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(dump.view[d]), 10);
203 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(dump.view[d]), 10);
204 gtk_text_view_set_pixels_above_lines(GTK_TEXT_VIEW(dump.view[d]), 3);
205 gtk_text_view_set_pixels_inside_wrap(GTK_TEXT_VIEW(dump.view[d]), 3);
206 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(dump.view[d]), FALSE);
207 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(dump.view[d]), GTK_WRAP_WORD);
209 gtk_container_add(GTK_CONTAINER(scroll), dump.view[d]);
211 btn = gtk_button_new_with_label(_("Close"));
212 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dump.dlg[d])->action_area), btn, TRUE, TRUE, 0);
213 g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(dump_dlg_close), (gpointer)d);
215 gtk_widget_show_all(dump.dlg[d]);
217 sprintf(buff, "%08x", res ? res->pos.page : 0);
218 gtk_entry_set_text(GTK_ENTRY(dump.page[d]), buff);
221 sprintf(buff, "%08x", res ? res->pos.offset : 0);
222 gtk_entry_set_text(GTK_ENTRY(dump.offset), buff);
224 hex ? dump_hex_page(NULL, NULL) : dump_text_page(NULL, NULL);
229 dump_do_dlg(DUMP_HEX);
234 dump_do_dlg(DUMP_TEXT);
239 if(dump.dlg[DUMP_HEX])
240 dump_hex_page(NULL, NULL);
241 if(dump.dlg[DUMP_TEXT])
242 dump_text_page(NULL, NULL);