return "";
}
+bool Base::belongs_to(const Base& rhs) const {
+ assert(is_thread() && rhs.is_board());
+
+ return get_bbs_name() == rhs.get_bbs_name() &&
+ host_ == rhs.host_ && board_ == rhs.board_;
+
+}
+
+std::string Base::get_thread_id() const {
+ return thread_;
+}
+
http::Header Base::get_thread_dat_request_header() const {
http::Header request_header;
request_header.set_host(host_);
virtual http::Header get_board_subject_request_header() const;
virtual http::Header get_thread_dat_request_header() const;
virtual std::string get_title_from_string(const std::string& dat) const;
+ virtual bool belongs_to(const Base& rhs) const;
+ virtual std::string get_thread_id() const;
virtual const std::string& get_encoding() const;
#include "http_date.hxx"
#include "misc.hxx"
#include "board_window_state.hxx"
+#include "thread_idx.hxx"
namespace dialektos {
BoardWindow::~BoardWindow() {
}
+void BoardWindow::on_informed_from(const bbs_detail::Base& bbs,
+ const ThreadIdx& idx) {
+ if (!bbs.belongs_to(*bbs_)) return;
+
+ ModelColumns cols;
+ model_column::field<model_column::Title>(cols) = idx.title_;
+ model_column::field<model_column::ID>(cols) = bbs.get_thread_id();
+ model_column::field<model_column::LineCount>(cols) = idx.line_count_;
+ tree_model_->update_row(cols);
+}
+
void BoardWindow::on_row_activated(const Gtk::TreeModel::Path& path,
Gtk::TreeViewColumn* /*col*/) {
Gtk::TreeIter iter = tree_model_->get_iter(path);
class Base;
}
+struct ThreadIdx;
+
class BoardWindow: public dialektos::ApplicationFrameWork {
public:
static void create(std::auto_ptr<bbs_detail::Base> bbs);
virtual ~BoardWindow();
virtual void save_state() const;
+ void on_informed_from(const bbs_detail::Base&, const ThreadIdx&);
protected:
BoardWindow(std::auto_ptr<bbs_detail::Base> bbs);
return it->second;
}
+void ThreadListModel::update_row(const ModelColumns& record) {
+ const model_column::ID::type& id = model_column::field<model_column::ID>(record);
+
+ StoreType::iterator it = list_.find(id);
+ if (it != list_.end()) {
+ model_column::field<model_column::Title>(it->second) =
+ model_column::field<model_column::Title>(record);
+ model_column::field<model_column::LineCount>(it->second) =
+ model_column::field<model_column::LineCount>(record);
+ OrderType::iterator jt = std::find(order_.begin(), order_.end(), id);
+ if (jt != order_.end()) {
+ const size_t row_index = std::distance(order_.begin(), jt);
+ Gtk::TreePath path;
+ path.append_index(row_index);
+ iterator iter;
+ iter.set_stamp(1);
+ iter.gobj()->user_data = GINT_TO_POINTER(row_index);
+ row_changed(path, iter);
+ }
+ } else {
+ append(record);
+ }
+}
+
+
GType ThreadListModel::get_column_type_vfunc(const int index) const {
assert(index >= 0 && index < boost::mpl::size<ModelColumns::type>::value);
void set_buffer(const boost::unordered_map<model_column::ID::type, ModelColumns>& buffer);
void get_buffer(boost::unordered_map<model_column::ID::type, ModelColumns>& buffer) const;
const ModelColumns& get_model_columns(size_t row_index) const;
+ void update_row(const ModelColumns& record);
protected:
ThreadListModel();
#include <gtkmm/stock.h>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/filesystem.hpp>
+#include <boost/foreach.hpp>
#include <iostream>
#include <fstream>
#include "bbs_detail_base.hxx"
#include "misc.hxx"
#include "uri_opener.hxx"
#include "thread_window_state.hxx"
+#include "board_window.hxx"
namespace dialektos {
text_view_->queue_draw();
save_content(response);
+ inform_to_board(idx_);
}
void ThreadWindow::on_refresh_end(const http::StatusLine& status,
state.to_xml(boost::filesystem::path(bbs_->get_thread_state_path()));
}
+void ThreadWindow::inform_to_board(const ThreadIdx& idx) const {
+ BOOST_FOREACH(ApplicationWindow& window, windows) {
+ if (BoardWindow* board_window = dynamic_cast<BoardWindow*>(&window)) {
+ board_window->on_informed_from(*bbs_, idx);
+ }
+ }
+}
+
+
} // namespace dialektos
void on_refresh_end(const http::StatusLine&, const http::Header&);
void save_content(const http::Response&);
+ void inform_to_board(const ThreadIdx& idx) const;
boost::scoped_ptr<text_view::TextView> text_view_;
ScrolledContainer scrolled_;