/* 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;
}
}