Update po/mc.pot and po/*.po files.
[midnight-commander.git] / src / viewer / dialogs.c
blob7a251bb495845d68b790184a0bd54d57f6a25d35
1 /*
2 Internal file viewer for the Midnight Commander
3 Function for paint dialogs
5 Copyright (C) 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
6 2004, 2005, 2006, 2007, 2009, 2011
7 The Free Software Foundation, Inc.
9 Written by:
10 Miguel de Icaza, 1994, 1995, 1998
11 Janne Kukonlehto, 1994, 1995
12 Jakub Jelinek, 1995
13 Joseph M. Hinkle, 1996
14 Norbert Warmuth, 1997
15 Pavel Machek, 1998
16 Roland Illig <roland.illig@gmx.de>, 2004, 2005
17 Slava Zanko <slavazanko@google.com>, 2009
18 Andrew Borodin <aborodin@vmail.ru>, 2009, 2012
19 Ilia Maslakov <il.smind@gmail.com>, 2009
21 This file is part of the Midnight Commander.
23 The Midnight Commander is free software: you can redistribute it
24 and/or modify it under the terms of the GNU General Public License as
25 published by the Free Software Foundation, either version 3 of the License,
26 or (at your option) any later version.
28 The Midnight Commander is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 GNU General Public License for more details.
33 You should have received a copy of the GNU General Public License
34 along with this program. If not, see <http://www.gnu.org/licenses/>.
37 #include <config.h>
39 #include <stdlib.h>
40 #include <sys/types.h>
42 #include "lib/global.h"
43 #include "lib/search.h"
44 #include "lib/strutil.h"
45 #include "lib/widget.h"
46 #ifdef HAVE_CHARSET
47 #include "lib/charsets.h"
48 #endif
50 #include "src/history.h"
52 #include "internal.h"
54 /*** global variables ****************************************************************************/
56 mcview_search_options_t mcview_search_options = {
57 .type = MC_SEARCH_T_NORMAL,
58 .case_sens = FALSE,
59 .backwards = FALSE,
60 .whole_words = FALSE,
61 .all_codepages = FALSE
64 /*** file scope macro definitions ****************************************************************/
66 /*** file scope type declarations ****************************************************************/
68 /*** file scope variables ************************************************************************/
70 /*** file scope functions ************************************************************************/
71 /* --------------------------------------------------------------------------------------------- */
73 /* --------------------------------------------------------------------------------------------- */
74 /*** public functions ****************************************************************************/
75 /* --------------------------------------------------------------------------------------------- */
77 gboolean
78 mcview_dialog_search (mcview_t * view)
80 char *exp = NULL;
81 int qd_result;
82 size_t num_of_types;
83 gchar **list_of_types;
85 list_of_types = mc_search_get_types_strings_array (&num_of_types);
88 quick_widget_t quick_widgets[] = {
89 /* *INDENT-OFF* */
90 QUICK_LABELED_INPUT (N_("Enter search string:"), input_label_above,
91 INPUT_LAST_TEXT, 0, MC_HISTORY_SHARED_SEARCH, &exp, NULL),
92 QUICK_SEPARATOR (TRUE),
93 QUICK_START_COLUMNS,
94 QUICK_RADIO (num_of_types, (const char **) list_of_types,
95 (int *) &mcview_search_options.type, NULL),
96 QUICK_NEXT_COLUMN,
97 QUICK_CHECKBOX (N_("Cas&e sensitive"), &mcview_search_options.case_sens, NULL),
98 QUICK_CHECKBOX (N_("&Backwards"), &mcview_search_options.backwards, NULL),
99 QUICK_CHECKBOX (N_("&Whole words"), &mcview_search_options.whole_words, NULL),
100 #ifdef HAVE_CHARSET
101 QUICK_CHECKBOX (N_("&All charsets"), &mcview_search_options.all_codepages, NULL),
102 #endif
103 QUICK_STOP_COLUMNS,
104 QUICK_BUTTONS_OK_CANCEL,
105 QUICK_END
106 /* *INDENT-ON* */
109 quick_dialog_t qdlg = {
110 -1, -1, 58,
111 N_("Search"), "[Input Line Keys]",
112 quick_widgets, NULL, NULL
115 qd_result = quick_dialog (&qdlg);
118 g_strfreev (list_of_types);
120 if ((qd_result == B_CANCEL) || (exp == NULL) || (exp[0] == '\0'))
122 g_free (exp);
123 return FALSE;
126 #ifdef HAVE_CHARSET
128 GString *tmp;
130 tmp = str_convert_to_input (exp);
131 if (tmp != NULL)
133 g_free (exp);
134 exp = g_string_free (tmp, FALSE);
137 #endif
139 g_free (view->last_search_string);
140 view->last_search_string = exp;
141 mcview_nroff_seq_free (&view->search_nroff_seq);
142 mc_search_free (view->search);
144 view->search = mc_search_new (view->last_search_string, -1);
145 view->search_nroff_seq = mcview_nroff_seq_new (view);
146 if (view->search != NULL)
148 view->search->search_type = mcview_search_options.type;
149 view->search->is_all_charsets = mcview_search_options.all_codepages;
150 view->search->is_case_sensitive = mcview_search_options.case_sens;
151 view->search->whole_words = mcview_search_options.whole_words;
152 view->search->search_fn = mcview_search_cmd_callback;
153 view->search->update_fn = mcview_search_update_cmd_callback;
156 return (view->search != NULL);
159 /* --------------------------------------------------------------------------------------------- */
161 gboolean
162 mcview_dialog_goto (mcview_t * view, off_t * offset)
164 typedef enum
166 MC_VIEW_GOTO_LINENUM = 0,
167 MC_VIEW_GOTO_PERCENT = 1,
168 MC_VIEW_GOTO_OFFSET_DEC = 2,
169 MC_VIEW_GOTO_OFFSET_HEX = 3
170 } mcview_goto_type_t;
172 const char *mc_view_goto_str[] = {
173 N_("&Line number (decimal)"),
174 N_("Pe&rcents"),
175 N_("&Decimal offset"),
176 N_("He&xadecimal offset")
179 static mcview_goto_type_t current_goto_type = MC_VIEW_GOTO_LINENUM;
181 size_t num_of_types;
182 char *exp = NULL;
183 int qd_result;
184 gboolean res;
186 num_of_types = G_N_ELEMENTS (mc_view_goto_str);
188 #ifdef ENABLE_NLS
190 size_t i;
192 for (i = 0; i < num_of_types; i++)
193 mc_view_goto_str[i] = _(mc_view_goto_str[i]);
195 #endif
198 quick_widget_t quick_widgets[] = {
199 /* *INDENT-OFF* */
200 QUICK_INPUT (INPUT_LAST_TEXT, 0, MC_HISTORY_VIEW_GOTO, &exp, NULL),
201 QUICK_RADIO (num_of_types, (const char **) mc_view_goto_str, (int *) &current_goto_type,
202 NULL),
203 QUICK_BUTTONS_OK_CANCEL,
204 QUICK_END
205 /* *INDENT-ON* */
208 quick_dialog_t qdlg = {
209 -1, -1, 40,
210 N_("Goto"), "[Input Line Keys]",
211 quick_widgets, NULL, NULL
214 /* run dialog */
215 qd_result = quick_dialog (&qdlg);
218 *offset = -1;
220 /* check input line value */
221 res = (qd_result != B_CANCEL && exp != NULL && exp[0] != '\0');
222 if (res)
224 int base = (current_goto_type == MC_VIEW_GOTO_OFFSET_HEX) ? 16 : 10;
225 off_t addr;
226 char *error;
228 addr = (off_t) g_ascii_strtoll (exp, &error, base);
229 if ((*error == '\0') && (addr >= 0))
231 switch (current_goto_type)
233 case MC_VIEW_GOTO_LINENUM:
234 mcview_coord_to_offset (view, offset, addr, 0);
235 *offset = mcview_bol (view, *offset, 0);
236 break;
237 case MC_VIEW_GOTO_PERCENT:
238 if (addr > 100)
239 addr = 100;
240 *offset = addr * mcview_get_filesize (view) / 100;
241 if (!view->hex_mode)
242 *offset = mcview_bol (view, *offset, 0);
243 break;
244 case MC_VIEW_GOTO_OFFSET_DEC:
245 case MC_VIEW_GOTO_OFFSET_HEX:
246 *offset = addr;
247 if (!view->hex_mode)
248 *offset = mcview_bol (view, *offset, 0);
249 else
251 addr = mcview_get_filesize (view);
252 if (*offset > addr)
253 *offset = addr;
255 break;
256 default:
257 *offset = 0;
258 break;
263 g_free (exp);
264 return res;