OSDN Git Service

clear btn, about btn, dicts info ...
[eb123/eb123.git] / src / dump.c
1
2 #include "defs.h"
3 #include "dump.h"
4 #include "ebook.h"
5 #include "history.h"
6 #include "jcode.h"
7
8 static void dump_dlg_close(GtkWidget *widget, gpointer data)
9 {
10     gulong d = (gulong)data;
11     gtk_widget_destroy(dump.dlg[d]);
12     dump.dlg[d] = NULL;
13 }
14
15 static void dump_clear_textbuf(GtkTextBuffer *buf)
16 {
17     GtkTextIter start, end;
18     gtk_text_buffer_get_bounds(buf, &start, &end);
19     gtk_text_buffer_delete(buf, &start, &end);
20 }
21
22 static void dump_hex_page(GtkWidget *widget, gpointer data)
23 {
24     gint i, page;
25     const gchar *p;
26     gchar *text, *tmp, *p_hex = NULL, *p_char = NULL, hex_buff[512], char_buff[512];
27     GtkTextIter iter;
28     GtkTextTag  *tag;
29     RESULT *res = history_last_result();
30
31     if(!res)
32         return;
33
34     p = gtk_entry_get_text(GTK_ENTRY(dump.page[DUMP_HEX]));
35     if(!strlen(p))
36         return;
37
38     page = strtol(p, NULL, 16);
39
40     text = ebook_get_raw_text(res->binfo->book, page, 0);
41     if(!text)
42         return;
43
44     dump_clear_textbuf(dump.buf[DUMP_HEX]);
45
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)
50     {
51         if((i % 16) == 0)
52         {
53             p_hex = hex_buff;
54             p_char = char_buff;
55             memset(p_hex, 0, 512);
56             memset(p_char, 0, 512);
57             sprintf(p_hex, "0x%02x ",(i / 16));
58             p_hex += 5;
59             sprintf(p_hex, "(0x%08x)  ",(page - 1) * EB_SIZE_PAGE + i);
60             p_hex += 14;
61             sprintf(p_char, " ");
62             p_char += 1;
63         }
64         sprintf(p_hex, "%02x ",(unsigned char)text[i]);
65         p_hex += 3;
66         sprintf(p_hex, "%02x ",(unsigned char)text[i+1]);
67         p_hex += 3;
68         if(is_jis_printable((guchar*)&text[i]))
69         {
70             *p_char = text[i] + 0x80;
71             p_char++;
72             *p_char = text[i + 1] + 0x80;
73             p_char++;
74         }
75         else
76         {
77             *p_char = 0xA1;
78             p_char++;
79             *p_char = 0xA5;
80             p_char++;
81         }
82         if((i % 16) == 14)
83         {
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);
86             if(tmp)
87             {
88                 gtk_text_buffer_insert_with_tags(dump.buf[DUMP_HEX], &iter, tmp, -1, tag, NULL);
89                 g_free(tmp);
90             }
91             gtk_text_buffer_insert_with_tags(dump.buf[DUMP_HEX], &iter, "\r\0", -1, tag, NULL);
92         }
93     }
94     g_free(text);
95 }
96
97 static void dump_hex_page_change(gboolean next)
98 {
99     gint page;
100     const gchar *p;
101     gchar buff[64];
102
103     p = gtk_entry_get_text(GTK_ENTRY(dump.page[DUMP_HEX]));
104     page = strtol(p, NULL, 16);
105     if(!page)
106         return;
107     page += next ? 1 : -1;
108
109     sprintf(buff, "%08x",page);
110     gtk_entry_set_text(GTK_ENTRY(dump.page[DUMP_HEX]), buff);
111     dump_hex_page(NULL, NULL);
112 }
113
114 static void dump_hex_page_prev(GtkWidget *widget, gpointer data)
115 {
116     dump_hex_page_change(FALSE);
117 }
118
119 static void dump_hex_page_next(GtkWidget *widget, gpointer data)
120 {
121     dump_hex_page_change(TRUE);
122 }
123
124 static void dump_text_page(GtkWidget *widget, gpointer data)
125 {
126     gchar *text, *utf_text;
127     GtkTextIter iter;
128     RESULT *res = history_last_result();
129
130     if(!res)
131         return;
132     text = ebook_get_text(res);
133     if(!text)
134         return;
135
136     dump_clear_textbuf(dump.buf[DUMP_TEXT]);
137
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);
141     g_free(text);
142     g_free(utf_text);
143 }
144
145 void dump_do_dlg(gulong d)
146 {
147     GtkWidget *btn, *hbox, *scroll;
148     gboolean hex = (d == DUMP_HEX);
149     gchar buff[16];
150     RESULT *res = history_last_result();
151
152     if(dump.dlg[d])
153     {
154         dump_dlg_close(NULL, (gpointer)d);
155         return;
156     }
157
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);
162
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);
166
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);
172
173     if(hex)
174     {
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);
178
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);
182     }
183     else
184     {
185         gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("offset")), FALSE, FALSE, 0);
186
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);
191     }
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);
197
198     dump.buf[d] = gtk_text_buffer_new(NULL);
199     dump.view[d] = gtk_text_view_new_with_buffer(dump.buf[d]);
200
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);
208
209     gtk_container_add(GTK_CONTAINER(scroll), dump.view[d]);
210
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);
214
215     gtk_widget_show_all(dump.dlg[d]);
216
217     sprintf(buff, "%08x", res ? res->pos.page : 0);
218     gtk_entry_set_text(GTK_ENTRY(dump.page[d]), buff);
219     if(!hex)
220     {
221         sprintf(buff, "%08x", res ? res->pos.offset : 0);
222         gtk_entry_set_text(GTK_ENTRY(dump.offset), buff);
223     }
224     hex ? dump_hex_page(NULL, NULL) : dump_text_page(NULL, NULL);
225 }
226
227 void dump_hex()
228 {
229     dump_do_dlg(DUMP_HEX);
230 }
231
232 void dump_text()
233 {
234     dump_do_dlg(DUMP_TEXT);
235 }
236
237 void dump_update()
238 {
239     if(dump.dlg[DUMP_HEX])
240         dump_hex_page(NULL, NULL);
241     if(dump.dlg[DUMP_TEXT])
242         dump_text_page(NULL, NULL);
243 }
244