亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? editor.cxx

?? 最強源代碼編輯控件
?? CXX
?? 第 1 頁 / 共 3 頁
字號:
// Scintilla source code edit control
/** @file Editor.cxx
 ** Main code for the edit control.
 **/
// Copyright 1998-2004 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 <ctype.h>

#include "Platform.h"

#ifndef PLAT_QT
#define INCLUDE_DEPRECATED_FEATURES
#endif
#include "Scintilla.h"

#include "ContractionState.h"
#include "SVector.h"
#include "SplitVector.h"
#include "Partitioning.h"
#include "CellBuffer.h"
#include "KeyMap.h"
#include "Indicator.h"
#include "XPM.h"
#include "LineMarker.h"
#include "Style.h"
#include "ViewStyle.h"
#include "CharClassify.h"
#include "Document.h"
#include "Editor.h"

/*
	return whether this modification represents an operation that
	may reasonably be deferred (not done now OR [possibly] at all)
*/
static bool CanDeferToLastStep(const DocModification& mh) {
	if (mh.modificationType & (SC_MOD_BEFOREINSERT|SC_MOD_BEFOREDELETE))
		return true;	// CAN skip
	if (!(mh.modificationType & (SC_PERFORMED_UNDO|SC_PERFORMED_REDO)))
		return false;	// MUST do
	if (mh.modificationType & SC_MULTISTEPUNDOREDO)
		return true;	// CAN skip
	return false;		// PRESUMABLY must do
}

static bool CanEliminate(const DocModification& mh) {
	return
		(mh.modificationType & (SC_MOD_BEFOREINSERT|SC_MOD_BEFOREDELETE)) != 0;
}

/*
	return whether this modification represents the FINAL step
	in a [possibly lengthy] multi-step Undo/Redo sequence
*/
static bool IsLastStep(const DocModification& mh) {
	return
		(mh.modificationType & (SC_PERFORMED_UNDO|SC_PERFORMED_REDO)) != 0
		&& (mh.modificationType & SC_MULTISTEPUNDOREDO) != 0
		&& (mh.modificationType & SC_LASTSTEPINUNDOREDO) != 0
		&& (mh.modificationType & SC_MULTILINEUNDOREDO) != 0;
}

Caret::Caret() :
active(false), on(false), period(500) {}

Timer::Timer() :
ticking(false), ticksToWait(0), tickerID(0) {}

Idler::Idler() :
state(false), idlerID(0) {}

LineLayout::LineLayout(int maxLineLength_) :
	lineStarts(0),
	lenLineStarts(0),
	lineNumber(-1),
	inCache(false),
	maxLineLength(-1),
	numCharsInLine(0),
	validity(llInvalid),
	xHighlightGuide(0),
	highlightColumn(0),
	selStart(0),
	selEnd(0),
	containsCaret(false),
	edgeColumn(0),
	chars(0),
	styles(0),
	styleBitsSet(0),
	indicators(0),
	positions(0),
	hsStart(0),
	hsEnd(0),
	widthLine(wrapWidthInfinite),
	lines(1) {
	Resize(maxLineLength_);
}

LineLayout::~LineLayout() {
	Free();
}

void LineLayout::Resize(int maxLineLength_) {
	if (maxLineLength_ > maxLineLength) {
		Free();
		chars = new char[maxLineLength_ + 1];
		styles = new unsigned char[maxLineLength_ + 1];
		indicators = new char[maxLineLength_ + 1];
		// Extra position allocated as sometimes the Windows
		// GetTextExtentExPoint API writes an extra element.
		positions = new int[maxLineLength_ + 1 + 1];
		maxLineLength = maxLineLength_;
	}
}

void LineLayout::Free() {
	delete []chars;
	chars = 0;
	delete []styles;
	styles = 0;
	delete []indicators;
	indicators = 0;
	delete []positions;
	positions = 0;
	delete []lineStarts;
	lineStarts = 0;
}

void LineLayout::Invalidate(validLevel validity_) {
	if (validity > validity_)
		validity = validity_;
}

void LineLayout::SetLineStart(int line, int start) {
	if ((line >= lenLineStarts) && (line != 0)) {
		int newMaxLines = line + 20;
		int *newLineStarts = new int[newMaxLines];
		if (!newLineStarts)
			return;
		for (int i = 0; i < newMaxLines; i++) {
			if (i < lenLineStarts)
				newLineStarts[i] = lineStarts[i];
			else
				newLineStarts[i] = 0;
		}
		delete []lineStarts;
		lineStarts = newLineStarts;
		lenLineStarts = newMaxLines;
	}
	lineStarts[line] = start;
}

void LineLayout::SetBracesHighlight(Range rangeLine, Position braces[],
                                    char bracesMatchStyle, int xHighlight) {
	if (rangeLine.ContainsCharacter(braces[0])) {
		int braceOffset = braces[0] - rangeLine.start;
		if (braceOffset < numCharsInLine) {
			bracePreviousStyles[0] = styles[braceOffset];
			styles[braceOffset] = bracesMatchStyle;
		}
	}
	if (rangeLine.ContainsCharacter(braces[1])) {
		int braceOffset = braces[1] - rangeLine.start;
		if (braceOffset < numCharsInLine) {
			bracePreviousStyles[1] = styles[braceOffset];
			styles[braceOffset] = bracesMatchStyle;
		}
	}
	if ((braces[0] >= rangeLine.start && braces[1] <= rangeLine.end) ||
	        (braces[1] >= rangeLine.start && braces[0] <= rangeLine.end)) {
		xHighlightGuide = xHighlight;
	}
}

void LineLayout::RestoreBracesHighlight(Range rangeLine, Position braces[]) {
	if (rangeLine.ContainsCharacter(braces[0])) {
		int braceOffset = braces[0] - rangeLine.start;
		if (braceOffset < numCharsInLine) {
			styles[braceOffset] = bracePreviousStyles[0];
		}
	}
	if (rangeLine.ContainsCharacter(braces[1])) {
		int braceOffset = braces[1] - rangeLine.start;
		if (braceOffset < numCharsInLine) {
			styles[braceOffset] = bracePreviousStyles[1];
		}
	}
	xHighlightGuide = 0;
}

LineLayoutCache::LineLayoutCache() :
	level(0), length(0), size(0), cache(0),
	allInvalidated(false), styleClock(-1), useCount(0) {
	Allocate(0);
}

LineLayoutCache::~LineLayoutCache() {
	Deallocate();
}

void LineLayoutCache::Allocate(int length_) {
	PLATFORM_ASSERT(cache == NULL);
	allInvalidated = false;
	length = length_;
	size = length;
	if (size > 1) {
		size = (size / 16 + 1) * 16;
	}
	if (size > 0) {
		cache = new LineLayout * [size];
	}
	for (int i = 0; i < size; i++)
		cache[i] = 0;
}

void LineLayoutCache::AllocateForLevel(int linesOnScreen, int linesInDoc) {
	PLATFORM_ASSERT(useCount == 0);
	int lengthForLevel = 0;
	if (level == llcCaret) {
		lengthForLevel = 1;
	} else if (level == llcPage) {
		lengthForLevel = linesOnScreen + 1;
	} else if (level == llcDocument) {
		lengthForLevel = linesInDoc;
	}
	if (lengthForLevel > size) {
		Deallocate();
		Allocate(lengthForLevel);
	} else {
		if (lengthForLevel < length) {
			for (int i = lengthForLevel; i < length; i++) {
				delete cache[i];
				cache[i] = 0;
			}
		}
		length = lengthForLevel;
	}
	PLATFORM_ASSERT(length == lengthForLevel);
	PLATFORM_ASSERT(cache != NULL || length == 0);
}

void LineLayoutCache::Deallocate() {
	PLATFORM_ASSERT(useCount == 0);
	for (int i = 0; i < length; i++)
		delete cache[i];
	delete []cache;
	cache = 0;
	length = 0;
	size = 0;
}

void LineLayoutCache::Invalidate(LineLayout::validLevel validity_) {
	if (cache && !allInvalidated) {
		for (int i = 0; i < length; i++) {
			if (cache[i]) {
				cache[i]->Invalidate(validity_);
			}
		}
		if (validity_ == LineLayout::llInvalid) {
			allInvalidated = true;
		}
	}
}

void LineLayoutCache::SetLevel(int level_) {
	allInvalidated = false;
	if ((level_ != -1) && (level != level_)) {
		level = level_;
		Deallocate();
	}
}

LineLayout *LineLayoutCache::Retrieve(int lineNumber, int lineCaret, int maxChars, int styleClock_,
                                      int linesOnScreen, int linesInDoc) {
	AllocateForLevel(linesOnScreen, linesInDoc);
	if (styleClock != styleClock_) {
		Invalidate(LineLayout::llCheckTextAndStyle);
		styleClock = styleClock_;
	}
	allInvalidated = false;
	int pos = -1;
	LineLayout *ret = 0;
	if (level == llcCaret) {
		pos = 0;
	} else if (level == llcPage) {
		if (lineNumber == lineCaret) {
			pos = 0;
		} else if (length > 1) {
			pos = 1 + (lineNumber % (length - 1));
		}
	} else if (level == llcDocument) {
		pos = lineNumber;
	}
	if (pos >= 0) {
		PLATFORM_ASSERT(useCount == 0);
		if (cache && (pos < length)) {
			if (cache[pos]) {
				if ((cache[pos]->lineNumber != lineNumber) ||
				        (cache[pos]->maxLineLength < maxChars)) {
					delete cache[pos];
					cache[pos] = 0;
				}
			}
			if (!cache[pos]) {
				cache[pos] = new LineLayout(maxChars);
			}
			if (cache[pos]) {
				cache[pos]->lineNumber = lineNumber;
				cache[pos]->inCache = true;
				ret = cache[pos];
				useCount++;
			}
		}
	}

	if (!ret) {
		ret = new LineLayout(maxChars);
		ret->lineNumber = lineNumber;
	}

	return ret;
}

void LineLayoutCache::Dispose(LineLayout *ll) {
	allInvalidated = false;
	if (ll) {
		if (!ll->inCache) {
			delete ll;
		} else {
			useCount--;
		}
	}
}

Editor::Editor() {
	ctrlID = 0;

	stylesValid = false;

	printMagnification = 0;
	printColourMode = SC_PRINT_NORMAL;
	printWrapState = eWrapWord;
	cursorMode = SC_CURSORNORMAL;
	controlCharSymbol = 0;	/* Draw the control characters */

	hasFocus = false;
	hideSelection = false;
	inOverstrike = false;
	errorStatus = 0;
	mouseDownCaptures = true;

	bufferedDraw = true;
	twoPhaseDraw = true;

	lastClickTime = 0;
	dwellDelay = SC_TIME_FOREVER;
	ticksToDwell = SC_TIME_FOREVER;
	dwelling = false;
	ptMouseLast.x = 0;
	ptMouseLast.y = 0;
	inDragDrop = false;
	dropWentOutside = false;
	posDrag = invalidPosition;
	posDrop = invalidPosition;
	selectionType = selChar;

	lastXChosen = 0;
	lineAnchor = 0;
	originalAnchorPos = 0;

	selType = selStream;
	moveExtendsSelection = false;
	xStartSelect = 0;
	xEndSelect = 0;
	primarySelection = true;

	caretXPolicy = CARET_SLOP | CARET_EVEN;
	caretXSlop = 50;

	caretYPolicy = CARET_EVEN;
	caretYSlop = 0;

	searchAnchor = 0;

	xOffset = 0;
	xCaretMargin = 50;
	horizontalScrollBarVisible = true;
	scrollWidth = 2000;
	verticalScrollBarVisible = true;
	endAtLastLine = true;
	caretSticky = false;

	pixmapLine = Surface::Allocate();
	pixmapSelMargin = Surface::Allocate();
	pixmapSelPattern = Surface::Allocate();
	pixmapIndentGuide = Surface::Allocate();
	pixmapIndentGuideHighlight = Surface::Allocate();

	currentPos = 0;
	anchor = 0;

	targetStart = 0;
	targetEnd = 0;
	searchFlags = 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成a人无v码亚洲福利| 国产白丝网站精品污在线入口| 中文字幕一区二区不卡| 国产欧美一区二区三区在线老狼| 精品久久免费看| 日韩精品专区在线影院观看| 欧美大胆一级视频| www久久精品| 国产亚洲一区二区三区四区 | 精品99一区二区| 精品久久99ma| 亚洲国产激情av| 一区二区三区在线观看视频| 一区二区三区四区精品在线视频| 一区二区三区四区精品在线视频| 婷婷久久综合九色综合伊人色| 日韩精品欧美精品| 国产福利一区二区三区在线视频| 成人免费电影视频| 欧美在线色视频| 欧美大片国产精品| 欧美激情一区二区三区全黄 | 这里只有精品免费| 精品国产乱码久久久久久牛牛| 26uuu欧美| 亚洲视频你懂的| 日韩高清欧美激情| 丰满放荡岳乱妇91ww| 91九色最新地址| 精品成a人在线观看| 一区二区三区日韩精品| 久久91精品国产91久久小草| 99re8在线精品视频免费播放| 欧美日韩二区三区| 久久久久久麻豆| 亚洲国产视频一区二区| 国产成人综合亚洲网站| 欧美午夜一区二区三区免费大片| 26uuuu精品一区二区| 夜夜操天天操亚洲| 国产精品综合一区二区三区| 精品视频免费看| 中文字幕欧美一| 国产一区不卡精品| 精品视频123区在线观看| 国产精品美女久久福利网站| 婷婷久久综合九色综合绿巨人| 不卡一区二区中文字幕| 日韩欧美视频一区| 亚洲自拍偷拍av| 91在线丨porny丨国产| 精品1区2区在线观看| 亚洲一区在线免费观看| 不卡视频一二三| 久久久精品人体av艺术| 久久99精品久久久久久国产越南| 91福利在线观看| 亚洲素人一区二区| 国产91丝袜在线播放九色| 欧美videossexotv100| 视频一区欧美日韩| 欧美视频完全免费看| 亚洲日本在线观看| 99综合影院在线| 国产欧美日韩精品在线| 国产成人av在线影院| 久久只精品国产| 久久国产麻豆精品| 欧美一级一区二区| 日韩不卡一区二区| 91精品国产综合久久久久久漫画| 亚洲国产一二三| 欧美日韩二区三区| 国产一区高清在线| 久久免费国产精品| 成人在线综合网站| 亚洲欧洲综合另类| 欧美专区日韩专区| 亚洲国产精品一区二区www在线| 欧美亚洲综合一区| 午夜成人在线视频| 91精品国产91久久久久久最新毛片| 天涯成人国产亚洲精品一区av| 欧美视频一区二| 另类小说综合欧美亚洲| 精品对白一区国产伦| 高清不卡在线观看av| 18成人在线视频| 欧美日韩一区成人| 久久国产欧美日韩精品| 欧美国产1区2区| 91福利国产精品| 蜜臀av性久久久久蜜臀aⅴ | 夜夜嗨av一区二区三区| 91精品国产综合久久精品麻豆| 九色|91porny| 国产精品乱码一区二三区小蝌蚪| 成人aa视频在线观看| 亚洲国产日韩在线一区模特| 91精品国产美女浴室洗澡无遮挡| 国产精品1区2区3区在线观看| 亚洲激情在线播放| 欧美精品一二三四| 懂色av噜噜一区二区三区av| 一区二区三区资源| 亚洲精品在线免费播放| 日本精品视频一区二区| 喷水一区二区三区| 亚洲欧美二区三区| 欧美一二三四在线| 色综合天天狠狠| 激情小说亚洲一区| 亚洲一级二级三级| 亚洲国产成人一区二区三区| 欧美视频一区二区三区四区| 丁香婷婷综合色啪| 日本亚洲视频在线| 亚洲色图制服诱惑| 久久久久88色偷偷免费| 欧美日韩精品一区二区天天拍小说| 国产尤物一区二区在线| 午夜视频一区二区三区| 国产精品久久免费看| 欧美电影免费观看高清完整版在线观看 | 欧美在线视频日韩| 成人午夜激情在线| 麻豆精品国产91久久久久久 | 欧美本精品男人aⅴ天堂| 99久久精品免费| 国产精品一二三| 美腿丝袜亚洲一区| 天天爽夜夜爽夜夜爽精品视频| 日韩美女啊v在线免费观看| 久久午夜羞羞影院免费观看| 日韩精品一区国产麻豆| 911精品产国品一二三产区| 在线视频一区二区三| 91在线观看美女| 成人国产免费视频| 国产精品亚洲成人| 国产一区二区三区高清播放| 日韩激情av在线| 奇米精品一区二区三区在线观看| 亚洲一区电影777| 亚洲一区二区三区免费视频| 亚洲自拍偷拍麻豆| 亚洲国产成人porn| 亚洲一区二区三区四区五区中文| 一卡二卡欧美日韩| 一区二区免费看| 亚洲在线视频一区| 天天做天天摸天天爽国产一区| 天使萌一区二区三区免费观看| 三级影片在线观看欧美日韩一区二区 | 国产精品色呦呦| 国产精品久久久久久久久果冻传媒 | 天堂影院一区二区| 日韩精品一级中文字幕精品视频免费观看 | 欧美人伦禁忌dvd放荡欲情| 欧美日韩视频在线一区二区 | 91在线码无精品| 欧美影院一区二区三区| 337p亚洲精品色噜噜| 欧美mv日韩mv国产| 国产精品美女一区二区在线观看| 中文字幕亚洲一区二区av在线| 亚洲精品日产精品乱码不卡| 亚洲成人av中文| 久久99久国产精品黄毛片色诱| 岛国av在线一区| 色噜噜夜夜夜综合网| 在线播放视频一区| 日韩精品一区二区在线观看| 国产精品国产三级国产普通话蜜臀 | 亚洲欧美激情插| 美国十次综合导航| 成人激情动漫在线观看| 欧洲精品在线观看| 91麻豆精品国产91久久久资源速度| 日韩一级完整毛片| 综合久久久久综合| 蜜桃精品视频在线| caoporen国产精品视频| 在线不卡a资源高清| 国产欧美日韩激情| 亚洲成人激情自拍| 成人一道本在线| 欧美日韩www| 日本91福利区| 成人激情校园春色| 日韩亚洲欧美在线观看| 亚洲欧洲性图库| 国产在线国偷精品免费看| 色94色欧美sute亚洲线路一久| www一区二区| 日韩电影一区二区三区| av网站免费线看精品| 久久久亚洲精品石原莉奈| 亚洲午夜av在线| av色综合久久天堂av综合|