1 /** \file
2  *  \brief Header: editor widget WEdit
3  */
4 
5 #ifndef MC__EDIT_WIDGET_H
6 #define MC__EDIT_WIDGET_H
7 
8 #include "lib/search.h"         /* mc_search_t */
9 #include "lib/widget.h"         /* Widget */
10 
11 #include "edit-impl.h"
12 #include "editbuffer.h"
13 
14 /*** typedefs(not structures) and defined constants **********************************************/
15 
16 #define N_LINE_CACHES 32
17 
18 /*** enums ***************************************************************************************/
19 
20 /**
21     enum for store the search conditions check results.
22     (if search condition have BOL(^) or EOL ($) regexp checial characters).
23 */
24 typedef enum
25 {
26     AT_START_LINE = (1 << 0),
27     AT_END_LINE = (1 << 1)
28 } edit_search_line_t;
29 
30 /*** structures declarations (and typedefs of structures)*****************************************/
31 
32 typedef struct edit_book_mark_t edit_book_mark_t;
33 struct edit_book_mark_t
34 {
35     long line;                  /* line number */
36     int c;                      /* color */
37     edit_book_mark_t *next;
38     edit_book_mark_t *prev;
39 };
40 
41 typedef struct edit_syntax_rule_t edit_syntax_rule_t;
42 struct edit_syntax_rule_t
43 {
44     unsigned short keyword;
45     off_t end;
46     unsigned char context;
47     unsigned char _context;
48     unsigned char border;
49 };
50 
51 /*
52  * State of WEdit window
53  * MCEDIT_DRAG_NONE   - window is in normal mode
54  * MCEDIT_DRAG_MOVE   - window is being moved
55  * MCEDIT_DRAG_RESIZE - window is being resized
56  */
57 typedef enum
58 {
59     MCEDIT_DRAG_NONE = 0,
60     MCEDIT_DRAG_MOVE,
61     MCEDIT_DRAG_RESIZE
62 } mcedit_drag_state_t;
63 
64 struct WEdit
65 {
66     Widget widget;
67     mcedit_drag_state_t drag_state;
68     int drag_state_start;       /* save cursor position before window moving */
69 
70     /* save location before move/resize or toggle to fullscreen */
71     WRect loc_prev;
72 
73     vfs_path_t *filename_vpath; /* Name of the file */
74     vfs_path_t *dir_vpath;      /* NULL if filename is absolute */
75 
76     /* dynamic buffers and cursor position for editor: */
77     edit_buffer_t buffer;
78 
79 #ifdef HAVE_CHARSET
80     /* multibyte support */
81     gboolean utf8;              /* It's multibyte file codeset */
82     GIConv converter;
83     char charbuf[4 + 1];
84     int charpoint;
85 #endif
86 
87     /* search handler */
88     mc_search_t *search;
89     int replace_mode;
90     /* is search conditions should be started from BOL(^) or ended with EOL($) */
91     edit_search_line_t search_line_type;
92 
93     char *last_search_string;   /* String that have been searched */
94     off_t search_start;         /* First character to start searching from */
95     unsigned long found_len;    /* Length of found string or 0 if none was found */
96     off_t found_start;          /* the found word from a search - start position */
97 
98     /* display information */
99     long start_display;         /* First char displayed */
100     long start_col;             /* First displayed column, negative */
101     long max_column;            /* The maximum cursor position ever reached used to calc hori scroll bar */
102     long curs_row;              /* row position of cursor on the screen */
103     long curs_col;              /* column position on screen */
104     long over_col;              /* pos after '\n' */
105     int force;                  /* how much of the screen do we redraw? */
106     unsigned int overwrite:1;   /* Overwrite on type mode (as opposed to insert) */
107     unsigned int modified:1;    /* File has been modified and needs saving */
108     unsigned int loading_done:1;        /* File has been loaded into the editor */
109     unsigned int locked:1;      /* We hold lock on current file */
110     unsigned int delete_file:1; /* New file, needs to be deleted unless modified */
111     unsigned int highlight:1;   /* There is a selected block */
112     unsigned int column_highlight:1;
113     unsigned int fullscreen:1;  /* Is window fullscreen or not */
114     long prev_col;              /* recent column position of the cursor - used when moving
115                                    up or down past lines that are shorter than the current line */
116     long start_line;            /* line number of the top of the page */
117 
118     /* file info */
119     off_t mark1;                /* position of highlight start */
120     off_t mark2;                /* position of highlight end */
121     off_t end_mark_curs;        /* position of cursor after end of highlighting */
122     long column1;               /* position of column highlight start */
123     long column2;               /* position of column highlight end */
124     off_t bracket;              /* position of a matching bracket */
125     off_t last_bracket;         /* previous position of a matching bracket */
126 
127     /* cache speedup for line lookups */
128     gboolean caches_valid;
129     long line_numbers[N_LINE_CACHES];
130     off_t line_offsets[N_LINE_CACHES];
131 
132     edit_book_mark_t *book_mark;
133     GArray *serialized_bookmarks;
134 
135     /* undo stack and pointers */
136     unsigned long undo_stack_pointer;
137     long *undo_stack;
138     unsigned long undo_stack_size;
139     unsigned long undo_stack_size_mask;
140     unsigned long undo_stack_bottom;
141     unsigned int undo_stack_disable:1;  /* If not 0, don't save events in the undo stack */
142 
143     unsigned long redo_stack_pointer;
144     long *redo_stack;
145     unsigned long redo_stack_size;
146     unsigned long redo_stack_size_mask;
147     unsigned long redo_stack_bottom;
148     unsigned int redo_stack_reset:1;    /* If 1, need clear redo stack */
149 
150     struct stat stat1;          /* Result of mc_fstat() on the file */
151     unsigned int skip_detach_prompt:1;  /* Do not prompt whether to detach a file anymore */
152 
153     /* syntax higlighting */
154     GSList *syntax_marker;
155     GPtrArray *rules;
156     off_t last_get_rule;
157     edit_syntax_rule_t rule;
158     char *syntax_type;          /* description of syntax highlighting type being used */
159     GTree *defines;             /* List of defines */
160     gboolean is_case_insensitive;       /* selects language case sensitivity */
161 
162     /* line break */
163     LineBreaks lb;
164 };
165 
166 /*** global variables defined in .c file *********************************************************/
167 
168 /*** declarations of public functions ************************************************************/
169 
170 /*** inline functions ****************************************************************************/
171 #endif /* MC__EDIT_WIDGET_H */
172