From 197cb0cf13437eeda244163b0b0f4d3ccaa787ec Mon Sep 17 00:00:00 2001 From: Aiwota Programmer Date: Sun, 19 Jul 2009 19:06:22 +0900 Subject: [PATCH] Add open all menu and open all and close others menu in History. --- src/application_framework.cxx | 39 +++++++++++++++++++++++++++++++++++++++ src/application_framework.hxx | 3 +++ src/application_window.cxx | 13 +++++++++++++ src/application_window.hxx | 3 +++ 4 files changed, 58 insertions(+) diff --git a/src/application_framework.cxx b/src/application_framework.cxx index 3241eff..1a5de86 100644 --- a/src/application_framework.cxx +++ b/src/application_framework.cxx @@ -197,6 +197,23 @@ void ApplicationFrameWork::on_history_menu_item_activate( uri_opener::open(uri); } +void ApplicationFrameWork::on_history_menu_items_activate( + const std::vector& uris) const { + BOOST_FOREACH(const std::string& uri, uris) uri_opener::open(uri); +} + +void ApplicationFrameWork::on_history_menu_items_open_close_activate( + const std::vector& uris) const { + + std::vector closes; + + BOOST_FOREACH(ApplicationWindow& window, windows) + if (std::find(uris.begin(), uris.end(), window.get_uri()) == uris.end()) + closes.push_back(&window); + + on_history_menu_items_activate(uris); + close_windows(closes); +} void ApplicationFrameWork::set_history_menus() { Gtk::Menu* sub = history_menu_->get_submenu(); @@ -206,6 +223,9 @@ void ApplicationFrameWork::set_history_menus() { typedef std::map SubMenuType; SubMenuType subs; + typedef std::map > UrisType; + UrisType uris; + BOOST_FOREACH(const history::Item& hitem, recents) { std::auto_ptr bbs = bbs_detail::judge(hitem.uri_); if (!bbs->is_thread()) continue; @@ -245,6 +265,25 @@ void ApplicationFrameWork::set_history_menus() { &ApplicationFrameWork::on_history_menu_item_activate), hitem.uri_)); subsub->append(*item); + uris[board].push_back(hitem.uri_); + } + + BOOST_FOREACH(SubMenuType::value_type pair, subs) { + Gtk::MenuItem* item = Gtk::manage(new Gtk::MenuItem("Open All")); + pair.second->append(*item); + item->show(); + item->signal_activate().connect(sigc::bind( + sigc::mem_fun(*this, + &ApplicationFrameWork::on_history_menu_items_activate), + uris[pair.first])); + + item = Gtk::manage(new Gtk::MenuItem("Open All & close others")); + pair.second->append(*item); + item->show(); + item->signal_activate().connect(sigc::bind( + sigc::mem_fun(*this, + &ApplicationFrameWork::on_history_menu_items_open_close_activate), + uris[pair.first])); } } diff --git a/src/application_framework.hxx b/src/application_framework.hxx index dac44d0..76fa272 100644 --- a/src/application_framework.hxx +++ b/src/application_framework.hxx @@ -55,6 +55,9 @@ protected: virtual void on_child_button_press(GdkEventButton*); void on_history_menu_item_activate(const std::string&); + void on_history_menu_items_activate(const std::vector&) const; + void on_history_menu_items_open_close_activate( + const std::vector&) const; void set_history_menus(); Gtk::VBox vbox_; diff --git a/src/application_window.cxx b/src/application_window.cxx index 9fa339f..3600ab2 100644 --- a/src/application_window.cxx +++ b/src/application_window.cxx @@ -104,6 +104,19 @@ void ApplicationWindow::save() { histories.to_xml(dir / ".dialektos" / "history.xml"); } +void ApplicationWindow::close_windows( + const std::vector& wins) { + BOOST_FOREACH(ApplicationWindow* window, wins) { + using namespace boost::lambda; + using boost::lambda::_1; + window->save_state(); + windows.erase_if(&_1 == window); + } + + if (!windows.empty()) save(); + if (windows.empty()) Gtk::Main::quit(); +} + //bool ApplicationWindow::is_same(const bbs_detail::Base& bbs) const { // return false; //} diff --git a/src/application_window.hxx b/src/application_window.hxx index c4af6a9..680befe 100644 --- a/src/application_window.hxx +++ b/src/application_window.hxx @@ -23,6 +23,7 @@ #include #include +#include #include "history_data.hxx" @@ -43,9 +44,11 @@ protected: ApplicationWindow(); static void regist(ApplicationWindow* window); static void save(); + static void close_windows(const std::vector&); virtual bool on_delete_event(GdkEventAny*); private: virtual bool is_same(const bbs_detail::Base& bbs) const = 0; +public: virtual std::string get_uri() const = 0; protected: static boost::ptr_vector windows; -- 2.11.0