/********************************************************************** ** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. ** ** This file is part of TQt Designer. ** ** This file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free ** Software Foundation and appearing in the files LICENSE.GPL2 ** and LICENSE.GPL3 included in the packaging of this file. ** Alternatively you may (at your option) use any later version ** of the GNU General Public License if such license has been ** publicly approved by Trolltech ASA (or its successors, if any) ** and the KDE Free TQt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** Licensees holding valid TQt Commercial licenses may use this file in ** accordance with the TQt Commercial License Agreement provided with ** the Software. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted ** herein. ** **********************************************************************/ #include "cindent.h" #include "ntqregexp.h" extern int indentForBottomLine( const TQStringList& program, TQChar typedIn ); extern void setTabSize( int s ); extern void setIndentSize( int s ); CIndent::CIndent() : TQTextIndent(), tabSize( 8 ), indentSize( 4 ), autoIndent( TRUE ), keepTabs( TRUE ), lastDoc( 0 ) { } static int indentation( const TQString &s ) { if ( s.simplifyWhiteSpace().length() == 0 ) return 0; int i = 0; int ind = 0; while ( i < (int)s.length() ) { TQChar c = s.at( i ); if ( c == ' ' ) ind++; else if ( c == '\t' ) ind += 8; else break; ++i; } return ind; } void CIndent::tabify( TQString &s ) { if ( !keepTabs ) return; int i = 0; for ( ;; ) { for ( int j = i; j < (int)s.length(); ++j ) { if ( s[ j ] != ' ' && s[ j ] != '\t' ) { if ( j > i ) { TQString t = s.mid( i, j - i ); int spaces = 0; for ( int k = 0; k < (int)t.length(); ++k ) spaces += ( t[ k ] == ' ' ? 1 : tabSize ); s.remove( i, t.length() ); int tabs = spaces / tabSize; spaces = spaces - ( tabSize * tabs ); TQString tmp; tmp.fill( ' ', spaces ); if ( spaces > 0 ) s.insert( i, tmp ); tmp.fill( '\t', tabs ); if ( tabs > 0 ) s.insert( i, tmp ); } break; } } i = s.find( '\n', i ); if ( i == -1 ) break; ++i; } } void CIndent::indentLine( TQTextParagraph *p, int &oldIndent, int &newIndent ) { TQString indentString; indentString.fill( ' ', newIndent ); indentString.append( "a" ); tabify( indentString ); indentString.remove( indentString.length() - 1, 1 ); newIndent = indentString.length(); oldIndent = 0; while ( p->length() > 0 && ( p->at( 0 )->c == ' ' || p->at( 0 )->c == '\t' ) ) { ++oldIndent; p->remove( 0, 1 ); } if ( p->string()->length() == 0 ) p->append( " " ); if ( !indentString.isEmpty() ) p->insert( 0, indentString ); } void CIndent::indent( TQTextDocument *doc, TQTextParagraph *p, int *oldIndent, int *newIndent ) { lastDoc = doc; int oi = indentation( p->string()->toString() ); TQStringList code; TQTextParagraph *parag = doc->firstParagraph(); while ( parag ) { code << parag->string()->toString(); if ( parag == p ) break; parag = parag->next(); } int ind = indentForBottomLine( code, TQChar::null ); indentLine( p, oi, ind ); if ( oldIndent ) *oldIndent = oi; if ( newIndent ) *newIndent = ind; } void CIndent::reindent() { if ( !lastDoc ) return; // #### this is sloooooooow (O(n^2)) TQTextParagraph *parag = lastDoc->firstParagraph(); while ( parag ) { indent( lastDoc, parag, 0, 0 ); parag = parag->next(); } } void CIndent::setTabSize( int ts ) { tabSize = ts; ::setTabSize( ts ); } void CIndent::setIndentSize( int is ) { indentSize = is; ::setIndentSize( is ); }