File: clEditorStateLocker.cpp

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (149 lines) | stat: -rw-r--r-- 5,606 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include "clEditorStateLocker.h"

#include "bookmark_manager.h"

clEditorStateLocker::clEditorStateLocker(wxStyledTextCtrl* ctrl)
    : m_ctrl(ctrl)
{
    // store the first visible line
    m_firstVisibleLine = m_ctrl->GetFirstVisibleLine();
    m_position = m_ctrl->GetCurrentPos();

    // Store the bookmarks
    SerializeBookmarks();
    // Store breakpoints
    SerializeBreakpoints();
    // Store the folds
    SerializeFolds();
}

clEditorStateLocker::~clEditorStateLocker()
{
    // restore the position.
    if(m_position > m_ctrl->GetLastPosition()) {
        m_position = m_ctrl->GetLastPosition();
    }

    // If the caret is out of screen, scroll the editor to make it visible again
    int caretLine = m_ctrl->LineFromPosition(m_position);
    if(caretLine < m_ctrl->GetFirstVisibleLine() ||
       (caretLine > (m_ctrl->GetFirstVisibleLine() + m_ctrl->LinesOnScreen()))) {
        // center the caret line
        m_ctrl->SetFirstVisibleLine(caretLine - (m_ctrl->LinesOnScreen() / 2));
    }

    m_ctrl->ClearSelections();
    m_ctrl->SetCurrentPos(m_position);
    m_ctrl->SetSelectionStart(m_position);
    m_ctrl->SetSelectionEnd(m_position);
    m_ctrl->EnsureVisible(m_ctrl->LineFromPosition(m_position));

    ApplyBookmarks();
    ApplyBreakpoints();
    ApplyFolds();

    m_ctrl->SetFirstVisibleLine(
        m_firstVisibleLine); // We must do this _after_ ApplyFolds() or the display may scroll down
}

void clEditorStateLocker::ApplyBookmarks() { ApplyBookmarks(m_ctrl, m_bookmarks); }
void clEditorStateLocker::SerializeBookmarks() { SerializeBookmarks(m_ctrl, m_bookmarks); }
void clEditorStateLocker::ApplyFolds() { ApplyFolds(m_ctrl, m_folds); }
void clEditorStateLocker::SerializeFolds() { SerializeFolds(m_ctrl, m_folds); }

void clEditorStateLocker::ApplyBookmarks(wxStyledTextCtrl* ctrl, const wxArrayString& bookmarks)
{
    for(size_t i = 0; i < bookmarks.GetCount(); i++) {
        // Unless this is an old file, each bookmark will have been stored in the form: "linenumber:type"
        wxString lineno = bookmarks.Item(i).BeforeFirst(':');
        long bmt = smt_bookmark1;
        wxString type = bookmarks.Item(i).AfterFirst(':');
        if(!type.empty()) {
            type.ToCLong(&bmt);
        }
        long line = 0;
        if(lineno.ToCLong(&line)) {
            ctrl->MarkerAdd(line, bmt);
        }
    }
}

void clEditorStateLocker::SerializeBookmarks(wxStyledTextCtrl* ctrl, wxArrayString& bookmarks)
{
    for(int line = 0; (line = ctrl->MarkerNext(line, mmt_all_bookmarks)) >= 0; ++line) {
        for(int type = smt_FIRST_BMK_TYPE; type <= smt_LAST_BMK_TYPE; ++type) {
            int mask = (1 << type);
            if(ctrl->MarkerGet(line) & mask) {
                // We need to serialise both the line and BM type. To keep things simple in sessionmanager, just merge
                // their strings
                bookmarks.Add(wxString::Format("%d:%d", line, type));
            }
        }
    }
}

void clEditorStateLocker::ApplyFolds(wxStyledTextCtrl* ctrl, const clEditorStateLocker::VecInt_t& folds)
{
    for(size_t i = 0; i < folds.size(); ++i) {
        int line = folds.at(i);
        // 'line' was collapsed when serialised, so collapse it now. That assumes that the line-numbers haven't changed
        // in the meanwhile.
        // If we cared enough, we could have saved a fold-level too, and/or the function name +/- the line's
        // displacement within the function. But for now...
        if(ctrl->GetFoldLevel(line) & wxSTC_FOLDLEVELHEADERFLAG) {
#if wxVERSION_NUMBER >= 3100
            if(ctrl->GetFoldExpanded(line)) {
                ctrl->ToggleFoldShowText(line, "...");
            }
#else
            if(ctrl->GetFoldExpanded(line)) { // For <wx3.1 check first, and only toggle if needed
                ctrl->ToggleFold(line);
            }
#endif
        }
    }
}

void clEditorStateLocker::SerializeFolds(wxStyledTextCtrl* ctrl, clEditorStateLocker::VecInt_t& folds)
{
    for(int line = 0; line < ctrl->GetLineCount(); ++line) {
        if((ctrl->GetFoldLevel(line) & wxSTC_FOLDLEVELHEADERFLAG) && (ctrl->GetFoldExpanded(line) == false)) {
            folds.push_back(line);
        }
    }
}

void clEditorStateLocker::ApplyBreakpoints(wxStyledTextCtrl* ctrl, const wxArrayString& breapoints)
{
    for(size_t i = 0; i < breapoints.GetCount(); i++) {
        // Unless this is an old file, each bookmark will have been stored in the form: "linenumber:type"
        wxString lineno = breapoints.Item(i).BeforeFirst(':');
        long bmt = smt_bookmark1;
        wxString type = breapoints.Item(i).AfterFirst(':');
        if(!type.empty()) {
            type.ToCLong(&bmt);
        }
        long line = 0;
        if(lineno.ToCLong(&line)) {
            ctrl->MarkerAdd(line, bmt);
        }
    }
}

void clEditorStateLocker::SerializeBreakpoints(wxStyledTextCtrl* ctrl, wxArrayString& breapoints)
{
    for(int line = 0; (line = ctrl->MarkerNext(line, mmt_all_breakpoints)) >= 0; ++line) {
        for(int type = smt_FIRST_BP_TYPE; type <= smt_LAST_BP_TYPE; ++type) {
            int mask = (1 << type);
            if(ctrl->MarkerGet(line) & mask) {
                // We need to serialise both the line and BM type. To keep things simple in sessionmanager, just merge
                // their strings
                breapoints.Add(wxString::Format("%d:%d", line, type));
            }
        }
    }
}

void clEditorStateLocker::ApplyBreakpoints() { ApplyBreakpoints(m_ctrl, m_breakpoints); }

void clEditorStateLocker::SerializeBreakpoints() { SerializeBreakpoints(m_ctrl, m_breakpoints); }