#include <gtkmm/menu.h>
#include <gtkmm/uimanager.h>
#include <gtkmm/actiongroup.h>
+#include <boost/foreach.hpp>
#include <iostream>
#include "bookmark_window.hxx"
+#include "uri_opener.hxx"
+#include "bbs_detail_judge.hxx"
+#include "bbs_detail_base.hxx"
namespace dialektos {
action_group_(Gtk::ActionGroup::create()),
menubar_(),
toolbar_(),
- popupmenu_() {
+ popupmenu_(),
+ history_menu_() {
ApplicationWindow::add(vbox_);
build_menubar();
+ statusbar_.set_no_show_all(true);
}
ApplicationFrameWork::~ApplicationFrameWork() {}
action_group_->add(Gtk::Action::create("MenuFile", "_File"));
action_group_->add(Gtk::Action::create("FileQuit", Gtk::Stock::QUIT),
sigc::mem_fun(*this, &ApplicationFrameWork::on_action_file_quit));
+ action_group_->add(Gtk::Action::create("FileClose", Gtk::Stock::CLOSE),
+ sigc::mem_fun(*this, &ApplicationFrameWork::on_action_file_close));
+
+ // Edit menu
+ action_group_->add(Gtk::Action::create("MenuEdit", "_Edit"));
+ action_group_->add(Gtk::Action::create("EditCopy", Gtk::Stock::COPY),
+ sigc::mem_fun(*this, &ApplicationFrameWork::on_action_edit_copy));
// View menu
action_group_->add(Gtk::Action::create("MenuView", "_View"));
action_group_->add(Gtk::Action::create("ViewStatusbar", "Toggle _Statusbar"),
sigc::mem_fun(*this, &ApplicationFrameWork::on_action_view_statusbar));
+ action_group_->add(Gtk::Action::create("MenuHistory", "Hi_story"));
+
// Bookmark menu
action_group_->add(Gtk::Action::create("MenuBookmark", "_Bookmark"));
action_group_->add(Gtk::Action::create("BookmarkShow", "_Show Bookmarks"),
" <menubar name='MenuBar'>"
" <menu action='MenuFile'>"
" <menuitem action='FileQuit'/>"
+ " <menuitem action='FileClose'/>"
+ " </menu>"
+ " <menu action='MenuEdit'>"
+ " <menuitem action='EditCopy'/>"
" </menu>"
" <menu action='MenuView'>"
" <menuitem action='ViewRefresh'/>"
" <menuitem action='ViewToolbar'/>"
" <menuitem action='ViewStatusbar'/>"
" </menu>"
+ " <menu action='MenuHistory'/>"
" <menu action='MenuBookmark'>"
" <menuitem action='BookmarkShow'/>"
" </menu>"
" <popup name='MenuPopup'>"
" <menuitem action='ViewRefresh'/>"
" <menuitem action='ViewStop'/>"
+ " <menuitem action='EditCopy'/>"
" <separator/>"
" <menuitem action='ViewMenubar'/>"
" </popup>"
ui_manager_->add_ui_from_string(ui_info);
menubar_ = ui_manager_->get_widget("/MenuBar");
+ menubar_->set_no_show_all(true);
+ menubar_->hide();
toolbar_ = ui_manager_->get_widget("/ToolBar");
+ toolbar_->set_no_show_all(true);
+ toolbar_->hide();
popupmenu_ =
dynamic_cast<Gtk::Menu*>(ui_manager_->get_widget("/MenuPopup"));
+ history_menu_ = dynamic_cast<Gtk::MenuItem*>(
+ ui_manager_->get_widget("/MenuBar/MenuHistory"));
+ history_menu_->show();
+ history_menu_->get_submenu()->signal_show().connect(
+ sigc::mem_fun(*this, &ApplicationFrameWork::set_history_menus));
}
void ApplicationFrameWork::on_action_file_quit() {
save();
+ BOOST_FOREACH(const ApplicationWindow& window, windows)
+ window.save_state();
windows.clear();
Gtk::Main::quit();
}
+void ApplicationFrameWork::on_action_file_close() {
+ std::vector<ApplicationWindow*> closes;
+ closes.push_back(this);
+ close_windows(closes);
+}
+
+void ApplicationFrameWork::on_action_edit_copy() {
+ std::cout << "edit copy activated" << std::endl;
+}
+
void ApplicationFrameWork::on_action_view_refresh() {
std::cout << "view refresh activated" << std::endl;
}
}
}
+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]));
+ }
+}
+
} // namespace dialektos