OSDN Git Service

Add a menu item 'Close'.
[fukui-no-namari/dialektos.git] / src / application_framework.cxx
index abc4f09..8e8a6da 100644 (file)
 #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 {
@@ -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() {
     "  <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'/>"
@@ -98,6 +117,7 @@ void ApplicationFrameWork::build_menubar() {
     "      <menuitem action='ViewToolbar'/>"
     "      <menuitem action='ViewStatusbar'/>"
     "    </menu>"
+    "    <menu action='MenuHistory'/>"
     "    <menu action='MenuBookmark'>"
     "      <menuitem action='BookmarkShow'/>"
     "    </menu>"
@@ -109,6 +129,7 @@ void ApplicationFrameWork::build_menubar() {
     "  <popup name='MenuPopup'>"
     "    <menuitem action='ViewRefresh'/>"
     "    <menuitem action='ViewStop'/>"
+    "    <menuitem action='EditCopy'/>"
     "    <separator/>"
     "    <menuitem action='ViewMenubar'/>"
     "  </popup>"
@@ -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<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;
 }
@@ -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<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