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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
// Copyright (C) 2003 Mooffie <mooffie@typo.co.il>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
#ifndef BDE_INPUTLINE_H
#define BDE_INPUTLINE_H
#include <vector>
#include "editbox.h"
class InputLine : public EditBox {
public:
typedef std::vector<unistring> StringArray;
// What kind of filenames, if any, to complete?
enum CompleteType {
cmpltOff, // turn off filename completion.
cmpltAll,
cmpltDirectories // complete only directory names.
// this is useful for, e.g., a "Change Dir:"
// input line.
};
private:
unistring vis_label;
direction_t label_dir;
int label_width;
// Filename completion variables:
CompleteType complete_type;
StringArray files_list;
u8string files_directory; // the directory we're listing
int event_num;
int last_tab_event_num;
int insertion_pos;
int prefix_len;
int slice_begin;
int slice_end;
int curr_choice;
/*
A little example can help in explaining what each completion
variable means.
Let's suppose our input-line looks like:
~/documents/no_ -cp862
^-----------cursor
We press TAB and a "TAB session" starts:
0. "no" is the partial filename component and "~/documents/" is the
directory name component.
1. files_list is populated with all filenames in "~/documents":
0. archive.txt
1. notes.txt
2. notes2.txt
3. november.txt
4. questions.txt
2. only entries 1 to 3 are relevant in our TAB session (because
they start in "no"), so slice_begin is set to 1 and slice_end
to 3.
3. insertion_pos is set to the cursor position.
4. prefix_len is set to the length of the partial filename
component: 2. (that is, strlen("no")).
5. While moving forward and backward in files_list (as a result
of pressing TAB and M-TAB), curr_choice is updated to point
to the current entry.
*/
// History variables:
StringArray *history;
int history_idx;
protected:
// Filename completion
void init_completion();
void get_directory_files(u8string directory, const char *prefix = NULL);
void complete(bool forward);
// History
void init_history(int history_set);
void update_history();
////
void trim();
protected:
virtual void do_syntax_highlight(const unistring &str,
AttributeArray &attributes, int para_num);
public:
HAS_ACTIONS_MAP(InputLine, EditBox);
HAS_BINDINGS_MAP(InputLine, EditBox);
InputLine(const char *aLabel, const unistring &default_text,
int history_set = 0, CompleteType complete = cmpltOff);
void set_label(const char *aLabel);
void set_text(const unistring &s);
unistring get_text() { return curr_para()->str; }
INTERACTIVE void end_modal();
INTERACTIVE void next_completion();
INTERACTIVE void previous_completion();
INTERACTIVE void next_history();
INTERACTIVE void previous_history();
virtual void redraw_paragraph(Paragraph &p,
int window_start_line, bool only_cursor, int);
virtual bool handle_event(const Event &evt);
};
#endif
|