mirror of
				https://github.com/notepad-plus-plus/notepad-plus-plus.git
				synced 2025-11-04 05:23:56 +01:00 
			
		
		
		
	git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@653 f5eea248-9336-0410-98b8-ebc06183d4e3
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Scintilla source code edit control
 | 
						|
/** @file KeyWords.cxx
 | 
						|
 ** Colourise for particular languages.
 | 
						|
 **/
 | 
						|
// Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
 | 
						|
// The License.txt file describes the conditions under which this software may be distributed.
 | 
						|
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdarg.h>
 | 
						|
#include <assert.h>
 | 
						|
#include <ctype.h>
 | 
						|
 | 
						|
#include "ILexer.h"
 | 
						|
#include "Scintilla.h"
 | 
						|
#include "SciLexer.h"
 | 
						|
 | 
						|
#include "PropSetSimple.h"
 | 
						|
#include "WordList.h"
 | 
						|
#include "LexAccessor.h"
 | 
						|
#include "Accessor.h"
 | 
						|
 | 
						|
#ifdef SCI_NAMESPACE
 | 
						|
using namespace Scintilla;
 | 
						|
#endif
 | 
						|
 | 
						|
Accessor::Accessor(IDocument *pAccess_, PropSetSimple *pprops_) : LexAccessor(pAccess_), pprops(pprops_) {
 | 
						|
}
 | 
						|
 | 
						|
int Accessor::GetPropertyInt(const char *key, int defaultValue) {
 | 
						|
	return pprops->GetInt(key, defaultValue);
 | 
						|
}
 | 
						|
 | 
						|
int Accessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) {
 | 
						|
	int end = Length();
 | 
						|
	int spaceFlags = 0;
 | 
						|
 | 
						|
	// Determines the indentation level of the current line and also checks for consistent
 | 
						|
	// indentation compared to the previous line.
 | 
						|
	// Indentation is judged consistent when the indentation whitespace of each line lines
 | 
						|
	// the same or the indentation of one line is a prefix of the other.
 | 
						|
 | 
						|
	int pos = LineStart(line);
 | 
						|
	char ch = (*this)[pos];
 | 
						|
	int indent = 0;
 | 
						|
	bool inPrevPrefix = line > 0;
 | 
						|
	int posPrev = inPrevPrefix ? LineStart(line-1) : 0;
 | 
						|
	while ((ch == ' ' || ch == '\t') && (pos < end)) {
 | 
						|
		if (inPrevPrefix) {
 | 
						|
			char chPrev = (*this)[posPrev++];
 | 
						|
			if (chPrev == ' ' || chPrev == '\t') {
 | 
						|
				if (chPrev != ch)
 | 
						|
					spaceFlags |= wsInconsistent;
 | 
						|
			} else {
 | 
						|
				inPrevPrefix = false;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if (ch == ' ') {
 | 
						|
			spaceFlags |= wsSpace;
 | 
						|
			indent++;
 | 
						|
		} else {	// Tab
 | 
						|
			spaceFlags |= wsTab;
 | 
						|
			if (spaceFlags & wsSpace)
 | 
						|
				spaceFlags |= wsSpaceTab;
 | 
						|
			indent = (indent / 8 + 1) * 8;
 | 
						|
		}
 | 
						|
		ch = (*this)[++pos];
 | 
						|
	}
 | 
						|
 | 
						|
	*flags = spaceFlags;
 | 
						|
	indent += SC_FOLDLEVELBASE;
 | 
						|
	// if completely empty line or the start of a comment...
 | 
						|
	if ((ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') ||
 | 
						|
			(pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)))
 | 
						|
		return indent | SC_FOLDLEVELWHITEFLAG;
 | 
						|
	else
 | 
						|
		return indent;
 | 
						|
}
 |