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 Free Software Foundation, Inc.
8 Written by: 1994, 1995, 1998 Miguel de Icaza
9 1994, 1995 Janne Kukonlehto
14 2004 Roland Illig <roland.illig@gmx.de>
15 2005 Roland Illig <roland.illig@gmx.de>
16 2009 Slava Zanko <slavazanko@google.com>
17 2009 Andrew Borodin <aborodin@vmail.ru>
18 2009 Ilia Maslakov <il.smind@gmail.com>
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 2 of the
25 License, or (at your option) any later version.
27 The Midnight Commander is distributed in the hope that it will be
28 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
29 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
30 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, write to the Free Software
34 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
41 #include <sys/types.h>
43 #include "lib/global.h"
44 #include "lib/search.h"
45 #include "lib/strutil.h"
46 #include "lib/widget.h"
47 #include "lib/charsets.h"
49 #include "src/history.h"
53 /*** global variables ****************************************************************************/
55 mcview_search_options_t mcview_search_options
= {
56 .type
= MC_SEARCH_T_NORMAL
,
60 .all_codepages
= FALSE
63 /*** file scope macro definitions ****************************************************************/
65 /*** file scope type declarations ****************************************************************/
67 /*** file scope variables ************************************************************************/
69 /*** file scope functions ************************************************************************/
70 /* --------------------------------------------------------------------------------------------- */
72 /* --------------------------------------------------------------------------------------------- */
73 /*** public functions ****************************************************************************/
74 /* --------------------------------------------------------------------------------------------- */
77 mcview_dialog_search (mcview_t
* view
)
79 int SEARCH_DLG_MIN_HEIGHT
= 12;
80 int SEARCH_DLG_HEIGHT_SUPPLY
= 3;
81 int SEARCH_DLG_WIDTH
= 58;
87 gchar
**list_of_types
= mc_search_get_types_strings_array (&num_of_types
);
88 int SEARCH_DLG_HEIGHT
= SEARCH_DLG_MIN_HEIGHT
+ num_of_types
- SEARCH_DLG_HEIGHT_SUPPLY
;
90 QuickWidget quick_widgets
[] = {
91 QUICK_BUTTON (6, 10, SEARCH_DLG_HEIGHT
- 3, SEARCH_DLG_HEIGHT
, N_("&Cancel"), B_CANCEL
,
93 QUICK_BUTTON (2, 10, SEARCH_DLG_HEIGHT
- 3, SEARCH_DLG_HEIGHT
, N_("&OK"), B_ENTER
, NULL
),
95 QUICK_CHECKBOX (SEARCH_DLG_WIDTH
/ 2 + 3, SEARCH_DLG_WIDTH
, 8, SEARCH_DLG_HEIGHT
,
96 N_("All charsets"), &mcview_search_options
.all_codepages
),
98 QUICK_CHECKBOX (SEARCH_DLG_WIDTH
/ 2 + 3, SEARCH_DLG_WIDTH
, 7, SEARCH_DLG_HEIGHT
,
99 N_("&Whole words"), &mcview_search_options
.whole_words
),
100 QUICK_CHECKBOX (SEARCH_DLG_WIDTH
/ 2 + 3, SEARCH_DLG_WIDTH
, 6, SEARCH_DLG_HEIGHT
,
101 N_("&Backwards"), &mcview_search_options
.backwards
),
102 QUICK_CHECKBOX (SEARCH_DLG_WIDTH
/ 2 + 3, SEARCH_DLG_WIDTH
, 5, SEARCH_DLG_HEIGHT
,
103 N_("Case &sensitive"), &mcview_search_options
.case_sens
),
104 QUICK_RADIO (3, SEARCH_DLG_WIDTH
, 5, SEARCH_DLG_HEIGHT
,
105 num_of_types
, (const char **) list_of_types
,
106 (int *) &mcview_search_options
.type
),
107 QUICK_INPUT (3, SEARCH_DLG_WIDTH
, 3, SEARCH_DLG_HEIGHT
,
108 INPUT_LAST_TEXT
, SEARCH_DLG_WIDTH
- 6, 0, MC_HISTORY_SHARED_SEARCH
, &exp
),
109 QUICK_LABEL (3, SEARCH_DLG_WIDTH
, 2, SEARCH_DLG_HEIGHT
, N_("Enter search string:")),
113 QuickDialog Quick_input
= {
114 SEARCH_DLG_WIDTH
, SEARCH_DLG_HEIGHT
, -1, -1,
115 N_("Search"), "[Input Line Keys]",
116 quick_widgets
, NULL
, FALSE
119 qd_result
= quick_dialog (&Quick_input
);
120 g_strfreev (list_of_types
);
122 if ((qd_result
== B_CANCEL
) || (exp
== NULL
) || (exp
[0] == '\0'))
130 GString
*tmp
= str_convert_to_input (exp
);
135 exp
= g_string_free (tmp
, FALSE
);
140 g_free (view
->last_search_string
);
141 view
->last_search_string
= exp
;
142 mcview_nroff_seq_free (&view
->search_nroff_seq
);
143 mc_search_free (view
->search
);
145 view
->search
= mc_search_new (view
->last_search_string
, -1);
146 view
->search_nroff_seq
= mcview_nroff_seq_new (view
);
147 if (view
->search
!= NULL
)
149 view
->search
->search_type
= mcview_search_options
.type
;
150 view
->search
->is_all_charsets
= mcview_search_options
.all_codepages
;
151 view
->search
->is_case_sensitive
= mcview_search_options
.case_sens
;
152 view
->search
->whole_words
= mcview_search_options
.whole_words
;
153 view
->search
->search_fn
= mcview_search_cmd_callback
;
154 view
->search
->update_fn
= mcview_search_update_cmd_callback
;
157 return (view
->search
!= NULL
);
160 /* --------------------------------------------------------------------------------------------- */
163 mcview_dialog_goto (mcview_t
* view
, off_t
* offset
)
167 MC_VIEW_GOTO_LINENUM
= 0,
168 MC_VIEW_GOTO_PERCENT
= 1,
169 MC_VIEW_GOTO_OFFSET_DEC
= 2,
170 MC_VIEW_GOTO_OFFSET_HEX
= 3
171 } mcview_goto_type_t
;
173 const char *mc_view_goto_str
[] = {
174 N_("&Line number (decimal)"),
176 N_("&Decimal offset"),
177 N_("He&xadecimal offset")
180 const int goto_dlg_height
= 12;
181 int goto_dlg_width
= 40;
183 static mcview_goto_type_t current_goto_type
= MC_VIEW_GOTO_LINENUM
;
187 size_t num_of_types
= sizeof (mc_view_goto_str
) / sizeof (mc_view_goto_str
[0]);
190 gboolean res
= FALSE
;
192 QuickWidget quick_widgets
[] = {
193 QUICK_BUTTON (6, 10, goto_dlg_height
- 3, goto_dlg_height
, N_("&Cancel"), B_CANCEL
, NULL
),
194 QUICK_BUTTON (2, 10, goto_dlg_height
- 3, goto_dlg_height
, N_("&OK"), B_ENTER
, NULL
),
195 QUICK_RADIO (3, goto_dlg_width
, 4, goto_dlg_height
,
196 num_of_types
, (const char **) mc_view_goto_str
, (int *) ¤t_goto_type
),
197 QUICK_INPUT (3, goto_dlg_width
, 2, goto_dlg_height
,
198 INPUT_LAST_TEXT
, goto_dlg_width
- 6, 0, MC_HISTORY_VIEW_GOTO
, &exp
),
202 QuickDialog Quick_input
= {
203 goto_dlg_width
, goto_dlg_height
, -1, -1,
204 N_("Goto"), "[Input Line Keys]",
205 quick_widgets
, NULL
, FALSE
209 for (i
= 0; i
< num_of_types
; i
++)
210 mc_view_goto_str
[i
] = _(mc_view_goto_str
[i
]);
212 quick_widgets
[0].u
.button
.text
= _(quick_widgets
[0].u
.button
.text
);
213 quick_widgets
[1].u
.button
.text
= _(quick_widgets
[1].u
.button
.text
);
216 /* calculate widget coordinates */
218 int b0_len
, b1_len
, len
;
219 const int button_gap
= 2;
221 /* preliminary dialog width */
222 goto_dlg_width
= max (goto_dlg_width
, str_term_width1 (Quick_input
.title
) + 4);
224 /* length of radiobuttons */
225 for (i
= 0; i
< num_of_types
; i
++)
226 goto_dlg_width
= max (goto_dlg_width
, str_term_width1 (mc_view_goto_str
[i
]) + 10);
228 /* length of buttons */
229 b0_len
= str_term_width1 (quick_widgets
[0].u
.button
.text
) + 3;
230 b1_len
= str_term_width1 (quick_widgets
[1].u
.button
.text
) + 5; /* default button */
231 len
= b0_len
+ b1_len
+ button_gap
* 2;
234 Quick_input
.xlen
= max (goto_dlg_width
, len
+ 6);
236 /* correct widget coordinates */
237 for (i
= sizeof (quick_widgets
) / sizeof (quick_widgets
[0]); i
> 0; i
--)
238 quick_widgets
[i
- 1].x_divisions
= Quick_input
.xlen
;
241 quick_widgets
[3].u
.input
.len
= Quick_input
.xlen
- 6;
243 /* button positions */
244 quick_widgets
[1].relative_x
= Quick_input
.xlen
/ 2 - len
/ 2;
245 quick_widgets
[0].relative_x
= quick_widgets
[1].relative_x
+ b1_len
+ button_gap
;
249 qd_result
= quick_dialog (&Quick_input
);
253 /* check input line value */
254 if ((qd_result
!= B_CANCEL
) && (exp
!= NULL
) && (exp
[0] != '\0'))
256 int base
= (current_goto_type
== MC_VIEW_GOTO_OFFSET_HEX
) ? 16 : 10;
262 addr
= strtoll (exp
, &error
, base
);
263 if ((*error
== '\0') && (addr
>= 0))
265 switch (current_goto_type
)
267 case MC_VIEW_GOTO_LINENUM
:
268 mcview_coord_to_offset (view
, offset
, addr
, 0);
269 *offset
= mcview_bol (view
, *offset
, 0);
271 case MC_VIEW_GOTO_PERCENT
:
274 *offset
= addr
* mcview_get_filesize (view
) / 100;
276 *offset
= mcview_bol (view
, *offset
, 0);
278 case MC_VIEW_GOTO_OFFSET_DEC
:
279 case MC_VIEW_GOTO_OFFSET_HEX
:
282 *offset
= mcview_bol (view
, *offset
, 0);
285 addr
= mcview_get_filesize (view
);