This source file includes following definitions.
- mcview_dialog_search
- mcview_dialog_goto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include <config.h>
37
38 #include <stdlib.h>
39 #include <sys/types.h>
40
41 #include "lib/global.h"
42 #include "lib/search.h"
43 #include "lib/strutil.h"
44 #include "lib/widget.h"
45 #ifdef HAVE_CHARSET
46 #include "lib/charsets.h"
47 #endif
48
49 #include "src/history.h"
50
51 #include "internal.h"
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 gboolean
69 mcview_dialog_search (WView * view)
70 {
71 char *exp = NULL;
72 int qd_result;
73 size_t num_of_types = 0;
74 gchar **list_of_types;
75
76 list_of_types = mc_search_get_types_strings_array (&num_of_types);
77
78 {
79 quick_widget_t quick_widgets[] = {
80
81 QUICK_LABELED_INPUT (N_("Enter search string:"), input_label_above,
82 INPUT_LAST_TEXT, MC_HISTORY_SHARED_SEARCH, &exp,
83 NULL, FALSE, FALSE, INPUT_COMPLETE_NONE),
84 QUICK_SEPARATOR (TRUE),
85 QUICK_START_COLUMNS,
86 QUICK_RADIO (num_of_types, (const char **) list_of_types,
87 (int *) &mcview_search_options.type, NULL),
88 QUICK_NEXT_COLUMN,
89 QUICK_CHECKBOX (N_("Cas&e sensitive"), &mcview_search_options.case_sens, NULL),
90 QUICK_CHECKBOX (N_("&Backwards"), &mcview_search_options.backwards, NULL),
91 QUICK_CHECKBOX (N_("&Whole words"), &mcview_search_options.whole_words, NULL),
92 #ifdef HAVE_CHARSET
93 QUICK_CHECKBOX (N_("&All charsets"), &mcview_search_options.all_codepages, NULL),
94 #endif
95 QUICK_STOP_COLUMNS,
96 QUICK_BUTTONS_OK_CANCEL,
97 QUICK_END
98
99 };
100
101 WRect r = { -1, -1, 0, 58 };
102
103 quick_dialog_t qdlg = {
104 r, N_("Search"), "[Input Line Keys]",
105 quick_widgets, NULL, NULL
106 };
107
108 qd_result = quick_dialog (&qdlg);
109 }
110
111 g_strfreev (list_of_types);
112
113 if (qd_result == B_CANCEL || exp[0] == '\0')
114 {
115 g_free (exp);
116 return FALSE;
117 }
118
119 #ifdef HAVE_CHARSET
120 {
121 GString *tmp;
122
123 tmp = str_convert_to_input (exp);
124 g_free (exp);
125 exp = g_string_free (tmp, FALSE);
126 }
127 #endif
128
129 mcview_search_deinit (view);
130 view->last_search_string = exp;
131
132 return mcview_search_init (view);
133 }
134
135
136
137 gboolean
138 mcview_dialog_goto (WView * view, off_t * offset)
139 {
140 typedef enum
141 {
142 MC_VIEW_GOTO_LINENUM = 0,
143 MC_VIEW_GOTO_PERCENT = 1,
144 MC_VIEW_GOTO_OFFSET_DEC = 2,
145 MC_VIEW_GOTO_OFFSET_HEX = 3
146 } mcview_goto_type_t;
147
148 const char *mc_view_goto_str[] = {
149 N_("&Line number"),
150 N_("Pe&rcents"),
151 N_("&Decimal offset"),
152 N_("He&xadecimal offset")
153 };
154
155 static mcview_goto_type_t current_goto_type = MC_VIEW_GOTO_LINENUM;
156
157 size_t num_of_types;
158 char *exp = NULL;
159 int qd_result;
160 gboolean res;
161
162 num_of_types = G_N_ELEMENTS (mc_view_goto_str);
163
164 #ifdef ENABLE_NLS
165 {
166 size_t i;
167
168 for (i = 0; i < num_of_types; i++)
169 mc_view_goto_str[i] = _(mc_view_goto_str[i]);
170 }
171 #endif
172
173 {
174 quick_widget_t quick_widgets[] = {
175
176 QUICK_INPUT (INPUT_LAST_TEXT, MC_HISTORY_VIEW_GOTO, &exp, NULL,
177 FALSE, FALSE, INPUT_COMPLETE_NONE),
178 QUICK_RADIO (num_of_types, (const char **) mc_view_goto_str, (int *) ¤t_goto_type,
179 NULL),
180 QUICK_BUTTONS_OK_CANCEL,
181 QUICK_END
182
183 };
184
185 WRect r = { -1, -1, 0, 40 };
186
187 quick_dialog_t qdlg = {
188 r, N_("Goto"), "[Input Line Keys]",
189 quick_widgets, NULL, NULL
190 };
191
192
193 qd_result = quick_dialog (&qdlg);
194 }
195
196 *offset = -1;
197
198
199 res = (qd_result != B_CANCEL && exp[0] != '\0');
200 if (res)
201 {
202 int base = (current_goto_type == MC_VIEW_GOTO_OFFSET_HEX) ? 16 : 10;
203 off_t addr;
204 char *error;
205
206 addr = (off_t) g_ascii_strtoll (exp, &error, base);
207 if ((*error == '\0') && (addr >= 0))
208 {
209 switch (current_goto_type)
210 {
211 case MC_VIEW_GOTO_LINENUM:
212
213 if (addr > 0)
214 addr--;
215 mcview_coord_to_offset (view, offset, addr, 0);
216 *offset = mcview_bol (view, *offset, 0);
217 break;
218 case MC_VIEW_GOTO_PERCENT:
219 if (addr > 100)
220 addr = 100;
221
222 if (view->growbuf_in_use)
223 mcview_growbuf_read_all_data (view);
224 *offset = addr * mcview_get_filesize (view) / 100;
225 if (!view->mode_flags.hex)
226 *offset = mcview_bol (view, *offset, 0);
227 break;
228 case MC_VIEW_GOTO_OFFSET_DEC:
229 case MC_VIEW_GOTO_OFFSET_HEX:
230 if (!view->mode_flags.hex)
231 {
232 if (view->growbuf_in_use)
233 mcview_growbuf_read_until (view, addr);
234
235 *offset = mcview_bol (view, addr, 0);
236 }
237 else
238 {
239
240 if (view->growbuf_in_use)
241 mcview_growbuf_read_all_data (view);
242
243 *offset = addr;
244 addr = mcview_get_filesize (view);
245 if (*offset > addr)
246 *offset = addr;
247 }
248 break;
249 default:
250 *offset = 0;
251 break;
252 }
253 }
254 }
255
256 g_free (exp);
257 return res;
258 }
259
260