📄 parenmatcher.cpp
字号:
/******************************************************************************** Copyright (C) 1992-$THISYEAR$ Trolltech AS. All rights reserved.**** This file is part of the $MODULE$ of the Qt Toolkit.**** $LICENSE$**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "parenmatcher.h"#include "paragdata.h"#include "q3textedit.h"#include "q3richtext_p.h"#include <qapplication.h>ParenMatcher::ParenMatcher(){ enabled = true;}bool ParenMatcher::match( Q3TextCursor *cursor ){ if ( !enabled ) return false; bool ret = false; QChar c( cursor->paragraph()->at( cursor->index() )->c ); bool ok1 = false; bool ok2 = false; if ( c == '{' || c == '(' || c == '[' ) { ok1 = checkOpenParen( cursor ); ret = ok1 || ret; } else if ( cursor->index() > 0 ) { c = cursor->paragraph()->at( cursor->index() - 1 )->c; if ( c == '}' || c == ')' || c == ']' ) { ok2 = checkClosedParen( cursor ); ret = ok2 || ret; } } return ret;}bool ParenMatcher::checkOpenParen( Q3TextCursor *cursor ){ if ( !cursor->paragraph()->extraData() ) return false; ParenList parenList = ( (ParagData*)cursor->paragraph()->extraData() )->parenList; Paren openParen, closedParen; Q3TextParagraph *closedParenParag = cursor->paragraph(); int i = 0; int ignore = 0; bool foundOpen = false; QChar c = cursor->paragraph()->at( cursor->index() )->c; for (;;) { if ( !foundOpen ) { if ( i >= (int)parenList.count() ) goto bye; openParen = parenList[ i ]; if ( openParen.pos != cursor->index() ) { ++i; continue; } else { foundOpen = true; ++i; } } if ( i >= (int)parenList.count() ) { for (;;) { closedParenParag = closedParenParag->next(); if ( !closedParenParag ) goto bye; if ( closedParenParag->extraData() && ( (ParagData*)closedParenParag->extraData() )->parenList.count() > 0 ) { parenList = ( (ParagData*)closedParenParag->extraData() )->parenList; break; } } i = 0; } closedParen = parenList[ i ]; if ( closedParen.type == Paren::Open ) { ignore++; ++i; continue; } else { if ( ignore > 0 ) { ignore--; ++i; continue; } int id = Match; if ( c == '{' && closedParen.chr != '}' || c == '(' && closedParen.chr != ')' || c == '[' && closedParen.chr != ']' ) id = Mismatch; cursor->document()->setSelectionStart( id, *cursor ); int tidx = cursor->index(); Q3TextParagraph *tstring = cursor->paragraph(); cursor->setParagraph( closedParenParag ); cursor->setIndex( closedParen.pos + 1 ); cursor->document()->setSelectionEnd( id, *cursor ); cursor->setParagraph( tstring ); cursor->setIndex( tidx ); return true; } } bye: return false;}bool ParenMatcher::checkClosedParen( Q3TextCursor *cursor ){ if ( !cursor->paragraph()->extraData() ) return false; ParenList parenList = ( (ParagData*)cursor->paragraph()->extraData() )->parenList; Paren openParen, closedParen; Q3TextParagraph *openParenParag = cursor->paragraph(); int i = parenList.count() - 1; int ignore = 0; bool foundClosed = false; QChar c = cursor->paragraph()->at( cursor->index() - 1 )->c; for (;;) { if ( !foundClosed ) { if ( i < 0 ) goto bye; closedParen = parenList[ i ]; if ( closedParen.pos != cursor->index() - 1 ) { --i; continue; } else { foundClosed = true; --i; } } if ( i < 0 ) { for (;;) { openParenParag = openParenParag->prev(); if ( !openParenParag ) goto bye; if ( openParenParag->extraData() && ( (ParagData*)openParenParag->extraData() )->parenList.count() > 0 ) { parenList = ( (ParagData*)openParenParag->extraData() )->parenList; break; } } i = parenList.count() - 1; } openParen = parenList[ i ]; if ( openParen.type == Paren::Closed ) { ignore++; --i; continue; } else { if ( ignore > 0 ) { ignore--; --i; continue; } int id = Match; if ( c == '}' && openParen.chr != '{' || c == ')' && openParen.chr != '(' || c == ']' && openParen.chr != '[' ) id = Mismatch; cursor->document()->setSelectionStart( id, *cursor ); int tidx = cursor->index(); Q3TextParagraph *tstring = cursor->paragraph(); cursor->setParagraph( openParenParag ); cursor->setIndex( openParen.pos ); cursor->document()->setSelectionEnd( id, *cursor ); cursor->setParagraph( tstring ); cursor->setIndex( tidx ); return true; } } bye: return false;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -