source: libi4uccore/documentslogic.vala @ 78c0493ca760d60a2360e816cd1aebee5fa490a2

Revision 78c0493ca760d60a2360e816cd1aebee5fa490a2, 8.5 KB checked in by Matias De la Puente <mfpuente.ar@…>, 2 years ago (diff)

Improve response of dialogs

Use DialogResponse? instead of ResponseType? to remove the use of Gtk in Core

  • Property mode set to 100644
Line 
1/* documentslogic.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 */
21using Gee;
22
23public class I4uc.Core.DocumentsLogic : GLib.Object
24{
25        private DocumentsView _view;
26        private ArrayList <DocumentPageLogic> _page_logics = new ArrayList <DocumentPageLogic> ();
27        private DocumentPageLogic _page_logic_selected;
28        private DocumentPreferencesPageLogic _preferences_page_logic;
29        private HashMap<string, DocumentOpener> _document_openers = new HashMap<string, DocumentOpener> ();
30       
31        public DocumentsLogic (DocumentsView view)
32        {
33                _view = view;
34               
35                _preferences_page_logic = new DocumentPreferencesPageLogic (_view.preferences_page_view, _page_logics);
36               
37                //configure view
38                _view.save_sensitive = false;
39                _view.save_as_sensitive = false;
40                _view.print_sensitive = false;
41                _view.undo_sensitive = false;
42                _view.redo_sensitive = false;
43                _view.cut_sensitive = false;
44                _view.copy_sensitive = false;
45                _view.paste_sensitive = false;
46                _view.search_sensitive = false;
47                _view.syntax_highlight_menu_sensitive = false;
48                _view.save_all_sensitive = false;
49                _view.close_all_sensitive = false;
50               
51                //connect view signals
52                _view.pages_panel.page_changed.connect (on_page_changed);
53                _view.new_clicked.connect (on_new_clicked);
54                _view.open_clicked.connect (on_open_clicked);
55                _view.open_recent_clicked.connect ((uri) => open_document (uri));
56                _view.save_clicked.connect (() => _page_logic_selected.save ());
57                _view.save_as_clicked.connect (on_save_as_clicked);
58                _view.print_clicked.connect (() => _page_logic_selected.print ());
59                _view.page_setup_clicked.connect (() => _view.show_page_setup_dialog ());
60                _view.undo_clicked.connect (() => _page_logic_selected.undo ());
61                _view.redo_clicked.connect (() => _page_logic_selected.redo ());
62                _view.cut_clicked.connect (() => _page_logic_selected.cut ());
63                _view.copy_clicked.connect (() => _page_logic_selected.copy ());
64                _view.paste_clicked.connect (() => _page_logic_selected.paste ());
65                _view.search_clicked.connect (() => _page_logic_selected.show_search_bar ());
66                _view.syntax_highlight_menu.language_id_changed.connect (on_language_id_changed);
67                _view.save_all_clicked.connect (on_save_all_clicked);
68                _view.close_all_clicked.connect (() => close_all ());
69        }
70       
71        public void open_document (string document_uri, int line=-1)
72        {
73                foreach (var file_extension in _document_openers.keys)
74                        if (document_uri.has_suffix (file_extension) &&
75                            _document_openers[file_extension].open_document (document_uri))
76                            return;
77                               
78                var page_logic = get_page_logic_from_title (document_uri);
79                if (page_logic == null)
80                {
81                        var page_view = _view.create_page_view ();
82                        page_logic = create_page_logic (page_view);
83                        page_logic.open (document_uri);
84                        _view.pages_panel.add_page (page_view);
85                }
86                _view.pages_panel.show_page (page_logic.view);
87                if (line != -1)
88                        page_logic.view.go_to_line (line);
89                page_logic.view.grab_focus ();
90        }
91       
92        public void open_documents (Gee.List<string> document_uris)
93        {
94                foreach (var document_uri in document_uris)
95                        open_document (document_uri);
96        }
97       
98        public void save_documents (Gee.List<string> document_uris)
99        {
100                foreach (var document_uri in document_uris)
101                {
102                        var page_logic = get_page_logic_from_title (document_uri);
103                        if (page_logic != null)
104                                page_logic.save ();
105                }
106        }
107       
108        public bool close_all ()
109        {
110                var unsaved_documents = new HashMap <string, string> ();
111                Gee.List<string> documents_to_save;
112                foreach (var page_logic in _page_logics)
113                        if (page_logic.view.content_modified)
114                                unsaved_documents[page_logic.view.title] = page_logic.view.tab_title;
115               
116                if (unsaved_documents.size != 0)
117                {
118                        var response = _view.show_close_confirmation_dialog (unsaved_documents, out documents_to_save);
119                       
120                        if (response == DialogResponse.CANCEL)
121                                return false;
122                       
123                        if (response == DialogResponse.OK)
124                                foreach (var document in documents_to_save)
125                                {
126                                        var page_logic = get_page_logic_from_title (document);
127                                        if (page_logic != null)
128                                                page_logic.save ();
129                                }
130                }
131               
132                foreach (var page_logic in _page_logics)
133                        _view.pages_panel.remove_page (page_logic.view);
134                _page_logics.clear ();
135                unselected_page_view ();
136                return true;
137        }
138       
139        public void add_document_opener (string file_extension, DocumentOpener document_opener)
140        {
141                _document_openers[file_extension] = document_opener;
142        }
143       
144        private void on_page_changed (Page? page)
145        {
146                if (page == null || !(page is DocumentPageView))
147                        unselected_page_view ();
148                else
149                        (page as DocumentPageView).selected ();
150        }
151       
152        private void unselected_page_view ()
153        {
154                _page_logic_selected = null;
155                _view.save_sensitive = false;
156                _view.save_as_sensitive = false;
157                _view.print_sensitive = false;
158                _view.undo_sensitive = false;
159                _view.redo_sensitive = false;
160                _view.cut_sensitive = false;
161                _view.copy_sensitive = false;
162                _view.paste_sensitive = false;
163                _view.search_sensitive = false;
164                _view.syntax_highlight_menu_sensitive = false;
165                if (_page_logics.size == 0)
166                {
167                        _view.save_all_sensitive = false;
168                        _view.close_all_sensitive = false;
169                }
170        }
171       
172        private void on_page_logic_selected (DocumentPageLogic page_logic)
173        {
174                _view.save_sensitive = page_logic.can_save;
175                _view.save_as_sensitive = true;
176                _view.print_sensitive = true;
177                on_page_logic_refresh_actions (page_logic);
178                _view.search_sensitive = true;
179                _view.save_all_sensitive = true;
180                _view.close_all_sensitive = true;
181                _page_logic_selected = page_logic;
182                _view.syntax_highlight_menu_sensitive = true;
183                _view.syntax_highlight_menu.language_id = page_logic.view.language_id;
184        }
185       
186        private void on_page_logic_refresh_actions (DocumentPageLogic page_logic)
187        {
188                _view.undo_sensitive = page_logic.view.can_undo;
189                _view.redo_sensitive = page_logic.view.can_redo;
190                _view.cut_sensitive = page_logic.view.has_selection;
191                _view.copy_sensitive = page_logic.view.has_selection;
192                _view.paste_sensitive = true;
193        }
194       
195        private void on_remove_page_logic (DocumentPageLogic page_logic)
196        {
197                _page_logics.remove (page_logic);
198                _view.pages_panel.remove_page (page_logic.view);
199        }
200       
201        private void on_new_clicked ()
202        {
203                var title = _("Unsaved file %i");
204                int i = 0;
205                while (get_page_logic_from_title (title.printf (++i)) != null)
206                        ;
207                var page_view = _view.create_page_view ();
208                page_view.title = title.printf (i);
209                page_view.tab_title = title.printf (i);
210                page_view.tab_tooltip = "<b>%s</b> %s".printf (_("Name:"), title.printf (i));
211                page_view.tab_image = TabImage.NEW;
212               
213                var page_logic = create_page_logic (page_view);
214                page_logic.is_new = true;
215               
216                _view.pages_panel.add_page (page_view);
217                _view.pages_panel.show_page (page_view);
218                page_view.grab_focus ();
219        }
220       
221        private void on_open_clicked ()
222        {
223                var folder_uri = I4uc.Core.Settings.instance.working_folder;
224                Gee.List<string> documents;
225                _view.show_open_dialog (ref folder_uri, out documents);
226                I4uc.Core.Settings.instance.working_folder = folder_uri;
227                open_documents (documents);
228        }
229       
230        private void on_save_as_clicked ()
231        {
232                _page_logic_selected.save_as ();
233                _view.save_sensitive = _page_logic_selected.can_save;
234        }
235       
236        private void on_language_id_changed ()
237        {
238                if (_page_logic_selected.view.language_id != _view.syntax_highlight_menu.language_id)
239                        _page_logic_selected.view.language_id = _view.syntax_highlight_menu.language_id;
240        }
241       
242        private void on_save_all_clicked ()
243        {
244                foreach (var page_logic in _page_logics)
245                        if (page_logic.view.content_modified)
246                                page_logic.save ();
247        }
248       
249        private DocumentPageLogic create_page_logic (DocumentPageView page_view)
250        {
251                var page_logic = new DocumentPageLogic (page_view);
252                page_logic.selected.connect (on_page_logic_selected);
253                page_logic.refresh_actions.connect (on_page_logic_refresh_actions);
254                page_logic.remove_document.connect (on_remove_page_logic);
255                _page_logics.add (page_logic);
256                return page_logic;
257        }
258       
259        private DocumentPageLogic? get_page_logic_from_title (string title)
260        {
261                foreach (var page_logic in _page_logics)
262                        if (page_logic.view.title == title)
263                                return page_logic;
264                return null;
265        }
266}
Note: See TracBrowser for help on using the repository browser.