source: libi4uc/i4ucdocumentpagepresenter.vala @ 759935945aef4be4bdc69724a7648f25885843f4

Revision 759935945aef4be4bdc69724a7648f25885843f4, 8.9 KB checked in by Matias De la Puente <mfpuente.ar@…>, 3 years ago (diff)

Documents: Improve message bars

  • Property mode set to 100644
Line 
1/* i4ucdocumentpagepresenter.vala
2 *
3 * Copyright (C) 2010  Matias De la Puente
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 *
18 * Author:
19 *      Matias De la Puente <mfpuente.ar@gmail.com>
20 */
21
22public class I4uc.DocumentPagePresenter : GLib.Object
23{
24        private DocumentPageViewIface _view;
25        private Document _document = new Document ();
26        private SearchBarPresenter _search_bar_presenter;
27        private bool _externally_modified_adviced;
28        private TabImage _prev_tab_image;
29       
30        public DocumentPageViewIface view { get { return _view; } }
31        public bool is_new { set; get; }
32       
33        public bool can_save
34        {
35                get
36                {
37                        if (_is_new)
38                                return true;
39                        return _document.can_write;
40                }
41        }
42       
43        public signal void selected ();
44        public signal void refresh_actions ();
45        public signal void remove_document ();
46       
47        public DocumentPagePresenter (DocumentPageViewIface view)
48        {
49                _view = view;
50                _search_bar_presenter = new SearchBarPresenter (_view.search_bar_view);
51               
52                //configure view
53                var settings = I4uc.Settings.instance;
54                _view.font_name = settings.documents_font;
55                _view.tab_width = settings.documents_tab_width;
56                _view.auto_indent = settings.documents_auto_indent;
57                _view.highlight_current_line = settings.documents_highlight_current_line;
58                _view.insert_spaces_instead_of_tabs = settings.documents_insert_spaces_instead_of_tabs;
59                _view.show_line_numbers = settings.documents_show_line_numbers;
60                _view.highlight_matching_brackets = settings.documents_highlight_matching_brackets;
61                _view.wrap_mode = settings.documents_wrap_mode;
62               
63                _view.error_message_bar.visible = false;
64                _view.error_message_bar.image = TabImage.ERROR;
65                _view.reload_message_bar.visible = false;
66                _view.reload_message_bar.image = TabImage.WARNING;
67                _view.save_message_bar.visible = false;
68                _view.save_message_bar.image = TabImage.WARNING;
69                _view.search_bar_view_visible = false;
70                _view.content_modified = false;
71               
72                //connect view signals
73                _view.error_message_bar.ok_clicked.connect (on_error_message_bar_ok_clicked);
74                _view.reload_message_bar.ok_clicked.connect (on_reload_message_bar_ok_clicked);
75                _view.reload_message_bar.cancel_clicked.connect (on_reload_message_bar_cancel_clicked);
76                _view.save_message_bar.ok_clicked.connect (on_save_message_bar_ok_clicked);
77                _view.save_message_bar.cancel_clicked.connect (on_save_message_bar_cancel_clicked);
78                _view.close_clicked.connect (on_close_clicked);
79                _view.search_bar_view.close_clicked.connect (() => _view.search_bar_view_visible = false);
80                _view.selected.connect (on_selected);
81                _view.content_changed.connect (on_content_changed);
82                _view.selection_changed.connect (() => this.refresh_actions ());
83                _view.focused_in.connect (on_focused_in);
84        }
85       
86        public void open (string uri)
87        {
88                var file = File.new_for_uri (uri);
89                try
90                {
91                        _view.title = uri;
92                        var file_info = file.query_info (FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, FileQueryInfoFlags.NONE, null);
93                        _view.tab_title = file_info.get_display_name ();
94                        var contents = _document.load_contents (uri);
95                        _view.tab_tooltip = "<b>%s</b> %s".printf (_("Name:"), _document.parse_name);
96                        _view.content = contents;
97                        _view.content_modified = false;
98                        _view.tab_mark = false;
99                        _view.add_recent (uri);
100                        _view.guess_language_id (_document.content_type);
101                        _externally_modified_adviced = false;
102                }
103                catch (GLib.Error e)
104                {
105                        _view.content_visible = false;
106                        _view.error_message_bar.primary_text = _("Error trying to open ") + file.get_path ();
107                        _view.error_message_bar.secondary_text = e.message;
108                        _view.tab_image = TabImage.ERROR;
109                        _view.error_message_bar.visible = true;
110                }
111        }
112       
113        public void save (bool forced=false)
114        {
115                if (_is_new)
116                        save_as ();
117                else if (_view.content_modified)
118                {
119                        try
120                        {
121                                _document.save_contents (_view.content, null, forced);
122                                _view.content_modified = false;
123                                _view.tab_mark = false;
124                                _view.add_recent (_document.uri);
125                                _externally_modified_adviced = false;
126                        }
127                        catch (GLib.Error e)
128                        {
129                                if (e is IOError.WRONG_ETAG)
130                                {
131                                        _view.save_message_bar.primary_text = _("The document was externally changed");
132                                        _view.save_message_bar.secondary_text = _("Do you want to save the document?");
133                                        _prev_tab_image = _view.tab_image;
134                                        _view.tab_image = TabImage.WARNING;
135                                        _view.save_message_bar.visible = true;
136                                }
137                                else
138                                {
139                                        _view.error_message_bar.primary_text = _("Error trying to save ") + _document.path;
140                                        _view.error_message_bar.secondary_text = e.message;
141                                        _prev_tab_image = _view.tab_image;
142                                        _view.tab_image = TabImage.ERROR;
143                                        _view.error_message_bar.visible = true;
144                                }
145                        }
146                }
147        }
148       
149        public void save_as ()
150        {
151                string document_uri;
152                var folder_uri = I4uc.Settings.instance.working_folder;
153                var response = _view.show_save_dialog (_view.tab_title, ref folder_uri, out document_uri);
154                if (response == Gtk.ResponseType.OK)
155                {
156                        try
157                        {
158                                _document.save_contents (_view.content, document_uri);
159                                _view.title = document_uri;
160                                _is_new = false;
161                                _view.tab_title = _document.display_name;
162                                _view.tab_tooltip = "<b>%s</b> %s".printf (_("Name:"), _document.parse_name);
163                                _view.tab_image = TabImage.FILE;
164                                _view.content_modified = false;
165                                _view.tab_mark = false;
166                                _view.add_recent (_document.uri);
167                                I4uc.Settings.instance.working_folder = folder_uri;
168                                _externally_modified_adviced = false;
169                        }
170                        catch (GLib.Error e)
171                        {
172                                _view.error_message_bar.primary_text = _("Error trying to save as ") + File.new_for_uri (document_uri).get_path ();
173                                _view.error_message_bar.secondary_text = e.message;
174                                _prev_tab_image = _view.tab_image;
175                                _view.tab_image = TabImage.ERROR;
176                                _view.error_message_bar.visible = true;
177                        }
178                }
179        }
180       
181        public void print ()
182        {
183                try
184                {
185                        _view.show_print_dialog ();
186                }
187                catch (GLib.Error e)
188                {
189                        _view.error_message_bar.primary_text = _("Error trying to print ") + _document.uri;
190                        _view.error_message_bar.secondary_text = e.message;
191                        _prev_tab_image = _view.tab_image;
192                        _view.tab_image = TabImage.ERROR;
193                        _view.error_message_bar.visible = true;
194                }
195        }
196       
197        public void undo ()
198        {
199                _view.undo ();
200                this.refresh_actions ();
201        }
202       
203        public void redo ()
204        {
205                _view.redo ();
206                this.refresh_actions ();
207        }
208       
209        public void cut ()
210        {
211                _view.cut ();
212                this.refresh_actions ();
213        }
214       
215        public void copy ()
216        {
217                _view.copy ();
218                this.refresh_actions ();
219        }
220       
221        public void paste ()
222        {
223                _view.paste ();
224                this.refresh_actions ();
225        }
226       
227        public void show_search_bar ()
228        {
229                _view.search_bar_view_visible = true;
230        }
231       
232        private void on_error_message_bar_ok_clicked ()
233        {
234                //Error produced trying to open a document
235                if (!_view.content_visible)
236                        this.remove_document ();
237                _view.tab_image = _prev_tab_image;
238                _view.error_message_bar.visible = false;
239                _view.grab_focus ();
240        }
241       
242        private void on_reload_message_bar_ok_clicked ()
243        {
244                _view.tab_image = _prev_tab_image;
245                _view.reload_message_bar.visible = false;
246                open (_document.uri);
247                _view.grab_focus ();
248        }
249       
250        private void on_reload_message_bar_cancel_clicked ()
251        {
252                _view.tab_image = _prev_tab_image;
253                _view.reload_message_bar.visible = false;
254                _externally_modified_adviced = true;
255                _view.grab_focus ();
256        }
257       
258        private void on_save_message_bar_ok_clicked ()
259        {
260                _view.tab_image = _prev_tab_image;
261                _view.save_message_bar.visible = false;
262                save (true);
263                _view.grab_focus ();
264        }
265       
266        private void on_save_message_bar_cancel_clicked ()
267        {
268                _view.tab_image = _prev_tab_image;
269                _view.save_message_bar.visible = false;
270                _view.grab_focus ();
271        }
272       
273        private void on_selected ()
274        {
275                if (!_is_new)
276                        I4uc.Settings.instance.working_folder = _document.folder;
277                this.selected ();
278        }
279       
280        private void on_content_changed ()
281        {
282                _view.tab_mark = _view.content_modified;
283                this.refresh_actions ();
284        }
285       
286        private void on_focused_in ()
287        {
288                if (_view.reload_message_bar.visible || _externally_modified_adviced)
289                        return;
290               
291                if (!_document.get_modified ())
292                        return;
293               
294                _view.reload_message_bar.primary_text = _("The file %s was externally modified").printf (_document.path);
295                _view.reload_message_bar.secondary_text = _("Do you want to reload the file?");
296                _prev_tab_image = _view.tab_image;
297                _view.tab_image = TabImage.WARNING;
298                _view.reload_message_bar.visible = true;
299        }
300       
301        private void on_close_clicked ()
302        {
303                if (_view.content_modified)
304                {
305                        var response = _view.show_close_message ();
306                       
307                        if (response == Gtk.ResponseType.CANCEL)
308                                return;
309                       
310                        if (response == Gtk.ResponseType.YES)
311                                save ();
312                }
313                this.remove_document ();
314        }
315}
Note: See TracBrowser for help on using the repository browser.