#include #include "notebook.h" #include "logging.h" #include "singletons.h" #include //TODO: remove using namespace std; //TODO: remove namespace sigc { SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE } Notebook::Notebook() : Gtk::Notebook() { INFO("Create notebook"); Gsv::init(); auto menu=Singleton::menu(); INFO("Notebook create signal handlers"); menu->action_group->add(Gtk::Action::create("FileMenu", "File")); menu->action_group->add(Gtk::Action::create("WindowCloseTab", "Close tab"), Gtk::AccelKey(menu->key_map["close_tab"]), [this]() { close_current_page(); }); menu->action_group->add(Gtk::Action::create("EditUndo", "Undo"), Gtk::AccelKey(menu->key_map["edit_undo"]), [this]() { INFO("On undo"); Glib::RefPtr undo_manager = CurrentSourceView()->get_source_buffer()->get_undo_manager(); if (Pages() != 0 && undo_manager->can_undo()) { undo_manager->undo(); } INFO("Done undo"); }); menu->action_group->add(Gtk::Action::create("EditRedo", "Redo"), Gtk::AccelKey(menu->key_map["edit_redo"]), [this]() { INFO("On Redo"); Glib::RefPtr undo_manager = CurrentSourceView()->get_source_buffer()->get_undo_manager(); if (Pages() != 0 && undo_manager->can_redo()) { undo_manager->redo(); } INFO("Done Redo"); }); menu->action_group->add(Gtk::Action::create("SourceGotoDeclaration", "Go to declaration"), Gtk::AccelKey(menu->key_map["source_goto_declaration"]), [this]() { if(CurrentPage()!=-1) { if(CurrentSourceView()->get_declaration_location) { auto location=CurrentSourceView()->get_declaration_location(); if(location.first.size()>0) { open_file(location.first); CurrentSourceView()->get_buffer()->place_cursor(CurrentSourceView()->get_buffer()->get_iter_at_offset(location.second)); while(gtk_events_pending()) gtk_main_iteration(); CurrentSourceView()->scroll_to(CurrentSourceView()->get_buffer()->get_insert(), 0.0, 1.0, 0.5); } } } }); menu->action_group->add(Gtk::Action::create("SourceGotoMethod", "Go to method"), Gtk::AccelKey(menu->key_map["source_goto_method"]), [this]() { if(CurrentPage()!=-1) { if(CurrentSourceView()->goto_method) { CurrentSourceView()->goto_method(); } } }); } void Notebook::open_file(std::string path) { INFO("Notebook open file"); INFO("Notebook create page"); for(int c=0;cview->file_path) { set_current_page(c); return; } } source_views.emplace_back(new Source(path, project_path)); scrolled_windows.emplace_back(new Gtk::ScrolledWindow()); hboxes.emplace_back(new Gtk::HBox()); scrolled_windows.back()->add(*source_views.back()->view); hboxes.back()->pack_start(*scrolled_windows.back(), true, true); boost::filesystem::path file_path(source_views.back()->view->file_path); std::string title=file_path.filename().string(); append_page(*hboxes.back(), title); show_all_children(); set_current_page(Pages()-1); set_focus_child(*source_views.back()->view); CurrentSourceView()->get_buffer()->set_modified(false); //Add star on tab label when the page is not saved: auto source_view=CurrentSourceView(); CurrentSourceView()->get_buffer()->signal_modified_changed().connect([this, source_view]() { boost::filesystem::path file_path(source_view->file_path); std::string title=file_path.filename().string(); if(source_view->get_buffer()->get_modified()) title+="*"; int page=-1; for(int c=0;cview.get()==source_view) { page=c; break; } } if(page!=-1) set_tab_label_text(*(get_nth_page(page)), title); }); } bool Notebook::close_current_page() { INFO("Notebook close page"); if (Pages() != 0) { if(CurrentSourceView()->get_buffer()->get_modified()){ if(!save_modified_dialog()) return false; } int page = CurrentPage(); remove_page(page); source_views.erase(source_views.begin()+ page); scrolled_windows.erase(scrolled_windows.begin()+page); hboxes.erase(hboxes.begin()+page); } return true; } Source::View* Notebook::CurrentSourceView() { INFO("Getting sourceview"); return source_views.at(CurrentPage())->view.get(); } int Notebook::CurrentPage() { return get_current_page(); } int Notebook::Pages() { return get_n_pages(); } bool Notebook::save_modified_dialog() { INFO("Notebook::save_dialog"); Gtk::MessageDialog dialog((Gtk::Window&)(*get_toplevel()), "Save file!", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO); dialog.set_secondary_text("Do you want to save: " + CurrentSourceView()->file_path+" ?"); int result = dialog.run(); if(result==Gtk::RESPONSE_YES) { CurrentSourceView()->save(); return true; } else if(result==Gtk::RESPONSE_NO) { return true; } else { return false; } }