亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
91一区二区三区在线观看| 午夜精品久久久久久久蜜桃app| 国产精品免费丝袜| 一级女性全黄久久生活片免费| 亚洲一区二区三区四区不卡| 青青青伊人色综合久久| 国产v综合v亚洲欧| 欧美性色aⅴ视频一区日韩精品| 69堂成人精品免费视频| 久久精品网站免费观看| 一区二区三区中文在线| 久久99久国产精品黄毛片色诱| 国产91丝袜在线18| 欧美视频一区二区在线观看| 久久综合久色欧美综合狠狠| 日韩理论片一区二区| 日本不卡在线视频| 白白色亚洲国产精品| 欧美精品乱人伦久久久久久| 国产亚洲精品中文字幕| 亚洲一区二区免费视频| 国产乱码精品一区二区三区五月婷| 色呦呦网站一区| 亚洲精品在线免费播放| 亚洲综合另类小说| 国产成人精品一区二区三区四区 | 久久久久久久久久久久久女国产乱 | 亚洲欧美日韩国产手机在线| 免费久久精品视频| 91麻豆精品秘密| 精品国产一二三| 亚洲午夜久久久久久久久电影网| 国产成人欧美日韩在线电影| 91.com在线观看| 国产精品大尺度| 精品一区二区三区在线观看 | 一区在线观看视频| 久久69国产一区二区蜜臀| 欧美性色aⅴ视频一区日韩精品| 久久精品人人爽人人爽| 奇米888四色在线精品| 91成人免费在线视频| 久久久99精品久久| 蜜臀a∨国产成人精品| 91久久免费观看| 国产精品每日更新在线播放网址| 精品在线免费观看| 欧美一区二区三区在线| 亚洲一区二区三区在线播放| 不卡的av电影| 亚洲国产精品t66y| 97精品久久久午夜一区二区三区 | 日韩精品1区2区3区| 色综合色狠狠综合色| 日本一区免费视频| 激情图片小说一区| 日韩一区二区免费电影| 亚洲第一主播视频| 欧美系列在线观看| 一区二区三区四区不卡视频| av成人老司机| 中文字幕一区二区三区av | 欧美韩国日本一区| 国产成人综合网| 久久免费美女视频| 精品在线免费观看| 精品国产乱码久久久久久免费| 日本欧美一区二区| 日韩一区二区三区在线视频| 日韩在线a电影| 9191精品国产综合久久久久久| 亚洲午夜久久久久久久久电影院 | 亚洲国产欧美日韩另类综合| 色婷婷精品久久二区二区蜜臂av | 久久国产综合精品| 亚洲精品一线二线三线| 久久精品噜噜噜成人88aⅴ| 日韩欧美的一区| 久久91精品久久久久久秒播| 精品对白一区国产伦| 精品夜夜嗨av一区二区三区| www欧美成人18+| 国产剧情一区在线| 久久欧美一区二区| 成人黄色在线网站| 亚洲欧美日韩一区二区 | 日日夜夜精品免费视频| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲女同ⅹxx女同tv| 色综合久久久久综合体| 亚洲国产综合色| 欧美一区午夜视频在线观看| 另类中文字幕网| 国产丝袜欧美中文另类| av亚洲精华国产精华精| 亚洲综合色成人| 欧美午夜电影一区| 捆绑调教美女网站视频一区| 国产欧美一区二区精品性色超碰 | 久久色在线视频| 高清成人在线观看| 亚洲欧美日韩国产综合在线 | 另类调教123区| 久久噜噜亚洲综合| 不卡高清视频专区| 性做久久久久久久久| 亚洲国产乱码最新视频 | 天天色天天操综合| 欧美精品一区二区在线播放| 北条麻妃国产九九精品视频| 亚洲成人在线观看视频| 2023国产精品自拍| 色综合激情久久| 老鸭窝一区二区久久精品| 中文字幕在线观看一区| 欧美理论片在线| 国产suv精品一区二区6| 一区二区国产盗摄色噜噜| 日韩欧美区一区二| 91色在线porny| 热久久久久久久| 国产精品第一页第二页第三页| 欧美美女直播网站| 丁香婷婷综合网| 午夜久久久久久久久| 日本一区二区视频在线| 欧美精品123区| 国产99精品视频| 五月婷婷久久综合| 欧美国产激情一区二区三区蜜月| 在线观看亚洲精品视频| 紧缚奴在线一区二区三区| 夜夜夜精品看看| 欧美国产在线观看| 91精品国产福利在线观看| 99久精品国产| 国内精品不卡在线| 无码av免费一区二区三区试看| 中文字幕不卡一区| 日韩欧美综合在线| 91女人视频在线观看| 国产在线精品一区二区不卡了 | 成人久久18免费网站麻豆 | 欧美日韩亚洲高清一区二区| 国产高清精品久久久久| 免费人成在线不卡| 亚洲电影中文字幕在线观看| 国产精品亲子乱子伦xxxx裸| 欧美成人女星排行榜| 欧美色视频在线| 99视频精品全部免费在线| 国产真实乱偷精品视频免| 日本在线不卡一区| 亚洲风情在线资源站| 亚洲欧美另类久久久精品2019| 久久久电影一区二区三区| 91精品国产乱码| 欧美日韩一区二区在线观看视频| 97国产精品videossex| 国产大陆亚洲精品国产| 激情欧美一区二区| 免费成人在线观看| 日精品一区二区| 亚洲国产成人高清精品| 亚洲日本一区二区| 国产精品护士白丝一区av| 国产欧美精品国产国产专区| 日韩精品一区二区三区四区视频| 欧美高清视频一二三区| 欧美吞精做爰啪啪高潮| 色综合色狠狠综合色| 91美女片黄在线| 99久久久久免费精品国产| 成人激情图片网| fc2成人免费人成在线观看播放| 粉嫩av一区二区三区粉嫩| 国产精品一区二区在线观看不卡| 久久精品理论片| 久久99精品国产91久久来源| 麻豆精品久久久| 经典三级一区二区| 国产一区二区福利视频| 国产精品996| 高清不卡一二三区| 成人高清免费观看| 波多野结衣视频一区| 不卡的av网站| 色一情一伦一子一伦一区| 99精品视频一区| 在线影院国内精品| 欧美亚洲综合网| 欧美日韩精品一区视频| 91精品欧美一区二区三区综合在| 欧美一级二级三级蜜桃| 精品毛片乱码1区2区3区| 国产亚洲欧洲一区高清在线观看| 国产婷婷色一区二区三区 | 91福利视频久久久久| 欧美日韩一区国产| 日韩女优制服丝袜电影|