2 * \brief Header: defines WPanel structure
8 #include <inttypes.h> /* uintmax_t */
9 #include <limits.h> /* MB_LEN_MAX */
11 #include "lib/global.h" /* gboolean */
12 #include "lib/fs.h" /* MC_MAXPATHLEN */
13 #include "lib/strutil.h"
14 #include "lib/widget.h" /* Widget */
15 #include "lib/filehighlight.h"
16 #include "lib/file-entry.h"
18 #include "dir.h" /* dir_list */
20 /*** typedefs(not structures) and defined constants **********************************************/
22 #define PANEL(x) ((WPanel *)(x))
24 #define LIST_FORMATS 4
26 #define UP_KEEPSEL ((char *) -1)
28 /*** enums ***************************************************************************************/
32 list_full
, /* Name, size, perm/date */
33 list_brief
, /* Name */
34 list_long
, /* Like ls -l */
35 list_user
/* User defined */
40 frame_full
, /* full screen frame */
41 frame_half
/* half screen frame */
49 } panel_update_flags_t
;
51 /* run mode and params */
58 /*** structures declarations (and typedefs of structures)*****************************************/
60 typedef struct panel_field_struct
65 align_crt_t default_just
;
67 const char *title_hotkey
;
68 gboolean is_user_choice
;
69 gboolean use_in_user_format
;
70 const char *(*string_fn
) (const file_entry_t
* fe
, int len
);
71 GCompareFunc sort_routine
; /* used by mouse_sort_col() */
77 vfs_path_t
*root_vpath
;
84 char *name
; /* The panel name */
86 panel_display_t frame_size
; /* half or full frame */
88 gboolean active
; /* If panel is currently selected */
89 gboolean dirty
; /* Should we redisplay the panel? */
91 gboolean is_panelized
; /* Panelization: special mode, can't reload the file list */
92 panelized_descr_t
*panelized_descr
; /* Panelization descriptor */
95 int codepage
; /* Panel codepage */
98 dir_list dir
; /* Directory contents */
99 struct stat dir_stat
; /* Stat of current dir: used by execute () */
101 vfs_path_t
*cwd_vpath
; /* Current Working Directory */
102 vfs_path_t
*lwd_vpath
; /* Last Working Directory */
104 list_format_t list_format
; /* Listing type */
105 GSList
*format
; /* Display format */
106 char *user_format
; /* User format */
107 int list_cols
; /* Number of file list columns */
108 int brief_cols
; /* Number of columns in case of list_brief format */
110 dir_sort_options_t sort_info
;
111 const panel_field_t
*sort_field
;
113 int marked
; /* Count of marked files */
114 int dirs_marked
; /* Count of marked directories */
115 uintmax_t total
; /* Bytes in marked files */
117 int top
; /* The file shown on the top of the panel */
118 int current
; /* Index to the currently selected file */
120 GSList
*status_format
; /* Mini status format */
121 gboolean user_mini_status
; /* Is user_status_format used */
122 char *user_status_format
[LIST_FORMATS
]; /* User format for status line */
124 file_filter_t filter
; /* File name filter */
128 char *name
; /* Directory history name for history file */
129 GList
*list
; /* Directory history */
130 GList
*current
; /* Pointer to the current history item */
137 GString
*prev_buffer
;
138 char ch
[MB_LEN_MAX
]; /* Buffer for multi-byte character */
139 int chpoint
; /* Point after last characters in @ch */
142 int content_shift
; /* Number of characters of filename need to skip from left side. */
143 int max_shift
; /* Max shift for visible part of current panel */
146 /*** global variables defined in .c file *********************************************************/
148 extern hook_t
*select_file_hook
;
150 extern mc_fhl_t
*mc_filehighlight
;
152 /*** declarations of public functions ************************************************************/
154 WPanel
*panel_sized_empty_new (const char *panel_name
, const WRect
* r
);
155 WPanel
*panel_sized_with_dir_new (const char *panel_name
, const WRect
* r
,
156 const vfs_path_t
* vpath
);
158 void panel_clean_dir (WPanel
* panel
);
160 void panel_reload (WPanel
* panel
);
161 void panel_set_sort_order (WPanel
* panel
, const panel_field_t
* sort_order
);
162 void panel_re_sort (WPanel
* panel
);
165 void panel_change_encoding (WPanel
* panel
);
166 vfs_path_t
*remove_encoding_from_path (const vfs_path_t
* vpath
);
169 void update_panels (panel_update_flags_t flags
, const char *current_file
);
170 int set_panel_formats (WPanel
* p
);
172 void panel_set_filter (WPanel
* panel
, const file_filter_t
* filter
);
174 void panel_set_current_by_name (WPanel
* panel
, const char *name
);
176 void unmark_files (WPanel
* panel
);
177 void select_item (WPanel
* panel
);
179 void recalculate_panel_summary (WPanel
* panel
);
180 void file_mark (WPanel
* panel
, int idx
, int val
);
181 void do_file_mark (WPanel
* panel
, int idx
, int val
);
183 gboolean
panel_do_cd (WPanel
* panel
, const vfs_path_t
* new_dir_vpath
, enum cd_enum cd_type
);
184 gboolean
panel_cd (WPanel
* panel
, const vfs_path_t
* new_dir_vpath
, enum cd_enum cd_type
);
186 gsize
panel_get_num_of_sortable_fields (void);
187 char **panel_get_sortable_fields (gsize
* array_size
);
188 const panel_field_t
*panel_get_field_by_id (const char *name
);
189 const panel_field_t
*panel_get_field_by_title (const char *name
);
190 const panel_field_t
*panel_get_field_by_title_hotkey (const char *name
);
191 gsize
panel_get_num_of_user_possible_fields (void);
192 char **panel_get_user_possible_fields (gsize
* array_size
);
193 void panel_set_cwd (WPanel
* panel
, const vfs_path_t
* vpath
);
194 void panel_set_lwd (WPanel
* panel
, const vfs_path_t
* vpath
);
196 void panel_panelize_cd (void);
197 void panel_panelize_change_root (WPanel
* panel
, const vfs_path_t
* new_root
);
198 void panel_panelize_absolutize_if_needed (WPanel
* panel
);
199 void panel_panelize_save (WPanel
* panel
);
201 void panel_init (void);
202 void panel_deinit (void);
204 /* --------------------------------------------------------------------------------------------- */
205 /*** inline functions ****************************************************************************/
206 /* --------------------------------------------------------------------------------------------- */
208 * Empty panel creation.
210 * @param panel_name name of panel for setup retrieving
212 * @return new instance of WPanel
215 static inline WPanel
*
216 panel_empty_new (const char *panel_name
)
218 /* Unknown sizes of the panel at startup */
219 WRect r
= { 0, 0, 1, 1 };
221 return panel_sized_empty_new (panel_name
, &r
);
224 /* --------------------------------------------------------------------------------------------- */
226 * Panel creation for specified directory.
228 * @param panel_name name of panel for setup retrieving
229 * @param vpath working panel directory. If NULL then current directory is used
231 * @return new instance of WPanel
234 static inline WPanel
*
235 panel_with_dir_new (const char *panel_name
, const vfs_path_t
* vpath
)
237 /* Unknown sizes of the panel at startup */
238 WRect r
= { 0, 0, 1, 1 };
240 return panel_sized_with_dir_new (panel_name
, &r
, vpath
);
244 /* --------------------------------------------------------------------------------------------- */
248 * @param panel_name name of panel for setup retrieving
250 * @return new instance of WPanel
253 static inline WPanel
*
254 panel_new (const char *panel_name
)
256 return panel_with_dir_new (panel_name
, NULL
);
259 /* --------------------------------------------------------------------------------------------- */
261 * Panel creation with specified size.
263 * @param panel_name name of panel for setup retrieving
264 * @param r panel area
266 * @return new instance of WPanel
269 static inline WPanel
*
270 panel_sized_new (const char *panel_name
, const WRect
* r
)
272 return panel_sized_with_dir_new (panel_name
, r
, NULL
);
275 /* --------------------------------------------------------------------------------------------- */
277 static inline file_entry_t
*
278 panel_current_entry (const WPanel
* panel
)
280 return &(panel
->dir
.list
[panel
->current
]);
283 /* --------------------------------------------------------------------------------------------- */
285 #endif /* MC__PANEL_H */