source: libi4uc/i4ucdocumentpagepresenter.vala @ 259b397a65e57004ff5d68373708c121d3c64dd9

Revision 259b397a65e57004ff5d68373708c121d3c64dd9, 8.2 KB checked in by Matias De la Puente <mfpuente.ar@…>, 3 years ago (diff)

Documents: View grabs focus after creating documents and info 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_bar_visible = false;
64                _view.reload_bar_visible = false;
65                _view.save_bar_visible = false;
66                _view.search_bar_view_visible = false;
67                _view.content_modified = false;
68               
69                //connect view signals
70                _view.error_bar_ok_clicked.connect (on_error_bar_ok_clicked);
71                _view.reload_bar_reload_clicked.connect (on_reload_bar_reload_clicked);
72                _view.reload_bar_cancel_clicked.connect (on_reload_bar_cancel_clicked);
73                _view.save_bar_save_clicked.connect (on_save_bar_save_clicked);
74                _view.save_bar_cancel_clicked.connect (on_save_bar_cancel_clicked);
75                _view.close_clicked.connect (on_close_clicked);
76                _view.search_bar_view.close_clicked.connect (() => _view.search_bar_view_visible = false);
77                _view.selected.connect (on_selected);
78                _view.content_changed.connect (on_content_changed);
79                _view.selection_changed.connect (() => this.refresh_actions ());
80                _view.focused_in.connect (on_focused_in);
81        }
82       
83        public void open (string uri)
84        {
85                var file = File.new_for_uri (uri);
86                try
87                {
88                        _view.title = uri;
89                        var file_info = file.query_info (FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, FileQueryInfoFlags.NONE, null);
90                        _view.tab_title = file_info.get_display_name ();
91                        var contents = _document.load_contents (uri);
92                        _view.tab_tooltip = "<b>%s</b> %s".printf (_("Name:"), _document.parse_name);
93                        _view.content = contents;
94                        _view.content_modified = false;
95                        _view.tab_mark = false;
96                        _view.guess_language_id (_document.content_type);
97                        _externally_modified_adviced = false;
98                }
99                catch (GLib.Error e)
100                {
101                        _view.content_visible = false;
102                        _view.error_bar_primary_text = _("Error trying to open ") + file.get_path ();
103                        _view.error_bar_secondary_text = e.message;
104                        _view.tab_image = TabImage.ERROR;
105                        _view.error_bar_visible = true;
106                }
107        }
108       
109        public void save (bool forced=false)
110        {
111                if (_is_new)
112                        save_as ();
113                else if (_view.content_modified)
114                {
115                        try
116                        {
117                                _document.save_contents (_view.content, null, forced);
118                                _view.content_modified = false;
119                                _view.tab_mark = false;
120                                _externally_modified_adviced = false;
121                        }
122                        catch (GLib.Error e)
123                        {
124                                if (e is IOError.WRONG_ETAG)
125                                {
126                                        _view.save_bar_primary_text = _("The document was externally changed");
127                                        _view.save_bar_secondary_text = _("Do you want to save the document?");
128                                        _prev_tab_image = _view.tab_image;
129                                        _view.tab_image = TabImage.WARNING;
130                                        _view.save_bar_visible = true;
131                                }
132                                else
133                                {
134                                        _view.error_bar_primary_text = _("Error trying to save ") + _document.path;
135                                        _view.error_bar_secondary_text = e.message;
136                                        _prev_tab_image = _view.tab_image;
137                                        _view.tab_image = TabImage.ERROR;
138                                        _view.error_bar_visible = true;
139                                }
140                        }
141                }
142        }
143       
144        public void save_as ()
145        {
146                string document_uri;
147                var folder_uri = I4uc.Settings.instance.working_folder;
148                var response = _view.show_save_dialog (_view.tab_title, ref folder_uri, out document_uri);
149                if (response == Gtk.ResponseType.OK)
150                {
151                        try
152                        {
153                                _document.save_contents (_view.content, document_uri);
154                                _view.title = document_uri;
155                                _is_new = false;
156                                _view.tab_title = _document.display_name;
157                                _view.tab_tooltip = "<b>%s</b> %s".printf (_("Name:"), _document.parse_name);
158                                _view.tab_image = TabImage.FILE;
159                                _view.content_modified = false;
160                                _view.tab_mark = false;
161                                I4uc.Settings.instance.working_folder = folder_uri;
162                        }
163                        catch (GLib.Error e)
164                        {
165                                _view.error_bar_primary_text = _("Error trying to save as ") + File.new_for_uri (document_uri).get_path ();
166                                _view.error_bar_secondary_text = e.message;
167                                _prev_tab_image = _view.tab_image;
168                                _view.tab_image = TabImage.ERROR;
169                                _view.error_bar_visible = true;
170                        }
171                }
172        }
173       
174        public void print ()
175        {
176                try
177                {
178                        _view.show_print_dialog ();
179                }
180                catch (GLib.Error e)
181                {
182                        _view.error_bar_primary_text = _("Error trying to print ") + _document.uri;
183                        _view.error_bar_secondary_text = e.message;
184                        _prev_tab_image = _view.tab_image;
185                        _view.tab_image = TabImage.ERROR;
186                        _view.error_bar_visible = true;
187                }
188        }
189       
190        public void undo ()
191        {
192                _view.undo ();
193                this.refresh_actions ();
194        }
195       
196        public void redo ()
197        {
198                _view.redo ();
199                this.refresh_actions ();
200        }
201       
202        public void cut ()
203        {
204                _view.cut ();
205                this.refresh_actions ();
206        }
207       
208        public void copy ()
209        {
210                _view.copy ();
211                this.refresh_actions ();
212        }
213       
214        public void paste ()
215        {
216                _view.paste ();
217                this.refresh_actions ();
218        }
219       
220        public void show_search_bar ()
221        {
222                _view.search_bar_view_visible = true;
223        }
224       
225        private void on_error_bar_ok_clicked ()
226        {
227                //Error produced trying to open a document
228                if (!_view.content_visible)
229                        this.remove_document ();
230                _view.tab_image = _prev_tab_image;
231                _view.error_bar_visible = false;
232                _view.grab_focus ();
233        }
234       
235        private void on_reload_bar_reload_clicked ()
236        {
237                _view.tab_image = _prev_tab_image;
238                _view.reload_bar_visible = false;
239                open (_document.uri);
240                _view.grab_focus ();
241        }
242       
243        private void on_reload_bar_cancel_clicked ()
244        {
245                _view.tab_image = _prev_tab_image;
246                _view.reload_bar_visible = false;
247                _externally_modified_adviced = true;
248                _view.grab_focus ();
249        }
250       
251        private void on_save_bar_save_clicked ()
252        {
253                _view.tab_image = _prev_tab_image;
254                _view.save_bar_visible = false;
255                save (true);
256                _view.grab_focus ();
257        }
258       
259        private void on_save_bar_cancel_clicked ()
260        {
261                _view.tab_image = _prev_tab_image;
262                _view.save_bar_visible = false;
263                _view.grab_focus ();
264        }
265       
266        private void on_selected ()
267        {
268                if (!_is_new)
269                        I4uc.Settings.instance.working_folder = _document.folder;
270                this.selected ();
271        }
272       
273        private void on_content_changed ()
274        {
275                _view.tab_mark = _view.content_modified;
276                this.refresh_actions ();
277        }
278       
279        private void on_focused_in ()
280        {
281                if (_view.reload_bar_visible || _externally_modified_adviced)
282                        return;
283               
284                if (!_document.get_modified ())
285                        return;
286               
287                _view.reload_bar_primary_text = _("The file %s was externally modified").printf (_document.path);
288                _view.reload_bar_secondary_text = _("Do you want to reload the file?");
289                _prev_tab_image = _view.tab_image;
290                _view.tab_image = TabImage.WARNING;
291                _view.reload_bar_visible = true;
292        }
293       
294        private void on_close_clicked ()
295        {
296                if (_view.content_modified)
297                {
298                        var response = _view.show_close_message ();
299                       
300                        if (response == Gtk.ResponseType.CANCEL)
301                                return;
302                       
303                        if (response == Gtk.ResponseType.YES)
304                                save ();
305                }
306                this.remove_document ();
307        }
308}
Note: See TracBrowser for help on using the repository browser.