1 //
2 // "$Id$"
3 //
4 // Header file for Fl_Text_Editor class.
5 //
6 // Copyright 2001-2010 by Bill Spitzak and others.
7 // Original code Copyright Mark Edel.  Permission to distribute under
8 // the LGPL for the FLTK library granted by Mark Edel.
9 //
10 // This library is free software. Distribution and use rights are outlined in
11 // the file "COPYING" which should have been included with this file.  If this
12 // file is missing or damaged, see the license at:
13 //
14 //     http://www.fltk.org/COPYING.php
15 //
16 // Please report all bugs and problems on the following page:
17 //
18 //     http://www.fltk.org/str.php
19 //
20 
21 /* \file
22    Fl_Text_Editor widget . */
23 
24 
25 #ifndef FL_TEXT_EDITOR_H
26 #define FL_TEXT_EDITOR_H
27 
28 #include "Fl_Text_Display.H"
29 
30 // key will match in any state
31 #define FL_TEXT_EDITOR_ANY_STATE  (-1L)
32 
33 /**
34   This is the FLTK text editor widget.
35 
36   It allows the user to edit multiple lines of text and supports highlighting
37   and scrolling. The buffer that is displayed in the widget is managed
38   by the Fl_Text_Buffer class.
39 */
40 class FL_EXPORT Fl_Text_Editor : public Fl_Text_Display {
41   public:
42     /** Key function binding callback type. */
43     typedef int (*Key_Func)(int key, Fl_Text_Editor* editor);
44 
45     /** Simple linked list item associating a key/state to a function. */
46     struct Key_Binding {
47       int          key;		///< the key pressed
48       int          state;	///< the state of key modifiers
49       Key_Func     function;	///< associated function
50       Key_Binding* next;	///< next key binding in the list
51     };
52 
53     Fl_Text_Editor(int X, int Y, int W, int H, const char* l = 0);
~Fl_Text_Editor()54     ~Fl_Text_Editor() { remove_all_key_bindings(); }
55     virtual int handle(int e);
56     /**
57 	Sets the current insert mode; if non-zero, new text
58 	is inserted before the current cursor position. Otherwise, new
59 	text replaces text at the current cursor position.
60     */
insert_mode(int b)61     void insert_mode(int b) { insert_mode_ = b; }
62     /**
63 	Gets the current insert mode; if non-zero, new text
64 	is inserted before the current cursor position. Otherwise, new
65 	text replaces text at the current cursor position.
66     */
insert_mode()67     int insert_mode() { return insert_mode_; }
68 
69 #if FLTK_ABI_VERSION >= 10304
70     void tab_nav(int val);
71     int tab_nav() const;
72 #endif
73 
74     void add_key_binding(int key, int state, Key_Func f, Key_Binding** list);
75     /** Adds a \p key of state \p state with the function \p f. */
add_key_binding(int key,int state,Key_Func f)76     void add_key_binding(int key, int state, Key_Func f)
77       { add_key_binding(key, state, f, &key_bindings); }
78     void remove_key_binding(int key, int state, Key_Binding** list);
79     /** Removes the key binding associated with the key "key" of state "state". */
remove_key_binding(int key,int state)80     void remove_key_binding(int key, int state)
81       { remove_key_binding(key, state, &key_bindings); }
82     void remove_all_key_bindings(Key_Binding** list);
83     /** Removes all of the key bindings associated with the text editor or list. */
remove_all_key_bindings()84     void remove_all_key_bindings() { remove_all_key_bindings(&key_bindings); }
85     void add_default_key_bindings(Key_Binding** list);
86 #if FLTK_ABI_VERSION < 10304
87     // OLD: non-const
88     Key_Func bound_key_function(int key, int state, Key_Binding* list);
89     /**  Returns the function associated with a key binding. */
bound_key_function(int key,int state)90     Key_Func bound_key_function(int key, int state)
91       { return bound_key_function(key, state, key_bindings); }
92 #else
93     // NEW: const (STR#3306)
94     Key_Func bound_key_function(int key, int state, Key_Binding* list) const;
95     /**  Returns the function associated with a key binding. */
bound_key_function(int key,int state)96     Key_Func bound_key_function(int key, int state) const
97       { return bound_key_function(key, state, key_bindings); }
98 #endif
99     /**  Sets the default key function for unassigned keys. */
default_key_function(Key_Func f)100     void default_key_function(Key_Func f) { default_key_function_ = f; }
101 
102     // functions for the built in default bindings
103     static int kf_default(int c, Fl_Text_Editor* e);
104     static int kf_ignore(int c, Fl_Text_Editor* e);
105     static int kf_backspace(int c, Fl_Text_Editor* e);
106     static int kf_enter(int c, Fl_Text_Editor* e);
107     static int kf_move(int c, Fl_Text_Editor* e);
108     static int kf_shift_move(int c, Fl_Text_Editor* e);
109     static int kf_ctrl_move(int c, Fl_Text_Editor* e);
110     static int kf_c_s_move(int c, Fl_Text_Editor* e);
111     static int kf_meta_move(int c, Fl_Text_Editor* e);
112     static int kf_m_s_move(int c, Fl_Text_Editor* e);
113     static int kf_home(int, Fl_Text_Editor* e);
114     static int kf_end(int c, Fl_Text_Editor* e);
115     static int kf_left(int c, Fl_Text_Editor* e);
116     static int kf_up(int c, Fl_Text_Editor* e);
117     static int kf_right(int c, Fl_Text_Editor* e);
118     static int kf_down(int c, Fl_Text_Editor* e);
119     static int kf_page_up(int c, Fl_Text_Editor* e);
120     static int kf_page_down(int c, Fl_Text_Editor* e);
121     static int kf_insert(int c, Fl_Text_Editor* e);
122     static int kf_delete(int c, Fl_Text_Editor* e);
123     static int kf_copy(int c, Fl_Text_Editor* e);
124     static int kf_cut(int c, Fl_Text_Editor* e);
125     static int kf_paste(int c, Fl_Text_Editor* e);
126     static int kf_select_all(int c, Fl_Text_Editor* e);
127     static int kf_undo(int c, Fl_Text_Editor* e);
128 
129   protected:
130     int handle_key();
131     void maybe_do_callback();
132 
133 #ifndef FL_DOXYGEN
134     int insert_mode_;
135     Key_Binding* key_bindings;
136 #endif
137 
138     /** Global key binding list.
139 
140       Derived classes can add key bindings for all Fl_Text_Editor widgets
141       by adding a Key_Binding to this list.
142 
143       \see add_key_binding(int key, int state, Key_Func f, Key_Binding** list);
144     */
145     static Key_Binding* global_key_bindings;
146 
147 #ifndef FL_DOXYGEN
148     Key_Func default_key_function_;
149 #endif
150 };
151 
152 #endif
153 
154 //
155 // End of "$Id$".
156 //
157 
158