/* i4ucdocumentspresenter.vala * * Copyright (C) 2010 Matias De la Puente * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Author: * Matias De la Puente */ using Gee; public class I4uc.DocumentsPresenter : GLib.Object { private DocumentsViewIface _view; private ArrayList _page_presenters = new ArrayList (); private DocumentPagePresenter _page_presenter_selected; private DocumentPreferencesSidePagePresenter _preferences_side_page_presenter; public DocumentsPresenter (DocumentsViewIface view) { _view = view; _preferences_side_page_presenter = new DocumentPreferencesSidePagePresenter (_view.preferences_side_page_view, _page_presenters); //configure view _view.save_sensitive = false; _view.save_as_sensitive = false; _view.print_sensitive = false; _view.undo_sensitive = false; _view.redo_sensitive = false; _view.cut_sensitive = false; _view.copy_sensitive = false; _view.paste_sensitive = false; _view.search_sensitive = false; _view.syntax_highlight_menu_sensitive = false; _view.save_all_sensitive = false; _view.close_all_sensitive = false; //connect view signals _view.pages_panel.page_changed.connect (on_page_changed); _view.new_clicked.connect (on_new_clicked); _view.open_clicked.connect (on_open_clicked); _view.save_clicked.connect (() => _page_presenter_selected.save ()); _view.save_as_clicked.connect (() => _page_presenter_selected.save_as ()); _view.print_clicked.connect (() => _page_presenter_selected.print ()); _view.page_setup_clicked.connect (() => _view.show_page_setup_dialog ()); _view.undo_clicked.connect (() => _page_presenter_selected.undo ()); _view.redo_clicked.connect (() => _page_presenter_selected.redo ()); _view.cut_clicked.connect (() => _page_presenter_selected.cut ()); _view.copy_clicked.connect (() => _page_presenter_selected.copy ()); _view.paste_clicked.connect (() => _page_presenter_selected.paste ()); _view.search_clicked.connect (() => _page_presenter_selected.show_search_bar ()); _view.syntax_highlight_menu.language_id_changed.connect (on_language_id_changed); _view.save_all_clicked.connect (on_save_all_clicked); _view.close_all_clicked.connect (() => close_all ()); } public void open_document (string document_uri) { var page_presenter = get_page_presenter_from_title (document_uri); if (page_presenter == null) { var page_view = _view.create_page_view (); page_presenter = create_page_presenter (page_view); page_presenter.open (document_uri); _view.pages_panel.add_page (page_view); } _view.pages_panel.show_page (page_presenter.view); } public void open_documents (Gee.List document_uris) { foreach (var document_uri in document_uris) open_document (document_uri); } public bool close_all () { var unsaved_documents = new HashMap (); Gee.List documents_to_save; foreach (var page_presenter in _page_presenters) if (page_presenter.view.content_modified) unsaved_documents[page_presenter.view.title] = page_presenter.view.tab_title; if (unsaved_documents.size != 0) { var response = _view.show_close_confirmation_dialog (unsaved_documents, out documents_to_save); if (response == Gtk.ResponseType.CANCEL) return false; if (response == Gtk.ResponseType.OK) foreach (var document in documents_to_save) { var page_presenter = get_page_presenter_from_title (document); if (page_presenter != null) page_presenter.save (); } } foreach (var page_presenter in _page_presenters) _view.pages_panel.remove_page (page_presenter.view); _page_presenters.clear (); unselected_page_view (); return true; } private void on_page_changed (PageIface? page) { if (page == null || !(page is DocumentPageView)) unselected_page_view (); else (page as DocumentPageView).selected (); } private void unselected_page_view () { _page_presenter_selected = null; _view.save_sensitive = false; _view.save_as_sensitive = false; _view.print_sensitive = false; _view.undo_sensitive = false; _view.redo_sensitive = false; _view.cut_sensitive = false; _view.copy_sensitive = false; _view.paste_sensitive = false; _view.search_sensitive = false; _view.syntax_highlight_menu_sensitive = false; if (_page_presenters.size == 0) { _view.save_all_sensitive = false; _view.close_all_sensitive = false; } } private void on_page_presenter_selected (DocumentPagePresenter page_presenter) { _view.save_sensitive = page_presenter.can_save; _view.save_as_sensitive = true; _view.print_sensitive = true; on_page_presenter_refresh_actions (page_presenter); _view.search_sensitive = true; _view.save_all_sensitive = true; _view.close_all_sensitive = true; _page_presenter_selected = page_presenter; _view.syntax_highlight_menu_sensitive = true; _view.syntax_highlight_menu.language_id = page_presenter.view.language_id; } private void on_page_presenter_refresh_actions (DocumentPagePresenter page_presenter) { _view.undo_sensitive = page_presenter.view.can_undo; _view.redo_sensitive = page_presenter.view.can_redo; _view.cut_sensitive = page_presenter.view.has_selection; _view.copy_sensitive = page_presenter.view.has_selection; _view.paste_sensitive = true; } private void on_remove_page_presenter (DocumentPagePresenter page_presenter) { _page_presenters.remove (page_presenter); _view.pages_panel.remove_page (page_presenter.view); } private void on_new_clicked () { var title = _("Unsaved file %i"); int i = 0; while (get_page_presenter_from_title (title.printf (++i)) != null) ; var page_view = _view.create_page_view (); page_view.title = title.printf (i); page_view.tab_title = title.printf (i); page_view.tab_tooltip = "%s %s".printf (_("Name:"), title.printf (i)); page_view.tab_image = TabImage.NEW; var page_presenter = create_page_presenter (page_view); page_presenter.is_new = true; _view.pages_panel.add_page (page_view); _view.pages_panel.show_page (page_view); } private void on_open_clicked () { var folder_uri = I4uc.Settings.instance.working_folder; Gee.List documents; _view.show_open_dialog (ref folder_uri, out documents); I4uc.Settings.instance.working_folder = folder_uri; open_documents (documents); } private void on_language_id_changed () { if (_page_presenter_selected.view.language_id != _view.syntax_highlight_menu.language_id) _page_presenter_selected.view.language_id = _view.syntax_highlight_menu.language_id; } private void on_save_all_clicked () { foreach (var page_presenter in _page_presenters) if (page_presenter.view.content_modified) page_presenter.save (); } private DocumentPagePresenter create_page_presenter (DocumentPageViewIface page_view) { var page_presenter = new DocumentPagePresenter (page_view); page_presenter.selected.connect (on_page_presenter_selected); page_presenter.refresh_actions.connect (on_page_presenter_refresh_actions); page_presenter.remove_document.connect (on_remove_page_presenter); _page_presenters.add (page_presenter); return page_presenter; } private DocumentPagePresenter? get_page_presenter_from_title (string title) { foreach (var page_presenter in _page_presenters) if (page_presenter.view.title == title) return page_presenter; return null; } }