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();
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;
&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]));
}
}
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_;
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;
//}
#include <gtkmm/window.h>
#include <boost/ptr_container/ptr_vector.hpp>
+#include <vector>
#include "history_data.hxx"
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;