Skip to content
Browse files

Move Bookmark manager to separate class.

* Introduce an interface for Lines & add some consts.
* Fix capitalization on a method
  • Loading branch information...
1 parent 9cadec7 commit 5f0c387c0c8c727b90d390d0d2c6d37b61fbfecd @adamv adamv committed
Showing with 344 additions and 289 deletions.
  1. +147 −0 src/Bookmarks.cpp
  2. +42 −0 src/Bookmarks.h
  3. +62 −192 src/EditorCtrl.cpp
  4. +12 −18 src/EditorCtrl.h
  5. +11 −14 src/GutterCtrl.cpp
  6. +2 −10 src/IFoldingEditor.h
  7. +22 −33 src/Lines.cpp
  8. +38 −22 src/Lines.h
  9. +8 −0 src/e.vcproj
View
147 src/Bookmarks.cpp
@@ -0,0 +1,147 @@
+#include "Bookmarks.h"
+#include "Catalyst.h"
+#include "Lines.h"
+
+typedef std::vector<cxBookmark>::iterator bookmark_iter;
+
+const std::vector<cxBookmark>& Bookmarks::GetBookmarks() const {
+ return this->bookmarks;
+}
+
+unsigned int Bookmarks::NextBookmark(const unsigned int line_id) const {
+ if (bookmarks.empty()) return NO_BOOKMARK;
+
+ // Find first bookmark after current line
+ for (std::vector<cxBookmark>::const_iterator p = bookmarks.begin(); p != bookmarks.end(); ++p)
+ if (line_id < p->line_id) return p->line_id;
+
+ return bookmarks.begin()->line_id;
+}
+
+unsigned int Bookmarks::PrevBookmark(const unsigned int line_id) const {
+ if (bookmarks.empty()) return NO_BOOKMARK;
+
+ // Find first bookmark after current line
+ for (std::vector<cxBookmark>::const_reverse_iterator p = bookmarks.rbegin(); p != bookmarks.rend(); ++p)
+ if (p->line_id < line_id) return p->line_id;
+
+ return bookmarks.rbegin()->line_id;
+}
+
+
+void Bookmarks::AddBookmark(unsigned int line_id, bool toggle) {
+ // wxASSERT(line_id < lines.GetLineCount());
+
+ // Find insert position
+ bookmark_iter p = bookmarks.begin();
+ while (p != bookmarks.end()) {
+ if (p->line_id == line_id) {
+ if (toggle) bookmarks.erase(p);
+ return; // already added
+ }
+ else if (line_id < p->line_id) break;
+ ++p;
+ }
+
+ // Insert the new bookmark
+ cxBookmark bm;
+ bm.line_id = line_id;
+ lines.GetLineExtent(line_id, bm.start, bm.end);
+ bookmarks.insert(p, bm);
+}
+
+void Bookmarks::DeleteBookmark(unsigned int line_id) {
+ for (bookmark_iter p = bookmarks.begin(); p != bookmarks.end(); ++p) {
+ if (line_id == p->line_id) {
+ bookmarks.erase(p);
+ return;
+ }
+ else if (line_id < p->line_id) {
+ wxASSERT(false); // no bookmark on line
+ return;
+ }
+ }
+}
+
+void Bookmarks::Clear() {bookmarks.clear();}
+
+void Bookmarks::InsertChars(unsigned int pos, unsigned int length) {
+ for (bookmark_iter p = bookmarks.begin(); p != bookmarks.end(); ++p) {
+ if (pos < p->start) {
+ p->start += length;
+ p->line_id = lines.GetLineFromStartPos(p->start);
+ p->end = lines.GetLineEndpos(p->line_id);
+ }
+ else if (pos < p->end)
+ p->end = lines.GetLineEndpos(p->line_id);
+ }
+}
+
+void Bookmarks::DeleteChars(unsigned int start, unsigned int end) {
+ const unsigned int len = end - start;
+
+ bookmark_iter p = bookmarks.begin();
+ // ignore bookmarks before deletion
+ while ((p != bookmarks.end()) && (p->end <= start)) ++p;
+
+ while (p != bookmarks.end()) {
+ if ((start == p->start && p->end <= end) || (start < p->start && p->start <= end)) {
+ // If bookmark is contained within the deleted range, erase it.
+ p = bookmarks.erase(p);
+ continue;
+ }
+ else if (p->start <= start) { // Else adjust the end if the bookmarked line had a deletion
+ p->end = lines.GetLineEndpos(p->line_id);
+ ++p;
+ }
+ else { // Else adjust the start and end down by the deleted amount.
+ p->start -= len;
+ p->line_id = lines.GetLineFromStartPos(p->start);
+ p->end = lines.GetLineEndpos(p->line_id);
+ ++p;
+ }
+ }
+}
+
+void Bookmarks::ApplyChanges(const std::vector<cxChange>& changes) {
+ // if (changes.empty()) return;
+
+ // Check if all has been deleted
+ if (lines.IsEmpty()) {
+ bookmarks.clear();
+ return;
+ }
+
+ // Adjust all start positions and remove deleted lines
+ int offset = 0;
+ for (std::vector<cxChange>::const_iterator ch = changes.begin(); ch != changes.end(); ++ch) {
+ const unsigned int len = ch->end - ch->start;
+ if (ch->type == cxINSERTION) {
+ for (bookmark_iter p = bookmarks.begin(); p != bookmarks.end(); ++p) {
+ if (p->start >= ch->start) p->start += len;
+ }
+ offset += len;
+ }
+ else { // ch->type == cxDELETION
+ const unsigned int start = ch->start + offset;
+ const unsigned int end = ch->end + offset;
+
+ bookmark_iter p = bookmarks.begin();
+ while (p != bookmarks.end()) {
+ if ((p->start > start && p->start <= end) || (p->start == start && ch->lines > 0)) {
+ p = bookmarks.erase(p);
+ continue;
+ }
+ else if (p->start > end) p->start -= len;
+ ++p;
+ }
+ offset -= len;
+ }
+ }
+
+ // Update line numbers and ends.
+ for (bookmark_iter p = bookmarks.begin(); p != bookmarks.end(); ++p) {
+ p->line_id = lines.GetLineFromStartPos(p->start);
+ p->end = lines.GetLineEndpos(p->line_id);
+ }
+}
View
42 src/Bookmarks.h
@@ -0,0 +1,42 @@
+#ifndef __BOOKMARKS_H__
+#define __BOOKMARKS_H__
+
+#include <vector>
+
+const unsigned int NO_BOOKMARK = (unsigned int)-1;
+
+class ILinePositions;
+struct cxBookmark;
+struct cxChange;
+
+
+class Bookmarks {
+public:
+ Bookmarks(const ILinePositions& lines): lines(lines){};
+
+ const std::vector<cxBookmark>& GetBookmarks() const;
+
+ void AddBookmark(unsigned int line_id, bool toggle=false);
+ void DeleteBookmark(unsigned int line_id);
+ void Clear();
+
+ // Returns the lineid of the next bookmark after the given one.
+ unsigned int NextBookmark(const unsigned int line_id) const;
+ unsigned int PrevBookmark(const unsigned int line_id) const;
+
+ // Adjust positions up for inserted characters
+ void InsertChars(unsigned int pos, unsigned int length);
+
+ // Adjust positions down for deleted characters
+ void DeleteChars(unsigned int start, unsigned int end);
+
+ void ApplyChanges(const std::vector<cxChange>& changes);
+
+private:
+ std::vector<cxBookmark> bookmarks;
+ const ILinePositions& lines;
+
+ Bookmarks& operator = (const Bookmarks& other);
+};
+
+#endif
View
254 src/EditorCtrl.cpp
@@ -20,9 +20,10 @@
#include <algorithm>
+#include "pcre.h"
+
#include "doc_byte_iter.h"
#include "tm_syntaxhandler.h"
-
#include "EditorFrame.h"
#include "StyleRun.h"
#include "FindCmdDlg.h"
@@ -43,8 +44,6 @@
#include "eSettings.h"
#include "IAppPaths.h"
#include "Strings.h"
-#include "pcre.h"
-
#include "ReplaceStringParser.h"
// Document Icons
@@ -89,13 +88,11 @@ class DragDropTarget : public wxDropTarget {
enum ShellOutput {soDISCARD, soREPLACESEL, soREPLACEDOC, soINSERT, soSNIPPET, soHTML, soTOOLTIP, soNEWDOC};
-// Ids
-enum {
+enum EDITORCTL_IDS {
TIMER_FOLDTOOLTIP = 100,
ID_LEFTSCROLL
};
-
BEGIN_EVENT_TABLE(EditorCtrl, wxControl)
EVT_PAINT(EditorCtrl::OnPaint)
EVT_CHAR(EditorCtrl::OnChar)
@@ -162,7 +159,9 @@ EditorCtrl::EditorCtrl(const int page_id, CatalystWrapper& cw, wxBitmap& bitmap,
do_freeze(true),
m_options_cache(0),
m_re(NULL),
- m_symbolCacheToken(0)
+ m_symbolCacheToken(0),
+
+ bookmarks(m_lines)
{
Create(parent, wxID_ANY, wxPoint(-100,-100), wxDefaultSize, wxNO_BORDER|wxWANTS_CHARS|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE);
Hide(); // start hidden to avoid flicker
@@ -208,7 +207,10 @@ EditorCtrl::EditorCtrl(const doc_id di, const wxString& mirrorPath, CatalystWrap
do_freeze(true),
m_options_cache(0),
m_re(NULL),
- m_symbolCacheToken(0)
+ m_symbolCacheToken(0),
+
+ bookmarks(m_lines)
+
{
Create(parent, wxID_ANY, pos, size, wxNO_BORDER|wxWANTS_CHARS|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE);
Init();
@@ -267,7 +269,9 @@ EditorCtrl::EditorCtrl(CatalystWrapper& cw, wxBitmap& bitmap, wxWindow* parent,
do_freeze(true),
m_options_cache(0),
m_re(NULL),
- m_symbolCacheToken(0)
+ m_symbolCacheToken(0),
+
+ bookmarks(m_lines)
{
Create(parent, wxID_ANY, pos, size, wxNO_BORDER|wxWANTS_CHARS|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE);
Hide(); // start hidden to avoid flicker
@@ -302,9 +306,7 @@ void EditorCtrl::RestoreSettings(unsigned int page_id, eFrameSettings& settings,
}
else {
const bool isBundleItem = eDocumentPath::IsBundlePath(mirrorPath);
- if (isBundleItem) {
- m_remotePath = mirrorPath;
- }
+ if (isBundleItem) m_remotePath = mirrorPath;
else m_path = mirrorPath;
cxLOCKDOC_WRITE(m_doc)
@@ -324,10 +326,9 @@ void EditorCtrl::RestoreSettings(unsigned int page_id, eFrameSettings& settings,
SetDocumentAndScrollPosition(newpos, topline);
- // Fold lines that was folded in previous session
+ // Fold lines that were folded in previous session
if (!folds.empty()) {
- // We have to make sure all text is syntaxed
- // and all fold markers found
+ // We have to make sure all text is syntaxed and all fold markers found
m_syntaxstyler.ParseAll();
UpdateFolds();
@@ -335,16 +336,14 @@ void EditorCtrl::RestoreSettings(unsigned int page_id, eFrameSettings& settings,
const unsigned int line_id = *p;
const cxFold target(line_id);
vector<cxFold>::iterator f = lower_bound(m_folds.begin(), m_folds.end(), target);
- if (f != m_folds.end() && f->line_id == line_id && f->type == cxFOLD_START) {
+ if (f != m_folds.end() && f->line_id == line_id && f->type == cxFOLD_START)
Fold(*p);
- }
}
}
// Set bookmarks
- for (vector<unsigned int>::const_iterator p = bookmarks.begin(); p != bookmarks.end(); ++p) {
+ for (vector<unsigned int>::const_iterator p = bookmarks.begin(); p != bookmarks.end(); ++p)
AddBookmark(*p);
- }
}
void EditorCtrl::Init() {
@@ -398,9 +397,8 @@ void EditorCtrl::Init() {
// resize the bitmap used for doublebuffering
wxSize size = GetClientSize();
- if (bitmap.GetWidth() < size.x || bitmap.GetHeight() < size.y) {
+ if (bitmap.GetWidth() < size.x || bitmap.GetHeight() < size.y)
bitmap = wxBitmap(size.x, size.y);
- }
// Init the lines
m_lines.SetWordWrap(m_parentFrame.GetWrapMode());
@@ -484,9 +482,8 @@ void EditorCtrl::SaveSettings(unsigned int i, eFrameSettings& settings, unsigned
const int topline = GetTopLine();
const wxString& syntax = GetSyntaxName();
const vector<unsigned int> folds = GetFoldedLines();
- const vector<cxBookmark>& bookmarks = GetBookmarks();
- settings.SetPageSettings(i, path, di, pos, topline, syntax, folds, bookmarks, (SubPage)subid);
+ settings.SetPageSettings(i, path, di, pos, topline, syntax, folds, bookmarks.GetBookmarks(), (SubPage)subid);
//wxLogDebug(wxT(" %d (%d,%d,%d) pos:%d topline:%d"), i, di.type, di.document_id, di.version_id, pos, topline);
}
@@ -555,9 +552,7 @@ unsigned int EditorCtrl::GetCurrentColumnNumber() {
int EditorCtrl::GetTopLine() {
wxASSERT(scrollPos >= 0);
-
//wxLogDebug(wxT("GetTopLine() - %d %d - %s"), scrollPos, m_lines.GetLineFromYPos(scrollPos), GetPath());
-
return m_lines.GetLineFromYPos(scrollPos);
}
@@ -643,8 +638,7 @@ bool EditorCtrl::IsOk() const {
wxSize size = GetClientSize();
// It is ok to have a size 0 window with invalid bitmap
- if (size.x == 0 && size.y == 0) return true;
- else return bitmap.Ok();
+ return (size.x == 0 && size.y == 0) || bitmap.Ok();
}
// WARNING: Be aware that during a change grouping, lines is not valid
@@ -713,9 +707,7 @@ bool EditorCtrl::Show(bool show) {
void EditorCtrl::SetShowGutter(bool showGutter) {
if (m_showGutter == showGutter) return;
- if (showGutter) {
- m_gutterCtrl->Show();
- }
+ if (showGutter) m_gutterCtrl->Show();
else {
m_gutterCtrl->Hide();
m_gutterWidth = 0;
@@ -738,9 +730,8 @@ void EditorCtrl::SetWordWrap(cxWrapMode wrapMode) {
m_lines.SetWordWrap(wrapMode);
- if (m_wrapAtMargin && wrapMode != cxWRAP_NONE) {
+ if (m_wrapAtMargin && wrapMode != cxWRAP_NONE)
m_lines.SetWidth(m_lines.GetMarginPos(), topline);
- }
scrollPos = m_lines.GetYPosFromLine(topline);
DrawLayout();
@@ -1316,7 +1307,7 @@ unsigned int EditorCtrl::GetLineIndentPos(unsigned int lineid) {
wxASSERT(lineid < m_lines.GetLineCount());
unsigned int linestart, lineend;
- m_lines.GetLineExtent(lineend, linestart, lineend);
+ m_lines.GetLineExtent(lineid, linestart, lineend);
if (linestart == lineend) return 0;
cxLOCKDOC_READ(m_doc)
@@ -2986,7 +2977,7 @@ void EditorCtrl::ApplyDiff(const doc_id& oldDoc, bool moveToFirstChange) {
m_syntaxstyler.ApplyDiff(linechanges);
FoldingApplyDiff(linechanges);
m_search_hl_styler.ApplyDiff(changes);
- BookmarksApplyDiff(changes);
+ if (!changes.empty()) bookmarks.ApplyChanges(changes);
// Move caret to position of first change
if (moveToFirstChange) {
@@ -3058,14 +3049,14 @@ void EditorCtrl::StylersInsert(unsigned int pos, unsigned int length) {
m_search_hl_styler.Insert(pos, length);
m_syntaxstyler.Insert(pos, length);
FoldingInsert(pos, length);
- BookmarksInsert(pos, length);
+ bookmarks.InsertChars(pos, length);
}
void EditorCtrl::StylersDelete(unsigned int start, unsigned int end) {
m_search_hl_styler.Delete(start, end);
m_syntaxstyler.Delete(start, end);
FoldingDelete(start, end);
- BookmarksDelete(start, end);
+ bookmarks.DeleteChars(start, end);
}
unsigned int EditorCtrl::GetChangePos(const doc_id& old_version_id) const {
@@ -3930,7 +3921,7 @@ void EditorCtrl::SwapLines(unsigned int line1, unsigned int line2) {
RawMove(linestart, lineend, lineend2);
}
- if (!m_lines.isLineVirtual(line2) && linestart2 != lineend2) {
+ if (!m_lines.IsLineVirtual(line2) && linestart2 != lineend2) {
const unsigned int offset = lineend - linestart;
// Move bottom line to top lines position
@@ -4268,7 +4259,7 @@ void EditorCtrl::OnCopy() {
else if (!m_lines.IsEmpty()) {
// Copy line
const unsigned int line_id = m_lines.GetCurrentLine();
- if (!m_lines.isLineVirtual(line_id)) {
+ if (!m_lines.IsLineVirtual(line_id)) {
unsigned int startpos, endpos;
m_lines.GetLineExtent(line_id, startpos, endpos);
copytext = GetText(startpos, endpos);
@@ -4585,7 +4576,7 @@ void EditorCtrl::SelectLine(unsigned int line_id, bool multiselect) {
if (!multiselect || m_lines.IsSelectionShadow()) m_lines.RemoveAllSelections();
// Select the line
- if (!m_lines.isLineVirtual(line_id)) {
+ if (!m_lines.IsLineVirtual(line_id)) {
unsigned int start, end;
m_lines.GetLineExtent(line_id, start, end);
@@ -7209,7 +7200,7 @@ void EditorCtrl::OnMouseMotion(wxMouseEvent& event) {
else if (m_selMode == SEL_LINE && m_currentSel != -1) {
// Extend selection one line at a time
const unsigned int line_id = m_lines.GetCurrentLine();
- if (!m_lines.isLineVirtual(line_id)) {
+ if (!m_lines.IsLineVirtual(line_id)) {
unsigned int linestart, lineend;
m_lines.GetLineExtent(line_id, linestart, lineend);
@@ -7975,9 +7966,9 @@ void EditorCtrl::OnDragDropText(const wxString& text, wxDragResult dragType) {
wxLogDebug(wxT("OnDragDropText (pos=%d)"), GetPos());
// If we are moving inside same doc we should delete source
- if (dragType == wxDragMove && m_dragStartPos != wxDefaultPosition) {
+ if (dragType == wxDragMove && m_dragStartPos != wxDefaultPosition)
DeleteSelections(); // Will adjust caret pos
- }
+
RemoveAllSelections();
const unsigned int pos = GetPos();
@@ -8005,13 +7996,11 @@ void EditorCtrl::OnDragDropColumn(const wxArrayString& text, wxDragResult dragTy
wxLogDebug(wxT("OnDragDropColumn (pos=%d)"), GetPos());
// If we are moving inside same doc we should delete source
- if (dragType == wxDragMove && m_dragStartPos != wxDefaultPosition) {
+ if (dragType == wxDragMove && m_dragStartPos != wxDefaultPosition)
DeleteSelections(); // Will adjust caret pos
- }
- RemoveAllSelections();
+ RemoveAllSelections();
InsertColumn(text, true /*select*/);
-
m_parentFrame.BringToFront();
}
@@ -8059,9 +8048,8 @@ void EditorCtrl::OnDragDrop(const wxArrayString& filenames) {
// Add drag actions
wxArrayString actionList;
- for (vector<const tmDragCommand*>::const_iterator p = actions.begin(); p != actions.end(); ++p) {
+ for (vector<const tmDragCommand*>::const_iterator p = actions.begin(); p != actions.end(); ++p)
listMenu.Append(menuId++, (*p)->name);
- }
// Add commands
listMenu.AppendSeparator();
@@ -8077,9 +8065,9 @@ void EditorCtrl::OnDragDrop(const wxArrayString& filenames) {
}
else if (result == 1002-1000) {
// Open all
- for (; i < filenames.GetCount(); ++i) {
+ for (; i < filenames.GetCount(); ++i)
m_parentFrame.Open(filenames[i]);
- }
+
newTabs = true;
break;
}
@@ -8180,11 +8168,9 @@ wxString EditorCtrl::GetSymbolString(const SymbolRef& sr) const {
const wxCharBuffer buf = rep.mb_str(wxConvUTF8);
source.insert(source.begin()+res.start, buf.data(), buf.data()+strlen(buf.data()));
}
-
break;
}
}
-
break;
}
}
@@ -8196,7 +8182,7 @@ wxString EditorCtrl::GetSymbolString(const SymbolRef& sr) const {
}
if (source.empty()) return wxEmptyString;
- else return wxString(&*source.begin(), wxConvUTF8, source.size());
+ return wxString(&*source.begin(), wxConvUTF8, source.size());
}
bool EditorCtrl::OnPreKeyDown(wxKeyEvent& event) {
@@ -8276,12 +8262,13 @@ bool EditorCtrl::OnPreKeyDown(wxKeyEvent& event) {
}
return false;
}
+
bool EditorCtrl::OnPreKeyUp(wxKeyEvent& event) {
#ifdef __WXMSW__
- if (event.m_rawCode == 17 || event.m_rawCode == 18) {
+ if (event.m_rawCode == 17 || event.m_rawCode == 18)
s_altGrDown = false;
- }
#endif
+
return false;
}
@@ -8403,7 +8390,7 @@ void EditorCtrl::FoldingInsert(unsigned int pos, unsigned int len) {
const unsigned int lineCount = m_lines.GetLineCount(false/*includeVirtual*/);
const unsigned int firstline = m_lines.GetLineFromCharPos(pos);
unsigned int lastline = m_lines.GetLineFromCharPos(pos + len);
- if (lastline && m_lines.isLineVirtual(lastline)) --lastline; // Don't try to parse last virtual line
+ if (lastline && m_lines.IsLineVirtual(lastline)) --lastline; // Don't try to parse last virtual line
// How many new lines were inserted?
unsigned int newLines = lastline - firstline;
@@ -8463,7 +8450,7 @@ void EditorCtrl::FoldingDelete(unsigned int start, unsigned int WXUNUSED(end)) {
if (p->type == cxFOLD_START_FOLDED) doRefold = true;
p = m_folds.erase(p);
}
- if (!m_lines.isLineVirtual(line_id)) {
+ if (!m_lines.IsLineVirtual(line_id)) {
p = ParseFoldLine(line_id, p, doRefold);
}
@@ -8521,7 +8508,7 @@ void EditorCtrl::FoldingApplyDiff(const vector<cxLineChange>& linechanges) {
}
else { // DELETION
// Reparse line with partial deletion
- if (!m_lines.isLineVirtual(line_id)) {
+ if (!m_lines.IsLineVirtual(line_id)) {
f = ParseFoldLine(line_id, f, doRefold);
}
@@ -8741,7 +8728,7 @@ bool EditorCtrl::IsPosInFold(unsigned int pos, unsigned int* fold_start, unsigne
vector<cxFold*> EditorCtrl::GetFoldStack(unsigned int line_id) {
vector<cxFold*> foldStack;
- if (m_lines.isLineVirtual(line_id)) return foldStack;
+ if (m_lines.IsLineVirtual(line_id)) return foldStack;
if (m_foldLineCount == 0) return foldStack;
wxASSERT(line_id < m_foldLineCount);
@@ -8776,6 +8763,10 @@ vector<cxFold*> EditorCtrl::GetFoldStack(unsigned int line_id) {
return foldStack;
}
+void EditorCtrl::ClearBookmarks() {bookmarks.Clear();}
+
+const vector<cxBookmark>& EditorCtrl::GetBookmarks() const {return bookmarks.GetBookmarks();}
+
void EditorCtrl::ToogleBookmarkOnCurrentLine() {
const unsigned line_id = m_lines.GetCurrentLine();
AddBookmark(line_id, true /*toggle*/);
@@ -8783,157 +8774,36 @@ void EditorCtrl::ToogleBookmarkOnCurrentLine() {
void EditorCtrl::AddBookmark(unsigned int line_id, bool toggle) {
wxASSERT(line_id < m_lines.GetLineCount());
-
- // Find insert position
- vector<cxBookmark>::iterator p = m_bookmarks.begin();
- while (p != m_bookmarks.end()) {
- if (p->line_id == line_id) {
- if (toggle) m_bookmarks.erase(p);
- return; // already added
- }
- else if (p->line_id > line_id) break;
- ++p;
- }
-
- // Insert the new bookmark
- const cxBookmark bm = {line_id, m_lines.GetLineStartpos(line_id), m_lines.GetLineEndpos(line_id)};
- m_bookmarks.insert(p, bm);
+ bookmarks.AddBookmark(line_id, toggle);
}
void EditorCtrl::DeleteBookmark(unsigned int line_id) {
- for (vector<cxBookmark>::iterator p = m_bookmarks.begin(); p != m_bookmarks.end(); ++p) {
- if (p->line_id == line_id) {
- m_bookmarks.erase(p);
- return;
- }
- else if (p->line_id > line_id) {
- wxASSERT(false); // no bookmark on line
- return;
- }
- }
-}
-
-void EditorCtrl::BookmarksInsert(unsigned int pos, unsigned int length) {
- for (vector<cxBookmark>::iterator p = m_bookmarks.begin(); p != m_bookmarks.end(); ++p) {
- if (p->start > pos) {
- p->start += length;
- p->line_id = m_lines.GetLineFromStartPos(p->start);
- p->end = m_lines.GetLineEndpos(p->line_id);
- }
- else if (p->end > pos) {
- p->end = m_lines.GetLineEndpos(p->line_id);
- }
- }
-}
-
-void EditorCtrl::BookmarksDelete(unsigned int start, unsigned int end) {
- const unsigned int len = end - start;
-
- vector<cxBookmark>::iterator p = m_bookmarks.begin();
- while (p != m_bookmarks.end()) {
- if (p->end > start) { // ignore bookmarks before deletion
- if ((start == p->start && end >= p->end) || (start < p->start && end >= p->start)) {
- p = m_bookmarks.erase(p);
- continue;
- }
- else if (start >= p->start) {
- p->end = m_lines.GetLineEndpos(p->line_id);
- }
- else {
- p->start -= len;
- p->line_id = m_lines.GetLineFromStartPos(p->start);
- p->end = m_lines.GetLineEndpos(p->line_id);
- }
- }
-
- ++p;
- }
-}
-
-void EditorCtrl::BookmarksApplyDiff(const vector<cxChange>& changes) {
- if (changes.empty()) return;
-
- // Check if all has been deleted
- if (m_lines.IsEmpty()) {
- m_bookmarks.clear();
- return;
- }
-
- // Adjust all start positions and remove deleted lines
- int offset = 0;
- for (vector<cxChange>::const_iterator ch = changes.begin(); ch != changes.end(); ++ch) {
- const unsigned int len = ch->end - ch->start;
- if (ch->type == cxINSERTION) {
- for (vector<cxBookmark>::iterator p = m_bookmarks.begin(); p != m_bookmarks.end(); ++p) {
- if (p->start >= ch->start) p->start += len;
- }
- offset += len;
- }
- else { // ch->type == cxDELETION
- const unsigned int start = ch->start + offset;
- const unsigned int end = ch->end + offset;
-
- vector<cxBookmark>::iterator p = m_bookmarks.begin();
- while (p != m_bookmarks.end()) {
- if ((p->start > start && p->start <= end) || (p->start == start && ch->lines > 0)) {
- p = m_bookmarks.erase(p);
- continue;
- }
- else if (p->start > end) p->start -= len;
- ++p;
- }
- offset -= len;
- }
- }
-
- // Update line numbers and ends
- for (vector<cxBookmark>::iterator p = m_bookmarks.begin(); p != m_bookmarks.end(); ++p) {
- p->line_id = m_lines.GetLineFromStartPos(p->start);
- p->end = m_lines.GetLineEndpos(p->line_id);
- }
+ bookmarks.DeleteBookmark(line_id);
}
void EditorCtrl::GotoNextBookmark() {
- if (m_bookmarks.empty()) return;
-
- // Find first bookmark after current line
- const unsigned int line_id = m_lines.GetCurrentLine();
- vector<cxBookmark>::iterator p = m_bookmarks.begin();
- for (; p != m_bookmarks.end(); ++p) {
- if (p->line_id > line_id) break;
+ const unsigned int new_line = bookmarks.NextBookmark(m_lines.GetCurrentLine());
+ if (new_line != NO_BOOKMARK) {
+ m_lines.SetPos(m_lines.GetLineStartpos(new_line));
+ MakeCaretVisible();
+ DrawLayout();
}
- if (p == m_bookmarks.end()) p = m_bookmarks.begin(); // restart from top
-
- // Goto bookmark
- m_lines.SetPos(m_lines.GetLineStartpos(p->line_id));
- MakeCaretVisible();
- DrawLayout();
}
void EditorCtrl::GotoPrevBookmark() {
- if (m_bookmarks.empty()) return;
-
- // Find first bookmark before current line
- const unsigned int line_id = m_lines.GetCurrentLine();
- vector<cxBookmark>::reverse_iterator p = m_bookmarks.rbegin();
- for (; p != m_bookmarks.rend(); ++p) {
- if (p->line_id < line_id) break;
+ const unsigned int new_line = bookmarks.PrevBookmark(m_lines.GetCurrentLine());
+ if (new_line != NO_BOOKMARK) {
+ m_lines.SetPos(m_lines.GetLineStartpos(new_line));
+ MakeCaretVisible();
+ DrawLayout();
}
- if (p == m_bookmarks.rend()) p = m_bookmarks.rbegin(); // restart from bottom
-
- // Goto bookmark
- m_lines.SetPos(m_lines.GetLineStartpos(p->line_id));
- MakeCaretVisible();
- DrawLayout();
}
EditorChangeState EditorCtrl::GetChangeState() const {
return EditorChangeState(this->GetId(), this->GetChangeToken());
}
-
#ifdef __WXDEBUG__
-
void EditorCtrl::TestMilestones() {
//Clear();
View
30 src/EditorCtrl.h
@@ -32,6 +32,7 @@
#include "BracketHighlight.h"
#include "DetectTripleClicks.h"
#include "AutoPairs.h"
+#include "Bookmarks.h"
#include "IFoldingEditor.h"
#include "IEditorDoAction.h"
@@ -40,7 +41,7 @@
#include "IEditorSearch.h"
#include "ITabPage.h"
-// Pre-definitions
+
class wxFileName;
class cxEnv;
@@ -48,7 +49,6 @@ class GutterCtrl;
class EditorFrame;
class PreviewDlg;
class cxRemoteAction;
-class MultilineDataObject;
class TextTip;
class eFrameSettings;
class LiveCaret;
@@ -58,6 +58,7 @@ class tmAction;
class tmDragCommand;
class TmSyntaxHandler;
+
class EditorCtrl : public KeyHookable<wxControl>,
public IFoldingEditor,
public IEditorDoAction,
@@ -348,10 +349,10 @@ class EditorCtrl : public KeyHookable<wxControl>,
void ToogleBookmarkOnCurrentLine();
void AddBookmark(unsigned int line_id, bool toggle=false);
void DeleteBookmark(unsigned int line_id);
- void ClearBookmarks() {m_bookmarks.clear();};
+ void ClearBookmarks();
void GotoNextBookmark();
void GotoPrevBookmark();
- const vector<cxBookmark>& GetBookmarks() const {return m_bookmarks;};
+ const vector<cxBookmark>& GetBookmarks() const;
// Scroll Position
int GetYScrollPos() const { return scrollPos; };
@@ -503,11 +504,6 @@ class EditorCtrl : public KeyHookable<wxControl>,
vector<cxFold>::iterator ParseFoldLine(unsigned int line_id, vector<cxFold>::iterator insertPos, bool doFold);
unsigned int GetLastLineInFold(const vector<cxFold*>& foldStack) const;
- // Bookmarks
- void BookmarksInsert(unsigned int pos, unsigned int length);
- void BookmarksDelete(unsigned int start, unsigned int end);
- void BookmarksApplyDiff(const vector<cxChange>& changes);
-
// Commands
bool cmd_Undo(int count, vector<int>& cStack, bool end=false);
@@ -589,7 +585,7 @@ class EditorCtrl : public KeyHookable<wxControl>,
unsigned int m_foldTooltipLine;
// Bookmarks
- vector<cxBookmark> m_bookmarks;
+ Bookmarks bookmarks;
action lastaction;
wxPoint lastMousePos; // Used to check if mouse have really moved
@@ -617,31 +613,26 @@ class EditorCtrl : public KeyHookable<wxControl>,
SnippetHandler m_snippetHandler;
// Change state vars
- int change_pos;
doc_id change_doc_id;
+ int change_pos;
int change_toppos;
// incremental search trackers
vector<interval> m_searchRanges;
// start/found are used to track state between Find calls
- unsigned int m_search_start_pos;
- unsigned int m_search_found_pos;
+ unsigned int m_search_start_pos, m_search_found_pos;
wxString m_indent;
AutoPairs m_autopair;
// Wrapping
- bool m_doAutoWrap;
- bool m_wrapAtMargin;
+ bool m_doAutoWrap, m_wrapAtMargin;
BracketHighlight m_bracketHighlight;
int m_lastScopePos;
- // Cache of last compiled regex
- mutable wxString m_regex_cache;
-
// Cached env variables
wxString m_tmFilePath;
wxString m_tmDirectory;
@@ -649,6 +640,9 @@ class EditorCtrl : public KeyHookable<wxControl>,
// Symbol cache
mutable vector<SymbolRef> m_symbolCache;
+ // Cache of last compiled regex
+ mutable wxString m_regex_cache;
+
// Key state
static unsigned long s_ctrlDownTime;
static bool s_altGrDown;
View
25 src/GutterCtrl.cpp
@@ -234,10 +234,12 @@ void GutterCtrl::DrawGutter(wxDC& dc) {
}
// Draw bookmark
- if (m_showBookmarks && nextBookmark != bookmarks.end() && nextBookmark->line_id == i) {
- //m_mdc.DrawText(wxT("\u066D"), 3, ypos);
- m_mdc.DrawBitmap(m_bmBookmark, 2, ypos + line_middle - 5);
- ++nextBookmark;
+ if (m_showBookmarks) {
+ if (nextBookmark != bookmarks.end() && nextBookmark->line_id == i) {
+ //m_mdc.DrawText(wxT("\u066D"), 3, ypos);
+ m_mdc.DrawBitmap(m_bmBookmark, 2, ypos + line_middle - 5);
+ ++nextBookmark;
+ }
}
// Draw the line number
@@ -326,7 +328,6 @@ void GutterCtrl::DrawGutter()
wxClientDC dc(this);DrawGutter(dc);
}
-
void GutterCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) {
wxPaintDC dc(this);
@@ -335,7 +336,6 @@ void GutterCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) {
dc.Blit(0, 0, size.x, size.y, &m_mdc, 0, 0);
}
-
void GutterCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) {
const wxSize size = GetClientSize();
@@ -348,7 +348,6 @@ void GutterCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) {
}
// Don't draw the new layout before asked by frame
- // DrawGutter();
}
// Don't erase the background
@@ -389,16 +388,15 @@ void GutterCtrl::OnMouseLeftDown(wxMouseEvent& event) {
}
// If not multiselecting or extending, remove previous selections
- if (!event.ControlDown()) {
+ if (!event.ControlDown())
lines.RemoveAllSelections();
- }
// Find out which line was clicked on
if (y < lines.GetHeight()) {
const unsigned int line_id = lines.GetLineFromYPos(y);
// Select the line
- if (!lines.isLineVirtual(line_id)) {
+ if (!lines.IsLineVirtual(line_id)) {
int startpos = lines.GetLineStartpos(line_id);
int endpos = lines.GetLineEndpos(line_id, false);
@@ -528,12 +526,11 @@ void GutterCtrl::OnMouseMotion(wxMouseEvent& event) {
}
else {
// Update the lines selection info
- if (m_currentSel == -1) {
+ if (m_currentSel == -1)
m_currentSel = lines.AddSelection(sel_start, sel_end);
- }
- else {
+ else
m_currentSel = lines.UpdateSelection(m_currentSel, sel_start, sel_end);
- }
+
lines.SetPos(m_sel_endline < m_sel_startline ? sel_start : sel_end);
}
View
12 src/IFoldingEditor.h
@@ -2,15 +2,7 @@
#define __IFOLDINGEDITOR_H__
#include <wx/platform.h>
-// STL can't compile with Level 4
-#ifdef __WXMSW__
- #pragma warning(push, 1)
-#endif
#include <vector>
-#ifdef __WXMSW__
- #pragma warning(pop)
-#endif
-using namespace std;
struct cxFold;
class interval;
@@ -19,10 +11,10 @@ class IFoldingEditor {
public:
virtual bool IsPosInFold(unsigned int pos, unsigned int* fold_start=NULL, unsigned int* fold_end=NULL) = 0;
virtual void UnFoldParents(unsigned int line_id) = 0;
- virtual const vector<cxFold>& GetFolds() const = 0;
+ virtual const std::vector<cxFold>& GetFolds() const = 0;
// This isn't used by Lines directly, but is passed to internal data member Line.
- // The only use of this member is in Lines (though of course the underlying EditorCtrl member
+ // The only pubilc use of this member is in Lines; the underlying EditorCtrl member
// is used internally in the editor control.
virtual const interval& GetHlBracket() const = 0;
};
View
55 src/Lines.cpp
@@ -133,7 +133,7 @@ void Lines::UpdateParsedLine(unsigned int line_id) {
ll->update_parsed_line(line_id);
}
-int Lines::GetWidth() {
+int Lines::GetWidth() const {
return m_wrapMode == cxWRAP_NONE ? ll->width() : line.GetDisplayWidth();
}
@@ -150,12 +150,12 @@ void Lines::SetTabWidth(unsigned int width) {
}
unsigned int Lines::GetPos() const {
- wxASSERT(pos >= 0 && pos <= ll->length());
+ wxASSERT(0 <= pos && pos <= ll->length());
return pos;
}
-unsigned int Lines::GetLastpos() {
- wxASSERT(lastpos >= 0 && lastpos <= ll->length());
+unsigned int Lines::GetLastpos() const {
+ wxASSERT(0 <= lastpos && lastpos <= ll->length());
return lastpos;
}
@@ -176,20 +176,10 @@ void Lines::SetPos(unsigned int newpos, bool update_lastpos) {
}
void Lines::SetLastpos(unsigned int newpos) {
- wxASSERT(newpos >= 0 && newpos <= ll->length());
+ wxASSERT(0 <= newpos && newpos <= ll->length());
lastpos = newpos;
}
-/*bool Lines::CaretVisible() {
- // Checks if caret is in linelist window
- // might not be visible in current display
- if (ll->in_window(pos)) {
- //SetCaretPos();
- return true;
- }
- else return false;
-}*/
-
wxPoint Lines::GetCaretPos() const {
return wxPoint(caretpos.x, FoldedYPos(caretpos.y));
}
@@ -286,7 +276,7 @@ bool Lines::IsOverFoldIndicator(const wxPoint& point) {
return false;
}
-bool Lines::IsAtTabPoint(){
+bool Lines::IsAtTabPoint() {
unsigned int posline = ll->find_offset(pos);
if (posline == ll->size()) return true;
@@ -299,15 +289,14 @@ bool Lines::IsAtTabPoint(){
return true; // start of next line
}
-int Lines::GetCurrentLine() {
+int Lines::GetCurrentLine() const {
if (ll->size() == 0) return 0; // WARNING: This line does not exist yet
// Notice that this can return the last (virtual) line
- unsigned int lineid = GetLineFromCharPos(pos);
- return lineid;
+ return GetLineFromCharPos(pos);
}
-unsigned int Lines::GetLineStartpos(unsigned int lineid) {
+unsigned int Lines::GetLineStartpos(unsigned int lineid) const {
wxASSERT(0 <= lineid && lineid <= ll->size());
if (ll->size() == 0) return 0;
@@ -320,7 +309,7 @@ unsigned int Lines::GetLineStartpos(unsigned int lineid) {
}
}
-unsigned int Lines::GetLineEndpos(unsigned int lineid, bool stripnewline) {
+unsigned int Lines::GetLineEndpos(unsigned int lineid, bool stripnewline) const {
wxASSERT(0 <= lineid && lineid <= ll->size());
if (ll->size() == 0) return 0;
@@ -339,7 +328,7 @@ unsigned int Lines::GetLineEndpos(unsigned int lineid, bool stripnewline) {
}
}
-void Lines::GetLineExtent(unsigned int lineid, unsigned int& start, unsigned int& end) {
+void Lines::GetLineExtent(unsigned int lineid, unsigned int& start, unsigned int& end) const {
wxASSERT(0 <= lineid && lineid <= ll->size());
if (ll->size() == 0) {
start = end = 0;
@@ -357,14 +346,14 @@ void Lines::GetLineExtent(unsigned int lineid, unsigned int& start, unsigned int
end = ll->end(lineid);
}
-bool Lines::isLineVirtual(unsigned int lineid) {
+bool Lines::IsLineVirtual(unsigned int lineid) const {
wxASSERT(lineid >= 0 && lineid <= ll->size());
wxASSERT(NewlineTerminated || lineid != ll->size());
return lineid == ll->size() && NewlineTerminated;
}
-bool Lines::IsLineEmpty(unsigned int lineid) {
+bool Lines::IsLineEmpty(unsigned int lineid) const {
wxASSERT(lineid <= ll->size());
if (ll->size() == 0) return true;
@@ -372,26 +361,26 @@ bool Lines::IsLineEmpty(unsigned int lineid) {
return (ll->offset(lineid)+1 >= ll->end(lineid));
}
-bool Lines::IsLineEnd(unsigned int pos) {
+bool Lines::IsLineEnd(unsigned int pos) const {
wxASSERT(pos <= GetLength());
return ll->IsLineEnd(pos);
}
-bool Lines::IsLineEnd(unsigned int line_id, unsigned int pos) {
+bool Lines::IsLineEnd(unsigned int line_id, unsigned int pos) const {
wxASSERT(line_id <= ll->size());
if (line_id == ll->size()) return (pos == ll->length());
return (pos == ll->end(line_id));
}
-bool Lines::IsLineStart(unsigned int line_id, unsigned int pos) {
+bool Lines::IsLineStart(unsigned int line_id, unsigned int pos) const {
wxASSERT(line_id <= ll->size());
if (line_id == ll->size()) return (pos == ll->length());
return (pos == ll->offset(line_id));
}
-bool Lines::IsBeforeNewline(unsigned int pos) {
+bool Lines::IsBeforeNewline(unsigned int pos) const {
wxASSERT(pos <= GetLength());
const unsigned int lineid = GetLineFromCharPos(pos);
@@ -399,20 +388,20 @@ bool Lines::IsBeforeNewline(unsigned int pos) {
return (pos == beforeNewline);
}
-unsigned int Lines::GetLineEndFromPos(unsigned int pos) {
+unsigned int Lines::GetLineEndFromPos(unsigned int pos) const {
wxASSERT(pos <= GetLength());
const unsigned int endPos = ll->EndFromPos(pos);
return endPos;
}
-unsigned int Lines::GetLineStartFromPos(unsigned int pos) {
+unsigned int Lines::GetLineStartFromPos(unsigned int pos) const {
wxASSERT(pos <= GetLength());
return ll->StartFromPos(pos);
}
-int Lines::GetLineFromCharPos(unsigned int char_pos) {
+int Lines::GetLineFromCharPos(unsigned int char_pos) const {
wxASSERT(char_pos >= 0 && char_pos <= GetLength());
if (char_pos == 0 && GetLength() == 0) return 0; // empty doc
@@ -426,7 +415,7 @@ int Lines::GetLineFromCharPos(unsigned int char_pos) {
return lineid;
}
-unsigned int Lines::GetLineFromStartPos(unsigned int char_pos) {
+unsigned int Lines::GetLineFromStartPos(unsigned int char_pos) const {
wxASSERT(char_pos <= GetLength());
if (char_pos == 0) return 0;
@@ -943,7 +932,7 @@ void Lines::ApplyDiff(vector<cxChange>& changes) {
#endif
}
-bool Lines::IsCaretInPreparedPos() {
+bool Lines::IsCaretInPreparedPos() const {
// Checks we can update caret without doing any validations that
// could move positions.
return ll->in_window(pos);
View
60 src/Lines.h
@@ -14,26 +14,40 @@ class IFoldingEditor;
struct tmTheme;
class Styler;
-class Lines {
+class ILinePositions {
+public:
+ virtual bool IsEmpty() const = 0;
+
+ virtual unsigned int GetLineFromStartPos(unsigned int char_pos) const = 0;
+
+ virtual unsigned int GetLineStartFromPos(unsigned int pos) const = 0;
+ virtual unsigned int GetLineEndFromPos(unsigned int pos) const = 0;
+
+ virtual unsigned int GetLineStartpos(unsigned int lineid) const = 0;
+ virtual unsigned int GetLineEndpos(unsigned int lineid, bool stripnewline=true) const = 0;
+ virtual void GetLineExtent(unsigned int lineid, unsigned int& start, unsigned int& end) const = 0;
+};
+
+class Lines: public ILinePositions {
public:
Lines(wxDC& dc, DocumentWrapper& dw, IFoldingEditor& editorCtrl, const tmTheme& theme);
void Init();
int GetHeight() const;
int GetLineHeight() const;
- bool IsEmpty() const {return GetLength() == 0;};
+ virtual bool IsEmpty() const {return GetLength() == 0;};
unsigned int GetLength() const;
unsigned int GetLineCount(bool includeVirtual=true) const;
unsigned int GetLastLine() const;
unsigned int GetDisplayWidth() const {return line.GetDisplayWidth();};
- int GetWidth();
+ int GetWidth() const;
void SetWidth(unsigned int newwidth, unsigned int index=0);
unsigned int GetPos() const;
void SetPos(unsigned int newpos, bool update_lastpos = true);
- unsigned int GetLastpos();
+ unsigned int GetLastpos() const;
void SetLastpos(unsigned int newpos);
void UpdateParsedLine(unsigned int line_id);
@@ -50,32 +64,35 @@ class Lines {
void UpdateFont();
void SetTabWidth(unsigned int width);
- bool IsCaretInPreparedPos();
+ bool IsCaretInPreparedPos() const;
wxPoint GetCaretPos() const;
void UpdateCaretPos();
wxPoint GetCharPos(unsigned int char_pos);
- int GetCurrentLine();
- int GetLineFromCharPos(unsigned int char_pos);
- unsigned int GetLineFromStartPos(unsigned int char_pos);
- unsigned int GetLineEndFromPos(unsigned int pos);
- unsigned int GetLineStartFromPos(unsigned int pos);
- unsigned int GetLineEndpos(unsigned int lineid, bool stripnewline = true);
- void GetLineExtent(unsigned int lineid, unsigned int& start, unsigned int& end); //equiv to "stripnewline = false"
-
- unsigned int GetLineStartpos(unsigned int lineid);
- bool isLineVirtual(unsigned int lineid);
- bool IsLineEnd(unsigned int pos);
- bool IsLineEnd(unsigned int line_id, unsigned int pos);
- bool IsLineStart(unsigned int line_id, unsigned int pos);
- bool IsBeforeNewline(unsigned int pos);
- bool IsLineEmpty(unsigned int lineid);
+ int GetCurrentLine() const;
+ int GetLineFromCharPos(unsigned int char_pos) const;
+
+ virtual unsigned int GetLineFromStartPos(unsigned int char_pos) const;
+
+ virtual unsigned int GetLineStartFromPos(unsigned int pos) const;
+ virtual unsigned int GetLineEndFromPos(unsigned int pos) const;
+
+ virtual unsigned int GetLineStartpos(unsigned int lineid) const;
+ virtual unsigned int GetLineEndpos(unsigned int lineid, bool stripnewline = true) const;
+ virtual void GetLineExtent(unsigned int lineid, unsigned int& start, unsigned int& end) const; //equiv to "stripnewline = false"
+
+ bool IsLineVirtual(unsigned int lineid) const;
+ bool IsLineEnd(unsigned int pos) const;
+ bool IsLineEnd(unsigned int line_id, unsigned int pos) const;
+ bool IsLineStart(unsigned int line_id, unsigned int pos) const;
+ bool IsBeforeNewline(unsigned int pos) const;
+ bool IsLineEmpty(unsigned int lineid) const;
int GetLineFromYPos(int ypos) const;
int GetYPosFromLine(unsigned int lineid) const;
int GetBottomYPosFromLine(unsigned int lineid) const;
int PrepareYPos(int ypos);
- int PrepareAll() const {return ll->prepare_all();};
+ int PrepareAll() {return ll->prepare_all();};
int GetPosFromXY(int xpos, int ypos, bool allowOutbound=true);
full_pos ClickOnLine(int xpos, int ypos, bool doSetpos=true);
@@ -161,4 +178,3 @@ class Lines {
};
#endif // LINES_H
-
View
8 src/e.vcproj
@@ -901,6 +901,14 @@
>
</File>
<File
+ RelativePath=".\Bookmarks.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\Bookmarks.h"
+ >
+ </File>
+ <File
RelativePath="BracketHighlight.cpp"
>
</File>

0 comments on commit 5f0c387

Please sign in to comment.
Something went wrong with that request. Please try again.