1 /**
2 * Inkscape::EventLog
3 *
4 * A simple log for maintaining a history of commited, undone and redone events along with their
5 * type. It implements the UndoStackObserver and should be registered with a
6 * CompositeUndoStackObserver for each document. The event log is then notified on all commit, undo
7 * and redo events and will store a representation of them in an internal Gtk::TreeStore.
8 *
9 * Consecutive events of the same type are grouped with the first event as a parent and following
10 * as its children.
11 *
12 * If a Gtk::TreeView is connected to the event log, the TreeView's selection and its nodes
13 * expanded/collapsed state will be updated as events are commited, undone and redone. Whenever
14 * this happens, the event log will block the TreeView's callbacks to prevent circular updates.
15 *
16 * Author:
17 * Gustav Broberg <broberg@kth.se>
18 *
19 * Copyright (c) 2006, 2007 Authors
20 *
21 * Released under GNU GPL, read the file 'COPYING' for more information
22 */
24 #ifndef INKSCAPE_EVENT_LOG_H
25 #define INKSCAPE_EVENT_LOG_H
27 #include <gdkmm/pixbuf.h>
28 #include <glibmm/refptr.h>
29 #include <gtkmm/treestore.h>
30 #include <gtkmm/treeselection.h>
31 #include <gtkmm/treeview.h>
33 #include "undo-stack-observer.h"
34 #include "event.h"
36 namespace Inkscape {
38 /**
39 *
40 */
41 class EventLog : public UndoStackObserver {
43 public:
44 typedef Gtk::TreeModel::iterator iterator;
45 typedef Gtk::TreeModel::const_iterator const_iterator;
47 EventLog(SPDocument* document);
48 virtual ~EventLog();
50 /**
51 * Event datatype
52 */
54 struct EventModelColumns : public Gtk::TreeModelColumnRecord
55 {
56 Gtk::TreeModelColumn<Event *> event;
57 Gtk::TreeModelColumn<unsigned int> type;
58 Gtk::TreeModelColumn<Glib::ustring> description;
59 Gtk::TreeModelColumn<int> child_count;
61 EventModelColumns()
62 {
63 add(event); add(type); add(description); add(child_count);
64 }
65 };
67 /**
68 * Implementation of Inkscape::UndoStackObserver methods
69 * \brief Modifies the log's entries and the view's selection when triggered
70 */
72 void notifyUndoEvent(Event *log);
73 void notifyRedoEvent(Event *log);
74 void notifyUndoCommitEvent(Event *log);
75 void notifyClearUndoEvent();
76 void notifyClearRedoEvent();
78 /**
79 * Accessor functions
80 */
82 Glib::RefPtr<Gtk::TreeModel> getEventListStore() const { return _event_list_store; }
83 const EventModelColumns& getColumns() const { return _columns; }
84 iterator getCurrEvent() const { return _curr_event; }
85 iterator getCurrEventParent() const { return _curr_event_parent; }
87 void setCurrEvent(iterator event) { _curr_event = event; }
88 void setCurrEventParent(iterator event) { _curr_event_parent = event; }
89 void blockNotifications(bool status=true) { _notifications_blocked = status; }
90 void rememberFileSave() { _last_saved = _curr_event; }
92 /*
93 * Callback types for TreeView changes.
94 */
96 enum CallbackTypes {
97 CALLB_SELECTION_CHANGE,
98 CALLB_EXPAND,
99 CALLB_COLLAPSE,
100 CALLB_LAST
101 };
103 typedef std::map<const CallbackTypes, sigc::connection> CallbackMap;
105 /**
106 * Connect with a TreeView.
107 */
108 void connectWithDialog(Gtk::TreeView *event_list_view, CallbackMap *callback_connections);
110 /*
111 * Updates the sensitivity and names of SP_VERB_EDIT_UNDO and SP_VERB_EDIT_REDO to reflect the
112 * current state.
113 */
114 void updateUndoVerbs();
116 private:
117 bool _connected; //< connected with dialog
118 SPDocument *_document; //< document that is logged
120 const EventModelColumns _columns;
122 Glib::RefPtr<Gtk::TreeStore> _event_list_store;
123 Glib::RefPtr<Gtk::TreeSelection> _event_list_selection;
124 Gtk::TreeView *_event_list_view;
126 iterator _curr_event; //< current event in _event_list_store
127 iterator _last_event; //< end position in _event_list_store
128 iterator _curr_event_parent; //< parent to current event, if any
130 iterator _last_saved; //< position where last document save occurred
132 bool _notifications_blocked; //< if notifications should be handled
134 // Map of connections used to temporary block/unblock callbacks in a TreeView
135 CallbackMap *_callback_connections;
137 /**
138 * Helper functions
139 */
141 const_iterator _getUndoEvent() const; //< returns the current undoable event or NULL if none
142 const_iterator _getRedoEvent() const; //< returns the current redoable event or NULL if none
144 void _clearUndo(); //< erase all previously commited events
145 void _clearRedo(); //< erase all previously undone events
147 void checkForVirginity(); //< marks the document as untouched if undo/redo reaches a previously saved state
149 // noncopyable, nonassignable
150 EventLog(EventLog const &other);
151 EventLog& operator=(EventLog const &other);
153 };
155 } // namespace Inkscape
157 #endif // INKSCAPE_EVENT_LOG_H
159 /*
160 Local Variables:
161 mode:c++
162 c-file-style:"stroustrup"
163 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
164 indent-tabs-mode:nil
165 fill-column:99
166 End:
167 */
168 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :