root/src/viewer/dialogs.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. mcview_dialog_search
  2. mcview_dialog_goto

   1 /*
   2    Internal file viewer for the Midnight Commander
   3    Function for paint dialogs
   4 
   5    Copyright (C) 1994-2023
   6    Free Software Foundation, Inc.
   7 
   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
  19 
  20    This file is part of the Midnight Commander.
  21 
  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.
  26 
  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.
  31 
  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/>.
  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 /*** global variables ****************************************************************************/
  54 
  55 /*** file scope macro definitions ****************************************************************/
  56 
  57 /*** file scope type declarations ****************************************************************/
  58 
  59 /*** file scope variables ************************************************************************/
  60 
  61 /*** file scope functions ************************************************************************/
  62 /* --------------------------------------------------------------------------------------------- */
  63 
  64 /* --------------------------------------------------------------------------------------------- */
  65 /*** public functions ****************************************************************************/
  66 /* --------------------------------------------------------------------------------------------- */
  67 
  68 gboolean
  69 mcview_dialog_search (WView * view)
     /* [previous][next][first][last][top][bottom][index][help]  */
  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             /* *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* */
  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)
     /* [previous][next][first][last][top][bottom][index][help]  */
 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             /* *INDENT-OFF* */
 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 *) &current_goto_type,
 179                          NULL),
 180             QUICK_BUTTONS_OK_CANCEL,
 181             QUICK_END
 182             /* *INDENT-ON* */
 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         /* run dialog */
 193         qd_result = quick_dialog (&qdlg);
 194     }
 195 
 196     *offset = -1;
 197 
 198     /* check input line value */
 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                 /* Line number entered by user is 1-based. */
 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                 /* read all data from pipe to get real size */
 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                     /* read all data from pipe to get real size */
 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 /* --------------------------------------------------------------------------------------------- */

/* [previous][next][first][last][top][bottom][index][help]  */