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