aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/document.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2014-11-14 02:43:23 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2014-11-16 23:34:24 +0100
commit8be99d3863a305046f0133116782734e87be0822 (patch)
tree4954d200a10ca96123347dce9af089806b9a13f9 /src/document.cpp
parentd9f04a78bf8679afc0c656f3440beb73b2dc8744 (diff)
downloadsciteco-8be99d3863a305046f0133116782734e87be0822.tar.gz
first working version of the one-view-per-buffer design
The user interface provides a Scintilla view abstraction and every buffer is based on a view. All Q-Register strings use a single dedicated view to save memory and initialization time when using many string registers. * this means we can finally implement a working lexer configuration and it only has to be done once when the buffer is first added to the ring. It is unnecessary to magically restore the lexer styles upon rubout of EB (very hard to implement anyway). It is also not necessary to rerun the lexer configuration macro upon rubout which would be hard to reconcile with SciTECO's basic design since every side-effect should be attached to a character. * this means that opening buffers is slightly slower now because of the view initialization * on the other hand, macros with many string q-reg operations are faster now, since the document must no longer be changed on the buffer's view and restored later on. * also now we can make a difference between editing a document in a view and changing the current view, which reduces UI calls * the Document class has been retained as an abstraction about Scintilla documents, used by QRegister Strings. It had to be made virtual, so the view on which the document is created can be specified by a virtual function. There is no additional space overhead for Documents.
Diffstat (limited to 'src/document.cpp')
-rw-r--r--src/document.cpp71
1 files changed, 19 insertions, 52 deletions
diff --git a/src/document.cpp b/src/document.cpp
index ff2ce2b..8ed5007 100644
--- a/src/document.cpp
+++ b/src/document.cpp
@@ -30,76 +30,43 @@
namespace SciTECO {
-static inline void
-set_representations(void)
-{
- static const char *reps[] = {
- "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G",
- "^H", "TAB" /* ^I */, "LF" /* ^J */, "^K", "^L", "CR" /* ^M */, "^N", "^O",
- "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W",
- "^X", "^Y", "^Z", "$" /* ^[ */, "^\\", "^]", "^^", "^_"
- };
-
- for (guint cc = 0; cc < G_N_ELEMENTS(reps); cc++) {
- gchar buf[] = {(gchar)cc, '\0'};
- interface.ssm(SCI_SETREPRESENTATION,
- (uptr_t)buf, (sptr_t)reps[cc]);
- }
-}
-
-class UndoSetRepresentations : public UndoToken {
-public:
- void
- run(void)
- {
- set_representations();
- }
-};
-
void
-Document::edit(void)
+Document::edit(ViewCurrent *view)
{
- if (!is_initialized())
- doc = (SciDoc)interface.ssm(SCI_CREATEDOCUMENT);
+ maybe_create_document();
- interface.ssm(SCI_SETDOCPOINTER, 0, (sptr_t)doc);
- interface.ssm(SCI_SETFIRSTVISIBLELINE, first_line);
- interface.ssm(SCI_SETXOFFSET, xoffset);
- interface.ssm(SCI_SETSEL, anchor, (sptr_t)dot);
+ view->ssm(SCI_SETDOCPOINTER, 0, (sptr_t)doc);
+ view->ssm(SCI_SETFIRSTVISIBLELINE, first_line);
+ view->ssm(SCI_SETXOFFSET, xoffset);
+ view->ssm(SCI_SETSEL, anchor, (sptr_t)dot);
/*
* Default TECO-style character representations.
* They are reset on EVERY SETDOCPOINTER call by Scintilla.
*/
- set_representations();
+ view->set_representations();
}
void
-Document::undo_edit(void)
+Document::undo_edit(ViewCurrent *view)
{
- if (!is_initialized())
- doc = (SciDoc)interface.ssm(SCI_CREATEDOCUMENT);
+ maybe_create_document();
- /*
- * see above: set TECO-style character representations
- * NOTE: could be done with push_msg() but that requires
- * making the entire mapping static constant
- */
- undo.push(new UndoSetRepresentations());
+ view->undo_set_representations();
- undo.push_msg(SCI_SETSEL, anchor, (sptr_t)dot);
- undo.push_msg(SCI_SETXOFFSET, xoffset);
- undo.push_msg(SCI_SETFIRSTVISIBLELINE, first_line);
- undo.push_msg(SCI_SETDOCPOINTER, 0, (sptr_t)doc);
+ view->undo_ssm(SCI_SETSEL, anchor, (sptr_t)dot);
+ view->undo_ssm(SCI_SETXOFFSET, xoffset);
+ view->undo_ssm(SCI_SETFIRSTVISIBLELINE, first_line);
+ view->undo_ssm(SCI_SETDOCPOINTER, 0, (sptr_t)doc);
}
void
-Document::update(void)
+Document::update(ViewCurrent *view)
{
- anchor = interface.ssm(SCI_GETANCHOR);
- dot = interface.ssm(SCI_GETCURRENTPOS);
- first_line = interface.ssm(SCI_GETFIRSTVISIBLELINE);
- xoffset = interface.ssm(SCI_GETXOFFSET);
+ anchor = view->ssm(SCI_GETANCHOR);
+ dot = view->ssm(SCI_GETCURRENTPOS);
+ first_line = view->ssm(SCI_GETFIRSTVISIBLELINE);
+ xoffset = view->ssm(SCI_GETXOFFSET);
}
/*