source: libi4uccore/documentslogic.vala @ 47b701a6646050bc639a18969b1ada4845b6e1c3

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

Rework to use ViewFactory? and App

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