OSDN Git Service

Add open all menu and open all and close others menu in History.
authorAiwota Programmer <aiwotaprog@tetteke.tk>
Sun, 19 Jul 2009 10:06:22 +0000 (19:06 +0900)
committerAiwota Programmer <aiwotaprog@tetteke.tk>
Sun, 19 Jul 2009 10:06:22 +0000 (19:06 +0900)
src/application_framework.cxx
src/application_framework.hxx
src/application_window.cxx
src/application_window.hxx

index 3241eff..1a5de86 100644 (file)
@@ -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<std::string>& 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<std::string>& uris) const {
+
+  std::vector<ApplicationWindow*> 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<std::string, Gtk::Menu*> SubMenuType;
   SubMenuType subs;
 
+  typedef std::map<std::string, std::vector<std::string> > UrisType;
+  UrisType uris;
+
   BOOST_FOREACH(const history::Item& hitem, recents) {
     std::auto_ptr<bbs_detail::Base> 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]));
   }
 }
 
index dac44d0..76fa272 100644 (file)
@@ -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<std::string>&) const;
+  void on_history_menu_items_open_close_activate(
+      const std::vector<std::string>&) const;
   void set_history_menus();
 
   Gtk::VBox vbox_;
index 9fa339f..3600ab2 100644 (file)
@@ -104,6 +104,19 @@ void ApplicationWindow::save() {
   histories.to_xml(dir / ".dialektos" / "history.xml");
 }
 
+void ApplicationWindow::close_windows(
+    const std::vector<ApplicationWindow*>& 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;
 //}
index c4af6a9..680befe 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <gtkmm/window.h>
 #include <boost/ptr_container/ptr_vector.hpp>
+#include <vector>
 #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<ApplicationWindow*>&);
   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<ApplicationWindow> windows;