4 * Copyright (C) 1997-2014 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include "bclistbox.h"
26 #include "bcsubwindow.h"
29 #include "bctextbox.inc"
30 #include "bctimer.inc"
37 class BC_TextBoxSuggestions;
38 class BC_ScrollTextBoxYScroll;
41 class BC_TextBox : public BC_SubWindow
46 BC_TextBox(int x, int y, int w, int rows, int size, char *text,
47 int has_border=1, int font=MEDIUMFONT);
48 BC_TextBox(int x, int y, int w, int rows, int size, wchar_t *wtext,
49 int has_border=1, int font=MEDIUMFONT);
50 BC_TextBox(int x, int y, int w, int rows, const char *text,
51 int has_border=1, int font=MEDIUMFONT, int is_utf8=1);
52 BC_TextBox(int x, int y, int w, int rows, const wchar_t *wtext,
53 int has_border=1, int font=MEDIUMFONT, int is_utf8=1);
54 BC_TextBox(int x, int y, int w, int rows, int64_t text,
55 int has_border=1, int font=MEDIUMFONT);
56 BC_TextBox(int x, int y, int w, int rows, float text,
57 int has_border=1, int font=MEDIUMFONT, int precision=4);
58 BC_TextBox(int x, int y, int w, int rows,
59 int text, int has_border=1, int font=MEDIUMFONT);
60 virtual ~BC_TextBox();
63 friend class BC_TextBoxSuggestions;
66 // Whenever the contents of the text change
67 virtual int handle_event() { return 0; };
68 // Whenever the position of the text changes
69 virtual int motion_event() { return 0; };
70 void set_selection(int char1, int char2, int ibeam);
71 int update(const char *text);
72 int update(const wchar_t *wtext);
73 int update(int64_t value);
74 int update(float value);
83 int focus_out_event();
84 int cursor_enter_event();
85 int cursor_leave_event();
86 int cursor_motion_event();
87 virtual int button_press_event();
88 int button_release_event();
89 int repeat_event(int64_t repeat_id);
93 const char* get_text();
94 const wchar_t* get_wtext();
95 const char* get_utf8text();
96 void set_text(char *text, int isz);
98 // Set top left of text view
99 void set_text_row(int row);
101 int reposition_window(int x, int y, int w = -1, int rows = -1);
103 #ifdef X_HAVE_UTF8_STRING
104 int utf8seek(int i, int reverse);
106 static int calculate_h(BC_WindowBase *gui, int font, int has_border, int rows);
107 static int calculate_row_h(int rows, BC_WindowBase *parent_window, int has_border = 1, int font = MEDIUMFONT);
108 static int pixels_to_rows(BC_WindowBase *window, int font, int pixels);
109 void set_precision(int precision);
110 // Whether to draw every time there is a keypress or rely on user to
111 // follow up every keypress with an update().
112 void set_keypress_draw(int value);
113 int get_ibeam_letter();
114 void set_ibeam_letter(int number, int redraw = 1);
115 // Used for custom formatting text boxes
116 int get_last_keypress();
117 // Table of separators to skip. Used by time textboxes
118 // The separator format is "0000:0000". Things not alnum are considered
119 // separators. The alnums are replaced by user text.
120 void set_separators(const char *separators);
122 // 1 - selects text, -1 - deselects, 0 - do nothing
123 // in all cases it returns text_selected after the operation
124 int select_whole_text(int select);
126 // Compute suggestions for a path
127 // If entries is null, just search absolute paths
128 int calculate_suggestions(ArrayList<BC_ListBoxItem*> *entries);
131 // User computes suggestions after handle_event.
132 // The array is copied to a local variable.
133 // A highlighted extension is added if 1 suggestion or a popup appears
134 // if multiple suggestions.
135 // column - starting column to replace
136 void set_suggestions(ArrayList<char*> *suggestions, int column);
137 BC_ScrollTextBoxYScroll *yscroll;
140 int reset_parameters(int rows, int has_border, int font, int size);
141 void draw(int flush);
144 void copy_selection(int clipboard_num);
145 void paste_selection(int clipboard_num);
146 void delete_selection(int letter1, int letter2, int text_len);
147 void insert_text(const wchar_t *wcp, int len=-1);
148 // Reformat text according to separators.
149 // ibeam_left causes the ibeam to move left.
150 int is_separator(const char *txt, int i);
151 void do_separators(int ibeam_left);
152 void get_ibeam_position(int &x, int &y);
153 void find_ibeam(int dispatch_event);
154 void select_word(int &letter1, int &letter2, int ibeam_letter);
155 void select_line(int &letter1, int &letter2, int ibeam_letter);
156 int get_cursor_letter(int cursor_x, int cursor_y);
157 int get_cursor_letter2(int cursor_x, int cursor_y);
158 int get_row_h(int rows);
159 void default_keypress(int &dispatch_event, int &result);
161 int tstrcmp(const char *cp);
162 char *tstrcpy(const char *cp);
163 char *tstrcat(const char *cp);
164 int text_update(const wchar_t *wcp, int wsz, char *tcp, int tsz);
167 // Top left of text relative to window
169 // Top left of cursor relative to text
170 int ibeam_x, ibeam_y;
173 int highlight_letter1, highlight_letter2;
174 int highlight_letter3, highlight_letter4;
175 int text_x1, text_start, text_end;
176 int text_selected, word_selected, line_selected;
177 int text_ascent, text_descent, text_height;
178 int left_margin, right_margin, top_margin, bottom_margin;
183 int high_color, back_color;
184 int background_color;
185 int size, tsize, dirty;
186 int wlen, wsize, *positions, plen;
187 char temp_string[KEYPRESSLEN];
193 // Cause the repeater to skip a cursor refresh if a certain event happened
194 // within a certain time of the last repeat event
196 // Used for custom formatting text boxes
198 const char *separators;
199 ArrayList<BC_ListBoxItem*> *suggestions;
200 BC_TextBoxSuggestions *suggestions_popup;
201 int suggestion_column;
206 class BC_TextBoxSuggestions : public BC_ListBox
209 BC_TextBoxSuggestions(BC_TextBox *text_box, int x, int y);
210 virtual ~BC_TextBoxSuggestions();
212 int selection_changed();
216 BC_TextBox *text_box;
221 class BC_ScrollTextBoxText;
222 class BC_ScrollTextBoxYScroll;
225 class BC_ScrollTextBox
228 BC_ScrollTextBox(BC_WindowBase *parent_window,
229 int x, int y, int w, int rows,
230 const char *default_text, int default_size=BCTEXTLEN);
231 BC_ScrollTextBox(BC_WindowBase *parent_window,
232 int x, int y, int w, int rows,
233 const wchar_t *default_wtext, int default_size=BCTEXTLEN);
234 virtual ~BC_ScrollTextBox();
235 void create_objects();
236 virtual int handle_event();
238 const char* get_text();
239 const wchar_t* get_wtext();
240 void set_text(char *text, int isz);
241 int set_text_row(int n);
242 void update(const char *text);
243 void update(const wchar_t *wtext);
244 void set_selection(int char1, int char2, int ibeam);
245 void reposition_window(int x, int y, int w, int rows);
250 // Visible rows for resizing
253 friend class BC_ScrollTextBoxText;
254 friend class BC_ScrollTextBoxYScroll;
257 BC_ScrollTextBoxText *text;
258 BC_ScrollTextBoxYScroll *yscroll;
259 BC_WindowBase *parent_window;
260 const char *default_text;
261 const wchar_t *default_wtext;
266 class BC_ScrollTextBoxText : public BC_TextBox
269 BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const char *text);
270 BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const wchar_t *wtext);
271 virtual ~BC_ScrollTextBoxText();
274 BC_ScrollTextBox *gui;
277 class BC_ScrollTextBoxYScroll : public BC_ScrollBar
280 BC_ScrollTextBoxYScroll(BC_ScrollTextBox *gui);
281 virtual ~BC_ScrollTextBoxYScroll();
283 BC_ScrollTextBox *gui;
289 class BC_PopupTextBoxText;
290 class BC_PopupTextBoxList;
292 class BC_PopupTextBox
295 BC_PopupTextBox(BC_WindowBase *parent_window,
296 ArrayList<BC_ListBoxItem*> *list_items,
297 const char *default_text, int x, int y,
298 int text_w, int list_h, int list_format = LISTBOX_TEXT);
299 virtual ~BC_PopupTextBox();
300 int create_objects();
301 virtual int handle_event();
302 const char* get_text();
303 const wchar_t* get_wtext();
309 void update(const char *text);
310 void update_list(ArrayList<BC_ListBoxItem*> *data);
311 void reposition_window(int x, int y);
313 friend class BC_PopupTextBoxText;
314 friend class BC_PopupTextBoxList;
317 int x, y, text_w, list_h;
319 const char *default_text;
320 const wchar_t *default_wtext;
321 ArrayList<BC_ListBoxItem*> *list_items;
322 BC_PopupTextBoxText *textbox;
323 BC_PopupTextBoxList *listbox;
324 BC_WindowBase *parent_window;
327 class BC_PopupTextBoxText : public BC_TextBox
330 BC_PopupTextBoxText(BC_PopupTextBox *popup, int x, int y, const char *text);
331 BC_PopupTextBoxText(BC_PopupTextBox *popup, int x, int y, const wchar_t *wtext);
332 virtual ~BC_PopupTextBoxText();
334 BC_PopupTextBox *popup;
337 class BC_PopupTextBoxList : public BC_ListBox
340 BC_PopupTextBoxList(BC_PopupTextBox *popup, int x, int y);
342 BC_PopupTextBox *popup;
346 class BC_TumbleTextBoxText;
347 class BC_TumbleTextBoxTumble;
349 class BC_TumbleTextBox
352 BC_TumbleTextBox(BC_WindowBase *parent_window,
353 int64_t default_value,
359 BC_TumbleTextBox(BC_WindowBase *parent_window,
366 BC_TumbleTextBox(BC_WindowBase *parent_window,
373 virtual ~BC_TumbleTextBox();
375 int create_objects();
377 virtual int handle_event();
378 const char* get_text();
379 const wchar_t* get_wtext();
380 BC_TextBox* get_textbox();
381 int update(const char *value);
382 int update(int64_t value);
383 int update(float value);
391 void reposition_window(int x, int y);
392 void set_boundaries(int64_t min, int64_t max);
393 void set_boundaries(float min, float max);
394 void set_precision(int precision);
395 void set_increment(float value);
396 void set_log_floatincrement(int value);
398 friend class BC_TumbleTextBoxText;
399 friend class BC_TumbleTextBoxTumble;
403 int64_t default_value, min, max;
404 float default_value_f, min_f, max_f;
408 int log_floatincrement;
409 BC_TumbleTextBoxText *textbox;
411 BC_WindowBase *parent_window;
414 class BC_TumbleTextBoxText : public BC_TextBox
417 BC_TumbleTextBoxText(BC_TumbleTextBox *popup,
418 int64_t default_value,
423 BC_TumbleTextBoxText(BC_TumbleTextBox *popup,
429 BC_TumbleTextBoxText(BC_TumbleTextBox *popup, int x, int y);
430 virtual ~BC_TumbleTextBoxText();
432 int button_press_event();
433 BC_TumbleTextBox *popup;