1 /*
2  *  filebuffer.h
3  *
4  *  Copyright (C) 1998  Jiann-Ching Liu
5  */
6 
7 
8 #ifndef __QE_FILEBUFFER_H_
9 #define __QE_FILEBUFFER_H_
10 
11 #include <limits.h>
12 #include "qe_config.h"
13 #include "qestring.h"
14 #include "linebuffer.h"
15 #include "history.h"
16 #include "mark.h"
17 #include "menu.h"
18 
19 
20 #ifndef TAB_SPACE
21 #define TAB_SPACE       (8)
22 #endif
23 
24 #define FB_COMMAND_MODE   (0)
25 #define FB_DATAAREA_MODE  (1)
26 #define FB_REPLACE_MODE   (0)
27 #define FB_INSERT_MODE    (1)
28 
29 #define MENU_NOT_IN_MENU  (0)
30 #define MENU_IN_MENU      (1)
31 #define MENU_KEEP_IN_MENU (2)
32 #define MENU_BACK_TO_MENU (3)
33 
34 #define HISTORY_KEY_NONE  (0)
35 #define HISTORY_KEY_UP    (1)
36 #define HISTORY_KEY_DOWN  (2)
37 #define HISTORY_KEY_BOTH  (3)
38 
39 #define DIR_SORT_BY_NAME  (0)
40 #define DIR_SORT_BY_TIME  (1)
41 #define DIR_SORT_BY_SIZE  (2)
42 
43 #define RTNVAL_NEXT_BUFFER          (1)
44 #define RTNVAL_SHELL_ESCAPE         (2)
45 #define RTNVAL_QUIT_BUFFER          (3)
46 #define RTNVAL_QUIT_CURRENT_BUFFER  (4)
47 #define RTNVAL_QUIT_ALL_BUFFER      (5)
48 #define RTNVAL_SAVE_ALL_AND_QUIT    (6)
49 
50 #define NORMAL_TEXT_BUFFER   (0)
51 #define DIRECTORY_BUFFER     (1)
52 
53 #define QE_IF_NECESSARY      (0)
54 #define QE_FORCE             (1)
55 
56 #define maximum(x,y)      (((x)>(y))?(x):(y))
57 #define minimum(x,y)      (((x)<(y))?(x):(y))
58 
59 #ifndef USE_ANSICOLOR
60 #define setattr(x,y)    wattrset(x,y)
61 #endif
62 
63 class keydefine;
64 
65 class filebuffer {
66 protected:
67     qeString          filename;
68     WINDOW            *win;
69     int               setbook0x,setbook0y;
70     int               setbook1x,setbook1y;
71     int               setbook2x,setbook2y;
72     char              cmdline[MAX_BUFFER_LEN];
73     char              patstr[21];
74     int               cmdline_idx;
75     int               screen_x, screen_y;
76     int               cursor_x, cursor_y;
77     int               buffer_x, buffer_y;
78     unsigned int      left_col_no;
79     linebuffer        *head, *tail, *current;
80     linebuffer        *topline;
81     int               top_line_no;
82     int               total_line;
83     short             input_mode;
84     short             mode;
85     short             loadingOK;
86     short             dirty_flag;
87     short             dirty_line;
88     short             quiet_flag;
89     short             read_only;
90     short             buffer_type;
91     short             message_dirty_flag;
92     short             keep_in_menu;
93 
94     char              workbuffer[MAX_BUFFER_LEN];
95     int               workbufidx;
96     int               workbuflen;
97 
98     int               clientarea(void);
99     int               cmdarea(void);
100 
101 protected:
102     static const int  markstacksize = 10;
103     static mark       markstack[];
104     static int        marksp;
105     static mark       current_mark;
106     static filebuffer *current_buffer;
107     filebuffer        *next_buffer;
108     filebuffer        *previous_buffer;
109     static int        push_mark(void);
110     static int        pop_mark(void);
111     static short      enable_ctrl_k;
112     static short      enable_ctrl_x;
113     static short      enable_ctrl_q;
114     static short      history_key;
115     static short      insert_mode;
116     static short      blank_compress;
117     static short      search_case;
118     static short      dir_sort;
119     static char       current_dir[PATH_MAX];
120     static int        screen_columns;
121     static int        screen_lines;
122     static keydefine  *kdf;
123     static short      big5msg_flag;
124     static short      quit_confirm;
125     static menu       menubar;
126     static cmdHistory history;
127 #ifdef USE_ANSICOLOR
128     static int        ansi_color;
129     void              setattr(WINDOW *w, int color);
130 #endif
131 
132     void              init_window(void);
133     void              init_menu(void);
134     void              load_file(void);
135 
136 protected:
137     void              general_init(void);
138     void              display_status(void);
139     void              load_workbuffer(void);
140     void              write_workbuffer(const int force);
141     virtual void      refresh_clientarea(const int  bflflag);
142     virtual void      refresh_bufferline(void);
143     void              refresh_cmdarea(void);
144     void              display_filename(void);
145     int               dirty_buffer(const int force = 0);
146     void              display_messages(const char *fmt, ...);
147     void              display_messages(const int  msgno);
148     void              display_messages(void);
149     int               getfirstkey(void);
150     int               getnextkey(void);
151     void              ca_attrset(void);
152     char              outputformat[10];
153     int               stringcompare(const char *s1, const char *s2);
154     int               stringncompare(const char *s1,const char *s2,const int n);
155     void              fix_all_mark_position(const int tp);
156     void              fix_mark_position(mark& mk, const int tp);
157     void              unmark_all_mark(void);
158     void              moveto(const int y, const int x);
159     void              mvprint(const int y, const int x, const char *str);
160     void              mvprint(const int y, const int x, const int len,
161                                                          const char *str);
162 public:
163     filebuffer(void);
164     filebuffer(const char *fname);
165 
166     virtual           ~filebuffer(void);
167     static void       init_curses(void);
168     static void       end_curses(void);
169     static int        setenviron(const char  *string);
170     static void       init_keydefine(const char *fname);
171     static void       init_keydefine(void);
172     static int        is_big5(void);
173 
174     static void       out_of_memory(void);
175 
176     filebuffer*       active(void);
177 
178 protected:
179 
180     void              paint(void);
181     int               cmd_kbinput(void);
182     int               cmd_edit(const char *filename, const int ro = 0);
183     int               cmd_dir(const char *path);
184     int               cmd_execute_key(const int  keycode);
185     int               cmd_execute(const char  *cmdstr);
186     int               cmd_cmdquote(const char *quote);
187     virtual int       do_function_key(const int  key);
188     int               cmd_change(const char *from, const char *to,
189                                      const int dir = 0, const int mk = 0,
190                                      int confirm = 1, int all = 0);
191     int               cmd_find(const char *str, const int dir = 0,
192                                               const int mark = 0 ,int msg = 1);
193     int               search_current_line(const char *str, const int  dir,
194                                                     linebuffer* lptr, int &x);
195     int               search_next_line(const char *str, const int  dir,
196                                             linebuffer*& lptr, int &y, int &x);
197 public:
198     virtual int       isword(int);
199     virtual int       cmd_up(void);
200     virtual int       cmd_down(void);
201     virtual int       cmd_left(void);
202     virtual int       cmd_right(void);
203     virtual int       cmd_pgup(void);
204     virtual int       cmd_pgdn(void);
205     virtual int       cmd_scrollup(void);
206     virtual int       cmd_scrolldown(void);
207     virtual int       cmd_scrollleft(void);
208     virtual int       cmd_scrollright(void);
209     virtual int       cmd_wordend(void);
210     virtual int       cmd_wordbegin(void);
211     virtual int       cmd_wordnext(void);
212     virtual int       cmd_markword(void);
213     virtual int       cmd_beginline(void);
214     virtual int       cmd_endline(void);
215     virtual int       cmd_goto_line(void);
216     virtual int       cmd_setbook0(void);
217     virtual int       cmd_setbook1(void);
218     virtual int       cmd_setbook2(void);
219     virtual int       cmd_gobook0(void);
220     virtual int       cmd_gobook1(void);
221     virtual int       cmd_gobook2(void);
222     virtual int       cmd_first_nonblank(void);
223     virtual int       cmd_top_edge(void);
224     virtual int       cmd_bottom_edge(void);
225     virtual int       cmd_tab(void);
226     virtual int       cmd_top(void);
227     virtual int       cmd_bottom(void);
228     virtual int       cmd_centerline(void);
229     virtual int       cmd_backword(void);
230     virtual int       cmd_tabword(void);
231     virtual int       cmd_quit(void);
232     virtual int       cmd_file(void);
233     virtual int       cmd_save(void);
234     virtual int       cmd_new(void);
235     virtual int       cmd_edit(void);
236     virtual int       cmd_dir(void);
237     virtual int       cmd_shell(void);
238     virtual int       cmd_command_toggle(void);
239     virtual int       cmd_insert_toggle(void);
240     virtual int       cmd_insert_mode(void);
241     virtual int       cmd_replace_mode(void);
242     virtual int       cmd_cursor_data(void);
243     virtual int       cmd_cursor_cmd(void);
244     virtual int       cmd_insertline(void);
245     virtual int       cmd_rubout(void);
246     virtual int       cmd_delchar(void);
247     virtual int       cmd_dupchar(void);
248     virtual int       cmd_undo(void);
249     virtual int       cmd_split(void);
250     virtual int       cmd_join(void);
251     virtual int       cmd_deleteline(void);
252     virtual int       cmd_erase_begin(void);
253     virtual int       cmd_erase_end(void);
254     virtual int       cmd_confirm(void);
255     virtual int       cmd_execute(void);
256     virtual int       cmd_beep(void);
257     virtual int       cmd_pushmark(void);
258     virtual int       cmd_popmark(void);
259     virtual int       cmd_markline(void);
260     virtual int       cmd_markblock(void);
261     virtual int       cmd_markchar(void);
262     virtual int       cmd_clear_marks(void);
263     virtual int       cmd_unmark(void);
264     virtual int       cmd_copymark(void);
265     virtual int       cmd_movemark(void);
266     virtual int       cmd_deletemark(void);
267     virtual int       cmd_fillmark(void);
268     virtual int       cmd_beginmark(void);
269     virtual int       cmd_endmark(void);
270     virtual int       cmd_overlayblock(void);
271     virtual int       cmd_shiftleft(void);
272     virtual int       cmd_shiftright(void);
273     virtual int       cmd_copyfromcmd(void);
274     virtual int       cmd_copytocmd(void);
275     virtual int       cmd_uppercase(void);
276     virtual int       cmd_lowercase(void);
277 //  virtual int       cmd_decodebase64(void);
278 
279     virtual int       cmd_gotoline(void);
280     virtual int       cmd_goto_currline(int,int);
281     virtual int       cmd_search(void);
282     virtual int       cmd_search2(void);
283     virtual int       cmd_isearch(void);
284     virtual int       cmd_menu(void);
285     virtual int       cmd_kill_line(void);
286     virtual int       query_blnkcmprs(void);
287     virtual int       query_searchcase(void);
288     virtual int       query_ctrl_k(void);
289     virtual int       query_ctrl_x(void);
290     virtual int       query_ctrl_q(void);
291     virtual int       query_big5(void);
292     virtual int       cmd_about(void);
293     virtual int       cmd_help(void);
294     virtual int       cmd_lang_big5(void);
295     virtual int       cmd_lang_english(void);
296     virtual int       cmd_toggle_blankcompress(void);
297     virtual int       cmd_history(void);
298     virtual int       cmd_toggle_historykey(void);
299     virtual int       cmd_toggle_dirsort(void);
300     virtual int       cmd_toggle_searchcase(void);
301     virtual int       cmd_quit_all(void);
302     virtual int       cmd_save_all_quit(void);
303     virtual int       cmd_resume(void);
304 
305 public:
306     char *            menu_language(const char *str);
307     char *            menu_blankcompress(const char *str);
308     char *            menu_inputmode(const char *str);
309     char *            menu_historykey(const char *str);
310     char *            menu_dirsort(const char *str);
311     char *            menu_searchcase(const char *str);
312 
313 // friend:
314     friend int        mark::renumber(void);
315 };
316 
317 typedef int (filebuffer::*filebuffer_pmfi)(void);
318 
319 #endif
320