X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fapplication_framework.cxx;h=8e8a6da6bfed6ef77af6a2b47fb0ba9c881d132d;hb=b82b4b8f03bf042479476602e1eace1841ede8eb;hp=abc4f09658f3333d289b58174f6cbad6ec48ac05;hpb=1d961f591c455f2bf350855d83db67fff5dcac7d;p=fukui-no-namari%2Fdialektos.git diff --git a/src/application_framework.cxx b/src/application_framework.cxx index abc4f09..8e8a6da 100644 --- a/src/application_framework.cxx +++ b/src/application_framework.cxx @@ -28,8 +28,12 @@ #include #include #include +#include #include #include "bookmark_window.hxx" +#include "uri_opener.hxx" +#include "bbs_detail_judge.hxx" +#include "bbs_detail_base.hxx" namespace dialektos { @@ -43,10 +47,12 @@ ApplicationFrameWork::ApplicationFrameWork() : action_group_(Gtk::ActionGroup::create()), menubar_(), toolbar_(), - popupmenu_() { + popupmenu_(), + history_menu_() { ApplicationWindow::add(vbox_); build_menubar(); + statusbar_.set_no_show_all(true); } ApplicationFrameWork::~ApplicationFrameWork() {} @@ -62,6 +68,13 @@ void ApplicationFrameWork::build_menubar() { 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")); @@ -76,6 +89,8 @@ void ApplicationFrameWork::build_menubar() { 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"), @@ -89,6 +104,10 @@ void ApplicationFrameWork::build_menubar() { " " " " " " + " " + " " + " " + " " " " " " " " @@ -98,6 +117,7 @@ void ApplicationFrameWork::build_menubar() { " " " " " " + " " " " " " " " @@ -109,6 +129,7 @@ void ApplicationFrameWork::build_menubar() { " " " " " " + " " " " " " " " @@ -117,18 +138,39 @@ void ApplicationFrameWork::build_menubar() { 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(ui_manager_->get_widget("/MenuPopup")); + history_menu_ = dynamic_cast( + 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 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; } @@ -159,5 +201,100 @@ void ApplicationFrameWork::on_child_button_press(GdkEventButton* event) { } } +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& 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(); + sub->items().clear(); + std::vector recents = histories.get_recent(); + + 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; + + 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