Merge branch '4524_cleanup'
[midnight-commander.git] / src / viewer / dialogs.c
blob4a2fe396b517f8d04f7a33f00917a0fab79c8ab8
1 /*
2 Internal file viewer for the Midnight Commander
3 Function for paint dialogs
5 Copyright (C) 1994-2024
6 Free Software Foundation, Inc.
8 Written by:
9 Miguel de Icaza, 1994, 1995, 1998
10 Janne Kukonlehto, 1994, 1995
11 Jakub Jelinek, 1995
12 Joseph M. Hinkle, 1996
13 Norbert Warmuth, 1997
14 Pavel Machek, 1998
15 Roland Illig <roland.illig@gmx.de>, 2004, 2005
16 Slava Zanko <slavazanko@google.com>, 2009
17 Andrew Borodin <aborodin@vmail.ru>, 2009-2022
18 Ilia Maslakov <il.smind@gmail.com>, 2009
20 This file is part of the Midnight Commander.
22 The Midnight Commander is free software: you can redistribute it
23 and/or modify it under the terms of the GNU General Public License as
24 published by the Free Software Foundation, either version 3 of the License,
25 or (at your option) any later version.
27 The Midnight Commander is distributed in the hope that it will be useful,
28 but WITHOUT ANY WARRANTY; without even the implied warranty of
29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 GNU General Public License for more details.
32 You should have received a copy of the GNU General Public License
33 along with this program. If not, see <http://www.gnu.org/licenses/>.
36 #include <config.h>
38 #include <stdlib.h>
39 #include <sys/types.h>
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
49 #include "src/history.h"
51 #include "internal.h"
53 /*** global variables ****************************************************************************/
55 /*** file scope macro definitions ****************************************************************/
57 /*** file scope type declarations ****************************************************************/
59 /*** file scope variables ************************************************************************/
61 /*** file scope functions ************************************************************************/
62 /* --------------------------------------------------------------------------------------------- */
64 /* --------------------------------------------------------------------------------------------- */
65 /*** public functions ****************************************************************************/
66 /* --------------------------------------------------------------------------------------------- */
68 gboolean
69 mcview_dialog_search (WView * view)
71 char *exp = NULL;
72 int qd_result;
73 size_t num_of_types = 0;
74 gchar **list_of_types;
76 list_of_types = mc_search_get_types_strings_array (&num_of_types);
79 quick_widget_t quick_widgets[] = {
80 /* *INDENT-OFF* */
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 /* *INDENT-ON* */
101 WRect r = { -1, -1, 0, 58 };
103 quick_dialog_t qdlg = {
104 r, N_("Search"), "[Input Line Keys]",
105 quick_widgets, NULL, NULL
108 qd_result = quick_dialog (&qdlg);
111 g_strfreev (list_of_types);
113 if (qd_result == B_CANCEL || exp[0] == '\0')
115 g_free (exp);
116 return FALSE;
119 #ifdef HAVE_CHARSET
121 GString *tmp;
123 tmp = str_convert_to_input (exp);
124 g_free (exp);
125 if (tmp != NULL)
126 exp = g_string_free (tmp, FALSE);
127 else
128 exp = g_strdup ("");
130 #endif
132 mcview_search_deinit (view);
133 view->last_search_string = exp;
135 return mcview_search_init (view);
138 /* --------------------------------------------------------------------------------------------- */
140 gboolean
141 mcview_dialog_goto (WView * view, off_t * offset)
143 typedef enum
145 MC_VIEW_GOTO_LINENUM = 0,
146 MC_VIEW_GOTO_PERCENT = 1,
147 MC_VIEW_GOTO_OFFSET_DEC = 2,
148 MC_VIEW_GOTO_OFFSET_HEX = 3
149 } mcview_goto_type_t;
151 const char *mc_view_goto_str[] = {
152 N_("&Line number"),
153 N_("Pe&rcents"),
154 N_("&Decimal offset"),
155 N_("He&xadecimal offset")
158 static mcview_goto_type_t current_goto_type = MC_VIEW_GOTO_LINENUM;
160 size_t num_of_types;
161 char *exp = NULL;
162 int qd_result;
163 gboolean res;
165 num_of_types = G_N_ELEMENTS (mc_view_goto_str);
167 #ifdef ENABLE_NLS
169 size_t i;
171 for (i = 0; i < num_of_types; i++)
172 mc_view_goto_str[i] = _(mc_view_goto_str[i]);
174 #endif
177 quick_widget_t quick_widgets[] = {
178 /* *INDENT-OFF* */
179 QUICK_INPUT (INPUT_LAST_TEXT, MC_HISTORY_VIEW_GOTO, &exp, NULL,
180 FALSE, FALSE, INPUT_COMPLETE_NONE),
181 QUICK_RADIO (num_of_types, (const char **) mc_view_goto_str, (int *) &current_goto_type,
182 NULL),
183 QUICK_BUTTONS_OK_CANCEL,
184 QUICK_END
185 /* *INDENT-ON* */
188 WRect r = { -1, -1, 0, 40 };
190 quick_dialog_t qdlg = {
191 r, N_("Goto"), "[Input Line Keys]",
192 quick_widgets, NULL, NULL
195 /* run dialog */
196 qd_result = quick_dialog (&qdlg);
199 *offset = -1;
201 /* check input line value */
202 res = (qd_result != B_CANCEL && exp[0] != '\0');
203 if (res)
205 int base = (current_goto_type == MC_VIEW_GOTO_OFFSET_HEX) ? 16 : 10;
206 off_t addr;
207 char *error;
209 addr = (off_t) g_ascii_strtoll (exp, &error, base);
210 if ((*error == '\0') && (addr >= 0))
212 switch (current_goto_type)
214 case MC_VIEW_GOTO_LINENUM:
215 /* Line number entered by user is 1-based. */
216 if (addr > 0)
217 addr--;
218 mcview_coord_to_offset (view, offset, addr, 0);
219 *offset = mcview_bol (view, *offset, 0);
220 break;
221 case MC_VIEW_GOTO_PERCENT:
222 if (addr > 100)
223 addr = 100;
224 /* read all data from pipe to get real size */
225 if (view->growbuf_in_use)
226 mcview_growbuf_read_all_data (view);
227 *offset = addr * mcview_get_filesize (view) / 100;
228 if (!view->mode_flags.hex)
229 *offset = mcview_bol (view, *offset, 0);
230 break;
231 case MC_VIEW_GOTO_OFFSET_DEC:
232 case MC_VIEW_GOTO_OFFSET_HEX:
233 if (!view->mode_flags.hex)
235 if (view->growbuf_in_use)
236 mcview_growbuf_read_until (view, addr);
238 *offset = mcview_bol (view, addr, 0);
240 else
242 /* read all data from pipe to get real size */
243 if (view->growbuf_in_use)
244 mcview_growbuf_read_all_data (view);
246 *offset = addr;
247 addr = mcview_get_filesize (view);
248 if (*offset > addr)
249 *offset = addr;
251 break;
252 default:
253 *offset = 0;
254 break;
259 g_free (exp);
260 return res;
263 /* --------------------------------------------------------------------------------------------- */