diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-11-18 05:00:26 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-11-18 05:00:26 +0100 |
commit | bd345771ee18eb7cb3b6081b1954b1e5b48f029e (patch) | |
tree | b90af855dd60dd54c378d12cba4c1747c8a3aeef | |
parent | 9be9fcca0c9ab63180a2e9aeb64e25829034b7a4 (diff) | |
download | sciteco-bd345771ee18eb7cb3b6081b1954b1e5b48f029e.tar.gz |
fixed "*" register: instead of trying to update it everywhere the buffer filename changes, it is implemented as a specialized Q-Register
* setting it (^U), is currently ignored
* getting it, returns the current file's filename directly
* editing it clears its document and resets it with the current file's filename
* later dynamic querying of the numeric part of Q-Registers may be implemented as well
-rw-r--r-- | qbuffers.cpp | 57 | ||||
-rw-r--r-- | qbuffers.h | 45 |
2 files changed, 67 insertions, 35 deletions
diff --git a/qbuffers.cpp b/qbuffers.cpp index 1647ef3..c8a43ba 100644 --- a/qbuffers.cpp +++ b/qbuffers.cpp @@ -107,6 +107,22 @@ QRegister::get_string(void) return str; } +void +QRegister::edit(void) +{ + interface.ssm(SCI_SETDOCPOINTER, 0, (sptr_t)get_document()); + interface.ssm(SCI_GOTOPOS, dot); + interface.info_update(this); +} + +void +QRegister::undo_edit(void) +{ + interface.undo_info_update(this); + undo.push_msg(SCI_GOTOPOS, dot); + undo.push_msg(SCI_SETDOCPOINTER, 0, (sptr_t)get_document()); +} + bool QRegister::load(const gchar *filename) { @@ -132,6 +148,28 @@ QRegister::load(const gchar *filename) return true; } +gchar * +QRegisterBufferInfo::get_string(void) +{ + gchar *filename = ring.current ? ring.current->filename : NULL; + + return g_strdup(filename ? : ""); +} + +void +QRegisterBufferInfo::edit(void) +{ + gchar *filename = ring.current ? ring.current->filename : NULL; + + QRegister::edit(); + + interface.ssm(SCI_BEGINUNDOACTION); + interface.ssm(SCI_SETTEXT, 0, (sptr_t)(filename ? : "")); + interface.ssm(SCI_ENDUNDOACTION); + + undo.push_msg(SCI_UNDO); +} + void QRegisterTable::initialize(void) { @@ -143,8 +181,8 @@ QRegisterTable::initialize(void) /* search string and status register */ initialize_register("_"); - /* current buffer name and number */ - initialize_register("*"); + /* current buffer name and number ("*") */ + insert(new QRegisterBufferInfo()); } void @@ -295,24 +333,9 @@ Ring::edit(const gchar *filename) } } - /* TODO: set integer part */ - qregisters["*"]->set_string(current->filename); - return new_in_ring; } -void -Ring::undo_edit(void) -{ - current->dot = interface.ssm(SCI_GETCURRENTPOS); - - undo.push_var<Buffer*>(current); - current->undo_edit(); - - /* TODO: undo integer part */ - qregisters["*"]->undo_set_string(); -} - #if 0 /* @@ -41,6 +41,7 @@ public: QRegister(const gchar *_name) : name(g_strdup(_name)), integer(0), string(NULL), dot(0) {} + virtual ~QRegister() { if (string) @@ -62,24 +63,12 @@ public: return string; } - void set_string(const gchar *str); - void undo_set_string(void); - gchar *get_string(void); + virtual void set_string(const gchar *str); + virtual void undo_set_string(void); + virtual gchar *get_string(void); - inline void - edit(void) - { - interface.ssm(SCI_SETDOCPOINTER, 0, (sptr_t)get_document()); - interface.ssm(SCI_GOTOPOS, dot); - interface.info_update(this); - } - inline void - undo_edit(void) - { - interface.undo_info_update(this); - undo.push_msg(SCI_GOTOPOS, dot); - undo.push_msg(SCI_SETDOCPOINTER, 0, (sptr_t)get_document()); - } + virtual void edit(void); + virtual void undo_edit(void); bool load(const gchar *filename); inline void @@ -89,6 +78,20 @@ public: } }; +class QRegisterBufferInfo : public QRegister { +public: + QRegisterBufferInfo() : QRegister("*") + { + get_document(); + } + + void set_string(const gchar *str) {} + void undo_set_string(void) {} + gchar *get_string(void); + + void edit(void); +}; + extern class QRegisterTable : public RBTree { inline void initialize_register(const gchar *name) @@ -283,7 +286,13 @@ public: bool is_any_dirty(void); bool edit(const gchar *filename); - void undo_edit(void); + inline void + undo_edit(void) + { + current->dot = interface.ssm(SCI_GETCURRENTPOS); + undo.push_var(current); + current->undo_edit(); + } bool save(const gchar *filename); |