+void ApplicationFrameWork::on_history_menu_item_activate(
+ const std::string& uri) {
+ 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();
+ sub->items().clear();
+ std::vector<history::Item> recents = histories.get_recent();
+
+ 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;
+
+ const std::string board = bbs->get_board_id();
+ SubMenuType::iterator it = subs.find(board);
+ Gtk::Menu* subsub;
+ if (it != subs.end()) {
+ subsub = it->second;
+ if (subsub->items().size() == 10) continue;
+ }
+ else {
+ Gtk::MenuItem* subitem = Gtk::manage(new Gtk::MenuItem(board));
+ sub->append(*subitem);
+ subitem->show();
+ subsub = Gtk::manage(new Gtk::Menu());
+ subitem->set_submenu(*subsub);
+ subs.insert(std::make_pair(board, subsub));
+
+ // menut item for threads list
+ Gtk::MenuItem* menuitem =
+ Gtk::manage(new Gtk::MenuItem(bbs->get_board_uri()));
+ subsub->append(*menuitem);
+ menuitem->show();
+ menuitem->signal_activate().connect(sigc::bind(
+ sigc::mem_fun(*this,
+ &ApplicationFrameWork::on_history_menu_item_activate),
+ bbs->get_board_uri()));
+ }
+
+ Glib::ustring label = hitem.name_;
+ Gtk::MenuItem* item = Gtk::manage(new Gtk::MenuItem(
+ label.size() > 40 ? label.substr(0, 40) + "..." : label));
+ item->show();
+ item->signal_activate().connect(sigc::bind(
+ sigc::mem_fun(*this,
+ &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]));
+ }
+}
+