1 /*
2  * pluma-document.h
3  * This file is part of pluma
4  *
5  * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence
6  * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi
7  * Copyright (C) 2002-2005 Paolo Maggi
8  * Copyright (C) 2012-2021 MATE Developers
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor,
23  * Boston, MA 02110-1301, USA.
24  */
25 
26 /*
27  * Modified by the pluma Team, 1998-2005. See the AUTHORS file for a
28  * list of people on the pluma Team.
29  * See the ChangeLog files for a list of changes.
30  *
31  * $Id$
32  */
33 
34 #ifndef __PLUMA_DOCUMENT_H__
35 #define __PLUMA_DOCUMENT_H__
36 
37 #include <gio/gio.h>
38 #include <gtk/gtk.h>
39 #include <gtksourceview/gtksource.h>
40 
41 #include <pluma/pluma-encodings.h>
42 
43 G_BEGIN_DECLS
44 
45 /*
46  * Type checking and casting macros
47  */
48 #define PLUMA_TYPE_DOCUMENT              (pluma_document_get_type())
49 #define PLUMA_DOCUMENT(obj)              (G_TYPE_CHECK_INSTANCE_CAST((obj), PLUMA_TYPE_DOCUMENT, PlumaDocument))
50 #define PLUMA_DOCUMENT_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST((klass), PLUMA_TYPE_DOCUMENT, PlumaDocumentClass))
51 #define PLUMA_IS_DOCUMENT(obj)           (G_TYPE_CHECK_INSTANCE_TYPE((obj), PLUMA_TYPE_DOCUMENT))
52 #define PLUMA_IS_DOCUMENT_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), PLUMA_TYPE_DOCUMENT))
53 #define PLUMA_DOCUMENT_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS((obj), PLUMA_TYPE_DOCUMENT, PlumaDocumentClass))
54 
55 #define PLUMA_METADATA_ATTRIBUTE_POSITION "metadata::pluma-position"
56 #define PLUMA_METADATA_ATTRIBUTE_ENCODING "metadata::pluma-encoding"
57 #define PLUMA_METADATA_ATTRIBUTE_LANGUAGE "metadata::pluma-language"
58 
59 typedef enum
60 {
61 	PLUMA_DOCUMENT_NEWLINE_TYPE_LF,
62 	PLUMA_DOCUMENT_NEWLINE_TYPE_CR,
63 	PLUMA_DOCUMENT_NEWLINE_TYPE_CR_LF
64 } PlumaDocumentNewlineType;
65 
66 #define PLUMA_DOCUMENT_NEWLINE_TYPE_DEFAULT PLUMA_DOCUMENT_NEWLINE_TYPE_LF
67 
68 typedef enum
69 {
70 	PLUMA_SEARCH_DONT_SET_FLAGS	= 1 << 0,
71 	PLUMA_SEARCH_ENTIRE_WORD	= 1 << 1,
72 	PLUMA_SEARCH_CASE_SENSITIVE	= 1 << 2,
73 	PLUMA_SEARCH_PARSE_ESCAPES	= 1 << 3,
74 	PLUMA_SEARCH_MATCH_REGEX	= 1 << 4,
75 
76 } PlumaSearchFlags;
77 
78 /**
79  * PlumaDocumentSaveFlags:
80  * @PLUMA_DOCUMENT_SAVE_IGNORE_MTIME: save file despite external modifications.
81  * @PLUMA_DOCUMENT_SAVE_IGNORE_BACKUP: write the file directly without attempting to backup.
82  * @PLUMA_DOCUMENT_SAVE_PRESERVE_BACKUP: preserve previous backup file, needed to support autosaving.
83  */
84 typedef enum
85 {
86 	PLUMA_DOCUMENT_SAVE_IGNORE_MTIME 	= 1 << 0,
87 	PLUMA_DOCUMENT_SAVE_IGNORE_BACKUP	= 1 << 1,
88 	PLUMA_DOCUMENT_SAVE_PRESERVE_BACKUP	= 1 << 2
89 } PlumaDocumentSaveFlags;
90 
91 /* Private structure type */
92 typedef struct _PlumaDocumentPrivate    PlumaDocumentPrivate;
93 
94 /*
95  * Main object structure
96  */
97 typedef struct _PlumaDocument           PlumaDocument;
98 
99 struct _PlumaDocument
100 {
101 	GtkSourceBuffer buffer;
102 
103 	/*< private > */
104 	PlumaDocumentPrivate *priv;
105 };
106 
107 /*
108  * Class definition
109  */
110 typedef struct _PlumaDocumentClass 	PlumaDocumentClass;
111 
112 struct _PlumaDocumentClass
113 {
114 	GtkSourceBufferClass parent_class;
115 
116 	/* Signals */ // CHECK: ancora da rivedere
117 
118 	void (* cursor_moved)		(PlumaDocument    *document);
119 
120 	/* Document load */
121 	void (* load)			(PlumaDocument       *document,
122 					 const gchar         *uri,
123 					 const PlumaEncoding *encoding,
124 					 gint                 line_pos,
125 					 gboolean             create);
126 
127 	void (* loading)		(PlumaDocument    *document,
128 					 goffset	   size,
129 					 goffset	   total_size);
130 
131 	void (* loaded)			(PlumaDocument    *document,
132 					 const GError     *error);
133 
134 	/* Document save */
135 	void (* save)			(PlumaDocument          *document,
136 					 const gchar            *uri,
137 					 const PlumaEncoding    *encoding,
138 					 PlumaDocumentSaveFlags  flags);
139 
140 	void (* saving)			(PlumaDocument    *document,
141 					 goffset	   size,
142 					 goffset	   total_size);
143 
144 	void (* saved)  		(PlumaDocument    *document,
145 					 const GError     *error);
146 
147 	void (* search_highlight_updated)
148 					(PlumaDocument    *document,
149 					 GtkTextIter      *start,
150 					 GtkTextIter      *end);
151 };
152 
153 
154 #define PLUMA_DOCUMENT_ERROR pluma_document_error_quark ()
155 
156 enum
157 {
158 	PLUMA_DOCUMENT_ERROR_EXTERNALLY_MODIFIED,
159 	PLUMA_DOCUMENT_ERROR_CANT_CREATE_BACKUP,
160 	PLUMA_DOCUMENT_ERROR_TOO_BIG,
161 	PLUMA_DOCUMENT_ERROR_ENCODING_AUTO_DETECTION_FAILED,
162 	PLUMA_DOCUMENT_ERROR_CONVERSION_FALLBACK,
163 	PLUMA_DOCUMENT_NUM_ERRORS
164 };
165 
166 GQuark		 pluma_document_error_quark	(void);
167 
168 GType		 pluma_document_get_type      	(void) G_GNUC_CONST;
169 
170 PlumaDocument   *pluma_document_new 		(void);
171 
172 GFile		*pluma_document_get_location	(PlumaDocument       *doc);
173 
174 gchar		*pluma_document_get_uri 	(PlumaDocument       *doc);
175 void		 pluma_document_set_uri		(PlumaDocument       *doc,
176 						 const gchar 	     *uri);
177 
178 gchar		*pluma_document_get_uri_for_display
179 						(PlumaDocument       *doc);
180 gchar		*pluma_document_get_short_name_for_display
181 					 	(PlumaDocument       *doc);
182 
183 void		 pluma_document_set_short_name_for_display
184 						(PlumaDocument       *doc,
185 						 const gchar         *name);
186 
187 gchar		*pluma_document_get_content_type
188 					 	(PlumaDocument       *doc);
189 
190 void		 pluma_document_set_content_type
191 					 	(PlumaDocument       *doc,
192 					 	 const gchar         *content_type);
193 
194 gchar		*pluma_document_get_mime_type 	(PlumaDocument       *doc);
195 
196 gboolean	 pluma_document_get_readonly 	(PlumaDocument       *doc);
197 
198 void		 pluma_document_load 		(PlumaDocument       *doc,
199 						 const gchar         *uri,
200 						 const PlumaEncoding *encoding,
201 						 gint                 line_pos,
202 						 gboolean             create);
203 
204 gboolean	 pluma_document_insert_file	(PlumaDocument       *doc,
205 						 GtkTextIter         *iter,
206 						 const gchar         *uri,
207 						 const PlumaEncoding *encoding);
208 
209 gboolean	 pluma_document_load_cancel	(PlumaDocument       *doc);
210 
211 void		 pluma_document_save 		(PlumaDocument       *doc,
212 						 PlumaDocumentSaveFlags flags);
213 
214 void		 pluma_document_save_as 	(PlumaDocument       *doc,
215 						 const gchar         *uri,
216 						 const PlumaEncoding *encoding,
217 						 PlumaDocumentSaveFlags flags);
218 
219 gboolean	 pluma_document_is_untouched 	(PlumaDocument       *doc);
220 gboolean	 pluma_document_is_untitled 	(PlumaDocument       *doc);
221 
222 gboolean	 pluma_document_is_local	(PlumaDocument       *doc);
223 
224 gboolean	 pluma_document_get_deleted	(PlumaDocument       *doc);
225 
226 gboolean	 pluma_document_goto_line 	(PlumaDocument       *doc,
227 						 gint                 line);
228 
229 gboolean	 pluma_document_goto_line_offset(PlumaDocument *doc,
230 						 gint           line,
231 						 gint           line_offset);
232 
233 void		 pluma_document_set_search_text	(PlumaDocument       *doc,
234 						 const gchar         *text,
235 						 guint                flags);
236 
237 gchar		*pluma_document_get_search_text	(PlumaDocument       *doc,
238 						 guint               *flags);
239 
240 gchar		*pluma_document_get_last_replace_text
241 						(PlumaDocument       *doc);
242 
243 void		 pluma_document_set_last_replace_text
244 						(PlumaDocument       *doc,
245 						 const gchar         *text);
246 
247 gboolean	 pluma_document_get_can_search_again
248 						(PlumaDocument       *doc);
249 
250 gboolean	 pluma_document_search_forward	(PlumaDocument       *doc,
251 						 const GtkTextIter   *start,
252 						 const GtkTextIter   *end,
253 						 GtkTextIter         *match_start,
254 						 GtkTextIter         *match_end);
255 
256 gboolean	 pluma_document_search_backward	(PlumaDocument       *doc,
257 						 const GtkTextIter   *start,
258 						 const GtkTextIter   *end,
259 						 GtkTextIter         *match_start,
260 						 GtkTextIter         *match_end);
261 
262 gint		 pluma_document_replace_all 	(PlumaDocument       *doc,
263 				            	 const gchar         *find,
264 						 const gchar         *replace,
265 					    	 guint                flags);
266 
267 void 		 pluma_document_set_language 	(PlumaDocument       *doc,
268 						 GtkSourceLanguage   *lang);
269 GtkSourceLanguage
270 		*pluma_document_get_language 	(PlumaDocument       *doc);
271 
272 const PlumaEncoding
273 		*pluma_document_get_encoding	(PlumaDocument       *doc);
274 
275 void		 pluma_document_set_enable_search_highlighting
276 						(PlumaDocument       *doc,
277 						 gboolean             enable);
278 
279 gboolean	 pluma_document_get_enable_search_highlighting
280 						(PlumaDocument       *doc);
281 
282 void		 pluma_document_set_newline_type (PlumaDocument           *doc,
283 						  PlumaDocumentNewlineType newline_type);
284 
285 PlumaDocumentNewlineType
286 		 pluma_document_get_newline_type (PlumaDocument *doc);
287 
288 gchar		*pluma_document_get_metadata	(PlumaDocument *doc,
289 						 const gchar   *key);
290 
291 void		 pluma_document_set_metadata	(PlumaDocument *doc,
292 						 const gchar   *first_key,
293 						 ...);
294 
295 /*
296  * Non exported functions
297  */
298 void		 _pluma_document_set_readonly 	(PlumaDocument       *doc,
299 						 gboolean             readonly);
300 
301 glong		 _pluma_document_get_seconds_since_last_save_or_load
302 						(PlumaDocument       *doc);
303 
304 /* Note: this is a sync stat: use only on local files */
305 gboolean	_pluma_document_check_externally_modified
306 						(PlumaDocument       *doc);
307 
308 void		_pluma_document_search_region   (PlumaDocument       *doc,
309 						 const GtkTextIter   *start,
310 						 const GtkTextIter   *end);
311 
312 /* Search macros */
313 #define PLUMA_SEARCH_IS_DONT_SET_FLAGS(sflags) ((sflags & PLUMA_SEARCH_DONT_SET_FLAGS) != 0)
314 #define PLUMA_SEARCH_SET_DONT_SET_FLAGS(sflags,state) ((state == TRUE) ? \
315 (sflags |= PLUMA_SEARCH_DONT_SET_FLAGS) : (sflags &= ~PLUMA_SEARCH_DONT_SET_FLAGS))
316 
317 #define PLUMA_SEARCH_IS_ENTIRE_WORD(sflags) ((sflags & PLUMA_SEARCH_ENTIRE_WORD) != 0)
318 #define PLUMA_SEARCH_SET_ENTIRE_WORD(sflags,state) ((state == TRUE) ? \
319 (sflags |= PLUMA_SEARCH_ENTIRE_WORD) : (sflags &= ~PLUMA_SEARCH_ENTIRE_WORD))
320 
321 #define PLUMA_SEARCH_IS_CASE_SENSITIVE(sflags) ((sflags &  PLUMA_SEARCH_CASE_SENSITIVE) != 0)
322 #define PLUMA_SEARCH_SET_CASE_SENSITIVE(sflags,state) ((state == TRUE) ? \
323 (sflags |= PLUMA_SEARCH_CASE_SENSITIVE) : (sflags &= ~PLUMA_SEARCH_CASE_SENSITIVE))
324 
325 #define PLUMA_SEARCH_IS_PARSE_ESCAPES(sflags) ((sflags &  PLUMA_SEARCH_PARSE_ESCAPES) != 0)
326 #define PLUMA_SEARCH_SET_PARSE_ESCAPES(sflags,state) ((state == TRUE) ? \
327 (sflags |= PLUMA_SEARCH_PARSE_ESCAPES) : (sflags &= ~PLUMA_SEARCH_PARSE_ESCAPES))
328 
329 #define PLUMA_SEARCH_IS_MATCH_REGEX(sflags) ((sflags &  PLUMA_SEARCH_MATCH_REGEX) != 0)
330 #define PLUMA_SEARCH_SET_MATCH_REGEX(sflags,state) ((state == TRUE) ? \
331 (sflags |= PLUMA_SEARCH_MATCH_REGEX) : (sflags &= ~PLUMA_SEARCH_MATCH_REGEX))
332 
333 
334 typedef GMountOperation *(*PlumaMountOperationFactory)(PlumaDocument *doc,
335 						       gpointer       userdata);
336 
337 void		 _pluma_document_set_mount_operation_factory
338 						(PlumaDocument	            *doc,
339 						 PlumaMountOperationFactory  callback,
340 						 gpointer	             userdata);
341 GMountOperation
342 		*_pluma_document_create_mount_operation
343 						(PlumaDocument	     *doc);
344 
345 G_END_DECLS
346 
347 #endif /* __PLUMA_DOCUMENT_H__ */
348