aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornyamatongwe <unknown>2009-04-22 13:20:43 +0000
committernyamatongwe <unknown>2009-04-22 13:20:43 +0000
commit865a213a8879baab1c67069ab1d2eae63deeea4b (patch)
tree98a6077613b017d50a85e1330092143920b4fa22
parentec2c38b2d808c46207aebb0c8642ecc42f641bc5 (diff)
downloadscintilla-mirror-865a213a8879baab1c67069ab1d2eae63deeea4b.tar.gz
Removed Document methods that returned parts of annotations in favour of
methods that return StyledText objects. Provided LineLength call on StyledText rather than iterator objects. Simplified code and made more things const.
-rw-r--r--src/Document.cxx48
-rw-r--r--src/Document.h31
-rw-r--r--src/Editor.cxx154
-rw-r--r--src/PerLine.cxx6
-rw-r--r--src/PerLine.h4
5 files changed, 85 insertions, 158 deletions
diff --git a/src/Document.cxx b/src/Document.cxx
index b0070233f..f7e9dfdcc 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -1214,7 +1214,7 @@ bool Document::SetStyleFor(int length, char style) {
}
}
-bool Document::SetStyles(int length, char *styles) {
+bool Document::SetStyles(int length, const char *styles) {
if (enteredStyling != 0) {
return false;
} else {
@@ -1269,25 +1269,10 @@ int Document::GetMaxLineState() {
return static_cast<LineState*>(perLineData[ldState])->GetMaxLineState();
}
-bool Document::MarginMultipleStyles(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldMargin])->MultipleStyles(line);
-}
-
-const char *Document::MarginText(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldMargin])->Text(line);
-}
-
-int Document::MarginStyle(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldMargin])->Style(line);
-}
-
-const char *Document::MarginStyles(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldMargin])->Styles(line);
-}
-
StyledText Document::MarginStyledText(int line) {
- return StyledText(MarginLength(line), MarginText(line),
- MarginMultipleStyles(line), MarginStyle(line), MarginStyles(line));
+ LineAnnotation *pla = static_cast<LineAnnotation*>(perLineData[ldMargin]);
+ return StyledText(pla->Length(line), pla->Text(line),
+ pla->MultipleStyles(line), pla->Style(line), pla->Styles(line));
}
void Document::MarginSetText(int line, const char *text) {
@@ -1300,7 +1285,7 @@ void Document::MarginSetStyle(int line, int style) {
static_cast<LineAnnotation*>(perLineData[ldMargin])->SetStyle(line, style);
}
-void Document::MarginSetStyles(int line, const char *styles) {
+void Document::MarginSetStyles(int line, const unsigned char *styles) {
static_cast<LineAnnotation*>(perLineData[ldMargin])->SetStyles(line, styles);
}
@@ -1320,25 +1305,10 @@ bool Document::AnnotationAny() const {
return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->AnySet();
}
-bool Document::AnnotationMultipleStyles(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->MultipleStyles(line);
-}
-
-const char *Document::AnnotationText(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Text(line);
-}
-
-int Document::AnnotationStyle(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Style(line);
-}
-
-const char *Document::AnnotationStyles(int line) {
- return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Styles(line);
-}
-
StyledText Document::AnnotationStyledText(int line) {
- return StyledText(AnnotationLength(line), AnnotationText(line),
- AnnotationMultipleStyles(line), AnnotationStyle(line), AnnotationStyles(line));
+ LineAnnotation *pla = static_cast<LineAnnotation*>(perLineData[ldAnnotation]);
+ return StyledText(pla->Length(line), pla->Text(line),
+ pla->MultipleStyles(line), pla->Style(line), pla->Styles(line));
}
void Document::AnnotationSetText(int line, const char *text) {
@@ -1354,7 +1324,7 @@ void Document::AnnotationSetStyle(int line, int style) {
static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetStyle(line, style);
}
-void Document::AnnotationSetStyles(int line, const char *styles) {
+void Document::AnnotationSetStyles(int line, const unsigned char *styles) {
static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetStyles(line, styles);
}
diff --git a/src/Document.h b/src/Document.h
index 2804a9a4f..6ff6c2d71 100644
--- a/src/Document.h
+++ b/src/Document.h
@@ -97,11 +97,22 @@ struct StyledText {
size_t length;
const char *text;
bool multipleStyles;
- int style;
- const char *styles;
- StyledText( size_t length_, const char *text_, bool multipleStyles_, int style_, const char *styles_) :
+ size_t style;
+ const unsigned char *styles;
+ StyledText( size_t length_, const char *text_, bool multipleStyles_, int style_, const unsigned char *styles_) :
length(length_), text(text_), multipleStyles(multipleStyles_), style(style_), styles(styles_) {
}
+ // Return number of bytes from start to before '\n' or end of text.
+ // Return 1 when start is outside text
+ size_t LineLength(size_t start) const {
+ size_t cur = start;
+ while ((cur < length) && (text[cur] != '\n'))
+ cur++;
+ return cur-start;
+ }
+ size_t StyleAt(size_t i) const {
+ return multipleStyles ? styles[i] : style;
+ }
};
/**
@@ -254,7 +265,7 @@ public:
void SetStylingBits(int bits);
void StartStyling(int position, char mask);
bool SetStyleFor(int length, char style);
- bool SetStyles(int length, char *styles);
+ bool SetStyles(int length, const char *styles);
int GetEndStyled() { return endStyled; }
void EnsureStyledTo(int pos);
int GetStyleClock() { return styleClock; }
@@ -265,26 +276,18 @@ public:
int GetLineState(int line);
int GetMaxLineState();
- bool MarginMultipleStyles(int line);
- const char *MarginText(int line);
- int MarginStyle(int line);
- const char *MarginStyles(int line);
StyledText MarginStyledText(int line);
void MarginSetStyle(int line, int style);
- void MarginSetStyles(int line, const char *styles);
+ void MarginSetStyles(int line, const unsigned char *styles);
void MarginSetText(int line, const char *text);
int MarginLength(int line) const;
void MarginClearAll();
bool AnnotationAny() const;
- bool AnnotationMultipleStyles(int line);
- const char *AnnotationText(int line);
- const char *AnnotationStyles(int line);
- int AnnotationStyle(int line);
StyledText AnnotationStyledText(int line);
void AnnotationSetText(int line, const char *text);
void AnnotationSetStyle(int line, int style);
- void AnnotationSetStyles(int line, const char *styles);
+ void AnnotationSetStyles(int line, const unsigned char *styles);
int AnnotationLength(int line) const;
int AnnotationLines(int line) const;
void AnnotationClearAll();
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 3e8cb21fc..ae2c16137 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -1459,54 +1459,27 @@ static int istrlen(const char *s) {
return static_cast<int>(strlen(s));
}
-bool ValidStyledText(ViewStyle &vs, int styleOffset, const StyledText &st) {
+bool ValidStyledText(ViewStyle &vs, size_t styleOffset, const StyledText &st) {
if (st.multipleStyles) {
for (size_t iStyle=0;iStyle<st.length; iStyle++) {
- if (!vs.ValidStyle(static_cast<size_t>(styleOffset + st.styles[iStyle])))
+ if (!vs.ValidStyle(styleOffset + st.styles[iStyle]))
return false;
}
} else {
- if (!vs.ValidStyle(static_cast<size_t>(styleOffset + st.style)))
+ if (!vs.ValidStyle(styleOffset + st.style))
return false;
}
return true;
}
-struct LineSegment {
- const char *s;
- int len;
-};
-
-class LineEnumerator {
-public:
- const char *s;
- int len;
- LineEnumerator(const char *s_, size_t len_) : s(s_), len(len_) {
- }
- LineSegment Next() {
- LineSegment ret;
- ret.s = s;
- int cur = 0;
- while ((cur < len) && (s[cur] != '\n'))
- cur++;
- ret.len = cur;
- s += cur + 1;
- len -= cur + 1;
- return ret;
- }
- bool Finished() const {
- return len <= 0;
- }
-};
-
static int WidthStyledText(Surface *surface, ViewStyle &vs, int styleOffset,
- const char *text, const char *styles, size_t len) {
+ const char *text, const unsigned char *styles, size_t len) {
int width = 0;
size_t start = 0;
while (start < len) {
- int style = styles[start];
+ size_t style = styles[start];
size_t endSegment = start;
- while ((endSegment < len-1) && (styles[endSegment+1] == style))
+ while ((endSegment+1 < len) && (static_cast<size_t>(styles[endSegment+1]) == style))
endSegment++;
width += surface->WidthText(vs.styles[style+styleOffset].font, text + start, endSegment - start + 1);
start = endSegment + 1;
@@ -1515,20 +1488,19 @@ static int WidthStyledText(Surface *surface, ViewStyle &vs, int styleOffset,
}
static int WidestLineWidth(Surface *surface, ViewStyle &vs, int styleOffset, const StyledText &st) {
- size_t styleStart = 0;
- LineEnumerator le(st.text, st.length);
int widthMax = 0;
- while (!le.Finished()) {
- LineSegment ls = le.Next();
+ size_t start = 0;
+ while (start < st.length) {
+ size_t lenLine = st.LineLength(start);
int widthSubLine;
if (st.multipleStyles) {
- widthSubLine = WidthStyledText(surface, vs, styleOffset, ls.s, st.styles + styleStart, ls.len);
- styleStart += ls.len + 1;
+ widthSubLine = WidthStyledText(surface, vs, styleOffset, st.text + start, st.styles + start, lenLine);
} else {
- widthSubLine = surface->WidthText(vs.styles[styleOffset + st.style].font, ls.s, ls.len);
+ widthSubLine = surface->WidthText(vs.styles[styleOffset + st.style].font, st.text + start, lenLine);
}
if (widthSubLine > widthMax)
widthMax = widthSubLine;
+ start += lenLine + 1;
}
return widthMax;
}
@@ -1748,20 +1720,16 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) {
vs.styles[STYLE_LINENUMBER].back.allocated);
} else if (vs.ms[margin].style == SC_MARGIN_TEXT || vs.ms[margin].style == SC_MARGIN_RTEXT) {
if (firstSubLine) {
- StyledText marginStyledText = pdoc->MarginStyledText(lineDoc);
- if (marginStyledText.text && ValidStyledText(vs, vs.marginStyleOffset, marginStyledText)) {
- if (marginStyledText.multipleStyles) {
- surface->FillRectangle(rcMarker,
- vs.styles[marginStyledText.styles[0]+vs.marginStyleOffset].back.allocated);
- } else {
- surface->FillRectangle(rcMarker, vs.styles[marginStyledText.style].back.allocated);
- }
+ const StyledText stMargin = pdoc->MarginStyledText(lineDoc);
+ if (stMargin.text && ValidStyledText(vs, vs.marginStyleOffset, stMargin)) {
+ surface->FillRectangle(rcMarker,
+ vs.styles[stMargin.StyleAt(0)+vs.marginStyleOffset].back.allocated);
if (vs.ms[margin].style == SC_MARGIN_RTEXT) {
- int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, marginStyledText);
+ int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, stMargin);
rcMarker.left = rcMarker.right - width - 3;
}
DrawStyledText(surface, vs, vs.marginStyleOffset, rcMarker, rcMarker.top + vs.maxAscent,
- marginStyledText, 0, marginStyledText.length);
+ stMargin, 0, stMargin.length);
}
}
}
@@ -2352,24 +2320,12 @@ void Editor::DrawAnnotation(Surface *surface, ViewStyle &vsDraw, int line, int x
int indent = pdoc->GetLineIndentation(line) * vsDraw.spaceWidth;
PRectangle rcSegment = rcLine;
int annotationLine = subLine - ll->lines;
- StyledText annotationStyledText = pdoc->AnnotationStyledText(line);
- int annotationStyle = annotationStyledText.style + vsDraw.annotationStyleOffset;
- if (annotationStyledText.multipleStyles) {
- for (size_t iStyle=0;iStyle<annotationStyledText.length; iStyle++) {
- if (!vsDraw.ValidStyle(static_cast<size_t>(
- vsDraw.annotationStyleOffset + annotationStyledText.styles[iStyle])))
- return;
- }
- } else {
- if (!vsDraw.ValidStyle(static_cast<size_t>(annotationStyle)))
- return;
- }
- if (annotationStyledText.text) {
+ const StyledText stAnnotation = pdoc->AnnotationStyledText(line);
+ if (stAnnotation.text && ValidStyledText(vsDraw, vsDraw.annotationStyleOffset, stAnnotation)) {
surface->FillRectangle(rcSegment, vsDraw.styles[0].back.allocated);
-
if (vs.annotationVisible == ANNOTATION_BOXED) {
// Only care about calculating width if need to draw box
- int widthAnnotation = WidestLineWidth(surface, vsDraw, vsDraw.annotationStyleOffset, annotationStyledText);
+ int widthAnnotation = WidestLineWidth(surface, vsDraw, vsDraw.annotationStyleOffset, stAnnotation);
widthAnnotation += vsDraw.spaceWidth * 2; // Margins
rcSegment.left = xStart + indent;
rcSegment.right = rcSegment.left + widthAnnotation;
@@ -2378,28 +2334,22 @@ void Editor::DrawAnnotation(Surface *surface, ViewStyle &vsDraw, int line, int x
rcSegment.left = xStart;
}
const int annotationLines = pdoc->AnnotationLines(line);
- LineEnumerator le(annotationStyledText.text, annotationStyledText.length);
- LineSegment ls = le.Next();
size_t start = 0;
- size_t lengthAnnotation = ls.len;
+ size_t lengthAnnotation = stAnnotation.LineLength(start);
int lineInAnnotation = 0;
- while ((lineInAnnotation < annotationLine) && !le.Finished()) {
- start += ls.len + 1;
- ls = le.Next();
- lengthAnnotation = ls.len;
+ while ((lineInAnnotation < annotationLine) && (start < stAnnotation.length)) {
+ start += lengthAnnotation + 1;
+ lengthAnnotation = stAnnotation.LineLength(start);
lineInAnnotation++;
}
PRectangle rcText = rcSegment;
if (vs.annotationVisible == ANNOTATION_BOXED) {
- if (annotationStyledText.multipleStyles) {
- surface->FillRectangle(rcText, vsDraw.styles[annotationStyledText.styles[start] + vsDraw.annotationStyleOffset].back.allocated);
- } else {
- surface->FillRectangle(rcText, vsDraw.styles[annotationStyle].back.allocated);
- }
+ surface->FillRectangle(rcText,
+ vsDraw.styles[stAnnotation.StyleAt(start) + vsDraw.annotationStyleOffset].back.allocated);
rcText.left += vsDraw.spaceWidth;
}
DrawStyledText(surface, vsDraw, vsDraw.annotationStyleOffset, rcText, rcText.top + vsDraw.maxAscent,
- annotationStyledText, start, lengthAnnotation);
+ stAnnotation, start, lengthAnnotation);
if (vs.annotationVisible == ANNOTATION_BOXED) {
surface->MoveTo(rcSegment.left, rcSegment.top);
surface->LineTo(rcSegment.left, rcSegment.bottom);
@@ -7895,36 +7845,38 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
break;
case SCI_MARGINGETTEXT: {
- const char *text = pdoc->MarginText(wParam);
+ const StyledText st = pdoc->MarginStyledText(wParam);
if (lParam) {
- if (text)
- memcpy(CharPtrFromSPtr(lParam), text, pdoc->MarginLength(wParam));
+ if (st.text)
+ memcpy(CharPtrFromSPtr(lParam), st.text, st.length);
else
strcpy(CharPtrFromSPtr(lParam), "");
}
- return text ? pdoc->MarginLength(wParam) : 0;
+ return st.length;
}
case SCI_MARGINSETSTYLE:
pdoc->MarginSetStyle(wParam, lParam);
break;
- case SCI_MARGINGETSTYLE:
- return pdoc->MarginStyle(wParam);
+ case SCI_MARGINGETSTYLE: {
+ const StyledText st = pdoc->MarginStyledText(wParam);
+ return st.style;
+ }
case SCI_MARGINSETSTYLES:
- pdoc->MarginSetStyles(wParam, CharPtrFromSPtr(lParam));
+ pdoc->MarginSetStyles(wParam, reinterpret_cast<const unsigned char *>(lParam));
break;
case SCI_MARGINGETSTYLES: {
- const char *styles = pdoc->MarginStyles(wParam);
+ const StyledText st = pdoc->MarginStyledText(wParam);
if (lParam) {
- if (styles)
- memcpy(CharPtrFromSPtr(lParam), styles, pdoc->MarginLength(wParam));
+ if (st.styles)
+ memcpy(CharPtrFromSPtr(lParam), st.styles, st.length);
else
strcpy(CharPtrFromSPtr(lParam), "");
}
- return styles ? pdoc->MarginLength(wParam) : 0;
+ return st.styles ? st.length : 0;
}
case SCI_MARGINTEXTCLEARALL:
@@ -7936,36 +7888,38 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
break;
case SCI_ANNOTATIONGETTEXT: {
- const char *text = pdoc->AnnotationText(wParam);
+ const StyledText st = pdoc->AnnotationStyledText(wParam);
if (lParam) {
- if (text)
- memcpy(CharPtrFromSPtr(lParam), text, pdoc->AnnotationLength(wParam));
+ if (st.text)
+ memcpy(CharPtrFromSPtr(lParam), st.text, st.length);
else
strcpy(CharPtrFromSPtr(lParam), "");
}
- return text ? pdoc->AnnotationLength(wParam) : 0;
+ return st.length;
}
- case SCI_ANNOTATIONGETSTYLE:
- return pdoc->AnnotationStyle(wParam);
+ case SCI_ANNOTATIONGETSTYLE: {
+ const StyledText st = pdoc->AnnotationStyledText(wParam);
+ return st.style;
+ }
case SCI_ANNOTATIONSETSTYLE:
pdoc->AnnotationSetStyle(wParam, lParam);
break;
case SCI_ANNOTATIONSETSTYLES:
- pdoc->AnnotationSetStyles(wParam, CharPtrFromSPtr(lParam));
+ pdoc->AnnotationSetStyles(wParam, reinterpret_cast<const unsigned char *>(lParam));
break;
case SCI_ANNOTATIONGETSTYLES: {
- const char *styles = pdoc->AnnotationStyles(wParam);
+ const StyledText st = pdoc->AnnotationStyledText(wParam);
if (lParam) {
- if (styles)
- memcpy(CharPtrFromSPtr(lParam), styles, pdoc->AnnotationLength(wParam));
+ if (st.styles)
+ memcpy(CharPtrFromSPtr(lParam), st.styles, st.length);
else
strcpy(CharPtrFromSPtr(lParam), "");
}
- return styles ? pdoc->AnnotationLength(wParam) : 0;
+ return st.styles ? st.length : 0;
}
case SCI_ANNOTATIONGETLINES:
diff --git a/src/PerLine.cxx b/src/PerLine.cxx
index b90416abb..466d2fb31 100644
--- a/src/PerLine.cxx
+++ b/src/PerLine.cxx
@@ -377,9 +377,9 @@ const char *LineAnnotation::Text(int line) const {
return 0;
}
-const char *LineAnnotation::Styles(int line) const {
+const unsigned char *LineAnnotation::Styles(int line) const {
if (annotations.Length() && (line < annotations.Length()) && annotations[line] && MultipleStyles(line))
- return annotations[line] + sizeof(AnnotationHeader) + Length(line);
+ return reinterpret_cast<unsigned char *>(annotations[line] + sizeof(AnnotationHeader) + Length(line));
else
return 0;
}
@@ -428,7 +428,7 @@ void LineAnnotation::SetStyle(int line, int style) {
reinterpret_cast<AnnotationHeader *>(annotations[line])->style = static_cast<short>(style);
}
-void LineAnnotation::SetStyles(int line, const char *styles) {
+void LineAnnotation::SetStyles(int line, const unsigned char *styles) {
annotations.EnsureLength(line+1);
if (!annotations[line]) {
annotations[line] = AllocateAnnotation(0, IndividualStyles);
diff --git a/src/PerLine.h b/src/PerLine.h
index 471219131..8d707bff6 100644
--- a/src/PerLine.h
+++ b/src/PerLine.h
@@ -93,11 +93,11 @@ public:
bool MultipleStyles(int line) const;
int Style(int line);
const char *Text(int line) const;
- const char *Styles(int line) const;
+ const unsigned char *Styles(int line) const;
void SetText(int line, const char *text);
void ClearAll();
void SetStyle(int line, int style);
- void SetStyles(int line, const char *styles);
+ void SetStyles(int line, const unsigned char *styles);
int Length(int line) const;
int Lines(int line) const;
};