summaryrefslogtreecommitdiffstats
path: root/tools/designer/editor/cindent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/designer/editor/cindent.cpp')
-rw-r--r--tools/designer/editor/cindent.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/tools/designer/editor/cindent.cpp b/tools/designer/editor/cindent.cpp
new file mode 100644
index 0000000..545c374
--- /dev/null
+++ b/tools/designer/editor/cindent.cpp
@@ -0,0 +1,163 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt 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 Qt 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 Qt Commercial licenses may use this file in
+** accordance with the Qt 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 "qregexp.h"
+
+extern int indentForBottomLine( const QStringList& program, QChar typedIn );
+extern void setTabSize( int s );
+extern void setIndentSize( int s );
+
+CIndent::CIndent()
+ : QTextIndent(), tabSize( 8 ), indentSize( 4 ),
+ autoIndent( TRUE ), keepTabs( TRUE ), lastDoc( 0 )
+{
+}
+
+static int indentation( const QString &s )
+{
+ if ( s.simplifyWhiteSpace().length() == 0 )
+ return 0;
+ int i = 0;
+ int ind = 0;
+ while ( i < (int)s.length() ) {
+ QChar c = s.at( i );
+ if ( c == ' ' )
+ ind++;
+ else if ( c == '\t' )
+ ind += 8;
+ else
+ break;
+ ++i;
+ }
+ return ind;
+}
+
+void CIndent::tabify( QString &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 ) {
+ QString 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 );
+ QString 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( QTextParagraph *p, int &oldIndent, int &newIndent )
+{
+ QString 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( QTextDocument *doc, QTextParagraph *p, int *oldIndent, int *newIndent )
+{
+ lastDoc = doc;
+ int oi = indentation( p->string()->toString() );
+ QStringList code;
+ QTextParagraph *parag = doc->firstParagraph();
+ while ( parag ) {
+ code << parag->string()->toString();
+ if ( parag == p )
+ break;
+ parag = parag->next();
+ }
+
+ int ind = indentForBottomLine( code, QChar::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))
+ QTextParagraph *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 );
+}