⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parenmatcher.cpp

📁 Linux下的基于X11的图形开发环境。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000 Trolltech AS.  All rights reserved.**** This file is part of Qt Designer.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "parenmatcher.h"#include "paragdata.h"#include "qtextedit.h"#include <private/qrichtext_p.h>#include <qapplication.h>ParenMatcher::ParenMatcher(){    enabled = TRUE;}bool ParenMatcher::match( QTextCursor *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( QTextCursor *cursor ){    if ( !cursor->paragraph()->extraData() )	return FALSE;    ParenList parenList = ( (ParagData*)cursor->paragraph()->extraData() )->parenList;    Paren openParen, closedParen;    QTextParagraph *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();	    QTextParagraph *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( QTextCursor *cursor ){    if ( !cursor->paragraph()->extraData() )	return FALSE;    ParenList parenList = ( (ParagData*)cursor->paragraph()->extraData() )->parenList;    Paren openParen, closedParen;    QTextParagraph *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();	    QTextParagraph *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 + -