summaryrefslogtreecommitdiffstats
path: root/src/jabber_whiteboard/session-file-player.cpp
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-01-16 02:36:01 +0000
committermental <mental@users.sourceforge.net>2006-01-16 02:36:01 +0000
commit179fa413b047bede6e32109e2ce82437c5fb8d34 (patch)
treea5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/jabber_whiteboard/session-file-player.cpp
downloadinkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz
inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/jabber_whiteboard/session-file-player.cpp')
-rw-r--r--src/jabber_whiteboard/session-file-player.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/src/jabber_whiteboard/session-file-player.cpp b/src/jabber_whiteboard/session-file-player.cpp
new file mode 100644
index 000000000..538d0bc91
--- /dev/null
+++ b/src/jabber_whiteboard/session-file-player.cpp
@@ -0,0 +1,176 @@
+/**
+ * Whiteboard session file playback mechanism
+ *
+ * Authors:
+ * David Yip <yipdw@rose-hulman.edu>
+ *
+ * Copyright (c) 2005 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+
+#include <glibmm.h>
+#include <glibmm/i18n.h>
+
+#include <gtkmm/textbuffer.h>
+
+#include "desktop-handles.h"
+#include "document.h"
+
+#include "jabber_whiteboard/defines.h"
+#include "jabber_whiteboard/session-file.h"
+#include "jabber_whiteboard/session-file-player.h"
+#include "jabber_whiteboard/session-manager.h"
+
+namespace Inkscape {
+
+namespace Whiteboard {
+
+SessionFilePlayer::SessionFilePlayer(unsigned int bufsz, SessionManager* sm)
+{
+ this->_sm = sm;
+ this->_delay = 100;
+ this->_playing = false;
+ this->_curdir = FORWARD;
+
+ this->_current = this->_next = 0;
+ this->_sf = NULL;
+
+ if (sm->session_file() != NULL) {
+ this->_sf = sm->session_file();
+ } else {
+ g_warning("Cannot operate on NULL SessionFile.");
+ }
+}
+
+SessionFilePlayer::~SessionFilePlayer()
+{
+
+}
+
+void
+SessionFilePlayer::load(SessionFile* sm)
+{
+ this->stop();
+ if (this->_sm != NULL) {
+ this->_sf = sm;
+ this->_current = this->_next = 0;
+ this->_visited.clear();
+ }
+}
+
+SessionFile*
+SessionFilePlayer::unload()
+{
+ SessionFile* sf = this->_sf;
+ this->stop();
+ this->_sf = NULL;
+ return sf;
+}
+
+Glib::ustring const&
+SessionFilePlayer::filename()
+{
+ return this->_sf->filename();
+}
+
+Glib::ustring const&
+SessionFilePlayer::curmsg()
+{
+ return this->_curmsg;
+}
+
+void
+SessionFilePlayer::start()
+{
+ this->_playback_dispatcher = Glib::signal_timeout().connect(sigc::bind< 0 > (sigc::mem_fun(*(this), &SessionFilePlayer::step), this->_curdir), this->_delay);
+ this->_playing = true;
+}
+
+void
+SessionFilePlayer::stop()
+{
+ this->_playback_dispatcher.disconnect();
+ this->_playing = false;
+}
+
+void
+SessionFilePlayer::setDelay(unsigned int delay)
+{
+ this->_delay = delay;
+ if (this->_playing) {
+ this->stop();
+ this->start();
+ }
+}
+
+void
+SessionFilePlayer::setMessageOutputWidget(Glib::RefPtr<Gtk::TextBuffer> const& widgetptr)
+{
+ this->_outputwidget = widgetptr;
+}
+
+bool
+SessionFilePlayer::step(unsigned short dir)
+{
+ switch (dir) {
+ case FORWARD: {
+ // Glib::ustring buf;
+ this->_current = this->_next;
+ this->_next = this->_sf->nextMessageFrom(this->_current, this->_curmsg);
+ if (this->_next == this->_current) {
+ return false;
+ } else {
+ this->_visited.push_front(std::make_pair< gint64, gint64 >(this->_current, this->_curmsg.bytes()));
+ this->_outputMessageToWidget();
+ this->_sm->receiveChange(this->_curmsg);
+ sp_document_done(SP_DT_DOCUMENT(this->_sm->desktop()));
+ this->_curdir = FORWARD;
+ return true;
+ }
+ break;
+ }
+ case BACKWARD:
+ if (this->_current == 0) {
+ return false;
+ } else {
+ this->_visited.pop_front();
+ std::pair< gint64, gint64 > last = this->_visited.front();
+ this->_current = last.first;
+ this->_next = last.first + last.second;
+ this->_sf->nextMessageFrom(this->_current, this->_curmsg);
+ this->_outputMessageToWidget();
+ sp_document_undo(SP_DT_DOCUMENT(this->_sm->desktop()));
+ this->_curdir = BACKWARD;
+ return true;
+ }
+ break;
+ default:
+ return true;
+ break;
+ }
+}
+
+void
+SessionFilePlayer::_outputMessageToWidget()
+{
+ if (this->_outputwidget) {
+ this->_outputwidget->set_text(this->_curmsg);
+ }
+}
+
+}
+
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :