3d1106e6e48f38bde571df2c6b04a4f205b06ddd
[goodguy/history.git] / cinelerra-5.1 / guicast / bctextbox.h
1
2 /*
3  * CINELERRA
4  * Copyright (C) 1997-2014 Adam Williams <broadcast at earthling dot net>
5  *
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.
10  *
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.
15  *
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
19  *
20  */
21
22 #ifndef BCTEXTBOX_H
23 #define BCTEXTBOX_H
24
25 #include "bclistbox.h"
26 #include "bcsubwindow.h"
27 #include "bctumble.h"
28 #include "fonts.h"
29 #include "bctextbox.inc"
30 #include "bctimer.inc"
31
32 #define BCCURSORW 2
33
34
35
36
37 class BC_TextBoxSuggestions;
38 class BC_ScrollTextBoxYScroll;
39
40
41 class BC_TextBox : public BC_SubWindow
42 {
43         char *text;
44         wchar_t *wtext;
45 public:
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();
61
62
63         friend class BC_TextBoxSuggestions;
64
65
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);
75         void disable();
76         void enable();
77         int get_enabled();
78         int get_rows();
79
80         int initialize();
81
82         int focus_in_event();
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);
90         int keypress_event();
91         int activate();
92         int deactivate();
93         const char* get_text();
94         const wchar_t* get_wtext();
95         const char* get_utf8text();
96         void set_text(char *text, int isz);
97         int get_text_rows();
98 // Set top left of text view
99         void set_text_row(int row);
100         int get_text_row();
101         int reposition_window(int x, int y, int w = -1, int rows = -1);
102         int uses_text();
103 #ifdef X_HAVE_UTF8_STRING
104         int utf8seek(int i, int reverse);
105 #endif
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);
121
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);
125
126 // Compute suggestions for a path
127 // If entries is null, just search absolute paths
128         int calculate_suggestions(ArrayList<BC_ListBoxItem*> *entries);
129
130
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;
138
139 private:
140         int reset_parameters(int rows, int has_border, int font, int size);
141         void draw(int flush);
142         void draw_border();
143         void draw_cursor();
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);
160         int tstrlen();
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);
165         int wtext_update();
166
167 // Top left of text relative to window
168         int text_x, text_y;
169 // Top left of cursor relative to text
170         int ibeam_x, ibeam_y;
171
172         int ibeam_letter;
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;
179         int has_border;
180         int font;
181         int rows;
182         int highlighted;
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];
188         int is_utf8;
189         int active;
190         int enabled;
191         int precision;
192         int keypress_draw;
193 // Cause the repeater to skip a cursor refresh if a certain event happened
194 // within a certain time of the last repeat event
195         Timer *skip_cursor;
196 // Used for custom formatting text boxes
197         int last_keypress;
198         const char *separators;
199         ArrayList<BC_ListBoxItem*> *suggestions;
200         BC_TextBoxSuggestions *suggestions_popup;
201         int suggestion_column;
202 };
203
204
205
206 class BC_TextBoxSuggestions : public BC_ListBox
207 {
208 public:
209         BC_TextBoxSuggestions(BC_TextBox *text_box, int x, int y);
210         virtual ~BC_TextBoxSuggestions();
211
212         int selection_changed();
213         int handle_event();
214
215
216         BC_TextBox *text_box;
217 };
218
219
220
221 class BC_ScrollTextBoxText;
222 class BC_ScrollTextBoxYScroll;
223
224
225 class BC_ScrollTextBox
226 {
227 public:
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();
237
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);
246         int get_x();
247         int get_y();
248         int get_w();
249         int get_h();
250 // Visible rows for resizing
251         int get_rows();
252
253         friend class BC_ScrollTextBoxText;
254         friend class BC_ScrollTextBoxYScroll;
255
256 private:
257         BC_ScrollTextBoxText *text;
258         BC_ScrollTextBoxYScroll *yscroll;
259         BC_WindowBase *parent_window;
260         const char *default_text;
261         const wchar_t *default_wtext;
262         int default_size;
263         int x, y, w, rows;
264 };
265
266 class BC_ScrollTextBoxText : public BC_TextBox
267 {
268 public:
269         BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const char *text);
270         BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const wchar_t *wtext);
271         virtual ~BC_ScrollTextBoxText();
272         int handle_event();
273         int motion_event();
274         BC_ScrollTextBox *gui;
275 };
276
277 class BC_ScrollTextBoxYScroll : public BC_ScrollBar
278 {
279 public:
280         BC_ScrollTextBoxYScroll(BC_ScrollTextBox *gui);
281         virtual ~BC_ScrollTextBoxYScroll();
282         int handle_event();
283         BC_ScrollTextBox *gui;
284 };
285
286
287
288
289 class BC_PopupTextBoxText;
290 class BC_PopupTextBoxList;
291
292 class BC_PopupTextBox
293 {
294 public:
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();
304         int get_number();
305         int get_x();
306         int get_y();
307         int get_w();
308         int get_h();
309         void update(const char *text);
310         void update_list(ArrayList<BC_ListBoxItem*> *data);
311         void reposition_window(int x, int y);
312
313         friend class BC_PopupTextBoxText;
314         friend class BC_PopupTextBoxList;
315
316 private:
317         int x, y, text_w, list_h;
318         int list_format;
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;
325 };
326
327 class BC_PopupTextBoxText : public BC_TextBox
328 {
329 public:
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();
333         int handle_event();
334         BC_PopupTextBox *popup;
335 };
336
337 class BC_PopupTextBoxList : public BC_ListBox
338 {
339 public:
340         BC_PopupTextBoxList(BC_PopupTextBox *popup, int x, int y);
341         int handle_event();
342         BC_PopupTextBox *popup;
343 };
344
345
346 class BC_TumbleTextBoxText;
347 class BC_TumbleTextBoxTumble;
348
349 class BC_TumbleTextBox
350 {
351 public:
352         BC_TumbleTextBox(BC_WindowBase *parent_window,
353                 int64_t default_value,
354                 int64_t min,
355                 int64_t max,
356                 int x,
357                 int y,
358                 int text_w);
359         BC_TumbleTextBox(BC_WindowBase *parent_window,
360                 int default_value,
361                 int min,
362                 int max,
363                 int x,
364                 int y,
365                 int text_w);
366         BC_TumbleTextBox(BC_WindowBase *parent_window,
367                 float default_value,
368                 float min,
369                 float max,
370                 int x,
371                 int y,
372                 int text_w);
373         virtual ~BC_TumbleTextBox();
374
375         int create_objects();
376         void reset();
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);
384         int get_x();
385         int get_y();
386         int get_w();
387         int get_h();
388         void disable();
389         void enable();
390         int get_enabled();
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);
397
398         friend class BC_TumbleTextBoxText;
399         friend class BC_TumbleTextBoxTumble;
400
401 private:
402         int x, y, text_w;
403         int64_t default_value, min, max;
404         float default_value_f, min_f, max_f;
405         int use_float;
406         int precision;
407         float increment;
408         int log_floatincrement;
409         BC_TumbleTextBoxText *textbox;
410         BC_Tumbler *tumbler;
411         BC_WindowBase *parent_window;
412 };
413
414 class BC_TumbleTextBoxText : public BC_TextBox
415 {
416 public:
417         BC_TumbleTextBoxText(BC_TumbleTextBox *popup,
418                 int64_t default_value,
419                 int64_t min,
420                 int64_t max,
421                 int x,
422                 int y);
423         BC_TumbleTextBoxText(BC_TumbleTextBox *popup,
424                 float default_value,
425                 float min,
426                 float max,
427                 int x,
428                 int y);
429         BC_TumbleTextBoxText(BC_TumbleTextBox *popup, int x, int y);
430         virtual ~BC_TumbleTextBoxText();
431         int handle_event();
432         int button_press_event();
433         BC_TumbleTextBox *popup;
434 };
435
436
437 #endif