diff options
| author | Unknown <nyamatongwe@gmail.com> | 2013-03-13 09:38:48 +1100 | 
|---|---|---|
| committer | Unknown <nyamatongwe@gmail.com> | 2013-03-13 09:38:48 +1100 | 
| commit | 551a8ab98dfffa718374fbbf2e575006df29d273 (patch) | |
| tree | 9f75cf99f0b0b616ce8c1000a4168029a560c099 /src | |
| parent | 69d7b3f7588a282eac6e8d917e499396b1414f93 (diff) | |
| download | scintilla-mirror-551a8ab98dfffa718374fbbf2e575006df29d273.tar.gz | |
Add different types of task to StyleNeeded mechanism, renaming to WorkNeeded.
Ask to perform update UI work for some selection moves.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Editor.cxx | 21 | ||||
| -rw-r--r-- | src/Editor.h | 23 | 
2 files changed, 26 insertions, 18 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index 5ce531787..f2a6a1f62 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -782,6 +782,7 @@ void Editor::SetSelection(SelectionPosition currentPos_, SelectionPosition ancho  	if (highlightDelimiter.NeedsDrawing(currentLine)) {  		RedrawSelMargin();  	} +	QueueIdleWork(WorkNeeded::workUpdateUI);  }  void Editor::SetSelection(int currentPos_, int anchor_) { @@ -808,6 +809,7 @@ void Editor::SetSelection(SelectionPosition currentPos_) {  	if (highlightDelimiter.NeedsDrawing(currentLine)) {  		RedrawSelMargin();  	} +	QueueIdleWork(WorkNeeded::workUpdateUI);  }  void Editor::SetSelection(int currentPos_) { @@ -828,6 +830,7 @@ void Editor::SetEmptySelection(SelectionPosition currentPos_) {  	if (highlightDelimiter.NeedsDrawing(currentLine)) {  		RedrawSelMargin();  	} +	QueueIdleWork(WorkNeeded::workUpdateUI);  }  void Editor::SetEmptySelection(int currentPos_) { @@ -4641,18 +4644,13 @@ void Editor::NotifyModified(Document *, DocModification mh, void *) {  				}  			} -			//Platform::DebugPrintf("** %x Doc Changed\n", this); -			// TODO: could invalidate from mh.startModification to end of screen -			//InvalidateRange(mh.position, mh.position + mh.length);  			if (paintState == notPainting && !CanDeferToLastStep(mh)) { -				QueueStyling(pdoc->Length()); +				QueueIdleWork(WorkNeeded::workStyle, pdoc->Length());  				Redraw();  			}  		} else { -			//Platform::DebugPrintf("** %x Line Changed %d .. %d\n", this, -			//	mh.position, mh.position + mh.length);  			if (paintState == notPainting && mh.length && !CanEliminate(mh)) { -				QueueStyling(mh.position + mh.length); +				QueueIdleWork(WorkNeeded::workStyle, mh.position + mh.length);  				InvalidateRange(mh.position, mh.position + mh.length);  			}  		} @@ -6719,14 +6717,15 @@ void Editor::StyleToPositionInView(Position pos) {  void Editor::IdleStyling() {  	// Style the line after the modification as this allows modifications that change just the  	// line of the modification to heal instead of propagating to the rest of the window. -	StyleToPositionInView(pdoc->LineStart(pdoc->LineFromPosition(styleNeeded.upTo) + 2)); +	if (workNeeded.items & WorkNeeded::workStyle) +		StyleToPositionInView(pdoc->LineStart(pdoc->LineFromPosition(workNeeded.upTo) + 2));  	NotifyUpdateUI(); -	styleNeeded.Reset(); +	workNeeded.Reset();  } -void Editor::QueueStyling(int upTo) { -	styleNeeded.NeedUpTo(upTo); +void Editor::QueueIdleWork(WorkNeeded::workItems items, int upTo) { +	workNeeded.Need(items, upTo);  }  bool Editor::PaintContains(PRectangle rc) { diff --git a/src/Editor.h b/src/Editor.h index 553cbeec0..bc7babb13 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -47,21 +47,30 @@ public:  /**   * When platform has a way to generate an event before painting, - * accumulate needed styling range in StyleNeeded to avoid unnecessary work. + * accumulate needed styling range and other work items in  + * WorkNeeded to avoid unnecessary work inside paint handler   */ -class StyleNeeded { +class WorkNeeded {  public: +	enum workItems { +		workNone=0, +		workStyle=1, +		workUpdateUI=2 +	};  	bool active; +	enum workItems items;  	Position upTo; -	StyleNeeded() : active(false), upTo(0) {} +	WorkNeeded() : active(false), items(workNone), upTo(0) {}  	void Reset() {  		active = false; +		items = workNone;  		upTo = 0;  	} -	void NeedUpTo(Position pos) { -		if (upTo < pos) +	void Need(workItems items_, Position pos) { +		if ((items_ & workStyle) && (upTo < pos))  			upTo = pos; +		items = static_cast<workItems>(items | items_);  	}  }; @@ -241,7 +250,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	PRectangle rcPaint;  	bool paintingAllText;  	bool willRedrawAll; -	StyleNeeded styleNeeded; +	WorkNeeded workNeeded;  	int modEventMask; @@ -532,7 +541,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	int PositionAfterArea(PRectangle rcArea);  	void StyleToPositionInView(Position pos);  	void IdleStyling(); -	virtual void QueueStyling(int upTo); +	virtual void QueueIdleWork(WorkNeeded::workItems items, int upTo=0);  	virtual bool PaintContains(PRectangle rc);  	bool PaintContainsMargin();  | 
