diff options
author | Neil <nyamatongwe@gmail.com> | 2018-04-17 08:23:18 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2018-04-17 08:23:18 +1000 |
commit | 255d2d33abf4c2c5a918bacde049004e52b7986f (patch) | |
tree | 4a563a7d7a9594be0e67b6be6c2c493d8ffea9ec /src | |
parent | ec79c307ff36cdcce0e520e67bef69e64a3e19b5 (diff) | |
download | scintilla-mirror-255d2d33abf4c2c5a918bacde049004e52b7986f.tar.gz |
Add SC_DOCUMENTOPTION_TEXT_LARGE option for documents larger than 2 GigaBytes.
This option is provisional and experimental.
Diffstat (limited to 'src')
-rw-r--r-- | src/CellBuffer.cxx | 17 | ||||
-rw-r--r-- | src/CellBuffer.h | 5 | ||||
-rw-r--r-- | src/ContractionState.cxx | 7 | ||||
-rw-r--r-- | src/ContractionState.h | 2 | ||||
-rw-r--r-- | src/Document.cxx | 9 | ||||
-rw-r--r-- | src/Document.h | 2 | ||||
-rw-r--r-- | src/EditModel.cxx | 2 | ||||
-rw-r--r-- | src/EditView.cxx | 7 | ||||
-rw-r--r-- | src/Editor.cxx | 9 | ||||
-rw-r--r-- | src/MarginView.cxx | 13 | ||||
-rw-r--r-- | src/Position.h | 4 | ||||
-rw-r--r-- | src/RunStyles.cxx | 2 |
12 files changed, 56 insertions, 23 deletions
diff --git a/src/CellBuffer.cxx b/src/CellBuffer.cxx index d6d83c20b..fcc75a741 100644 --- a/src/CellBuffer.cxx +++ b/src/CellBuffer.cxx @@ -364,12 +364,17 @@ void UndoHistory::CompletedRedoStep() { currentAction++; } -CellBuffer::CellBuffer(bool hasStyles_) : - hasStyles(hasStyles_) { +CellBuffer::CellBuffer(bool hasStyles_, bool largeDocument_) : + hasStyles(hasStyles_), largeDocument(largeDocument_) { readOnly = false; utf8LineEnds = 0; collectingUndo = true; plv = std::make_unique<LineVector<Sci::Position>>(); + if (largeDocument) + plv = std::make_unique<LineVector<Sci::Position>>(); + else + plv = std::make_unique<LineVector<int>>(); + } CellBuffer::~CellBuffer() { @@ -556,6 +561,14 @@ void CellBuffer::SetReadOnly(bool set) { readOnly = set; } +bool CellBuffer::IsLarge() const { + return largeDocument; +} + +bool CellBuffer::HasStyles() const { + return hasStyles; +} + void CellBuffer::SetSavePoint() { uh.SetSavePoint(); } diff --git a/src/CellBuffer.h b/src/CellBuffer.h index 544a26711..935ea6e69 100644 --- a/src/CellBuffer.h +++ b/src/CellBuffer.h @@ -108,6 +108,7 @@ public: class CellBuffer { private: bool hasStyles; + bool largeDocument; SplitVector<char> substance; SplitVector<char> style; bool readOnly; @@ -126,7 +127,7 @@ private: public: - CellBuffer(bool hasStyles_); + CellBuffer(bool hasStyles_, bool largeDocument_); // Deleted so CellBuffer objects can not be copied. CellBuffer(const CellBuffer &) = delete; void operator=(const CellBuffer &) = delete; @@ -163,6 +164,8 @@ public: bool IsReadOnly() const; void SetReadOnly(bool set); + bool IsLarge() const; + bool HasStyles() const; /// The save point is a marker in the undo stack where the container has stated that /// the buffer was saved. Undo and redo can move over the save point. diff --git a/src/ContractionState.cxx b/src/ContractionState.cxx index 2950587cb..b513c20a6 100644 --- a/src/ContractionState.cxx +++ b/src/ContractionState.cxx @@ -407,8 +407,11 @@ void ContractionState<LINE>::Check() const { namespace Scintilla { -std::unique_ptr<IContractionState> ContractionStateCreate() { - return std::make_unique<ContractionState<Sci::Line>>(); +std::unique_ptr<IContractionState> ContractionStateCreate(bool largeDocument) { + if (largeDocument) + return std::make_unique<ContractionState<Sci::Line>>(); + else + return std::make_unique<ContractionState<int>>(); } } diff --git a/src/ContractionState.h b/src/ContractionState.h index a951e0a0c..90f5c0784 100644 --- a/src/ContractionState.h +++ b/src/ContractionState.h @@ -45,7 +45,7 @@ public: virtual void ShowAll()=0; }; -std::unique_ptr<IContractionState> ContractionStateCreate(); +std::unique_ptr<IContractionState> ContractionStateCreate(bool largeDocument); } diff --git a/src/Document.cxx b/src/Document.cxx index 09a91d469..4765248d1 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -82,7 +82,7 @@ int LexInterface::LineEndTypesSupported() { } Document::Document(int options) : - cb((options & SC_DOCUMENTOPTION_STYLES_NONE) == 0) { + cb((options & SC_DOCUMENTOPTION_STYLES_NONE) == 0, (options & SC_DOCUMENTOPTION_TEXT_LARGE) != 0) { refCount = 0; #ifdef _WIN32 eolMode = SC_EOL_CRLF; @@ -113,7 +113,7 @@ Document::Document(int options) : perLineData[ldMargin] = std::make_unique<LineAnnotation>(); perLineData[ldAnnotation] = std::make_unique<LineAnnotation>(); - decorations = DecorationListCreate(false); + decorations = DecorationListCreate(IsLarge()); cb.SetPerLine(this); } @@ -1520,6 +1520,11 @@ void Document::ConvertLineEnds(int eolModeSet) { } +int Document::Options() const { + return (IsLarge() ? SC_DOCUMENTOPTION_TEXT_LARGE : 0) | + (cb.HasStyles() ? 0 : SC_DOCUMENTOPTION_STYLES_NONE); +} + bool Document::IsWhiteLine(Sci::Line line) const { Sci::Position currentChar = static_cast<Sci::Position>(LineStart(line)); const Sci::Position endLine = static_cast<Sci::Position>(LineEnd(line)); diff --git a/src/Document.h b/src/Document.h index 7614373e2..d5d0a4d2e 100644 --- a/src/Document.h +++ b/src/Document.h @@ -352,6 +352,8 @@ public: void ConvertLineEnds(int eolModeSet); void SetReadOnly(bool set) { cb.SetReadOnly(set); } bool IsReadOnly() const { return cb.IsReadOnly(); } + bool IsLarge() const { return cb.IsLarge(); } + int Options() const; void DelChar(Sci::Position pos); void DelCharBack(Sci::Position pos); diff --git a/src/EditModel.cxx b/src/EditModel.cxx index 7782f583e..e7400ca37 100644 --- a/src/EditModel.cxx +++ b/src/EditModel.cxx @@ -70,7 +70,7 @@ EditModel::EditModel() { wrapWidth = LineLayout::wrapWidthInfinite; pdoc = new Document(SC_DOCUMENTOPTION_DEFAULT); pdoc->AddRef(); - pcs = ContractionStateCreate(); + pcs = ContractionStateCreate(pdoc->IsLarge()); } EditModel::~EditModel() { diff --git a/src/EditView.cxx b/src/EditView.cxx index 37a6a9f9e..3f490af5e 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -2330,16 +2330,15 @@ Sci::Position EditView::FormatRange(bool draw, Sci_RangeToFormat *pfr, Surface * if (draw && lineNumberWidth && (ypos + vsPrint.lineHeight <= pfr->rc.bottom) && (visibleLine >= 0)) { - char number[100]; - sprintf(number, "%d" lineNumberPrintSpace, lineDoc + 1); + const std::string number = std::to_string(lineDoc + 1) + lineNumberPrintSpace; PRectangle rcNumber = rcLine; rcNumber.right = rcNumber.left + lineNumberWidth; // Right justify rcNumber.left = rcNumber.right - surfaceMeasure->WidthText( - vsPrint.styles[STYLE_LINENUMBER].font, number, static_cast<int>(strlen(number))); + vsPrint.styles[STYLE_LINENUMBER].font, number.c_str(), static_cast<int>(number.length())); surface->FlushCachedState(); surface->DrawTextNoClip(rcNumber, vsPrint.styles[STYLE_LINENUMBER].font, - static_cast<XYPOSITION>(ypos + vsPrint.maxAscent), number, static_cast<int>(strlen(number)), + static_cast<XYPOSITION>(ypos + vsPrint.maxAscent), number.c_str(), static_cast<int>(number.length()), vsPrint.styles[STYLE_LINENUMBER].fore, vsPrint.styles[STYLE_LINENUMBER].back); } diff --git a/src/Editor.cxx b/src/Editor.cxx index 0a2cf9c7c..ca23b0030 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -5212,7 +5212,7 @@ void Editor::SetDocPointer(Document *document) { pdoc = document; } pdoc->AddRef(); - pcs = ContractionStateCreate(); + pcs = ContractionStateCreate(pdoc->IsLarge()); // Ensure all positions within document sel.Clear(); @@ -7604,7 +7604,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { Document *doc = new Document(static_cast<int>(lParam)); doc->AddRef(); doc->Allocate(static_cast<int>(wParam)); - pcs = ContractionStateCreate(); + pcs = ContractionStateCreate(pdoc->IsLarge()); return reinterpret_cast<sptr_t>(doc); } @@ -7616,12 +7616,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { (reinterpret_cast<Document *>(lParam))->Release(); break; + case SCI_GETDOCUMENTOPTIONS: + return pdoc->Options(); + case SCI_CREATELOADER: { Document *doc = new Document(static_cast<int>(lParam)); doc->AddRef(); doc->Allocate(static_cast<int>(wParam)); doc->SetUndoCollection(false); - pcs = ContractionStateCreate(); + pcs = ContractionStateCreate(pdoc->IsLarge()); return reinterpret_cast<sptr_t>(static_cast<ILoader *>(doc)); } diff --git a/src/MarginView.cxx b/src/MarginView.cxx index a7f9a9a2d..02a961b10 100644 --- a/src/MarginView.cxx +++ b/src/MarginView.cxx @@ -367,10 +367,12 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc, rcMarker.bottom = static_cast<XYPOSITION>(yposScreen + vs.lineHeight); if (vs.ms[margin].style == SC_MARGIN_NUMBER) { if (firstSubLine) { - char number[100] = ""; - if (lineDoc >= 0) - sprintf(number, "%d", lineDoc + 1); + std::string sNumber; + if (lineDoc >= 0) { + sNumber = std::to_string(lineDoc + 1); + } if (model.foldFlags & (SC_FOLDFLAG_LEVELNUMBERS | SC_FOLDFLAG_LINESTATE)) { + char number[100] = ""; if (model.foldFlags & SC_FOLDFLAG_LEVELNUMBERS) { const int lev = model.pdoc->GetLevel(lineDoc); sprintf(number, "%c%c %03X %03X", @@ -383,14 +385,15 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc, const int state = model.pdoc->GetLineState(lineDoc); sprintf(number, "%0X", state); } + sNumber = number; } PRectangle rcNumber = rcMarker; // Right justify - const XYPOSITION width = surface->WidthText(fontLineNumber, number, static_cast<int>(strlen(number))); + const XYPOSITION width = surface->WidthText(fontLineNumber, sNumber.c_str(), static_cast<int>(sNumber.length())); const XYPOSITION xpos = rcNumber.right - width - vs.marginNumberPadding; rcNumber.left = xpos; DrawTextNoClipPhase(surface, rcNumber, vs.styles[STYLE_LINENUMBER], - rcNumber.top + vs.maxAscent, number, static_cast<int>(strlen(number)), drawAll); + rcNumber.top + vs.maxAscent, sNumber.c_str(), static_cast<int>(sNumber.length()), drawAll); } else if (vs.wrapVisualFlags & SC_WRAPVISUALFLAG_MARGIN) { PRectangle rcWrapMarker = rcMarker; rcWrapMarker.right -= wrapMarkerPaddingRight; diff --git a/src/Position.h b/src/Position.h index a8fbfb494..e0bbcb53f 100644 --- a/src/Position.h +++ b/src/Position.h @@ -16,8 +16,8 @@ namespace Sci { -typedef int Position; -typedef int Line; +typedef ptrdiff_t Position; +typedef ptrdiff_t Line; const Position invalidPosition = -1; diff --git a/src/RunStyles.cxx b/src/RunStyles.cxx index 03692f673..f92da5047 100644 --- a/src/RunStyles.cxx +++ b/src/RunStyles.cxx @@ -306,3 +306,5 @@ void RunStyles<DISTANCE, STYLE>::Check() const { template class Scintilla::RunStyles<int, int>; template class Scintilla::RunStyles<int, char>; +template class Scintilla::RunStyles<ptrdiff_t, int>; +template class Scintilla::RunStyles<ptrdiff_t, char>; |