diff options
| -rw-r--r-- | doc/ScintillaDoc.html | 80 | ||||
| -rw-r--r-- | include/Scintilla.h | 5 | ||||
| -rw-r--r-- | include/Scintilla.iface | 11 | ||||
| -rw-r--r-- | src/Editor.cxx | 69 | ||||
| -rw-r--r-- | src/Editor.h | 3 | ||||
| -rw-r--r-- | src/PositionCache.cxx | 3 | ||||
| -rw-r--r-- | src/PositionCache.h | 1 | 
7 files changed, 142 insertions, 30 deletions
| diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index d4e9146f9..175be3396 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -9,7 +9,7 @@      <meta name="generator" content="SciTE" />      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> -    <title>Scintilla and SciTE</title> +    <title>Scintilla Documentation</title>      <style type="text/css">  <!-- @@ -38,7 +38,7 @@      <h1>Scintilla Documentation</h1> -    <p>Last edited 28/April/2009 NH</p> +    <p>Last edited 9/June/2009 NH</p>      <p>There is <a class="jump" href="Design.html">an overview of the internal design of      Scintilla</a>.<br /> @@ -878,8 +878,34 @@ struct TextToFind {      <p><b id="SCI_SETSTATUS">SCI_SETSTATUS(int status)</b><br />       <b id="SCI_GETSTATUS">SCI_GETSTATUS</b><br />       If an error occurs, Scintilla may set an internal error number that can be retrieved with -    <code>SCI_GETSTATUS</code>. Not currently used but will be in the future. To clear the error -    status call <code>SCI_SETSTATUS(0)</code>.</p> +    <code>SCI_GETSTATUS</code>.  +    To clear the error status call <code>SCI_SETSTATUS(0)</code>. +    The currently defined statuses are: + +    <table cellpadding="1" cellspacing="2" border="0" summary="Status values"> +      <tbody valign="top"> +        <tr> +          <th align="left">SC_STATUS_OK</th> +          <td>0</td> +          <td>No failures</td> +        </tr> + +        <tr> +          <th align="left">SC_STATUS_FAILURE</th> +          <td>1</td> +          <td>Generic failure</td> +        </tr> + +        <tr> +          <th align="left">SC_STATUS_BADALLOC</th> +          <td>2</td> +          <td>Memory is exhausted</td> +        </tr> + +      </tbody> +    </table> + +    </p>      <h2 id="UndoAndRedo">Undo and Redo</h2> @@ -4527,6 +4553,8 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){       <a class="message" href="#SCI_GETWRAPVISUALFLAGS">SCI_GETWRAPVISUALFLAGS</a><br />       <a class="message" href="#SCI_SETWRAPVISUALFLAGSLOCATION">SCI_SETWRAPVISUALFLAGSLOCATION(int wrapVisualFlagsLocation)</a><br />       <a class="message" href="#SCI_GETWRAPVISUALFLAGSLOCATION">SCI_GETWRAPVISUALFLAGSLOCATION</a><br /> +     <a class="message" href="#SCI_SETWRAPINDENTMODE">SCI_SETWRAPINDENTMODE(int indentMode)</a><br /> +     <a class="message" href="#SCI_GETWRAPINDENTMODE">SCI_GETWRAPINDENTMODE</a><br />       <a class="message" href="#SCI_SETWRAPSTARTINDENT">SCI_SETWRAPSTARTINDENT(int indent)</a><br />       <a class="message" href="#SCI_GETWRAPSTARTINDENT">SCI_GETWRAPSTARTINDENT</a><br />       <a class="message" href="#SCI_SETLAYOUTCACHE">SCI_SETLAYOUTCACHE(int cacheMode)</a><br /> @@ -4546,7 +4574,7 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){          <p>For wrapped lines Scintilla can draw visual flags (little arrows) at end of a a subline of a          wrapped line and at begin of the next subline. These can be enabled individually, but if Scintilla -        draws the visual flag at begin of the next subline this subline will be indented by one char. +        draws the visual flag at the beginning of the next subline this subline will be indented by one char.          Independent from drawing a visual flag at the begin the subline can have an indention.</p>      <p>Much of the time used by Scintilla is spent on laying out and drawing text. The same text @@ -4617,7 +4645,7 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){      <p><b id="SCI_SETWRAPVISUALFLAGSLOCATION">SCI_SETWRAPVISUALFLAGSLOCATION(int wrapVisualFlagsLocation)</b><br />       <b id="SCI_GETWRAPVISUALFLAGSLOCATION">SCI_GETWRAPVISUALFLAGSLOCATION</b><br /> -                You can set wether the visual flags to indicate a line is wrapped are drawn near the border or near the text. +                You can set whether the visual flags to indicate a line is wrapped are drawn near the border or near the text.                  Bits set in wrapVisualFlagsLocation set the location to near the text for the corresponding visual flag.      <table cellpadding="1" cellspacing="2" border="0" summary="Wrap visual flags locations"> @@ -4645,7 +4673,45 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){          <tr>            <td align="left"><code>SC_WRAPVISUALFLAGLOC_START_BY_TEXT</code></td>            <td align="center">2</td> -          <td>Visual flag at begin of subline drawn near text</td> +          <td>Visual flag at beginning of subline drawn near text</td> +        </tr> +      </tbody> +    </table> +    </p> + +    <p><b id="SCI_SETWRAPINDENTMODE">SCI_SETWRAPINDENTMODE(int indentMode)</b><br /> +     <b id="SCI_GETWRAPINDENTMODE">SCI_GETWRAPINDENTMODE</b><br /> +                Wrapped sublines can be indented to the position of their first subline or one more indent level. +	  The default is <code>SC_WRAPINDENT_FIXED</code>. +                The modes are: + +    <table cellpadding="1" cellspacing="2" border="0" summary="Wrap visual flags locations"> +      <tbody> +        <tr> +          <th align="left">Symbol</th> +          <th>Value</th> +          <th align="left">Effect</th> +        </tr> +      </tbody> + +      <tbody valign="top"> +        <tr> +          <td align="left"><code>SC_WRAPINDENT_FIXED</code></td> +          <td align="center">0</td> +          <td>Wrapped sublines aligned to left of window plus amount set by   +	  <a class="message" href="#SCI_SETWRAPSTARTINDENT">SCI_SETWRAPSTARTINDENT</a></td> +        </tr> + +        <tr> +          <td align="left"><code>SC_WRAPINDENT_SAME</code></td> +          <td align="center">1</td> +          <td>Wrapped sublines are aligned to first subline indent</td> +        </tr> + +        <tr> +          <td align="left"><code>SC_WRAPINDENT_INDENT</code></td> +          <td align="center">2</td> +          <td>Wrapped sublines are aligned to first subline indent plus one more level of indentation</td>          </tr>        </tbody>      </table> diff --git a/include/Scintilla.h b/include/Scintilla.h index 312ec6204..476fa0506 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -444,6 +444,11 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,  #define SCI_GETWRAPVISUALFLAGSLOCATION 2463  #define SCI_SETWRAPSTARTINDENT 2464  #define SCI_GETWRAPSTARTINDENT 2465 +#define SC_WRAPINDENT_FIXED 0 +#define SC_WRAPINDENT_SAME 1 +#define SC_WRAPINDENT_INDENT 2 +#define SCI_SETWRAPINDENTMODE 2472 +#define SCI_GETWRAPINDENTMODE 2473  #define SC_CACHE_NONE 0  #define SC_CACHE_CARET 1  #define SC_CACHE_PAGE 2 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index d0f376fa5..d2e4a6f9a 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1131,6 +1131,17 @@ set void SetWrapStartIndent=2464(int indent,)  # Retrive the start indent for wrapped lines.  get int GetWrapStartIndent=2465(,) +enu WrapIndentMode=SC_WRAPINDENT_ +val SC_WRAPINDENT_FIXED=0 +val SC_WRAPINDENT_SAME=1 +val SC_WRAPINDENT_INDENT=2 + +# Sets how wrapped sublines are placed. Default is fixed. +set void SetWrapIndentMode=2472(int mode,) + +# Retrieve how wrapped sublines are placed. Default is fixed. +get int GetWrapIndentMode=2473(,) +  enu LineCache=SC_CACHE_  val SC_CACHE_NONE=0  val SC_CACHE_CARET=1 diff --git a/src/Editor.cxx b/src/Editor.cxx index d54bbe36c..f7f5cb2bb 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -184,7 +184,8 @@ Editor::Editor() {  	wrapVisualFlags = 0;  	wrapVisualFlagsLocation = 0;  	wrapVisualStartIndent = 0; -	actualWrapVisualStartIndent = 0; +	wrapIndentMode = SC_WRAPINDENT_FIXED; +	wrapAddIndent = 0;  	convertPastes = true; @@ -252,6 +253,15 @@ void Editor::RefreshStyleData() {  			palette.Allocate(wMain);  			RefreshColourPalette(palette, false);  		} +		if (wrapIndentMode == SC_WRAPINDENT_INDENT) { +			wrapAddIndent = pdoc->IndentSize() * vs.spaceWidth; +		} else if (wrapIndentMode == SC_WRAPINDENT_SAME) { +			wrapAddIndent = 0; +		} else { //SC_WRAPINDENT_FIXED +			wrapAddIndent = wrapVisualStartIndent * vs.aveCharWidth; +			if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (wrapAddIndent <= 0)) +				wrapAddIndent = vs.aveCharWidth; // must indent to show start visual +		}  		SetScrollBars();  	}  } @@ -448,10 +458,10 @@ Point Editor::LocationFromPosition(int pos) {  		for (int subLine = 0; subLine < ll->lines; subLine++) {  			if ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) {  				pt.x = ll->positions[posInLine] - ll->positions[ll->LineStart(subLine)]; -				if (actualWrapVisualStartIndent != 0) { +				if (ll->wrapIndent != 0) {  					int lineStart = ll->LineStart(subLine);  					if (lineStart != 0)	// Wrapped -						pt.x += actualWrapVisualStartIndent * vs.aveCharWidth; +						pt.x += ll->wrapIndent;  				}  			}  			if (posInLine >= ll->LineStart(subLine)) { @@ -513,9 +523,9 @@ int Editor::PositionFromLocation(Point pt, bool canReturnInvalid, bool charPosit  			int lineEnd = ll->LineLastVisible(subLine);  			int subLineStart = ll->positions[lineStart]; -			if (actualWrapVisualStartIndent != 0) { +			if (ll->wrapIndent != 0) {  				if (lineStart != 0)	// Wrapped -					pt.x -= actualWrapVisualStartIndent * vs.aveCharWidth; +					pt.x -= ll->wrapIndent;  			}  			int i = ll->FindBefore(pt.x + subLineStart, lineStart, lineEnd);  			while (i < lineEnd) { @@ -565,9 +575,9 @@ int Editor::PositionFromLineX(int lineDoc, int x) {  		int lineEnd = ll->LineLastVisible(subLine);  		int subLineStart = ll->positions[lineStart]; -		if (actualWrapVisualStartIndent != 0) { +		if (ll->wrapIndent != 0) {  			if (lineStart != 0)	// Wrapped -				x -= actualWrapVisualStartIndent * vs.aveCharWidth; +				x -= ll->wrapIndent;  		}  		int i = ll->FindBefore(x + subLineStart, lineStart, lineEnd);  		while (i < lineEnd) { @@ -1999,6 +2009,20 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou  			if (wrapVisualFlags & SC_WRAPVISUALFLAG_END) {  				width -= vstyle.aveCharWidth; // take into account the space for end wrap mark  			} +			ll->wrapIndent = wrapAddIndent; +			if (wrapIndentMode != SC_WRAPINDENT_FIXED) +				for (int i = 0; i < ll->numCharsInLine; i++) { +					if (!IsSpaceOrTab(ll->chars[i])) { +						ll->wrapIndent += ll->positions[i]; // Add line indent +						break; +					} +				} +			// Check for text width minimum +			if (ll->wrapIndent > width - static_cast<int>(vstyle.aveCharWidth) * 15) +				ll->wrapIndent = wrapAddIndent; +			// Check for wrapIndent minimum +			if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (ll->wrapIndent < static_cast<int>(vstyle.aveCharWidth))) +				ll->wrapIndent = vstyle.aveCharWidth; // Indent to show start visual  			ll->lines = 0;  			// Calculate line start positions based upon width.  			int lastGoodBreak = 0; @@ -2024,7 +2048,7 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou  					ll->SetLineStart(ll->lines, lastGoodBreak);  					startOffset = ll->positions[lastGoodBreak];  					// take into account the space for start wrap mark and indent -					startOffset -= actualWrapVisualStartIndent * vstyle.aveCharWidth; +					startOffset -= ll->wrapIndent;  					p = lastGoodBreak + 1;  					continue;  				} @@ -2417,7 +2441,7 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis  		}  	} -	if (actualWrapVisualStartIndent != 0) { +	if (ll->wrapIndent != 0) {  		bool continuedWrapLine = false;  		if (subLine < ll->lines) { @@ -2429,7 +2453,7 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis  			PRectangle rcPlace = rcSegment;  			rcPlace.left = ll->positions[startseg] + xStart - subLineStart; -			rcPlace.right = rcPlace.left + actualWrapVisualStartIndent * vsDraw.aveCharWidth; +			rcPlace.right = rcPlace.left + ll->wrapIndent;  			// default bgnd here..  			surface->FillRectangle(rcSegment, overrideBackground ? background : @@ -2450,7 +2474,7 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis  				DrawWrapMarker(surface, rcPlace, false, wrapColour);  			} -			xStart += actualWrapVisualStartIndent * vsDraw.aveCharWidth; +			xStart += ll->wrapIndent;  		}  	} @@ -2832,8 +2856,8 @@ void Editor::DrawBlockCaret(Surface *surface, ViewStyle &vsDraw, LineLayout *ll,  	rcCaret.right = ll->positions[offsetFirstChar+numCharsToDraw] - ll->positions[lineStart] + xStart;  	// Adjust caret position to take into account any word wrapping symbols. -	if ((actualWrapVisualStartIndent != 0) && (lineStart != 0)) { -		int wordWrapCharWidth = actualWrapVisualStartIndent * vs.aveCharWidth; +	if ((ll->wrapIndent != 0) && (lineStart != 0)) { +		int wordWrapCharWidth = ll->wrapIndent;  		rcCaret.left += wordWrapCharWidth;  		rcCaret.right += wordWrapCharWidth;  	} @@ -3114,10 +3138,10 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {  					if (ll->InLine(offset, subLine)) {  						int xposCaret = ll->positions[offset] - ll->positions[ll->LineStart(subLine)] + xStart; -						if (actualWrapVisualStartIndent != 0) { +						if (ll->wrapIndent != 0) {  							int lineStart = ll->LineStart(subLine);  							if (lineStart != 0)	// Wrapped -								xposCaret += actualWrapVisualStartIndent * vs.aveCharWidth; +								xposCaret += ll->wrapIndent;  						}  						if ((xposCaret >= 0) && (vs.caretWidth > 0) && (vs.caretStyle != CARETSTYLE_INVISIBLE) &&  						        ((posDrag >= 0) || (caret.active && caret.on))) { @@ -6786,9 +6810,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	case SCI_SETWRAPVISUALFLAGS:  		wrapVisualFlags = wParam; -		actualWrapVisualStartIndent = wrapVisualStartIndent; -		if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (actualWrapVisualStartIndent == 0)) -			actualWrapVisualStartIndent = 1; // must indent to show start visual  		InvalidateStyleRedraw();  		ReconfigureScrollBars();  		break; @@ -6806,9 +6827,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	case SCI_SETWRAPSTARTINDENT:  		wrapVisualStartIndent = wParam; -		actualWrapVisualStartIndent = wrapVisualStartIndent; -		if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (actualWrapVisualStartIndent == 0)) -			actualWrapVisualStartIndent = 1; // must indent to show start visual  		InvalidateStyleRedraw();  		ReconfigureScrollBars();  		break; @@ -6816,6 +6834,15 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	case SCI_GETWRAPSTARTINDENT:  		return wrapVisualStartIndent; +	case SCI_SETWRAPINDENTMODE: +		wrapIndentMode = wParam; +		InvalidateStyleRedraw(); +		ReconfigureScrollBars(); +		break; + +	case SCI_GETWRAPINDENTMODE: +		return wrapIndentMode; +  	case SCI_SETLAYOUTCACHE:  		llc.SetLevel(wParam);  		break; diff --git a/src/Editor.h b/src/Editor.h index b74466416..e9372be00 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -235,7 +235,8 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	int wrapVisualFlags;  	int wrapVisualFlagsLocation;  	int wrapVisualStartIndent; -	int actualWrapVisualStartIndent; +	int wrapAddIndent; // This will be added to initial indent of line +	int wrapIndentMode; // SC_WRAPINDENT_FIXED, _SAME, _INDENT  	bool convertPastes; diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx index cd5becf1a..71b408236 100644 --- a/src/PositionCache.cxx +++ b/src/PositionCache.cxx @@ -61,7 +61,8 @@ LineLayout::LineLayout(int maxLineLength_) :  	hsStart(0),  	hsEnd(0),  	widthLine(wrapWidthInfinite), -	lines(1) { +	lines(1), +	wrapIndent(0) {  	Resize(maxLineLength_);  } diff --git a/src/PositionCache.h b/src/PositionCache.h index 5d486cb60..6c4c62efd 100644 --- a/src/PositionCache.h +++ b/src/PositionCache.h @@ -51,6 +51,7 @@ public:  	// Wrapped line support  	int widthLine;  	int lines; +	int wrapIndent; // In pixels  	LineLayout(int maxLineLength_);  	virtual ~LineLayout(); | 
