| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | /**************************************************************************
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-01-11 16:28:15 +01:00
										 |  |  | ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** Contact: Nokia Corporation (info@qt.nokia.com) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** GNU Lesser General Public License Usage | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** This file may be used under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  | ** License version 2.1 as published by the Free Software Foundation and | 
					
						
							|  |  |  | ** appearing in the file LICENSE.LGPL included in the packaging of this file. | 
					
						
							|  |  |  | ** Please review the following information to ensure the GNU Lesser General | 
					
						
							|  |  |  | ** Public License version 2.1 requirements will be met: | 
					
						
							|  |  |  | ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-12-17 16:01:08 +01:00
										 |  |  | ** In addition, as a special exception, Nokia gives you certain additional | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** rights. These rights are described in the Nokia Qt LGPL Exception | 
					
						
							| 
									
										
										
										
											2010-12-17 16:01:08 +01:00
										 |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** Other Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Alternatively, this file may be used in accordance with the terms and | 
					
						
							|  |  |  | ** conditions contained in a signed written agreement between you and Nokia. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-12-17 16:01:08 +01:00
										 |  |  | ** If you have questions regarding the use of this file, please contact | 
					
						
							| 
									
										
										
										
											2011-05-06 15:05:37 +02:00
										 |  |  | ** Nokia at info@qt.nokia.com. | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | **************************************************************************/ | 
					
						
							| 
									
										
										
										
											2008-12-02 16:19:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include "texteditor_global.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-02 16:19:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include "basetextdocument.h"
 | 
					
						
							| 
									
										
										
										
											2010-04-26 14:02:09 +02:00
										 |  |  | #include "basetextdocumentlayout.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include "basetexteditor_p.h"
 | 
					
						
							| 
									
										
										
										
											2010-02-04 10:33:12 +01:00
										 |  |  | #include "behaviorsettings.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include "codecselector.h"
 | 
					
						
							| 
									
										
										
										
											2010-05-11 11:33:31 +02:00
										 |  |  | #include "completionsettings.h"
 | 
					
						
							| 
									
										
										
										
											2009-12-08 17:43:01 +01:00
										 |  |  | #include "tabsettings.h"
 | 
					
						
							| 
									
										
										
										
											2011-02-03 15:48:14 +01:00
										 |  |  | #include "tabpreferences.h"
 | 
					
						
							| 
									
										
										
										
											2010-02-04 10:33:12 +01:00
										 |  |  | #include "texteditorconstants.h"
 | 
					
						
							|  |  |  | #include "texteditorplugin.h"
 | 
					
						
							| 
									
										
										
										
											2010-07-09 14:47:18 +02:00
										 |  |  | #include "syntaxhighlighter.h"
 | 
					
						
							| 
									
										
										
										
											2010-08-23 15:21:02 +02:00
										 |  |  | #include "tooltip.h"
 | 
					
						
							|  |  |  | #include "tipcontents.h"
 | 
					
						
							| 
									
										
										
										
											2010-11-05 14:27:16 +01:00
										 |  |  | #include "indenter.h"
 | 
					
						
							| 
									
										
										
										
											2010-11-08 16:11:26 +01:00
										 |  |  | #include "autocompleter.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-27 17:38:22 +02:00
										 |  |  | #include "snippet.h"
 | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  | #include "codeassistant.h"
 | 
					
						
							|  |  |  | #include "defaultassistinterface.h"
 | 
					
						
							|  |  |  | #include "convenience.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-15 12:38:45 +02:00
										 |  |  | #include <aggregation/aggregate.h>
 | 
					
						
							| 
									
										
										
										
											2010-02-04 10:33:12 +01:00
										 |  |  | #include <coreplugin/actionmanager/actionmanager.h>
 | 
					
						
							| 
									
										
										
										
											2010-03-18 10:59:06 +01:00
										 |  |  | #include <coreplugin/actionmanager/actioncontainer.h>
 | 
					
						
							|  |  |  | #include <coreplugin/actionmanager/command.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include <coreplugin/coreconstants.h>
 | 
					
						
							|  |  |  | #include <coreplugin/editormanager/editormanager.h>
 | 
					
						
							| 
									
										
										
										
											2009-11-02 14:02:18 +01:00
										 |  |  | #include <coreplugin/icore.h>
 | 
					
						
							| 
									
										
										
										
											2011-05-06 12:48:44 +02:00
										 |  |  | #include <coreplugin/infobar.h>
 | 
					
						
							| 
									
										
										
										
											2010-02-04 10:33:12 +01:00
										 |  |  | #include <coreplugin/manhattanstyle.h>
 | 
					
						
							| 
									
										
										
										
											2010-11-02 16:53:56 +01:00
										 |  |  | #include <coreplugin/uniqueidmanager.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-19 12:39:20 +01:00
										 |  |  | #include <extensionsystem/pluginmanager.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include <find/basetextfind.h>
 | 
					
						
							|  |  |  | #include <utils/linecolumnlabel.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  | #include <utils/qtcassert.h>
 | 
					
						
							| 
									
										
										
										
											2010-02-04 10:33:12 +01:00
										 |  |  | #include <utils/stylehelper.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <QtCore/QCoreApplication>
 | 
					
						
							|  |  |  | #include <QtCore/QTextCodec>
 | 
					
						
							|  |  |  | #include <QtCore/QFile>
 | 
					
						
							|  |  |  | #include <QtCore/QDebug>
 | 
					
						
							|  |  |  | #include <QtCore/QTimer>
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:38:08 +02:00
										 |  |  | #include <QtCore/QTimeLine>
 | 
					
						
							| 
									
										
										
										
											2010-07-19 14:06:00 +02:00
										 |  |  | #include <QtCore/QTime>
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include <QtGui/QAbstractTextDocumentLayout>
 | 
					
						
							|  |  |  | #include <QtGui/QApplication>
 | 
					
						
							|  |  |  | #include <QtGui/QKeyEvent>
 | 
					
						
							|  |  |  | #include <QtGui/QLabel>
 | 
					
						
							|  |  |  | #include <QtGui/QLayout>
 | 
					
						
							|  |  |  | #include <QtGui/QPainter>
 | 
					
						
							|  |  |  | #include <QtGui/QPrinter>
 | 
					
						
							|  |  |  | #include <QtGui/QPrintDialog>
 | 
					
						
							|  |  |  | #include <QtGui/QScrollBar>
 | 
					
						
							|  |  |  | #include <QtGui/QShortcut>
 | 
					
						
							|  |  |  | #include <QtGui/QStyle>
 | 
					
						
							|  |  |  | #include <QtGui/QSyntaxHighlighter>
 | 
					
						
							|  |  |  | #include <QtGui/QTextCursor>
 | 
					
						
							| 
									
										
										
										
											2010-03-05 11:50:37 +01:00
										 |  |  | #include <QtGui/QTextDocumentFragment>
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include <QtGui/QTextBlock>
 | 
					
						
							|  |  |  | #include <QtGui/QTextLayout>
 | 
					
						
							|  |  |  | #include <QtGui/QToolBar>
 | 
					
						
							|  |  |  | #include <QtGui/QInputDialog>
 | 
					
						
							| 
									
										
										
										
											2008-12-04 19:33:23 +01:00
										 |  |  | #include <QtGui/QMenu>
 | 
					
						
							| 
									
										
										
										
											2011-04-04 15:24:13 +02:00
										 |  |  | #include <QtGui/QMessageBox>
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  | //#define DO_FOO
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | using namespace TextEditor; | 
					
						
							|  |  |  | using namespace TextEditor::Internal; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace TextEditor { | 
					
						
							| 
									
										
										
										
											2009-01-20 11:52:04 +01:00
										 |  |  | namespace Internal { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class TextEditExtraArea : public QWidget { | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |     BaseTextEditorWidget *textEdit; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |     TextEditExtraArea(BaseTextEditorWidget *edit):QWidget(edit) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         textEdit = edit; | 
					
						
							|  |  |  |         setAutoFillBackground(true); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QSize sizeHint() const { | 
					
						
							|  |  |  |         return QSize(textEdit->extraAreaWidth(), 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  |     void paintEvent(QPaintEvent *event){ | 
					
						
							|  |  |  |         textEdit->extraAreaPaintEvent(event); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     void mousePressEvent(QMouseEvent *event){ | 
					
						
							|  |  |  |         textEdit->extraAreaMouseEvent(event); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     void mouseMoveEvent(QMouseEvent *event){ | 
					
						
							|  |  |  |         textEdit->extraAreaMouseEvent(event); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     void mouseReleaseEvent(QMouseEvent *event){ | 
					
						
							|  |  |  |         textEdit->extraAreaMouseEvent(event); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     void leaveEvent(QEvent *event){ | 
					
						
							|  |  |  |         textEdit->extraAreaLeaveEvent(event); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void wheelEvent(QWheelEvent *event) { | 
					
						
							|  |  |  |         QCoreApplication::sendEvent(textEdit->viewport(), event); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-20 11:52:04 +01:00
										 |  |  | } // namespace Internal
 | 
					
						
							|  |  |  | } // namespace TextEditor
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | ITextEditor *BaseTextEditorWidget::openEditorAt(const QString &fileName, int line, int column, | 
					
						
							| 
									
										
										
										
											2010-09-07 09:51:20 +02:00
										 |  |  |                                  const QString &editorKind, | 
					
						
							|  |  |  |                                  Core::EditorManager::OpenEditorFlags flags, | 
					
						
							|  |  |  |                                  bool *newEditor) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-21 15:52:34 +01:00
										 |  |  |     Core::EditorManager *editorManager = Core::EditorManager::instance(); | 
					
						
							| 
									
										
										
										
											2010-07-06 12:19:27 +02:00
										 |  |  |     editorManager->cutForwardNavigationHistory(); | 
					
						
							| 
									
										
										
										
											2009-03-18 17:17:53 +01:00
										 |  |  |     editorManager->addCurrentPositionToNavigationHistory(); | 
					
						
							| 
									
										
										
										
											2010-03-10 12:48:53 +01:00
										 |  |  |     Core::IEditor *editor = editorManager->openEditor(fileName, editorKind, | 
					
						
							| 
									
										
										
										
											2010-09-07 09:51:20 +02:00
										 |  |  |             flags, newEditor); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     TextEditor::ITextEditor *texteditor = qobject_cast<TextEditor::ITextEditor *>(editor); | 
					
						
							|  |  |  |     if (texteditor) { | 
					
						
							|  |  |  |         texteditor->gotoLine(line, column); | 
					
						
							|  |  |  |         return texteditor; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-30 17:48:57 +02:00
										 |  |  | static void convertToPlainText(QString &txt) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QChar *uc = txt.data(); | 
					
						
							|  |  |  |     QChar *e = uc + txt.size(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; uc != e; ++uc) { | 
					
						
							|  |  |  |         switch (uc->unicode()) { | 
					
						
							|  |  |  |         case 0xfdd0: // QTextBeginningOfFrame
 | 
					
						
							|  |  |  |         case 0xfdd1: // QTextEndOfFrame
 | 
					
						
							|  |  |  |         case QChar::ParagraphSeparator: | 
					
						
							|  |  |  |         case QChar::LineSeparator: | 
					
						
							|  |  |  |             *uc = QLatin1Char('\n'); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case QChar::Nbsp: | 
					
						
							|  |  |  |             *uc = QLatin1Char(' '); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             ; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | BaseTextEditorWidget::BaseTextEditorWidget(QWidget *parent) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     : QPlainTextEdit(parent) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-11 11:33:31 +02:00
										 |  |  |     d = new BaseTextEditorPrivate; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     d->q = this; | 
					
						
							|  |  |  |     d->m_extraArea = new TextEditExtraArea(this); | 
					
						
							|  |  |  |     d->m_extraArea->setMouseTracking(true); | 
					
						
							|  |  |  |     setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     d->m_overlay = new TextEditorOverlay(this); | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |     d->m_snippetOverlay = new TextEditorOverlay(this); | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     d->m_searchResultOverlay = new TextEditorOverlay(this); | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |     d->m_refactorOverlay = new RefactorOverlay(this); | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     d->setupDocumentSignals(d->m_document); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     d->m_lastScrollPos = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // from RESEARCH
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setLayoutDirection(Qt::LeftToRight); | 
					
						
							|  |  |  |     viewport()->setMouseTracking(true); | 
					
						
							|  |  |  |     d->extraAreaSelectionAnchorBlockNumber | 
					
						
							|  |  |  |         = d->extraAreaToggleMarkBlockNumber | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         = d->extraAreaHighlightFoldedBlockNumber | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     d->visibleFoldedBlockNumber = d->suggestedVisibleFoldedBlockNumber = -1; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(slotUpdateExtraAreaWidth())); | 
					
						
							|  |  |  |     connect(this, SIGNAL(modificationChanged(bool)), this, SLOT(slotModificationChanged(bool))); | 
					
						
							|  |  |  |     connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(slotCursorPositionChanged())); | 
					
						
							|  |  |  |     connect(this, SIGNAL(updateRequest(QRect, int)), this, SLOT(slotUpdateRequest(QRect, int))); | 
					
						
							|  |  |  |     connect(this, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged())); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //     (void) new QShortcut(tr("CTRL+L"), this, SLOT(centerCursor()), 0, Qt::WidgetShortcut);
 | 
					
						
							|  |  |  | //     (void) new QShortcut(tr("F9"), this, SLOT(slotToggleMark()), 0, Qt::WidgetShortcut);
 | 
					
						
							|  |  |  | //     (void) new QShortcut(tr("F11"), this, SLOT(slotToggleBlockVisible()));
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  | #ifdef DO_FOO
 | 
					
						
							|  |  |  |     (void) new QShortcut(tr("CTRL+D"), this, SLOT(doFoo())); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // parentheses matcher
 | 
					
						
							|  |  |  |     d->m_formatRange = true; | 
					
						
							|  |  |  |     d->m_matchFormat.setForeground(Qt::red); | 
					
						
							|  |  |  |     d->m_rangeFormat.setBackground(QColor(0xb4, 0xee, 0xb4)); | 
					
						
							|  |  |  |     d->m_mismatchFormat.setBackground(Qt::magenta); | 
					
						
							|  |  |  |     d->m_parenthesesMatchingTimer = new QTimer(this); | 
					
						
							|  |  |  |     d->m_parenthesesMatchingTimer->setSingleShot(true); | 
					
						
							|  |  |  |     connect(d->m_parenthesesMatchingTimer, SIGNAL(timeout()), this, SLOT(_q_matchParentheses())); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  |     d->m_highlightBlocksTimer = new QTimer(this); | 
					
						
							|  |  |  |     d->m_highlightBlocksTimer->setSingleShot(true); | 
					
						
							|  |  |  |     connect(d->m_highlightBlocksTimer, SIGNAL(timeout()), this, SLOT(_q_highlightBlocks())); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |     d->m_animator = 0; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     d->m_searchResultFormat.setBackground(QColor(0xffef0b)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     slotUpdateExtraAreaWidth(); | 
					
						
							| 
									
										
										
										
											2010-02-08 16:54:14 +01:00
										 |  |  |     updateHighlights(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     setFrameStyle(QFrame::NoFrame); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 14:47:10 +01:00
										 |  |  |     d->m_delayedUpdateTimer = new QTimer(this); | 
					
						
							|  |  |  |     d->m_delayedUpdateTimer->setSingleShot(true); | 
					
						
							|  |  |  |     connect(d->m_delayedUpdateTimer, SIGNAL(timeout()), viewport(), SLOT(update())); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-29 16:44:27 +02:00
										 |  |  |     d->m_moveLineUndoHack = false; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | BaseTextEditorWidget::~BaseTextEditorWidget() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     delete d; | 
					
						
							|  |  |  |     d = 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QString BaseTextEditorWidget::mimeType() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_document->mimeType(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setMimeType(const QString &mt) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_document->setMimeType(mt); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::print(QPrinter *printer) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     const bool oldFullPage =  printer->fullPage(); | 
					
						
							|  |  |  |     printer->setFullPage(true); | 
					
						
							|  |  |  |     QPrintDialog *dlg = new QPrintDialog(printer, this); | 
					
						
							|  |  |  |     dlg->setWindowTitle(tr("Print Document")); | 
					
						
							|  |  |  |     if (dlg->exec() == QDialog::Accepted) { | 
					
						
							|  |  |  |         d->print(printer); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     printer->setFullPage(oldFullPage); | 
					
						
							|  |  |  |     delete dlg; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  | static int foldBoxWidth(const QFontMetrics &fm) | 
					
						
							| 
									
										
										
										
											2009-06-05 16:16:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     const int lineSpacing = fm.lineSpacing(); | 
					
						
							|  |  |  |     return lineSpacing + lineSpacing%2 + 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | static void printPage(int index, QPainter *painter, const QTextDocument *doc, | 
					
						
							|  |  |  |                       const QRectF &body, const QRectF &titleBox, | 
					
						
							|  |  |  |                       const QString &title) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     painter->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     painter->translate(body.left(), body.top() - (index - 1) * body.height()); | 
					
						
							|  |  |  |     QRectF view(0, (index - 1) * body.height(), body.width(), body.height()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QAbstractTextDocumentLayout *layout = doc->documentLayout(); | 
					
						
							|  |  |  |     QAbstractTextDocumentLayout::PaintContext ctx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     painter->setFont(QFont(doc->defaultFont())); | 
					
						
							|  |  |  |     QRectF box = titleBox.translated(0, view.top()); | 
					
						
							|  |  |  |     int dpix = painter->device()->logicalDpiX(); | 
					
						
							|  |  |  |     int dpiy = painter->device()->logicalDpiY(); | 
					
						
							|  |  |  |     int mx = 5 * dpix / 72.0; | 
					
						
							|  |  |  |     int my = 2 * dpiy / 72.0; | 
					
						
							|  |  |  |     painter->fillRect(box.adjusted(-mx, -my, mx, my), QColor(210, 210, 210)); | 
					
						
							|  |  |  |     if (!title.isEmpty()) | 
					
						
							|  |  |  |         painter->drawText(box, Qt::AlignCenter, title); | 
					
						
							|  |  |  |     const QString pageString = QString::number(index); | 
					
						
							|  |  |  |     painter->drawText(box, Qt::AlignRight, pageString); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     painter->setClipRect(view); | 
					
						
							|  |  |  |     ctx.clip = view; | 
					
						
							|  |  |  |     // don't use the system palette text as default text color, on HP/UX
 | 
					
						
							|  |  |  |     // for example that's white, and white text on white paper doesn't
 | 
					
						
							|  |  |  |     // look that nice
 | 
					
						
							|  |  |  |     ctx.palette.setColor(QPalette::Text, Qt::black); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     layout->draw(painter, ctx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     painter->restore(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorPrivate::print(QPrinter *printer) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTextDocument *doc = q->document(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QString title = q->displayName(); | 
					
						
							|  |  |  |     if (title.isEmpty()) | 
					
						
							|  |  |  |         printer->setDocName(title); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QPainter p(printer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Check that there is a valid device to print to.
 | 
					
						
							|  |  |  |     if (!p.isActive()) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     doc = doc->clone(doc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextOption opt = doc->defaultTextOption(); | 
					
						
							|  |  |  |     opt.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); | 
					
						
							|  |  |  |     doc->setDefaultTextOption(opt); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     (void)doc->documentLayout(); // make sure that there is a layout
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QColor background = q->palette().color(QPalette::Base); | 
					
						
							|  |  |  |     bool backgroundIsDark = background.value() < 128; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (QTextBlock srcBlock = q->document()->firstBlock(), dstBlock = doc->firstBlock(); | 
					
						
							|  |  |  |          srcBlock.isValid() && dstBlock.isValid(); | 
					
						
							|  |  |  |          srcBlock = srcBlock.next(), dstBlock = dstBlock.next()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         QList<QTextLayout::FormatRange> formatList = srcBlock.layout()->additionalFormats(); | 
					
						
							|  |  |  |         if (backgroundIsDark) { | 
					
						
							|  |  |  |             // adjust syntax highlighting colors for better contrast
 | 
					
						
							|  |  |  |             for (int i = formatList.count() - 1; i >=0; --i) { | 
					
						
							|  |  |  |                 QTextCharFormat &format = formatList[i].format; | 
					
						
							|  |  |  |                 if (format.background().color() == background) { | 
					
						
							|  |  |  |                     QBrush brush = format.foreground(); | 
					
						
							|  |  |  |                     QColor color = brush.color(); | 
					
						
							|  |  |  |                     int h,s,v,a; | 
					
						
							|  |  |  |                     color.getHsv(&h, &s, &v, &a); | 
					
						
							|  |  |  |                     color.setHsv(h, s, qMin(128, v), a); | 
					
						
							|  |  |  |                     brush.setColor(color); | 
					
						
							|  |  |  |                     format.setForeground(brush); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 format.setBackground(Qt::white); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         dstBlock.layout()->setAdditionalFormats(formatList); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QAbstractTextDocumentLayout *layout = doc->documentLayout(); | 
					
						
							|  |  |  |     layout->setPaintDevice(p.device()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int dpiy = p.device()->logicalDpiY(); | 
					
						
							|  |  |  |     int margin = (int) ((2/2.54)*dpiy); // 2 cm margins
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextFrameFormat fmt = doc->rootFrame()->frameFormat(); | 
					
						
							|  |  |  |     fmt.setMargin(margin); | 
					
						
							|  |  |  |     doc->rootFrame()->setFrameFormat(fmt); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QRectF pageRect(printer->pageRect()); | 
					
						
							|  |  |  |     QRectF body = QRectF(0, 0, pageRect.width(), pageRect.height()); | 
					
						
							|  |  |  |     QFontMetrics fontMetrics(doc->defaultFont(), p.device()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QRectF titleBox(margin, | 
					
						
							|  |  |  |                     body.top() + margin | 
					
						
							|  |  |  |                     - fontMetrics.height() | 
					
						
							|  |  |  |                     - 6 * dpiy / 72.0, | 
					
						
							|  |  |  |                     body.width() - 2*margin, | 
					
						
							|  |  |  |                     fontMetrics.height()); | 
					
						
							|  |  |  |     doc->setPageSize(body.size()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int docCopies; | 
					
						
							|  |  |  |     int pageCopies; | 
					
						
							|  |  |  |     if (printer->collateCopies() == true){ | 
					
						
							|  |  |  |         docCopies = 1; | 
					
						
							|  |  |  |         pageCopies = printer->numCopies(); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         docCopies = printer->numCopies(); | 
					
						
							|  |  |  |         pageCopies = 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int fromPage = printer->fromPage(); | 
					
						
							|  |  |  |     int toPage = printer->toPage(); | 
					
						
							|  |  |  |     bool ascending = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (fromPage == 0 && toPage == 0) { | 
					
						
							|  |  |  |         fromPage = 1; | 
					
						
							|  |  |  |         toPage = doc->pageCount(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // paranoia check
 | 
					
						
							|  |  |  |     fromPage = qMax(1, fromPage); | 
					
						
							|  |  |  |     toPage = qMin(doc->pageCount(), toPage); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (printer->pageOrder() == QPrinter::LastPageFirst) { | 
					
						
							|  |  |  |         int tmp = fromPage; | 
					
						
							|  |  |  |         fromPage = toPage; | 
					
						
							|  |  |  |         toPage = tmp; | 
					
						
							|  |  |  |         ascending = false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (int i = 0; i < docCopies; ++i) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         int page = fromPage; | 
					
						
							|  |  |  |         while (true) { | 
					
						
							|  |  |  |             for (int j = 0; j < pageCopies; ++j) { | 
					
						
							|  |  |  |                 if (printer->printerState() == QPrinter::Aborted | 
					
						
							|  |  |  |                     || printer->printerState() == QPrinter::Error) | 
					
						
							|  |  |  |                     goto UserCanceled; | 
					
						
							|  |  |  |                 printPage(page, &p, doc, body, titleBox, title); | 
					
						
							|  |  |  |                 if (j < pageCopies - 1) | 
					
						
							|  |  |  |                     printer->newPage(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (page == toPage) | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (ascending) | 
					
						
							|  |  |  |                 ++page; | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 --page; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             printer->newPage(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ( i < docCopies - 1) | 
					
						
							|  |  |  |             printer->newPage(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | UserCanceled: | 
					
						
							|  |  |  |     delete doc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  | int BaseTextEditorPrivate::visualIndent(const QTextBlock &block) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!block.isValid()) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     const QTextDocument *document = block.document(); | 
					
						
							|  |  |  |     int i = 0; | 
					
						
							|  |  |  |     while (i < block.length()) { | 
					
						
							|  |  |  |         if (!document->characterAt(block.position() + i).isSpace()) { | 
					
						
							|  |  |  |             QTextCursor cursor(block); | 
					
						
							|  |  |  |             cursor.setPosition(block.position() + i); | 
					
						
							|  |  |  |             return q->cursorRect(cursor).x(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         ++i; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | ITextMarkable *BaseTextEditorWidget::markableInterface() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return baseTextDocument()->documentMarker(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | BaseTextEditor *BaseTextEditorWidget::editor() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |     if (!d->m_editor) { | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  |         d->m_editor = const_cast<BaseTextEditorWidget *>(this)->createEditor(); | 
					
						
							|  |  |  |         d->m_codeAssistant->configure(d->m_editor); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         connect(this, SIGNAL(textChanged()), | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |                 d->m_editor, SIGNAL(contentsChanged())); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         connect(this, SIGNAL(changed()), | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |                 d->m_editor, SIGNAL(changed())); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |     return d->m_editor; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::selectEncoding() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     BaseTextDocument *doc = d->m_document; | 
					
						
							|  |  |  |     CodecSelector codecSelector(this, doc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (codecSelector.exec()) { | 
					
						
							| 
									
										
										
										
											2011-04-04 15:24:13 +02:00
										 |  |  |     case CodecSelector::Reload: { | 
					
						
							|  |  |  |         QString errorString; | 
					
						
							|  |  |  |         if (!doc->reload(&errorString, codecSelector.selectedCodec())) { | 
					
						
							|  |  |  |             QMessageBox::critical(this, tr("File Error"), errorString); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     case CodecSelector::Save: | 
					
						
							|  |  |  |         doc->setCodec(codecSelector.selectedCodec()); | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |         Core::EditorManager::instance()->saveEditor(editor()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         break; | 
					
						
							|  |  |  |     case CodecSelector::Cancel: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QString BaseTextEditorWidget::msgTextTooLarge(quint64 size) | 
					
						
							| 
									
										
										
										
											2010-07-12 14:15:38 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return tr("The text is too large to be displayed (%1 MB)."). | 
					
						
							|  |  |  |            arg(size >> 20); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::createNew(const QString &contents) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-12 14:15:38 +02:00
										 |  |  |     if (contents.size() > Core::EditorManager::maxTextFileSize()) { | 
					
						
							|  |  |  |         setPlainText(msgTextTooLarge(contents.size())); | 
					
						
							|  |  |  |         document()->setModified(false); | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     setPlainText(contents); | 
					
						
							|  |  |  |     document()->setModified(false); | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-06 12:48:44 +02:00
										 |  |  | void BaseTextEditorWidget::updateCannotDecodeInfo() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     setReadOnly(d->m_document->hasDecodingError()); | 
					
						
							|  |  |  |     if (d->m_document->hasDecodingError()) { | 
					
						
							|  |  |  |         Core::InfoBarEntry info( | 
					
						
							|  |  |  |             QLatin1String(Constants::SELECT_ENCODING), | 
					
						
							|  |  |  |             tr("<b>Error:</b> Could not decode \"%1\" with \"%2\"-encoding. Editing not possible.") | 
					
						
							|  |  |  |             .arg(displayName()).arg(QString::fromLatin1(d->m_document->codec()->name()))); | 
					
						
							|  |  |  |         info.setCustomButtonInfo(tr("Select Encoding"), this, SLOT(selectEncoding())); | 
					
						
							|  |  |  |         d->m_document->infoBar()->addInfo(info); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         d->m_document->infoBar()->removeInfo(QLatin1String(Constants::SELECT_ENCODING)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-10 20:43:03 +02:00
										 |  |  | bool BaseTextEditorWidget::open(QString *errorString, const QString &fileName, const QString &realFileName) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-10 20:43:03 +02:00
										 |  |  |     if (d->m_document->open(errorString, fileName, realFileName)) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         moveCursor(QTextCursor::Start); | 
					
						
							| 
									
										
										
										
											2011-05-06 12:48:44 +02:00
										 |  |  |         updateCannotDecodeInfo(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 18:08:02 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |   Collapses the first comment in a file, if there is only whitespace above | 
					
						
							|  |  |  |   */ | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  | void BaseTextEditorPrivate::foldLicenseHeader() | 
					
						
							| 
									
										
										
										
											2009-12-01 18:08:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextDocument *doc = q->document(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); | 
					
						
							| 
									
										
										
										
											2009-12-01 18:08:02 +01:00
										 |  |  |     QTC_ASSERT(documentLayout, return); | 
					
						
							|  |  |  |     QTextBlock block = doc->firstBlock(); | 
					
						
							|  |  |  |     const TabSettings &ts = m_document->tabSettings(); | 
					
						
							| 
									
										
										
										
											2009-12-01 18:14:02 +01:00
										 |  |  |     while (block.isValid() && block.isVisible()) { | 
					
						
							| 
									
										
										
										
											2009-12-01 18:08:02 +01:00
										 |  |  |         QString text = block.text(); | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         if (BaseTextDocumentLayout::canFold(block) && block.next().isVisible()) { | 
					
						
							|  |  |  |             if (text.trimmed().startsWith(QLatin1String("/*"))) { | 
					
						
							|  |  |  |                 BaseTextDocumentLayout::doFoldOrUnfold(block, false); | 
					
						
							|  |  |  |                 moveCursorVisible(); | 
					
						
							|  |  |  |                 documentLayout->requestUpdate(); | 
					
						
							|  |  |  |                 documentLayout->emitDocumentSizeChanged(); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-12-01 18:08:02 +01:00
										 |  |  |         if (ts.firstNonSpace(text) < text.size()) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         block = block.next(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | const Utils::ChangeSet &BaseTextEditorWidget::changeSet() const | 
					
						
							| 
									
										
										
										
											2009-11-26 12:19:58 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_changeSet; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setChangeSet(const Utils::ChangeSet &changeSet) | 
					
						
							| 
									
										
										
										
											2009-11-26 12:19:58 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-26 12:36:36 +01:00
										 |  |  |     using namespace Utils; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-26 12:19:58 +01:00
										 |  |  |     d->m_changeSet = changeSet; | 
					
						
							| 
									
										
										
										
											2009-11-26 12:36:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     foreach (const ChangeSet::EditOp &op, changeSet.operationList()) { | 
					
						
							|  |  |  |         // ### TODO: process the edit operation
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         switch (op.type) { | 
					
						
							|  |  |  |         case ChangeSet::EditOp::Replace: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case ChangeSet::EditOp::Move: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case ChangeSet::EditOp::Insert: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case ChangeSet::EditOp::Remove: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case ChangeSet::EditOp::Flip: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case ChangeSet::EditOp::Copy: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } // switch
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-26 12:19:58 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | Core::IFile *BaseTextEditorWidget::file() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_document; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::editorContentsChange(int position, int charsRemoved, int charsAdded) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-09-23 12:50:02 +02:00
										 |  |  |     if (d->m_animator) | 
					
						
							|  |  |  |         d->m_animator->finish(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     d->m_contentsChanged = true; | 
					
						
							| 
									
										
										
										
											2010-03-29 14:20:12 +02:00
										 |  |  |     QTextDocument *doc = document(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Keep the line numbers and the block information for the text marks updated
 | 
					
						
							|  |  |  |     if (charsRemoved != 0) { | 
					
						
							|  |  |  |         d->updateMarksLineNumber(); | 
					
						
							|  |  |  |         d->updateMarksBlock(document()->findBlock(position)); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2010-03-29 14:20:12 +02:00
										 |  |  |         const QTextBlock posBlock = doc->findBlock(position); | 
					
						
							|  |  |  |         const QTextBlock nextBlock = doc->findBlock(position + charsAdded); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         if (posBlock != nextBlock) { | 
					
						
							|  |  |  |             d->updateMarksLineNumber(); | 
					
						
							|  |  |  |             d->updateMarksBlock(posBlock); | 
					
						
							|  |  |  |             d->updateMarksBlock(nextBlock); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             d->updateMarksBlock(posBlock); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-03-29 14:20:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-24 13:02:13 +02:00
										 |  |  |     if (d->m_snippetOverlay->isVisible()) { | 
					
						
							|  |  |  |         QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |         cursor.setPosition(position); | 
					
						
							| 
									
										
										
										
											2010-11-29 17:25:01 +01:00
										 |  |  |         d->snippetCheckCursor(cursor); | 
					
						
							| 
									
										
										
										
											2010-09-24 13:02:13 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-29 14:20:12 +02:00
										 |  |  |     if (doc->isRedoAvailable()) | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |         emit editor()->contentsChangedBecauseOfUndo(); | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (charsAdded != 0 && characterAt(position + charsAdded - 1).isPrint()) | 
					
						
							|  |  |  |         d->m_assistRelevantContentAdded = true; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::slotSelectionChanged() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     if (d->m_inBlockSelectionMode && !textCursor().hasSelection()) { | 
					
						
							|  |  |  |         d->m_inBlockSelectionMode = false; | 
					
						
							|  |  |  |         d->m_blockSelection.clear(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         viewport()->update(); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-04 19:25:20 +01:00
										 |  |  |     if (!d->m_selectBlockAnchor.isNull() && !textCursor().hasSelection()) | 
					
						
							|  |  |  |         d->m_selectBlockAnchor = QTextCursor(); | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Clear any link which might be showing when the selection changes
 | 
					
						
							|  |  |  |     clearLink(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoBlockStart() | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |     if (TextBlockUserData::findPreviousOpenParenthesis(&cursor, false)) { | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  |         setTextCursor(cursor); | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |         _q_matchParentheses(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoBlockEnd() | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |     if (TextBlockUserData::findNextClosingParenthesis(&cursor, false)) { | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  |         setTextCursor(cursor); | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |         _q_matchParentheses(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoBlockStartWithSelection() | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |     if (TextBlockUserData::findPreviousOpenParenthesis(&cursor, true)) { | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  |         setTextCursor(cursor); | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |         _q_matchParentheses(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoBlockEndWithSelection() | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |     if (TextBlockUserData::findNextClosingParenthesis(&cursor, true)) { | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  |         setTextCursor(cursor); | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |         _q_matchParentheses(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoLineStart() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     handleHomeKey(false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoLineStartWithSelection() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     handleHomeKey(true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoLineEnd() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::EndOfLine); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoLineEndWithSelection() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoNextLine() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-23 11:05:49 +02:00
										 |  |  |     moveCursor(QTextCursor::Down); | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoNextLineWithSelection() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-23 11:05:49 +02:00
										 |  |  |     moveCursor(QTextCursor::Down, QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoPreviousLine() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-23 11:05:49 +02:00
										 |  |  |     moveCursor(QTextCursor::Up); | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoPreviousLineWithSelection() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-23 11:05:49 +02:00
										 |  |  |     moveCursor(QTextCursor::Up, QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoPreviousCharacter() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::PreviousCharacter); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoPreviousCharacterWithSelection() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoNextCharacter() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::NextCharacter); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoNextCharacterWithSelection() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoPreviousWord() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::PreviousWord); | 
					
						
							| 
									
										
										
										
											2011-05-22 08:51:30 +02:00
										 |  |  |     setTextCursor(textCursor()); | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoPreviousWordWithSelection() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::PreviousWord, QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2011-05-22 08:51:30 +02:00
										 |  |  |     setTextCursor(textCursor()); | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoNextWord() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::NextWord); | 
					
						
							| 
									
										
										
										
											2011-05-22 08:51:30 +02:00
										 |  |  |     setTextCursor(textCursor()); | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoNextWordWithSelection() | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     moveCursor(QTextCursor::NextWord, QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2011-05-22 08:51:30 +02:00
										 |  |  |     setTextCursor(textCursor()); | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoPreviousWordCamelCase() | 
					
						
							| 
									
										
										
										
											2010-11-10 12:53:45 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor c = textCursor(); | 
					
						
							|  |  |  |     camelCaseLeft(c, QTextCursor::MoveAnchor); | 
					
						
							|  |  |  |     setTextCursor(c); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoPreviousWordCamelCaseWithSelection() | 
					
						
							| 
									
										
										
										
											2010-11-10 12:53:45 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor c = textCursor(); | 
					
						
							|  |  |  |     camelCaseLeft(c, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     setTextCursor(c); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoNextWordCamelCase() | 
					
						
							| 
									
										
										
										
											2010-11-10 12:53:45 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     qDebug() << Q_FUNC_INFO; | 
					
						
							|  |  |  |     QTextCursor c = textCursor(); | 
					
						
							|  |  |  |     camelCaseRight(c, QTextCursor::MoveAnchor); | 
					
						
							|  |  |  |     setTextCursor(c); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoNextWordCamelCaseWithSelection() | 
					
						
							| 
									
										
										
										
											2010-11-10 12:53:45 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor c = textCursor(); | 
					
						
							|  |  |  |     camelCaseRight(c, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     setTextCursor(c); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-07 15:24:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-26 14:02:09 +02:00
										 |  |  | static QTextCursor flippedCursor(const QTextCursor &cursor) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |     QTextCursor flipped = cursor; | 
					
						
							|  |  |  |     flipped.clearSelection(); | 
					
						
							|  |  |  |     flipped.setPosition(cursor.anchor(), QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     return flipped; | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::selectBlockUp() | 
					
						
							| 
									
										
										
										
											2008-12-04 19:25:20 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     if (!cursor.hasSelection()) | 
					
						
							|  |  |  |         d->m_selectBlockAnchor = cursor; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         cursor.setPosition(cursor.selectionStart()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!TextBlockUserData::findPreviousOpenParenthesis(&cursor, false)) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     if (!TextBlockUserData::findNextClosingParenthesis(&cursor, true)) | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |     setTextCursor(flippedCursor(cursor)); | 
					
						
							|  |  |  |     _q_matchParentheses(); | 
					
						
							| 
									
										
										
										
											2008-12-04 19:25:20 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::selectBlockDown() | 
					
						
							| 
									
										
										
										
											2008-12-04 19:25:20 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor tc = textCursor(); | 
					
						
							|  |  |  |     QTextCursor cursor = d->m_selectBlockAnchor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!tc.hasSelection() || cursor.isNull()) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     tc.setPosition(tc.selectionStart()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     forever { | 
					
						
							|  |  |  |         QTextCursor ahead = cursor; | 
					
						
							|  |  |  |         if (!TextBlockUserData::findPreviousOpenParenthesis(&ahead, false)) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         if (ahead.position() <= tc.position()) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         cursor = ahead; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ( cursor != d->m_selectBlockAnchor) | 
					
						
							|  |  |  |         TextBlockUserData::findNextClosingParenthesis(&cursor, true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-05 17:06:17 +01:00
										 |  |  |     setTextCursor(flippedCursor(cursor)); | 
					
						
							|  |  |  |     _q_matchParentheses(); | 
					
						
							| 
									
										
										
										
											2008-12-04 19:25:20 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::copyLineUp() | 
					
						
							| 
									
										
										
										
											2009-05-15 23:17:11 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     copyLineUpDown(true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::copyLineDown() | 
					
						
							| 
									
										
										
										
											2009-05-15 23:17:11 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     copyLineUpDown(false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-09 11:09:03 +01:00
										 |  |  | // @todo: Potential reuse of some code around the following functions...
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::copyLineUpDown(bool up) | 
					
						
							| 
									
										
										
										
											2009-05-15 23:17:11 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     QTextCursor move = cursor; | 
					
						
							|  |  |  |     move.beginEditBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool hasSelection = cursor.hasSelection(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (hasSelection) { | 
					
						
							|  |  |  |         move.setPosition(cursor.selectionStart()); | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::StartOfBlock); | 
					
						
							|  |  |  |         move.setPosition(cursor.selectionEnd(), QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2011-02-09 11:09:03 +01:00
										 |  |  |         move.movePosition(move.atBlockStart() ? QTextCursor::Left: QTextCursor::EndOfBlock, | 
					
						
							|  |  |  |                           QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2009-05-15 23:17:11 +02:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::StartOfBlock); | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QString text = move.selectedText(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (up) { | 
					
						
							|  |  |  |         move.setPosition(cursor.selectionStart()); | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::StartOfBlock); | 
					
						
							|  |  |  |         move.insertBlock(); | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::Left); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::EndOfBlock); | 
					
						
							|  |  |  |         if (move.atBlockStart()) { | 
					
						
							|  |  |  |             move.movePosition(QTextCursor::NextBlock); | 
					
						
							|  |  |  |             move.insertBlock(); | 
					
						
							|  |  |  |             move.movePosition(QTextCursor::Left); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             move.insertBlock(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int start = move.position(); | 
					
						
							|  |  |  |     move.clearSelection(); | 
					
						
							|  |  |  |     move.insertText(text); | 
					
						
							|  |  |  |     int end = move.position(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     move.setPosition(start); | 
					
						
							|  |  |  |     move.setPosition(end, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     indent(document(), move, QChar::Null); | 
					
						
							|  |  |  |     move.endEditBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setTextCursor(move); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::joinLines() | 
					
						
							| 
									
										
										
										
											2010-01-20 16:54:06 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-21 15:14:35 +01:00
										 |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     QTextCursor start = cursor; | 
					
						
							|  |  |  |     QTextCursor end = cursor; | 
					
						
							| 
									
										
										
										
											2010-01-20 16:54:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-21 15:14:35 +01:00
										 |  |  |     start.setPosition(cursor.selectionStart()); | 
					
						
							|  |  |  |     end.setPosition(cursor.selectionEnd() - 1); | 
					
						
							| 
									
										
										
										
											2010-01-20 17:51:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-21 15:14:35 +01:00
										 |  |  |     int lineCount = qMax(1, end.blockNumber() - start.blockNumber()); | 
					
						
							| 
									
										
										
										
											2010-01-20 16:54:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-21 15:14:35 +01:00
										 |  |  |     cursor.beginEditBlock(); | 
					
						
							|  |  |  |     cursor.setPosition(cursor.selectionStart()); | 
					
						
							|  |  |  |     while (lineCount--) { | 
					
						
							|  |  |  |         cursor.movePosition(QTextCursor::NextBlock); | 
					
						
							|  |  |  |         cursor.movePosition(QTextCursor::StartOfBlock); | 
					
						
							|  |  |  |         cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         QString cutLine = cursor.selectedText(); | 
					
						
							| 
									
										
										
										
											2010-01-20 17:51:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-21 15:14:35 +01:00
										 |  |  |         // Collapse leading whitespaces to one or insert whitespace
 | 
					
						
							|  |  |  |         cutLine.replace(QRegExp("^\\s*"), " "); | 
					
						
							|  |  |  |         cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         cursor.removeSelectedText(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cursor.movePosition(QTextCursor::PreviousBlock); | 
					
						
							|  |  |  |         cursor.movePosition(QTextCursor::EndOfBlock); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cursor.insertText(cutLine); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     cursor.endEditBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setTextCursor(cursor); | 
					
						
							| 
									
										
										
										
											2010-01-20 16:54:06 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::insertLineAbove() | 
					
						
							| 
									
										
										
										
											2010-05-03 17:03:11 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     cursor.beginEditBlock(); | 
					
						
							|  |  |  |     cursor.movePosition(QTextCursor::PreviousBlock, QTextCursor::MoveAnchor); | 
					
						
							|  |  |  |     cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::MoveAnchor); | 
					
						
							|  |  |  |     cursor.insertBlock(); | 
					
						
							|  |  |  |     indent(document(), cursor, QChar::Null); | 
					
						
							|  |  |  |     cursor.endEditBlock(); | 
					
						
							|  |  |  |     setTextCursor(cursor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::insertLineBelow() | 
					
						
							| 
									
										
										
										
											2010-05-03 17:03:11 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     cursor.beginEditBlock(); | 
					
						
							|  |  |  |     cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::MoveAnchor); | 
					
						
							|  |  |  |     cursor.insertBlock(); | 
					
						
							|  |  |  |     indent(document(), cursor, QChar::Null); | 
					
						
							|  |  |  |     cursor.endEditBlock(); | 
					
						
							|  |  |  |     setTextCursor(cursor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::moveLineUp() | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     moveLineUpDown(true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::moveLineDown() | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     moveLineUpDown(false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-25 11:10:42 +01:00
										 |  |  | void BaseTextEditorWidget::uppercaseSelection() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     transformSelection(&QString::toUpper); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorWidget::lowercaseSelection() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     transformSelection(&QString::toLower); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::moveLineUpDown(bool up) | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     QTextCursor move = cursor; | 
					
						
							| 
									
										
										
										
											2010-02-26 14:51:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     move.setVisualNavigation(false); // this opens folded items instead of destroying them
 | 
					
						
							| 
									
										
										
										
											2010-02-26 14:51:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-23 19:24:57 +02:00
										 |  |  |     if (d->m_moveLineUndoHack) | 
					
						
							|  |  |  |         move.joinPreviousEditBlock(); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         move.beginEditBlock(); | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool hasSelection = cursor.hasSelection(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (cursor.hasSelection()) { | 
					
						
							|  |  |  |         move.setPosition(cursor.selectionStart()); | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::StartOfBlock); | 
					
						
							|  |  |  |         move.setPosition(cursor.selectionEnd(), QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2011-02-09 11:09:03 +01:00
										 |  |  |         move.movePosition(move.atBlockStart() ? QTextCursor::Left: QTextCursor::EndOfBlock, | 
					
						
							|  |  |  |                           QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::StartOfBlock); | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     QString text = move.selectedText(); | 
					
						
							| 
									
										
										
										
											2010-09-07 14:34:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     RefactorMarkers affectedMarkers; | 
					
						
							|  |  |  |     RefactorMarkers nonAffectedMarkers; | 
					
						
							|  |  |  |     QList<int> markerOffsets; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     foreach (const RefactorMarker &marker, d->m_refactorOverlay->markers()) { | 
					
						
							|  |  |  |         //test if marker is part of the selection to be moved
 | 
					
						
							| 
									
										
										
										
											2011-02-09 11:09:03 +01:00
										 |  |  |         if ((move.selectionStart() <= marker.cursor.position()) | 
					
						
							|  |  |  |                 && (move.selectionEnd() >= marker.cursor.position())) { | 
					
						
							| 
									
										
										
										
											2010-09-07 14:34:40 +02:00
										 |  |  |             affectedMarkers.append(marker); | 
					
						
							|  |  |  |             //remember the offset of markers in text
 | 
					
						
							|  |  |  |             int offset = marker.cursor.position() - move.selectionStart(); | 
					
						
							|  |  |  |             markerOffsets.append(offset); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             nonAffectedMarkers.append(marker); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  |     move.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     move.removeSelectedText(); | 
					
						
							| 
									
										
										
										
											2008-12-11 10:28:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  |     if (up) { | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::PreviousBlock); | 
					
						
							|  |  |  |         move.insertBlock(); | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::Left); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         move.movePosition(QTextCursor::EndOfBlock); | 
					
						
							|  |  |  |         if (move.atBlockStart()) { // empty block
 | 
					
						
							|  |  |  |             move.movePosition(QTextCursor::NextBlock); | 
					
						
							|  |  |  |             move.insertBlock(); | 
					
						
							|  |  |  |             move.movePosition(QTextCursor::Left); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             move.insertBlock(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-11 10:28:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  |     int start = move.position(); | 
					
						
							|  |  |  |     move.clearSelection(); | 
					
						
							|  |  |  |     move.insertText(text); | 
					
						
							|  |  |  |     int end = move.position(); | 
					
						
							| 
									
										
										
										
											2008-12-11 13:20:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  |     if (hasSelection) { | 
					
						
							|  |  |  |         move.setPosition(start); | 
					
						
							|  |  |  |         move.setPosition(end, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 14:34:40 +02:00
										 |  |  |     //update positions of affectedMarkers
 | 
					
						
							|  |  |  |     for (int i=0;i < affectedMarkers.count(); i++) { | 
					
						
							|  |  |  |         int newPosition = start + markerOffsets.at(i); | 
					
						
							|  |  |  |         affectedMarkers[i].cursor.setPosition(newPosition); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     d->m_refactorOverlay->setMarkers(nonAffectedMarkers + affectedMarkers); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |     reindent(document(), move); | 
					
						
							| 
									
										
										
										
											2008-12-11 13:20:59 +01:00
										 |  |  |     move.endEditBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  |     setTextCursor(move); | 
					
						
							| 
									
										
										
										
											2009-04-23 19:24:57 +02:00
										 |  |  |     d->m_moveLineUndoHack = true; | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::cleanWhitespace() | 
					
						
							| 
									
										
										
										
											2008-12-09 17:43:31 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-09-09 16:37:09 +02:00
										 |  |  |     d->m_document->cleanWhitespace(textCursor()); | 
					
						
							| 
									
										
										
										
											2008-12-09 17:43:31 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // could go into QTextCursor...
 | 
					
						
							|  |  |  | static QTextLine currentTextLine(const QTextCursor &cursor) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QTextBlock block = cursor.block(); | 
					
						
							|  |  |  |     if (!block.isValid()) | 
					
						
							|  |  |  |         return QTextLine(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QTextLayout *layout = block.layout(); | 
					
						
							|  |  |  |     if (!layout) | 
					
						
							|  |  |  |         return QTextLine(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const int relativePos = cursor.position() - block.position(); | 
					
						
							|  |  |  |     return layout->lineForTextPosition(relativePos); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::camelCaseLeft(QTextCursor &cursor, QTextCursor::MoveMode mode) | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     int state = 0; | 
					
						
							|  |  |  |     enum Input { | 
					
						
							|  |  |  |         Input_U, | 
					
						
							|  |  |  |         Input_l, | 
					
						
							|  |  |  |         Input_underscore, | 
					
						
							|  |  |  |         Input_space, | 
					
						
							|  |  |  |         Input_other | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!cursor.movePosition(QTextCursor::Left, mode)) | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     forever { | 
					
						
							|  |  |  |         QChar c = characterAt(cursor.position()); | 
					
						
							|  |  |  |         Input input = Input_other; | 
					
						
							|  |  |  |         if (c.isUpper()) | 
					
						
							|  |  |  |             input = Input_U; | 
					
						
							|  |  |  |         else if (c.isLower() || c.isDigit()) | 
					
						
							|  |  |  |             input = Input_l; | 
					
						
							|  |  |  |         else if (c == QLatin1Char('_')) | 
					
						
							|  |  |  |             input = Input_underscore; | 
					
						
							|  |  |  |         else if (c.isSpace() && c != QChar::ParagraphSeparator) | 
					
						
							|  |  |  |             input = Input_space; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             input = Input_other; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         switch (state) { | 
					
						
							|  |  |  |         case 0: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_U: | 
					
						
							|  |  |  |                 state = 1; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_l: | 
					
						
							|  |  |  |                 state = 2; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_underscore: | 
					
						
							|  |  |  |                 state = 3; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_space: | 
					
						
							|  |  |  |                 state = 4; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 cursor.movePosition(QTextCursor::Right, mode); | 
					
						
							|  |  |  |                 return cursor.movePosition(QTextCursor::WordLeft, mode); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 1: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_U: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							| 
									
										
										
										
											2010-11-10 12:53:45 +01:00
										 |  |  |                 cursor.movePosition(QTextCursor::Right, mode); | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case 2: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_U: | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             case Input_l: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 cursor.movePosition(QTextCursor::Right, mode); | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 3: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_underscore: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_U: | 
					
						
							|  |  |  |                 state = 1; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_l: | 
					
						
							|  |  |  |                 state = 2; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 cursor.movePosition(QTextCursor::Right, mode); | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 4: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_space: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_U: | 
					
						
							|  |  |  |                 state = 1; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_l: | 
					
						
							|  |  |  |                 state = 2; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_underscore: | 
					
						
							|  |  |  |                 state = 3; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 cursor.movePosition(QTextCursor::Right, mode); | 
					
						
							|  |  |  |                 if (cursor.positionInBlock() == 0) | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 return cursor.movePosition(QTextCursor::WordLeft, mode); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!cursor.movePosition(QTextCursor::Left, mode)) | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::camelCaseRight(QTextCursor &cursor, QTextCursor::MoveMode mode) | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     int state = 0; | 
					
						
							|  |  |  |     enum Input { | 
					
						
							|  |  |  |         Input_U, | 
					
						
							|  |  |  |         Input_l, | 
					
						
							|  |  |  |         Input_underscore, | 
					
						
							|  |  |  |         Input_space, | 
					
						
							|  |  |  |         Input_other | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     forever { | 
					
						
							|  |  |  |         QChar c = characterAt(cursor.position()); | 
					
						
							|  |  |  |         Input input = Input_other; | 
					
						
							|  |  |  |         if (c.isUpper()) | 
					
						
							|  |  |  |             input = Input_U; | 
					
						
							|  |  |  |         else if (c.isLower() || c.isDigit()) | 
					
						
							|  |  |  |             input = Input_l; | 
					
						
							|  |  |  |         else if (c == QLatin1Char('_')) | 
					
						
							|  |  |  |             input = Input_underscore; | 
					
						
							|  |  |  |         else if (c.isSpace() && c != QChar::ParagraphSeparator) | 
					
						
							|  |  |  |             input = Input_space; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             input = Input_other; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         switch (state) { | 
					
						
							|  |  |  |         case 0: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_U: | 
					
						
							|  |  |  |                 state = 4; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_l: | 
					
						
							|  |  |  |                 state = 1; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_underscore: | 
					
						
							|  |  |  |                 state = 6; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 return cursor.movePosition(QTextCursor::WordRight, mode); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 1: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_U: | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             case Input_l: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_underscore: | 
					
						
							|  |  |  |                 state = 6; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_space: | 
					
						
							|  |  |  |                 state = 7; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 2: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_U: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_l: | 
					
						
							|  |  |  |                 cursor.movePosition(QTextCursor::Left, mode); | 
					
						
							|  |  |  |                 return true; | 
					
						
							| 
									
										
										
										
											2010-11-10 12:53:45 +01:00
										 |  |  |             case Input_underscore: | 
					
						
							|  |  |  |                 state = 6; | 
					
						
							|  |  |  |                 break; | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |             case Input_space: | 
					
						
							|  |  |  |                 state = 7; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							| 
									
										
										
										
											2010-11-10 12:26:18 +01:00
										 |  |  |                 return true; | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 4: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_U: | 
					
						
							|  |  |  |                 state = 2; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_l: | 
					
						
							|  |  |  |                 state = 1; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_underscore: | 
					
						
							|  |  |  |                 state = 6; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_space: | 
					
						
							|  |  |  |                 state = 7; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							| 
									
										
										
										
											2010-11-10 12:26:18 +01:00
										 |  |  |                 return true; | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 6: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_underscore: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case Input_space: | 
					
						
							|  |  |  |                 state = 7; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							| 
									
										
										
										
											2010-11-10 12:26:18 +01:00
										 |  |  |                 return true; | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 7: | 
					
						
							|  |  |  |             switch (input) { | 
					
						
							|  |  |  |             case Input_space: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         cursor.movePosition(QTextCursor::Right, mode); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::cursorMoveKeyEvent(QKeyEvent *e) | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor::MoveMode mode = QTextCursor::MoveAnchor; | 
					
						
							|  |  |  |     QTextCursor::MoveOperation op = QTextCursor::NoMove; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (e == QKeySequence::MoveToNextChar) { | 
					
						
							|  |  |  |             op = QTextCursor::Right; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToPreviousChar) { | 
					
						
							|  |  |  |             op = QTextCursor::Left; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectNextChar) { | 
					
						
							|  |  |  |            op = QTextCursor::Right; | 
					
						
							|  |  |  |            mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectPreviousChar) { | 
					
						
							|  |  |  |             op = QTextCursor::Left; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectNextWord) { | 
					
						
							|  |  |  |             op = QTextCursor::WordRight; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectPreviousWord) { | 
					
						
							|  |  |  |             op = QTextCursor::WordLeft; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectStartOfLine) { | 
					
						
							|  |  |  |             op = QTextCursor::StartOfLine; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectEndOfLine) { | 
					
						
							|  |  |  |             op = QTextCursor::EndOfLine; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectStartOfBlock) { | 
					
						
							|  |  |  |             op = QTextCursor::StartOfBlock; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectEndOfBlock) { | 
					
						
							|  |  |  |             op = QTextCursor::EndOfBlock; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectStartOfDocument) { | 
					
						
							|  |  |  |             op = QTextCursor::Start; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectEndOfDocument) { | 
					
						
							|  |  |  |             op = QTextCursor::End; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectPreviousLine) { | 
					
						
							|  |  |  |             op = QTextCursor::Up; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::SelectNextLine) { | 
					
						
							|  |  |  |             op = QTextCursor::Down; | 
					
						
							|  |  |  |             mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 QTextBlock block = cursor.block(); | 
					
						
							|  |  |  |                 QTextLine line = currentTextLine(cursor); | 
					
						
							|  |  |  |                 if (!block.next().isValid() | 
					
						
							|  |  |  |                     && line.isValid() | 
					
						
							|  |  |  |                     && line.lineNumber() == block.layout()->lineCount() - 1) | 
					
						
							|  |  |  |                     op = QTextCursor::End; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToNextWord) { | 
					
						
							|  |  |  |             op = QTextCursor::WordRight; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToPreviousWord) { | 
					
						
							|  |  |  |             op = QTextCursor::WordLeft; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToEndOfBlock) { | 
					
						
							|  |  |  |             op = QTextCursor::EndOfBlock; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToStartOfBlock) { | 
					
						
							|  |  |  |             op = QTextCursor::StartOfBlock; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToNextLine) { | 
					
						
							|  |  |  |             op = QTextCursor::Down; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToPreviousLine) { | 
					
						
							|  |  |  |             op = QTextCursor::Up; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToPreviousLine) { | 
					
						
							|  |  |  |             op = QTextCursor::Up; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToStartOfLine) { | 
					
						
							|  |  |  |             op = QTextCursor::StartOfLine; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToEndOfLine) { | 
					
						
							|  |  |  |             op = QTextCursor::EndOfLine; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToStartOfDocument) { | 
					
						
							|  |  |  |             op = QTextCursor::Start; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (e == QKeySequence::MoveToEndOfDocument) { | 
					
						
							|  |  |  |             op = QTextCursor::End; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Except for pageup and pagedown, Mac OS X has very different behavior, we don't do it all, but
 | 
					
						
							|  |  |  | // here's the breakdown:
 | 
					
						
							|  |  |  | // Shift still works as an anchor, but only one of the other keys can be down Ctrl (Command),
 | 
					
						
							|  |  |  | // Alt (Option), or Meta (Control).
 | 
					
						
							|  |  |  | // Command/Control + Left/Right -- Move to left or right of the line
 | 
					
						
							|  |  |  | //                 + Up/Down -- Move to top bottom of the file. (Control doesn't move the cursor)
 | 
					
						
							|  |  |  | // Option + Left/Right -- Move one word Left/right.
 | 
					
						
							|  |  |  | //        + Up/Down  -- Begin/End of Paragraph.
 | 
					
						
							|  |  |  | // Home/End Top/Bottom of file. (usually don't move the cursor, but will select)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool visualNavigation = cursor.visualNavigation(); | 
					
						
							|  |  |  |     cursor.setVisualNavigation(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (op == QTextCursor::WordRight) { | 
					
						
							| 
									
										
										
										
											2011-01-05 13:46:41 +01:00
										 |  |  |         camelCaseRight(cursor, mode); | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |     } else if (op == QTextCursor::WordLeft) { | 
					
						
							| 
									
										
										
										
											2011-01-05 13:46:41 +01:00
										 |  |  |         camelCaseLeft(cursor, mode); | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2011-01-05 13:46:41 +01:00
										 |  |  |         cursor.movePosition(op, mode); | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     cursor.setVisualNavigation(visualNavigation); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-05 13:46:41 +01:00
										 |  |  |     setTextCursor(cursor); | 
					
						
							|  |  |  |     ensureCursorVisible(); | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::keyPressEvent(QKeyEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-06-12 12:38:27 +02:00
										 |  |  |     viewport()->setCursor(Qt::BlankCursor); | 
					
						
							| 
									
										
										
										
											2010-08-23 15:21:02 +02:00
										 |  |  |     ToolTip::instance()->hide(); | 
					
						
							| 
									
										
										
										
											2009-06-12 12:38:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-23 19:24:57 +02:00
										 |  |  |     d->m_moveLineUndoHack = false; | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     d->clearVisibleFoldedBlock(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (e->key() == Qt::Key_Escape) { | 
					
						
							| 
									
										
										
										
											2010-01-19 18:50:50 +01:00
										 |  |  |         if (d->m_snippetOverlay->isVisible()) { | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							|  |  |  |             d->m_snippetOverlay->hide(); | 
					
						
							|  |  |  |             d->m_snippetOverlay->clear(); | 
					
						
							|  |  |  |             QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |             cursor.clearSelection(); | 
					
						
							|  |  |  |             setTextCursor(cursor); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool ro = isReadOnly(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (d->m_inBlockSelectionMode) { | 
					
						
							|  |  |  |         if (e == QKeySequence::Cut) { | 
					
						
							|  |  |  |             if (!ro) { | 
					
						
							|  |  |  |                 cut(); | 
					
						
							|  |  |  |                 e->accept(); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-05-29 18:48:18 +02:00
										 |  |  |         } else if (e == QKeySequence::Delete || e->key() == Qt::Key_Backspace) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             if (!ro) { | 
					
						
							|  |  |  |                 d->removeBlockSelection(); | 
					
						
							|  |  |  |                 e->accept(); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  |         } else if (e == QKeySequence::Paste) { | 
					
						
							|  |  |  |             if (!ro) { | 
					
						
							|  |  |  |                 d->removeBlockSelection(); | 
					
						
							|  |  |  |                 // continue
 | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!ro | 
					
						
							|  |  |  |         && (e == QKeySequence::InsertParagraphSeparator | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  |             || (!d->m_lineSeparatorsAllowed && e == QKeySequence::InsertLineSeparator))) { | 
					
						
							| 
									
										
										
										
											2010-01-19 18:50:50 +01:00
										 |  |  |         if (d->m_snippetOverlay->isVisible()) { | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							|  |  |  |             d->m_snippetOverlay->hide(); | 
					
						
							|  |  |  |             d->m_snippetOverlay->clear(); | 
					
						
							|  |  |  |             QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |             cursor.movePosition(QTextCursor::EndOfBlock); | 
					
						
							|  |  |  |             setTextCursor(cursor); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |         if (d->m_inBlockSelectionMode) | 
					
						
							|  |  |  |             cursor.clearSelection(); | 
					
						
							| 
									
										
										
										
											2009-09-09 13:55:11 +02:00
										 |  |  |         const TabSettings &ts = d->m_document->tabSettings(); | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |         cursor.beginEditBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-01 14:13:54 +01:00
										 |  |  |         int extraBlocks = | 
					
						
							|  |  |  |             d->m_autoCompleter->paragraphSeparatorAboutToBeInserted(cursor, tabSettings()); | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-30 14:14:33 +01:00
										 |  |  |         QString previousIndentationString; | 
					
						
							| 
									
										
										
										
											2009-09-09 13:55:11 +02:00
										 |  |  |         if (ts.m_autoIndent) { | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  |             cursor.insertBlock(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             indent(document(), cursor, QChar::Null); | 
					
						
							| 
									
										
										
										
											2008-12-10 18:01:33 +01:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             cursor.insertBlock(); | 
					
						
							| 
									
										
										
										
											2009-12-03 15:46:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // After inserting the block, to avoid duplicating whitespace on the same line
 | 
					
						
							| 
									
										
										
										
											2010-11-30 14:14:33 +01:00
										 |  |  |             const QString &previousBlockText = cursor.block().previous().text(); | 
					
						
							|  |  |  |             previousIndentationString = ts.indentationString(previousBlockText); | 
					
						
							|  |  |  |             if (!previousIndentationString.isEmpty()) | 
					
						
							|  |  |  |                 cursor.insertText(previousIndentationString); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |         cursor.endEditBlock(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         e->accept(); | 
					
						
							| 
									
										
										
										
											2009-09-17 12:47:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (extraBlocks > 0) { | 
					
						
							|  |  |  |             QTextCursor ensureVisible = cursor; | 
					
						
							|  |  |  |             while (extraBlocks > 0) { | 
					
						
							|  |  |  |                 --extraBlocks; | 
					
						
							|  |  |  |                 ensureVisible.movePosition(QTextCursor::NextBlock); | 
					
						
							| 
									
										
										
										
											2010-11-30 14:14:33 +01:00
										 |  |  |                 if (ts.m_autoIndent) | 
					
						
							|  |  |  |                     indent(document(), ensureVisible, QChar::Null); | 
					
						
							|  |  |  |                 else if (!previousIndentationString.isEmpty()) | 
					
						
							|  |  |  |                     ensureVisible.insertText(previousIndentationString); | 
					
						
							| 
									
										
										
										
											2009-09-17 12:47:16 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             setTextCursor(ensureVisible); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         setTextCursor(cursor); | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2009-08-13 17:34:29 +02:00
										 |  |  |     } else if (!ro | 
					
						
							|  |  |  |                && (e == QKeySequence::MoveToStartOfBlock | 
					
						
							|  |  |  |                    || e == QKeySequence::SelectStartOfBlock)){ | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         if ((e->modifiers() & (Qt::AltModifier | Qt::ShiftModifier)) == (Qt::AltModifier | Qt::ShiftModifier)) { | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-13 17:34:29 +02:00
										 |  |  |         handleHomeKey(e == QKeySequence::SelectStartOfBlock); | 
					
						
							|  |  |  |         e->accept(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } else if (!ro | 
					
						
							|  |  |  |                && (e == QKeySequence::MoveToStartOfLine | 
					
						
							|  |  |  |                    || e == QKeySequence::SelectStartOfLine)){ | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         if ((e->modifiers() & (Qt::AltModifier | Qt::ShiftModifier)) == (Qt::AltModifier | Qt::ShiftModifier)) { | 
					
						
							|  |  |  |                 e->accept(); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-13 17:34:29 +02:00
										 |  |  |         QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |         if (QTextLayout *layout = cursor.block().layout()) { | 
					
						
							|  |  |  |             if (layout->lineForTextPosition(cursor.position() - cursor.block().position()).lineNumber() == 0) { | 
					
						
							|  |  |  |                 handleHomeKey(e == QKeySequence::SelectStartOfLine); | 
					
						
							|  |  |  |                 e->accept(); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-10-05 15:17:24 +02:00
										 |  |  |     } else if (!ro | 
					
						
							|  |  |  |                && e == QKeySequence::DeleteStartOfWord | 
					
						
							|  |  |  |                && d->m_document->tabSettings().m_autoIndent | 
					
						
							|  |  |  |                && !textCursor().hasSelection()){ | 
					
						
							|  |  |  |         e->accept(); | 
					
						
							|  |  |  |         QTextCursor c = textCursor(); | 
					
						
							|  |  |  |         int pos = c.position(); | 
					
						
							| 
									
										
										
										
											2010-11-10 12:26:18 +01:00
										 |  |  |         camelCaseLeft(c, QTextCursor::MoveAnchor); | 
					
						
							| 
									
										
										
										
											2009-10-05 15:17:24 +02:00
										 |  |  |         int targetpos = c.position(); | 
					
						
							|  |  |  |         forever { | 
					
						
							|  |  |  |             handleBackspaceKey(); | 
					
						
							|  |  |  |             int cpos = textCursor().position(); | 
					
						
							|  |  |  |             if (cpos == pos || cpos <= targetpos) | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             pos = cpos; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2010-11-10 12:26:18 +01:00
										 |  |  |     } else if (!ro && e == QKeySequence::DeleteStartOfWord && !textCursor().hasSelection()) { | 
					
						
							|  |  |  |         e->accept(); | 
					
						
							|  |  |  |         QTextCursor c = textCursor(); | 
					
						
							|  |  |  |         camelCaseLeft(c, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         c.removeSelectedText(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } else if (!ro && e == QKeySequence::DeleteEndOfWord && !textCursor().hasSelection()) { | 
					
						
							|  |  |  |         e->accept(); | 
					
						
							|  |  |  |         QTextCursor c = textCursor(); | 
					
						
							|  |  |  |         camelCaseRight(c, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         c.removeSelectedText(); | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } else switch (e->key()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     case Qt::Key_Dollar: { | 
					
						
							|  |  |  |             d->m_overlay->setVisible(!d->m_overlay->isVisible()); | 
					
						
							|  |  |  |             d->m_overlay->setCursor(textCursor()); | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } break; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     case Qt::Key_Tab: | 
					
						
							| 
									
										
										
										
											2009-05-18 12:21:30 -05:00
										 |  |  |     case Qt::Key_Backtab: { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         if (ro) break; | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |         if (d->m_snippetOverlay->isVisible() && !d->m_snippetOverlay->isEmpty()) { | 
					
						
							|  |  |  |             d->snippetTabOrBacktab(e->key() == Qt::Key_Tab); | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-05-18 12:21:30 -05:00
										 |  |  |         QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |         int newPosition; | 
					
						
							|  |  |  |         if (d->m_document->tabSettings().tabShouldIndent(document(), cursor, &newPosition)) { | 
					
						
							|  |  |  |             if (newPosition != cursor.position() && !cursor.hasSelection()) { | 
					
						
							|  |  |  |                 cursor.setPosition(newPosition); | 
					
						
							|  |  |  |                 setTextCursor(cursor); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             indent(document(), cursor, QChar::Null); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             indentOrUnindent(e->key() == Qt::Key_Tab); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         e->accept(); | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2009-05-18 12:21:30 -05:00
										 |  |  |     } break; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     case Qt::Key_Backspace: | 
					
						
							|  |  |  |         if (ro) break; | 
					
						
							| 
									
										
										
										
											2009-09-16 15:39:51 +02:00
										 |  |  |         if ((e->modifiers() & (Qt::ControlModifier | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                                | Qt::ShiftModifier | 
					
						
							|  |  |  |                                | Qt::AltModifier | 
					
						
							|  |  |  |                                | Qt::MetaModifier)) == Qt::NoModifier | 
					
						
							|  |  |  |             && !textCursor().hasSelection()) { | 
					
						
							|  |  |  |             handleBackspaceKey(); | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case Qt::Key_Up: | 
					
						
							|  |  |  |     case Qt::Key_Down: | 
					
						
							|  |  |  |         if (e->modifiers() & Qt::ControlModifier) { | 
					
						
							|  |  |  |             verticalScrollBar()->triggerAction( | 
					
						
							|  |  |  |                     e->key() == Qt::Key_Up ? QAbstractSlider::SliderSingleStepSub : | 
					
						
							|  |  |  |                                              QAbstractSlider::SliderSingleStepAdd); | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // fall through
 | 
					
						
							|  |  |  |     case Qt::Key_Right: | 
					
						
							|  |  |  |     case Qt::Key_Left: | 
					
						
							| 
									
										
										
										
											2009-06-03 20:45:49 +02:00
										 |  |  | #ifndef Q_WS_MAC
 | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  |         if ((e->modifiers() | 
					
						
							|  |  |  |              & (Qt::AltModifier | Qt::ShiftModifier)) == (Qt::AltModifier | Qt::ShiftModifier)) { | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |             int diff_row = 0; | 
					
						
							|  |  |  |             int diff_col = 0; | 
					
						
							|  |  |  |             if (e->key() == Qt::Key_Up) | 
					
						
							|  |  |  |                 diff_row = -1; | 
					
						
							|  |  |  |             else if (e->key() == Qt::Key_Down) | 
					
						
							|  |  |  |                 diff_row = 1; | 
					
						
							|  |  |  |             else if (e->key() == Qt::Key_Left) | 
					
						
							|  |  |  |                 diff_col = -1; | 
					
						
							|  |  |  |             else if (e->key() == Qt::Key_Right) | 
					
						
							|  |  |  |                 diff_col = 1; | 
					
						
							|  |  |  |             handleBlockSelection(diff_row, diff_col); | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2010-09-08 13:42:01 +02:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             // leave block selection mode
 | 
					
						
							|  |  |  |             if (d->m_inBlockSelectionMode) { | 
					
						
							|  |  |  |                 d->m_inBlockSelectionMode = false; | 
					
						
							|  |  |  |                 d->m_blockSelection.clear(); | 
					
						
							|  |  |  |                 viewport()->update(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case Qt::Key_PageUp: | 
					
						
							|  |  |  |     case Qt::Key_PageDown: | 
					
						
							|  |  |  |         if (e->modifiers() == Qt::ControlModifier) { | 
					
						
							|  |  |  |             verticalScrollBar()->triggerAction( | 
					
						
							|  |  |  |                     e->key() == Qt::Key_PageUp ? QAbstractSlider::SliderPageStepSub : | 
					
						
							|  |  |  |                                                  QAbstractSlider::SliderPageStepAdd); | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (d->m_inBlockSelectionMode) { | 
					
						
							|  |  |  |         QString text = e->text(); | 
					
						
							|  |  |  |         if (!text.isEmpty() && (text.at(0).isPrint() || text.at(0) == QLatin1Char('\t'))) { | 
					
						
							|  |  |  |             d->removeBlockSelection(text); | 
					
						
							|  |  |  |             goto skip_event; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 16:18:28 +01:00
										 |  |  |     if (e->key() == Qt::Key_H && e->modifiers() == | 
					
						
							|  |  |  | #ifdef Q_OS_DARWIN
 | 
					
						
							|  |  |  |         Qt::MetaModifier | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |         Qt::ControlModifier | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |         ) { | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |         universalHelper(); | 
					
						
							|  |  |  |         e->accept(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |     if (ro || e->text().isEmpty() || !e->text().at(0).isPrint()) { | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |         if (cursorMoveKeyEvent(e)) | 
					
						
							|  |  |  |             ; | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         else { | 
					
						
							|  |  |  |             QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |             bool cursorWithinSnippet = false; | 
					
						
							|  |  |  |             if (d->m_snippetOverlay->isVisible() | 
					
						
							|  |  |  |                 && (e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace)) { | 
					
						
							|  |  |  |                 cursorWithinSnippet = d->snippetCheckCursor(cursor); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (cursorWithinSnippet) | 
					
						
							|  |  |  |                 cursor.beginEditBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 15:19:14 +01:00
										 |  |  |             QPlainTextEdit::keyPressEvent(e); | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (cursorWithinSnippet) { | 
					
						
							|  |  |  |                 cursor.endEditBlock(); | 
					
						
							|  |  |  |                 d->m_snippetOverlay->updateEquivalentSelections(textCursor()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-01-11 16:17:22 +01:00
										 |  |  |     } else if ((e->modifiers() & (Qt::ControlModifier|Qt::AltModifier)) != Qt::ControlModifier){ | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |         QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |         QString text = e->text(); | 
					
						
							| 
									
										
										
										
											2010-11-30 14:14:33 +01:00
										 |  |  |         const QString &autoText = d->m_autoCompleter->autoComplete(cursor, text); | 
					
						
							| 
									
										
										
										
											2009-09-16 15:31:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |         QChar electricChar; | 
					
						
							|  |  |  |         if (d->m_document->tabSettings().m_autoIndent) { | 
					
						
							| 
									
										
										
										
											2009-09-16 13:56:34 +02:00
										 |  |  |             foreach (QChar c, text) { | 
					
						
							| 
									
										
										
										
											2010-11-09 10:36:02 +01:00
										 |  |  |                 if (d->m_indenter->isElectricCharacter(c)) { | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |                     electricChar = c; | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-17 13:33:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         bool cursorWithinSnippet = false; | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |         if (d->m_snippetOverlay->isVisible()) | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |             cursorWithinSnippet = d->snippetCheckCursor(cursor); | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         bool doEditBlock = !electricChar.isNull() || !autoText.isEmpty() || cursorWithinSnippet; | 
					
						
							| 
									
										
										
										
											2009-09-17 13:33:42 +02:00
										 |  |  |         if (doEditBlock) | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |             cursor.beginEditBlock(); | 
					
						
							| 
									
										
										
										
											2009-09-16 13:56:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |         cursor.insertText(text); | 
					
						
							| 
									
										
										
										
											2009-09-16 13:56:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-17 12:36:40 +02:00
										 |  |  |         if (!autoText.isEmpty()) { | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |             int pos = cursor.position(); | 
					
						
							|  |  |  |             cursor.insertText(autoText); | 
					
						
							| 
									
										
										
										
											2010-11-24 19:44:54 +01:00
										 |  |  |             //Select the inserted text, to be able to re-indent the inserted text
 | 
					
						
							|  |  |  |             cursor.setPosition(pos, QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-11-08 16:11:26 +01:00
										 |  |  |         if (!electricChar.isNull() && d->m_autoCompleter->contextAllowsElectricCharacters(cursor)) | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |             indent(document(), cursor, electricChar); | 
					
						
							| 
									
										
										
										
											2010-11-24 19:44:54 +01:00
										 |  |  |         if (!autoText.isEmpty()) { | 
					
						
							|  |  |  |             if (d->m_document->tabSettings().m_autoIndent) | 
					
						
							|  |  |  |                 reindent(document(), cursor); | 
					
						
							|  |  |  |             cursor.setPosition(autoText.length() == 1 ? cursor.position() : cursor.anchor()); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-17 13:33:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         if (doEditBlock) { | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |             cursor.endEditBlock(); | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |             if (cursorWithinSnippet) | 
					
						
							|  |  |  |                 d->m_snippetOverlay->updateEquivalentSelections(textCursor()); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-17 13:33:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-15 17:04:17 +02:00
										 |  |  |         setTextCursor(cursor); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-19 14:06:00 +02:00
										 |  |  |     skip_event: | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     if (!ro && e->key() == Qt::Key_Delete && d->m_parenthesesMatchingEnabled) | 
					
						
							| 
									
										
										
										
											2009-05-06 11:18:56 +02:00
										 |  |  |         d->m_parenthesesMatchingTimer->start(50); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  |     if (!ro && d->m_contentsChanged && !e->text().isEmpty() && e->text().at(0).isPrint()) | 
					
						
							|  |  |  |         d->m_codeAssistant->process(); | 
					
						
							| 
									
										
										
										
											2010-07-19 14:06:00 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::insertCodeSnippet(const QTextCursor &cursor_arg, const QString &snippet) | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-10-27 17:38:22 +02:00
										 |  |  |     if ((snippet.count(Snippet::kVariableDelimiter) % 2) != 0) { | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  |         qWarning() << "invalid snippet"; | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-29 16:44:27 +02:00
										 |  |  |     QList<QTextEdit::ExtraSelection> selections; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor cursor = cursor_arg; | 
					
						
							|  |  |  |     cursor.beginEditBlock(); | 
					
						
							|  |  |  |     cursor.removeSelectedText(); | 
					
						
							|  |  |  |     const int startCursorPosition = cursor.position(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  |     int pos = 0; | 
					
						
							| 
									
										
										
										
											2010-01-19 16:18:28 +01:00
										 |  |  |     QMap<int, int> positions; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  |     while (pos < snippet.size()) { | 
					
						
							| 
									
										
										
										
											2010-10-27 17:38:22 +02:00
										 |  |  |         if (snippet.at(pos) != Snippet::kVariableDelimiter) { | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  |             const int start = pos; | 
					
						
							|  |  |  |             do { ++pos; } | 
					
						
							| 
									
										
										
										
											2010-10-27 17:38:22 +02:00
										 |  |  |             while (pos < snippet.size() && snippet.at(pos) != Snippet::kVariableDelimiter); | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  |             cursor.insertText(snippet.mid(start, pos - start)); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             // the start of a place holder.
 | 
					
						
							|  |  |  |             const int start = ++pos; | 
					
						
							|  |  |  |             for (; pos < snippet.size(); ++pos) { | 
					
						
							| 
									
										
										
										
											2010-10-27 17:38:22 +02:00
										 |  |  |                 if (snippet.at(pos) == Snippet::kVariableDelimiter) | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  |                     break; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             Q_ASSERT(pos < snippet.size()); | 
					
						
							| 
									
										
										
										
											2010-10-27 17:38:22 +02:00
										 |  |  |             Q_ASSERT(snippet.at(pos) == Snippet::kVariableDelimiter); | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             const QString textToInsert = snippet.mid(start, pos - start); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             int cursorPosition = cursor.position(); | 
					
						
							|  |  |  |             cursor.insertText(textToInsert); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 16:18:28 +01:00
										 |  |  |             if (textToInsert.isEmpty()) { | 
					
						
							|  |  |  |                 positions.insert(cursorPosition, 0); | 
					
						
							|  |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2010-08-24 12:28:51 +02:00
										 |  |  |                 positions.insert(cursorPosition, textToInsert.length()); | 
					
						
							| 
									
										
										
										
											2010-01-19 16:18:28 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             ++pos; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 16:18:28 +01:00
										 |  |  |     QMapIterator<int,int> it(positions); | 
					
						
							|  |  |  |     while (it.hasNext()) { | 
					
						
							|  |  |  |         it.next(); | 
					
						
							|  |  |  |         int length = it.value(); | 
					
						
							|  |  |  |         int position = it.key(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         QTextCursor tc(document()); | 
					
						
							|  |  |  |         tc.setPosition(position); | 
					
						
							|  |  |  |         tc.setPosition(position + length, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         QTextEdit::ExtraSelection selection; | 
					
						
							|  |  |  |         selection.cursor = tc; | 
					
						
							| 
									
										
										
										
											2010-03-29 16:44:27 +02:00
										 |  |  |         selection.format = (length ? d->m_occurrencesFormat : d->m_occurrenceRenameFormat); | 
					
						
							| 
									
										
										
										
											2010-01-19 16:18:28 +01:00
										 |  |  |         selections.append(selection); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  |     cursor.setPosition(startCursorPosition, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     indent(cursor.document(), cursor, QChar()); | 
					
						
							| 
									
										
										
										
											2010-01-19 16:18:28 +01:00
										 |  |  |     cursor.endEditBlock(); | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |     setExtraSelections(BaseTextEditorWidget::SnippetPlaceholderSelection, selections); | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (! selections.isEmpty()) { | 
					
						
							|  |  |  |         const QTextEdit::ExtraSelection &selection = selections.first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2010-01-19 18:50:50 +01:00
										 |  |  |         if (selection.cursor.hasSelection()) { | 
					
						
							| 
									
										
										
										
											2010-08-24 12:28:51 +02:00
										 |  |  |             cursor.setPosition(selection.cursor.selectionStart()); | 
					
						
							| 
									
										
										
										
											2010-01-19 18:50:50 +01:00
										 |  |  |             cursor.setPosition(selection.cursor.selectionEnd(), QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             cursor.setPosition(selection.cursor.position()); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-01-19 15:59:09 +01:00
										 |  |  |         setTextCursor(cursor); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-03-29 16:44:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::universalHelper() | 
					
						
							| 
									
										
										
										
											2010-01-19 16:36:48 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-03 14:58:09 +01:00
										 |  |  |     // Test function for development. Place your new fangled experiment here to
 | 
					
						
							|  |  |  |     // give it proper scrutiny before pushing it onto others.
 | 
					
						
							| 
									
										
										
										
											2010-01-19 16:36:48 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setTextCursor(const QTextCursor &cursor) | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     // workaround for QTextControl bug
 | 
					
						
							|  |  |  |     bool selectionChange = cursor.hasSelection() || textCursor().hasSelection(); | 
					
						
							| 
									
										
										
										
											2009-12-03 19:58:44 +01:00
										 |  |  |     QTextCursor c = cursor; | 
					
						
							|  |  |  |     c.setVisualNavigation(true); | 
					
						
							|  |  |  |     QPlainTextEdit::setTextCursor(c); | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  |     if (selectionChange) | 
					
						
							|  |  |  |         slotSelectionChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::gotoLine(int line, int column) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-19 15:17:05 +01:00
										 |  |  |     d->m_lastCursorChangeWasInteresting = false; // avoid adding the previous position to history
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     const int blockNumber = line - 1; | 
					
						
							|  |  |  |     const QTextBlock &block = document()->findBlockByNumber(blockNumber); | 
					
						
							|  |  |  |     if (block.isValid()) { | 
					
						
							|  |  |  |         QTextCursor cursor(block); | 
					
						
							|  |  |  |         if (column > 0) { | 
					
						
							|  |  |  |             cursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, column); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             int pos = cursor.position(); | 
					
						
							|  |  |  |             while (characterAt(pos).category() == QChar::Separator_Space) { | 
					
						
							|  |  |  |                 ++pos; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             cursor.setPosition(pos); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         setTextCursor(cursor); | 
					
						
							|  |  |  |         centerCursor(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-03-19 15:01:12 +01:00
										 |  |  |     saveCurrentCursorPositionForNavigation(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditorWidget::position(ITextEditor::PositionOperation posOp, int at) const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor tc = textCursor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (at != -1) | 
					
						
							|  |  |  |         tc.setPosition(at); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (posOp == ITextEditor::Current) | 
					
						
							|  |  |  |         return tc.position(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (posOp) { | 
					
						
							|  |  |  |     case ITextEditor::EndOfLine: | 
					
						
							|  |  |  |         tc.movePosition(QTextCursor::EndOfLine); | 
					
						
							|  |  |  |         return tc.position(); | 
					
						
							|  |  |  |     case ITextEditor::StartOfLine: | 
					
						
							|  |  |  |         tc.movePosition(QTextCursor::StartOfLine); | 
					
						
							|  |  |  |         return tc.position(); | 
					
						
							|  |  |  |     case ITextEditor::Anchor: | 
					
						
							|  |  |  |         if (tc.hasSelection()) | 
					
						
							|  |  |  |             return tc.anchor(); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case ITextEditor::EndOfDoc: | 
					
						
							|  |  |  |         tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  |         return tc.position(); | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::convertPosition(int pos, int *line, int *column) const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  |     Convenience::convertPosition(document(), pos, line, column); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QChar BaseTextEditorWidget::characterAt(int pos) const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return document()->characterAt(pos); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::event(QEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-19 14:18:26 +01:00
										 |  |  |     d->m_contentsChanged = false; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     switch (e->type()) { | 
					
						
							|  |  |  |     case QEvent::ShortcutOverride: | 
					
						
							| 
									
										
										
										
											2010-01-19 18:50:50 +01:00
										 |  |  |         if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape && d->m_snippetOverlay->isVisible()) { | 
					
						
							|  |  |  |             e->accept(); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-04-23 14:41:55 +02:00
										 |  |  |         e->ignore(); // we are a really nice citizen
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2010-01-19 18:50:50 +01:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     default: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return QPlainTextEdit::event(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::duplicateFrom(BaseTextEditorWidget *widget) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |     if (this == widget) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         return; | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |     setDisplayName(widget->displayName()); | 
					
						
							|  |  |  |     d->m_revisionsVisible = widget->d->m_revisionsVisible; | 
					
						
							|  |  |  |     if (d->m_document == widget->d->m_document) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         return; | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |     d->setupDocumentSignals(widget->d->m_document); | 
					
						
							|  |  |  |     d->m_document = widget->d->m_document; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QString BaseTextEditorWidget::displayName() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_displayName; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setDisplayName(const QString &title) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_displayName = title; | 
					
						
							| 
									
										
										
										
											2010-11-30 12:55:41 +01:00
										 |  |  |     emit changed(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | BaseTextDocument *BaseTextEditorWidget::baseTextDocument() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_document; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setBaseTextDocument(BaseTextDocument *doc) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (doc) { | 
					
						
							|  |  |  |         d->setupDocumentSignals(doc); | 
					
						
							|  |  |  |         d->m_document = doc; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::documentAboutToBeReloaded() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-06-24 20:13:13 +02:00
										 |  |  |     //memorize cursor position
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     d->m_tempState = saveState(); | 
					
						
							| 
									
										
										
										
											2010-06-24 20:13:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // remove extra selections (loads of QTextCursor objects)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (int i = 0; i < NExtraSelectionKinds; ++i) | 
					
						
							|  |  |  |         d->m_extraSelections[i].clear(); | 
					
						
							|  |  |  |     QPlainTextEdit::setExtraSelections(QList<QTextEdit::ExtraSelection>()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // clear all overlays
 | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |     d->m_overlay->clear(); | 
					
						
							|  |  |  |     d->m_snippetOverlay->clear(); | 
					
						
							|  |  |  |     d->m_searchResultOverlay->clear(); | 
					
						
							|  |  |  |     d->m_refactorOverlay->clear(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::documentReloaded() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-06-24 20:13:13 +02:00
										 |  |  |     // restore cursor position
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     restoreState(d->m_tempState); | 
					
						
							| 
									
										
										
										
											2011-05-06 12:48:44 +02:00
										 |  |  |     updateCannotDecodeInfo(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QByteArray BaseTextEditorWidget::saveState() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QByteArray state; | 
					
						
							|  |  |  |     QDataStream stream(&state, QIODevice::WriteOnly); | 
					
						
							| 
									
										
										
										
											2010-03-15 12:26:16 +01:00
										 |  |  |     stream << 1; // version number
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     stream << verticalScrollBar()->value(); | 
					
						
							|  |  |  |     stream << horizontalScrollBar()->value(); | 
					
						
							|  |  |  |     int line, column; | 
					
						
							|  |  |  |     convertPosition(textCursor().position(), &line, &column); | 
					
						
							|  |  |  |     stream << line; | 
					
						
							|  |  |  |     stream << column; | 
					
						
							| 
									
										
										
										
											2010-03-15 12:26:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // store code folding state
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     QList<int> foldedBlocks; | 
					
						
							| 
									
										
										
										
											2010-03-15 12:26:16 +01:00
										 |  |  |     QTextBlock block = document()->firstBlock(); | 
					
						
							|  |  |  |     while (block.isValid()) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         if (block.userData() && static_cast<TextBlockUserData*>(block.userData())->folded()) { | 
					
						
							| 
									
										
										
										
											2010-03-15 12:26:16 +01:00
										 |  |  |             int number = block.blockNumber(); | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             foldedBlocks += number; | 
					
						
							| 
									
										
										
										
											2010-03-15 12:26:16 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |         block = block.next(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     stream << foldedBlocks; | 
					
						
							| 
									
										
										
										
											2010-03-15 12:26:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return state; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::restoreState(const QByteArray &state) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-03-15 13:16:40 +01:00
										 |  |  |     if (state.isEmpty()) { | 
					
						
							|  |  |  |         if (d->m_displaySettings.m_autoFoldFirstComment) | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             d->foldLicenseHeader(); | 
					
						
							| 
									
										
										
										
											2010-03-15 13:16:40 +01:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     int version; | 
					
						
							|  |  |  |     int vval; | 
					
						
							|  |  |  |     int hval; | 
					
						
							|  |  |  |     int lval; | 
					
						
							|  |  |  |     int cval; | 
					
						
							|  |  |  |     QDataStream stream(state); | 
					
						
							|  |  |  |     stream >> version; | 
					
						
							|  |  |  |     stream >> vval; | 
					
						
							|  |  |  |     stream >> hval; | 
					
						
							|  |  |  |     stream >> lval; | 
					
						
							|  |  |  |     stream >> cval; | 
					
						
							| 
									
										
										
										
											2010-03-15 12:26:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (version >= 1) { | 
					
						
							|  |  |  |         QList<int> collapsedBlocks; | 
					
						
							|  |  |  |         stream >> collapsedBlocks; | 
					
						
							|  |  |  |         QTextDocument *doc = document(); | 
					
						
							|  |  |  |         foreach(int blockNumber, collapsedBlocks) { | 
					
						
							|  |  |  |             QTextBlock block = doc->findBlockByNumber(qMax(0, blockNumber)); | 
					
						
							|  |  |  |             if (block.isValid()) | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                 BaseTextDocumentLayout::doFoldOrUnfold(block, false); | 
					
						
							| 
									
										
										
										
											2010-03-15 12:26:16 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-03-15 13:16:40 +01:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         if (d->m_displaySettings.m_autoFoldFirstComment) | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             d->foldLicenseHeader(); | 
					
						
							| 
									
										
										
										
											2010-03-15 12:26:16 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-19 15:01:12 +01:00
										 |  |  |     d->m_lastCursorChangeWasInteresting = false; // avoid adding last position to history
 | 
					
						
							|  |  |  |     gotoLine(lval, cval); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     verticalScrollBar()->setValue(vval); | 
					
						
							|  |  |  |     horizontalScrollBar()->setValue(hval); | 
					
						
							| 
									
										
										
										
											2009-03-19 15:01:12 +01:00
										 |  |  |     saveCurrentCursorPositionForNavigation(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setDefaultPath(const QString &defaultPath) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     baseTextDocument()->setDefaultPath(defaultPath); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setSuggestedFileName(const QString &suggestedFileName) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     baseTextDocument()->setSuggestedFileName(suggestedFileName); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setParenthesesMatchingEnabled(bool b) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_parenthesesMatchingEnabled = b; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::isParenthesesMatchingEnabled() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_parenthesesMatchingEnabled; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setHighlightCurrentLine(bool b) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_highlightCurrentLine = b; | 
					
						
							| 
									
										
										
										
											2009-07-15 16:10:15 +02:00
										 |  |  |     updateCurrentLineHighlight(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::highlightCurrentLine() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_highlightCurrentLine; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setLineNumbersVisible(bool b) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_lineNumbersVisible = b; | 
					
						
							|  |  |  |     slotUpdateExtraAreaWidth(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::lineNumbersVisible() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_lineNumbersVisible; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setMarksVisible(bool b) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_marksVisible = b; | 
					
						
							|  |  |  |     slotUpdateExtraAreaWidth(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::marksVisible() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_marksVisible; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setRequestMarkEnabled(bool b) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_requestMarkEnabled = b; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::requestMarkEnabled() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_requestMarkEnabled; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setLineSeparatorsAllowed(bool b) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_lineSeparatorsAllowed = b; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::lineSeparatorsAllowed() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_lineSeparatorsAllowed; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::updateCodeFoldingVisible() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-10 15:09:18 +01:00
										 |  |  |     const bool visible = d->m_codeFoldingSupported && d->m_displaySettings.m_displayFoldingMarkers; | 
					
						
							|  |  |  |     if (d->m_codeFoldingVisible != visible) { | 
					
						
							|  |  |  |         d->m_codeFoldingVisible = visible; | 
					
						
							|  |  |  |         slotUpdateExtraAreaWidth(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::codeFoldingVisible() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_codeFoldingVisible; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-16 17:23:50 +01:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Sets whether code folding is supported by the syntax highlighter. When not | 
					
						
							|  |  |  |  * supported (the default), this makes sure the code folding is not shown. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Needs to be called before calling setCodeFoldingVisible. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setCodeFoldingSupported(bool b) | 
					
						
							| 
									
										
										
										
											2009-03-16 17:23:50 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_codeFoldingSupported = b; | 
					
						
							| 
									
										
										
										
											2010-11-10 15:09:18 +01:00
										 |  |  |     updateCodeFoldingVisible(); | 
					
						
							| 
									
										
										
										
											2009-03-16 17:23:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::codeFoldingSupported() const | 
					
						
							| 
									
										
										
										
											2009-03-16 17:23:50 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_codeFoldingSupported; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setMouseNavigationEnabled(bool b) | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-09 16:27:34 +01:00
										 |  |  |     d->m_behaviorSettings.m_mouseNavigation = b; | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::mouseNavigationEnabled() const | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-09 16:27:34 +01:00
										 |  |  |     return d->m_behaviorSettings.m_mouseNavigation; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setScrollWheelZoomingEnabled(bool b) | 
					
						
							| 
									
										
										
										
											2009-12-09 16:27:34 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_behaviorSettings.m_scrollWheelZooming = b; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::scrollWheelZoomingEnabled() const | 
					
						
							| 
									
										
										
										
											2009-12-09 16:27:34 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_behaviorSettings.m_scrollWheelZooming; | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setRevisionsVisible(bool b) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_revisionsVisible = b; | 
					
						
							|  |  |  |     slotUpdateExtraAreaWidth(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::revisionsVisible() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_revisionsVisible; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setVisibleWrapColumn(int column) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_visibleWrapColumn = column; | 
					
						
							|  |  |  |     viewport()->update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditorWidget::visibleWrapColumn() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_visibleWrapColumn; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setIndenter(Indenter *indenter) | 
					
						
							| 
									
										
										
										
											2010-11-05 14:27:16 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     // clear out existing code formatter data
 | 
					
						
							|  |  |  |     for (QTextBlock it = document()->begin(); it.isValid(); it = it.next()) { | 
					
						
							|  |  |  |         TextEditor::TextBlockUserData *userData = BaseTextDocumentLayout::testUserData(it); | 
					
						
							|  |  |  |         if (userData) | 
					
						
							|  |  |  |             userData->setCodeFormatterData(0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     d->m_indenter.reset(indenter); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | Indenter *BaseTextEditorWidget::indenter() const | 
					
						
							| 
									
										
										
										
											2010-11-09 10:36:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_indenter.data(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setAutoCompleter(AutoCompleter *autoCompleter) | 
					
						
							| 
									
										
										
										
											2010-11-08 16:11:26 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_autoCompleter.reset(autoCompleter); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | AutoCompleter *BaseTextEditorWidget::autoCompleter() const | 
					
						
							| 
									
										
										
										
											2010-11-08 16:11:26 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_autoCompleter.data(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | //--------- BaseTextEditorPrivate -----------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | BaseTextEditorPrivate::BaseTextEditorPrivate() | 
					
						
							|  |  |  |     : | 
					
						
							| 
									
										
										
										
											2010-06-04 11:47:39 +02:00
										 |  |  |     m_lastScrollPos(-1), | 
					
						
							|  |  |  |     m_lineNumber(-1), | 
					
						
							|  |  |  |     q(0), | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     m_contentsChanged(false), | 
					
						
							| 
									
										
										
										
											2009-03-19 14:18:26 +01:00
										 |  |  |     m_lastCursorChangeWasInteresting(false), | 
					
						
							| 
									
										
										
										
											2010-05-11 11:33:31 +02:00
										 |  |  |     m_document(new BaseTextDocument), | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     m_parenthesesMatchingEnabled(false), | 
					
						
							| 
									
										
										
										
											2010-06-04 11:47:39 +02:00
										 |  |  |     m_updateTimer(0), | 
					
						
							|  |  |  |     m_formatRange(false), | 
					
						
							|  |  |  |     m_parenthesesMatchingTimer(0), | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     m_extraArea(0), | 
					
						
							| 
									
										
										
										
											2011-02-03 15:48:14 +01:00
										 |  |  |     m_tabPreferences(0), | 
					
						
							|  |  |  |     m_codeStylePreferences(0), | 
					
						
							| 
									
										
										
										
											2010-06-04 11:47:39 +02:00
										 |  |  |     extraAreaSelectionAnchorBlockNumber(-1), | 
					
						
							|  |  |  |     extraAreaToggleMarkBlockNumber(-1), | 
					
						
							|  |  |  |     extraAreaHighlightFoldedBlockNumber(-1), | 
					
						
							|  |  |  |     m_overlay(0), | 
					
						
							|  |  |  |     m_snippetOverlay(0), | 
					
						
							|  |  |  |     m_searchResultOverlay(0), | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |     m_refactorOverlay(0), | 
					
						
							| 
									
										
										
										
											2010-06-04 11:47:39 +02:00
										 |  |  |     visibleFoldedBlockNumber(-1), | 
					
						
							|  |  |  |     suggestedVisibleFoldedBlockNumber(-1), | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     m_mouseOnFoldedMarker(false), | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     m_marksVisible(false), | 
					
						
							|  |  |  |     m_codeFoldingVisible(false), | 
					
						
							| 
									
										
										
										
											2009-03-16 17:23:50 +01:00
										 |  |  |     m_codeFoldingSupported(false), | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     m_revisionsVisible(false), | 
					
						
							|  |  |  |     m_lineNumbersVisible(true), | 
					
						
							|  |  |  |     m_highlightCurrentLine(true), | 
					
						
							|  |  |  |     m_requestMarkEnabled(true), | 
					
						
							|  |  |  |     m_lineSeparatorsAllowed(false), | 
					
						
							|  |  |  |     m_visibleWrapColumn(0), | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |     m_linkPressed(false), | 
					
						
							| 
									
										
										
										
											2010-06-04 11:47:39 +02:00
										 |  |  |     m_delayedUpdateTimer(0), | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |     m_editor(0), | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     m_actionHack(0), | 
					
						
							|  |  |  |     m_inBlockSelectionMode(false), | 
					
						
							| 
									
										
										
										
											2009-12-01 15:55:55 +01:00
										 |  |  |     m_moveLineUndoHack(false), | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     m_findScopeVerticalBlockSelectionFirstColumn(-1), | 
					
						
							|  |  |  |     m_findScopeVerticalBlockSelectionLastColumn(-1), | 
					
						
							| 
									
										
										
										
											2010-06-04 11:15:29 +02:00
										 |  |  |     m_highlightBlocksTimer(0), | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  |     m_codeAssistant(new CodeAssistant), | 
					
						
							|  |  |  |     m_assistRelevantContentAdded(false), | 
					
						
							| 
									
										
										
										
											2010-11-08 16:11:26 +01:00
										 |  |  |     m_cursorBlockNumber(-1), | 
					
						
							| 
									
										
										
										
											2010-11-09 10:36:02 +01:00
										 |  |  |     m_autoCompleter(new AutoCompleter), | 
					
						
							|  |  |  |     m_indenter(new Indenter) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | BaseTextEditorPrivate::~BaseTextEditorPrivate() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorPrivate::setupDocumentSignals(BaseTextDocument *document) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BaseTextDocument *oldDocument = q->baseTextDocument(); | 
					
						
							|  |  |  |     if (oldDocument) { | 
					
						
							|  |  |  |         q->disconnect(oldDocument->document(), 0, q, 0); | 
					
						
							|  |  |  |         q->disconnect(oldDocument, 0, q, 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument *doc = document->document(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     if (!documentLayout) { | 
					
						
							|  |  |  |         QTextOption opt = doc->defaultTextOption(); | 
					
						
							|  |  |  |         opt.setTextDirection(Qt::LeftToRight); | 
					
						
							|  |  |  |         opt.setFlags(opt.flags() | QTextOption::IncludeTrailingSpaces | 
					
						
							|  |  |  |                 | QTextOption::AddSpaceForLineAndParagraphSeparators | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |         doc->setDefaultTextOption(opt); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |         documentLayout = new BaseTextDocumentLayout(doc); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         doc->setDocumentLayout(documentLayout); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     q->setDocument(doc); | 
					
						
							| 
									
										
										
										
											2010-09-16 17:26:45 +02:00
										 |  |  |     q->setCursorWidth(2); // Applies to the document layout
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QObject::connect(documentLayout, SIGNAL(updateBlock(QTextBlock)), q, SLOT(slotUpdateBlockNotify(QTextBlock))); | 
					
						
							|  |  |  |     QObject::connect(q, SIGNAL(requestBlockUpdate(QTextBlock)), documentLayout, SIGNAL(updateBlock(QTextBlock))); | 
					
						
							|  |  |  |     QObject::connect(doc, SIGNAL(modificationChanged(bool)), q, SIGNAL(changed())); | 
					
						
							|  |  |  |     QObject::connect(doc, SIGNAL(contentsChange(int,int,int)), q, | 
					
						
							|  |  |  |         SLOT(editorContentsChange(int,int,int)), Qt::DirectConnection); | 
					
						
							|  |  |  |     QObject::connect(document, SIGNAL(changed()), q, SIGNAL(changed())); | 
					
						
							|  |  |  |     QObject::connect(document, SIGNAL(titleChanged(QString)), q, SLOT(setDisplayName(const QString &))); | 
					
						
							| 
									
										
										
										
											2010-06-24 20:13:13 +02:00
										 |  |  |     QObject::connect(document, SIGNAL(aboutToReload()), q, SLOT(documentAboutToBeReloaded())); | 
					
						
							|  |  |  |     QObject::connect(document, SIGNAL(reloaded()), q, SLOT(documentReloaded())); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     q->slotUpdateExtraAreaWidth(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  | bool BaseTextEditorPrivate::snippetCheckCursor(const QTextCursor &cursor) | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!m_snippetOverlay->isVisible() || m_snippetOverlay->isEmpty()) | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2010-01-19 12:53:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor start = cursor; | 
					
						
							|  |  |  |     start.setPosition(cursor.selectionStart()); | 
					
						
							|  |  |  |     QTextCursor end = cursor; | 
					
						
							|  |  |  |     end.setPosition(cursor.selectionEnd()); | 
					
						
							|  |  |  |     if (!m_snippetOverlay->hasCursorInSelection(start) | 
					
						
							| 
									
										
										
										
											2010-11-29 17:25:01 +01:00
										 |  |  |         || !m_snippetOverlay->hasCursorInSelection(end) | 
					
						
							|  |  |  |         || m_snippetOverlay->hasFirstSelectionBeginMoved()) { | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |         m_snippetOverlay->setVisible(false); | 
					
						
							|  |  |  |         m_snippetOverlay->clear(); | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |     return true; | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorPrivate::snippetTabOrBacktab(bool forward) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!m_snippetOverlay->isVisible() || m_snippetOverlay->isEmpty()) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     QTextCursor cursor = q->textCursor(); | 
					
						
							|  |  |  |     OverlaySelection final; | 
					
						
							|  |  |  |     if (forward) { | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         for (int i = 0; i < m_snippetOverlay->selections().count(); ++i){ | 
					
						
							|  |  |  |             const OverlaySelection &selection = m_snippetOverlay->selections().at(i); | 
					
						
							| 
									
										
										
										
											2010-01-19 18:50:50 +01:00
										 |  |  |             if (selection.m_cursor_begin.position() >= cursor.position() | 
					
						
							|  |  |  |                 && selection.m_cursor_end.position() > cursor.position()) { | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |                 final = selection; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         for (int i = m_snippetOverlay->selections().count()-1; i >= 0; --i){ | 
					
						
							|  |  |  |             const OverlaySelection &selection = m_snippetOverlay->selections().at(i); | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |             if (selection.m_cursor_end.position() < cursor.position()) { | 
					
						
							|  |  |  |                 final = selection; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (final.m_cursor_begin.isNull()) | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         final = forward ? m_snippetOverlay->selections().first() : m_snippetOverlay->selections().last(); | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (final.m_cursor_begin.position() == final.m_cursor_end.position()) { // empty tab stop
 | 
					
						
							|  |  |  |         cursor.setPosition(final.m_cursor_end.position()); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2010-08-24 12:28:51 +02:00
										 |  |  |         cursor.setPosition(final.m_cursor_begin.position()); | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |         cursor.setPosition(final.m_cursor_end.position(), QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     q->setTextCursor(cursor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:45:07 +01:00
										 |  |  | // Calculate global position for a tooltip considering the left extra area.
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QPoint BaseTextEditorWidget::toolTipPosition(const QTextCursor &c) const | 
					
						
							| 
									
										
										
										
											2011-02-21 16:45:07 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     const QPoint cursorPos = mapToGlobal(cursorRect(c).bottomRight() + QPoint(1,1)); | 
					
						
							|  |  |  |     return cursorPos + QPoint(d->m_extraArea->width(), | 
					
						
							|  |  |  | #ifdef Q_WS_WIN
 | 
					
						
							|  |  |  |     -24 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     -16 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::viewportEvent(QEvent *event) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-19 14:18:26 +01:00
										 |  |  |     d->m_contentsChanged = false; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     if (event->type() == QEvent::ContextMenu) { | 
					
						
							|  |  |  |         const QContextMenuEvent *ce = static_cast<QContextMenuEvent*>(event); | 
					
						
							|  |  |  |         if (ce->reason() == QContextMenuEvent::Mouse && !textCursor().hasSelection()) | 
					
						
							|  |  |  |             setTextCursor(cursorForPosition(ce->pos())); | 
					
						
							|  |  |  |     } else if (event->type() == QEvent::ToolTip) { | 
					
						
							|  |  |  |         const QHelpEvent *he = static_cast<QHelpEvent*>(event); | 
					
						
							| 
									
										
										
										
											2009-04-24 18:16:30 +02:00
										 |  |  |         if (QApplication::keyboardModifiers() & Qt::ControlModifier) | 
					
						
							|  |  |  |             return true; // eat tooltip event when control is pressed
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         const QPoint &pos = he->pos(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |         RefactorMarker refactorMarker = d->m_refactorOverlay->markerAt(pos); | 
					
						
							|  |  |  |         if (refactorMarker.isValid() && !refactorMarker.tooltip.isEmpty()) { | 
					
						
							| 
									
										
										
										
											2010-08-23 15:21:02 +02:00
										 |  |  |             ToolTip::instance()->show(he->globalPos(), | 
					
						
							|  |  |  |                                       TextContent(refactorMarker.tooltip), | 
					
						
							|  |  |  |                                       viewport(), | 
					
						
							|  |  |  |                                       refactorMarker.rect); | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         // Allow plugins to show tooltips
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:45:07 +01:00
										 |  |  |         const QTextCursor c = cursorForPosition(pos); | 
					
						
							|  |  |  |         const QPoint toolTipPoint = toolTipPosition(c); | 
					
						
							| 
									
										
										
										
											2011-01-04 13:58:05 +01:00
										 |  |  |         bool handled = false; | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |         BaseTextEditor *ed = editor(); | 
					
						
							|  |  |  |         emit ed->tooltipOverrideRequested(ed, toolTipPoint, c.position(), &handled); | 
					
						
							| 
									
										
										
										
											2011-01-04 13:58:05 +01:00
										 |  |  |         if (!handled) | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |             emit ed->tooltipRequested(ed, toolTipPoint, c.position()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return QPlainTextEdit::viewportEvent(event); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::resizeEvent(QResizeEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QPlainTextEdit::resizeEvent(e); | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     QRect cr = rect(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     d->m_extraArea->setGeometry( | 
					
						
							|  |  |  |         QStyle::visualRect(layoutDirection(), cr, | 
					
						
							|  |  |  |                            QRect(cr.left(), cr.top(), extraAreaWidth(), cr.height()))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QRect BaseTextEditorWidget::foldBox() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     if (d->m_highlightBlocksInfo.isEmpty() || d->extraAreaHighlightFoldedBlockNumber < 0) | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |         return QRect(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |     QTextBlock begin = document()->findBlockByNumber(d->m_highlightBlocksInfo.open.last()); | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-27 14:10:54 +02:00
										 |  |  |     QTextBlock end = document()->findBlockByNumber(d->m_highlightBlocksInfo.close.first()); | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |     if (!begin.isValid() || !end.isValid()) | 
					
						
							|  |  |  |         return QRect(); | 
					
						
							|  |  |  |     QRectF br = blockBoundingGeometry(begin).translated(contentOffset()); | 
					
						
							|  |  |  |     QRectF er = blockBoundingGeometry(end).translated(contentOffset()); | 
					
						
							| 
									
										
										
										
											2009-06-05 16:16:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     return QRect(d->m_extraArea->width() - foldBoxWidth(fontMetrics()), | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |                  int(br.top()), | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                  foldBoxWidth(fontMetrics()), | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |                  er.bottom() - br.top()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QTextBlock BaseTextEditorWidget::foldedBlockAt(const QPoint &pos, QRect *box) const | 
					
						
							| 
									
										
										
										
											2010-04-26 14:02:09 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QPointF offset(contentOffset()); | 
					
						
							|  |  |  |     QTextBlock block = firstVisibleBlock(); | 
					
						
							| 
									
										
										
										
											2010-05-31 15:03:38 +02:00
										 |  |  |     qreal top = blockBoundingGeometry(block).translated(offset).top(); | 
					
						
							|  |  |  |     qreal bottom = top + blockBoundingRect(block).height(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     int viewportHeight = viewport()->height(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (block.isValid() && top <= viewportHeight) { | 
					
						
							|  |  |  |         QTextBlock nextBlock = block.next(); | 
					
						
							|  |  |  |         if (block.isVisible() && bottom >= 0) { | 
					
						
							|  |  |  |             if (nextBlock.isValid() && !nextBlock.isVisible()) { | 
					
						
							|  |  |  |                 QTextLayout *layout = block.layout(); | 
					
						
							|  |  |  |                 QTextLine line = layout->lineAt(layout->lineCount()-1); | 
					
						
							|  |  |  |                 QRectF lineRect = line.naturalTextRect().translated(offset.x(), top); | 
					
						
							|  |  |  |                 lineRect.adjust(0, 0, -1, -1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 QRectF collapseRect(lineRect.right() + 12, | 
					
						
							|  |  |  |                                     lineRect.top(), | 
					
						
							|  |  |  |                                     fontMetrics().width(QLatin1String(" {...}; ")), | 
					
						
							|  |  |  |                                     lineRect.height()); | 
					
						
							|  |  |  |                 if (collapseRect.contains(pos)) { | 
					
						
							|  |  |  |                     QTextBlock result = block; | 
					
						
							|  |  |  |                     if (box) | 
					
						
							|  |  |  |                         *box = collapseRect.toAlignedRect(); | 
					
						
							|  |  |  |                     return result; | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     block = nextBlock; | 
					
						
							|  |  |  |                     while (nextBlock.isValid() && !nextBlock.isVisible()) { | 
					
						
							|  |  |  |                         block = nextBlock; | 
					
						
							|  |  |  |                         nextBlock = block.next(); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         block = nextBlock; | 
					
						
							|  |  |  |         top = bottom; | 
					
						
							| 
									
										
										
										
											2010-05-31 15:03:38 +02:00
										 |  |  |         bottom = top + blockBoundingRect(block).height(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     return QTextBlock(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 14:47:10 +01:00
										 |  |  | void BaseTextEditorPrivate::highlightSearchResults(const QTextBlock &block, | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |                                                    TextEditorOverlay *overlay) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (m_searchExpr.isEmpty()) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 19:44:31 +01:00
										 |  |  |     int blockPosition = block.position(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor cursor = q->textCursor(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QString text = block.text(); | 
					
						
							|  |  |  |     text.replace(QChar::Nbsp, QLatin1Char(' ')); | 
					
						
							|  |  |  |     int idx = -1; | 
					
						
							| 
									
										
										
										
											2009-12-02 13:31:17 +01:00
										 |  |  |     int l = 1; | 
					
						
							| 
									
										
										
										
											2010-04-12 20:49:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     while (idx < text.length()) { | 
					
						
							| 
									
										
										
										
											2009-12-02 13:31:17 +01:00
										 |  |  |         idx = m_searchExpr.indexIn(text, idx + l); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         if (idx < 0) | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2009-12-02 13:31:17 +01:00
										 |  |  |         l = m_searchExpr.matchedLength(); | 
					
						
							| 
									
										
										
										
											2010-04-26 19:37:19 +02:00
										 |  |  |         if (l == 0) | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2010-07-15 13:30:04 +02:00
										 |  |  |         if ((m_findFlags & Find::FindWholeWords) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             && ((idx && text.at(idx-1).isLetterOrNumber()) | 
					
						
							|  |  |  |                 || (idx + l < text.length() && text.at(idx + l).isLetterOrNumber()))) | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         if (!q->inFindScope(blockPosition + idx, blockPosition + idx + l)) | 
					
						
							|  |  |  |             continue; | 
					
						
							| 
									
										
										
										
											2009-12-01 14:47:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-12 20:49:40 +02:00
										 |  |  |         overlay->addOverlaySelection(blockPosition + idx, | 
					
						
							|  |  |  |                                      blockPosition + idx + l, | 
					
						
							|  |  |  |                                      m_searchResultFormat.background().color().darker(120), | 
					
						
							|  |  |  |                                      QColor(), | 
					
						
							|  |  |  |                                      (idx == cursor.selectionStart() - blockPosition | 
					
						
							|  |  |  |                                       && idx + l == cursor.selectionEnd() - blockPosition)? | 
					
						
							|  |  |  |                                      TextEditorOverlay::DropShadow : 0); | 
					
						
							| 
									
										
										
										
											2009-12-01 14:47:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace TextEditor { | 
					
						
							|  |  |  |     namespace Internal { | 
					
						
							|  |  |  |         struct BlockSelectionData { | 
					
						
							|  |  |  |             int selectionIndex; | 
					
						
							|  |  |  |             int selectionStart; | 
					
						
							|  |  |  |             int selectionEnd; | 
					
						
							|  |  |  |             int firstColumn; | 
					
						
							|  |  |  |             int lastColumn; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorPrivate::clearBlockSelection() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_inBlockSelectionMode) { | 
					
						
							|  |  |  |         m_inBlockSelectionMode = false; | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         m_blockSelection.clear(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         QTextCursor cursor = q->textCursor(); | 
					
						
							|  |  |  |         cursor.clearSelection(); | 
					
						
							|  |  |  |         q->setTextCursor(cursor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString BaseTextEditorPrivate::copyBlockSelection() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     QString selection; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QTextCursor cursor = q->textCursor(); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     if (!m_inBlockSelectionMode) | 
					
						
							|  |  |  |         return selection; | 
					
						
							|  |  |  |     const TabSettings &ts = q->tabSettings(); | 
					
						
							|  |  |  |     QTextBlock block = m_blockSelection.firstBlock.block(); | 
					
						
							|  |  |  |     QTextBlock lastBlock = m_blockSelection.lastBlock.block(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     for (;;) { | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         QString text = block.text(); | 
					
						
							|  |  |  |         int startOffset = 0; | 
					
						
							|  |  |  |         int startPos = ts.positionAtColumn(text, m_blockSelection.firstVisualColumn, &startOffset); | 
					
						
							|  |  |  |         int endOffset = 0; | 
					
						
							|  |  |  |         int endPos = ts.positionAtColumn(text, m_blockSelection.lastVisualColumn, &endOffset); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         if (startPos == endPos) { | 
					
						
							|  |  |  |             selection += QString(endOffset - startOffset, QLatin1Char(' ')); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             if (startOffset < 0) | 
					
						
							|  |  |  |                 selection += QString(-startOffset, QLatin1Char(' ')); | 
					
						
							|  |  |  |             if (endOffset < 0) | 
					
						
							|  |  |  |                 --endPos; | 
					
						
							|  |  |  |             selection += text.mid(startPos, endPos - startPos); | 
					
						
							|  |  |  |             if (endOffset < 0) { | 
					
						
							|  |  |  |                 selection += QString(ts.m_tabSize + endOffset, QLatin1Char(' ')); | 
					
						
							|  |  |  |             } else if (endOffset > 0) { | 
					
						
							|  |  |  |                 selection += QString(endOffset, QLatin1Char(' ')); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (block == lastBlock) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         selection += QLatin1Char('\n'); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         block = block.next(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     return selection; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorPrivate::removeBlockSelection(const QString &text) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = q->textCursor(); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     if (!cursor.hasSelection() || !m_inBlockSelectionMode) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     int cursorPosition = cursor.selectionStart(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     cursor.clearSelection(); | 
					
						
							|  |  |  |     cursor.beginEditBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     const TabSettings &ts = q->tabSettings(); | 
					
						
							|  |  |  |     QTextBlock block = m_blockSelection.firstBlock.block(); | 
					
						
							|  |  |  |     QTextBlock lastBlock = m_blockSelection.lastBlock.block(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     for (;;) { | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         QString text = block.text(); | 
					
						
							|  |  |  |         int startOffset = 0; | 
					
						
							|  |  |  |         int startPos = ts.positionAtColumn(text, m_blockSelection.firstVisualColumn, &startOffset); | 
					
						
							|  |  |  |         int endOffset = 0; | 
					
						
							|  |  |  |         int endPos = ts.positionAtColumn(text, m_blockSelection.lastVisualColumn, &endOffset); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         cursor.setPosition(block.position() + startPos); | 
					
						
							|  |  |  |         cursor.setPosition(block.position() + endPos, QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         cursor.removeSelectedText(); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (startOffset < 0) | 
					
						
							|  |  |  |             cursor.insertText(QString(ts.m_tabSize + startOffset, QLatin1Char(' '))); | 
					
						
							|  |  |  |         if (endOffset < 0) | 
					
						
							|  |  |  |             cursor.insertText(QString(-endOffset, QLatin1Char(' '))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (block == lastBlock) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             break; | 
					
						
							|  |  |  |         block = block.next(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     cursor.setPosition(cursorPosition); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     if (!text.isEmpty()) | 
					
						
							|  |  |  |         cursor.insertText(text); | 
					
						
							|  |  |  |     cursor.endEditBlock(); | 
					
						
							|  |  |  |     q->setTextCursor(cursor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | void BaseTextEditorPrivate::moveCursorVisible(bool ensureVisible) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = q->textCursor(); | 
					
						
							|  |  |  |     if (!cursor.block().isVisible()) { | 
					
						
							|  |  |  |         cursor.setVisualNavigation(true); | 
					
						
							|  |  |  |         cursor.movePosition(QTextCursor::Up); | 
					
						
							|  |  |  |         q->setTextCursor(cursor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (ensureVisible) | 
					
						
							|  |  |  |         q->ensureCursorVisible(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-25 13:46:08 +01:00
										 |  |  | static QColor blendColors(const QColor &a, const QColor &b, int alpha) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return QColor((a.red()   * (256 - alpha) + b.red()   * alpha) / 256, | 
					
						
							|  |  |  |                   (a.green() * (256 - alpha) + b.green() * alpha) / 256, | 
					
						
							|  |  |  |                   (a.blue()  * (256 - alpha) + b.blue()  * alpha) / 256); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 11:43:13 +02:00
										 |  |  | static QColor calcBlendColor(const QColor &baseColor, int level, int count) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QColor color80; | 
					
						
							|  |  |  |     QColor color90; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (baseColor.value() > 128) { | 
					
						
							| 
									
										
										
										
											2009-07-20 18:22:55 +02:00
										 |  |  |         const int f90 = 15; | 
					
						
							|  |  |  |         const int f80 = 30; | 
					
						
							|  |  |  |         color80.setRgb(qMax(0, baseColor.red() - f80), | 
					
						
							|  |  |  |                        qMax(0, baseColor.green() - f80), | 
					
						
							|  |  |  |                        qMax(0, baseColor.blue() - f80)); | 
					
						
							|  |  |  |         color90.setRgb(qMax(0, baseColor.red() - f90), | 
					
						
							|  |  |  |                        qMax(0, baseColor.green() - f90), | 
					
						
							|  |  |  |                        qMax(0, baseColor.blue() - f90)); | 
					
						
							| 
									
										
										
										
											2009-04-28 11:43:13 +02:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2009-07-20 18:22:55 +02:00
										 |  |  |         const int f90 = 20; | 
					
						
							|  |  |  |         const int f80 = 40; | 
					
						
							|  |  |  |         color80.setRgb(qMin(255, baseColor.red() + f80), | 
					
						
							|  |  |  |                        qMin(255, baseColor.green() + f80), | 
					
						
							|  |  |  |                        qMin(255, baseColor.blue() + f80)); | 
					
						
							|  |  |  |         color90.setRgb(qMin(255, baseColor.red() + f90), | 
					
						
							|  |  |  |                        qMin(255, baseColor.green() + f90), | 
					
						
							|  |  |  |                        qMin(255, baseColor.blue() + f90)); | 
					
						
							| 
									
										
										
										
											2009-04-28 11:43:13 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (level == count) | 
					
						
							|  |  |  |         return baseColor; | 
					
						
							|  |  |  |     if (level == 0) | 
					
						
							|  |  |  |         return color80; | 
					
						
							|  |  |  |     if (level == count - 1) | 
					
						
							|  |  |  |         return color90; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const int blendFactor = level * (256 / (count - 2)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-25 13:46:08 +01:00
										 |  |  |     return blendColors(color80, color90, blendFactor); | 
					
						
							| 
									
										
										
										
											2009-04-28 11:43:13 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::paintEvent(QPaintEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |       Here comes an almost verbatim copy of | 
					
						
							|  |  |  |       QPlainTextEdit::paintEvent() so we can adjust the extra | 
					
						
							|  |  |  |       selections dynamically to indicate all search results. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     //begin QPlainTextEdit::paintEvent()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QPainter painter(viewport()); | 
					
						
							|  |  |  |     QTextDocument *doc = document(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  |     QTC_ASSERT(documentLayout, return); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QPointF offset(contentOffset()); | 
					
						
							| 
									
										
										
										
											2010-04-14 13:39:36 +02:00
										 |  |  |     QTextBlock textCursorBlock = textCursor().block(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 13:46:50 +02:00
										 |  |  |     bool hasMainSelection = textCursor().hasSelection(); | 
					
						
							| 
									
										
										
										
											2010-03-05 12:33:33 +01:00
										 |  |  |     bool suppressSyntaxInIfdefedOutBlock = (d->m_ifdefedOutFormat.foreground() | 
					
						
							|  |  |  |                                            != palette().foreground()); | 
					
						
							| 
									
										
										
										
											2009-05-04 13:46:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QRect er = e->rect(); | 
					
						
							|  |  |  |     QRect viewportRect = viewport()->rect(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 11:33:59 +02:00
										 |  |  |     qreal lineX = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-09 12:10:26 +01:00
										 |  |  |     if (d->m_visibleWrapColumn > 0) { | 
					
						
							| 
									
										
										
										
											2010-11-22 10:20:15 +01:00
										 |  |  |         // Don't use QFontMetricsF::averageCharWidth here, due to it returning
 | 
					
						
							|  |  |  |         // a fractional size even when this is not supported by the platform.
 | 
					
						
							|  |  |  |         lineX = QFontMetricsF(font()).width(QLatin1Char('x')) * d->m_visibleWrapColumn + offset.x() + 4; | 
					
						
							| 
									
										
										
										
											2010-01-25 14:25:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (lineX < viewportRect.width()) { | 
					
						
							| 
									
										
										
										
											2010-02-02 16:46:43 +01:00
										 |  |  |             const QBrush background = d->m_ifdefedOutFormat.background(); | 
					
						
							| 
									
										
										
										
											2010-01-25 14:25:00 +01:00
										 |  |  |             painter.fillRect(QRectF(lineX, er.top(), viewportRect.width() - lineX, er.height()), | 
					
						
							| 
									
										
										
										
											2010-02-02 16:46:43 +01:00
										 |  |  |                              background); | 
					
						
							| 
									
										
										
										
											2010-01-25 14:25:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             const QColor col = (palette().base().color().value() > 128) ? Qt::black : Qt::white; | 
					
						
							|  |  |  |             const QPen pen = painter.pen(); | 
					
						
							| 
									
										
										
										
											2010-10-26 11:02:49 +02:00
										 |  |  |             painter.setPen(blendColors(background.isOpaque() ? background.color() : palette().base().color(), | 
					
						
							|  |  |  |                                        col, 32)); | 
					
						
							| 
									
										
										
										
											2010-01-25 14:25:00 +01:00
										 |  |  |             painter.drawLine(QPointF(lineX, er.top()), QPointF(lineX, er.bottom())); | 
					
						
							|  |  |  |             painter.setPen(pen); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-09 12:10:26 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-05-04 11:33:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-26 16:34:14 +01:00
										 |  |  |     // Set a brush origin so that the WaveUnderline knows where the wave started
 | 
					
						
							|  |  |  |     painter.setBrushOrigin(offset); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-23 20:11:00 +02:00
										 |  |  | //    // keep right margin clean from full-width selection
 | 
					
						
							|  |  |  | //    int maxX = offset.x() + qMax((qreal)viewportRect.width(), documentLayout->documentSize().width())
 | 
					
						
							|  |  |  | //               - doc->documentMargin();
 | 
					
						
							|  |  |  | //    er.setRight(qMin(er.right(), maxX));
 | 
					
						
							|  |  |  | //    painter.setClipRect(er);
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool editable = !isReadOnly(); | 
					
						
							|  |  |  |     QTextBlock block = firstVisibleBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QAbstractTextDocumentLayout::PaintContext context = getPaintContext(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-25 13:00:33 +01:00
										 |  |  |     if (!d->m_highlightBlocksInfo.isEmpty()) { | 
					
						
							| 
									
										
										
										
											2010-05-31 13:48:40 +02:00
										 |  |  |         const QColor baseColor = palette().base().color(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-25 13:00:33 +01:00
										 |  |  |         // extra pass for the block highlight
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const int margin = 5; | 
					
						
							|  |  |  |         QTextBlock blockFP = block; | 
					
						
							|  |  |  |         QPointF offsetFP = offset; | 
					
						
							|  |  |  |         while (blockFP.isValid()) { | 
					
						
							|  |  |  |             QRectF r = blockBoundingRect(blockFP).translated(offsetFP); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             int n = blockFP.blockNumber(); | 
					
						
							|  |  |  |             int depth = 0; | 
					
						
							|  |  |  |             foreach (int i, d->m_highlightBlocksInfo.open) | 
					
						
							|  |  |  |                 if (n >= i) | 
					
						
							|  |  |  |                     ++depth; | 
					
						
							|  |  |  |             foreach (int i, d->m_highlightBlocksInfo.close) | 
					
						
							|  |  |  |                 if (n > i) | 
					
						
							|  |  |  |                     --depth; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             int count = d->m_highlightBlocksInfo.count(); | 
					
						
							|  |  |  |             if (count) { | 
					
						
							|  |  |  |                 for (int i = 0; i <= depth; ++i) { | 
					
						
							| 
									
										
										
										
											2010-11-12 11:31:12 +01:00
										 |  |  |                     const QColor &blendedColor = calcBlendColor(baseColor, i, count); | 
					
						
							| 
									
										
										
										
											2010-02-25 13:00:33 +01:00
										 |  |  |                     int vi = i > 0 ? d->m_highlightBlocksInfo.visualIndent.at(i-1) : 0; | 
					
						
							| 
									
										
										
										
											2010-11-12 11:31:12 +01:00
										 |  |  |                     QRectF oneRect = r; | 
					
						
							|  |  |  |                     oneRect.setWidth(viewport()->width()); | 
					
						
							|  |  |  |                     oneRect.adjust(vi, 0, -8*i, 0); | 
					
						
							|  |  |  |                     if (oneRect.left() >= oneRect.right()) | 
					
						
							|  |  |  |                         continue; | 
					
						
							|  |  |  |                     if (lineX > 0 && oneRect.left() < lineX && oneRect.right() > lineX) { | 
					
						
							|  |  |  |                         QRectF otherRect = r; | 
					
						
							|  |  |  |                         otherRect.setLeft(lineX + 1); | 
					
						
							|  |  |  |                         otherRect.setRight(oneRect.right()); | 
					
						
							|  |  |  |                         oneRect.setRight(lineX - 1); | 
					
						
							|  |  |  |                         painter.fillRect(otherRect, blendedColor); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     painter.fillRect(oneRect, blendedColor); | 
					
						
							| 
									
										
										
										
											2010-02-25 13:00:33 +01:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             offsetFP.ry() += r.height(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (offsetFP.y() > viewportRect.height() + margin) | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             blockFP = blockFP.next(); | 
					
						
							|  |  |  |             if (!blockFP.isVisible()) { | 
					
						
							|  |  |  |                 // invisible blocks do have zero line count
 | 
					
						
							|  |  |  |                 blockFP = doc->findBlockByLineNumber(blockFP.firstLineNumber()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     int blockSelectionIndex = -1; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (d->m_inBlockSelectionMode | 
					
						
							|  |  |  |         && context.selections.count() && context.selections.last().cursor == textCursor()) { | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         blockSelectionIndex = context.selections.size()-1; | 
					
						
							|  |  |  |         context.selections[blockSelectionIndex].format.clearBackground(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextBlock visibleCollapsedBlock; | 
					
						
							|  |  |  |     QPointF visibleCollapsedBlockOffset; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     QTextLayout *cursor_layout = 0; | 
					
						
							|  |  |  |     QPointF cursor_offset; | 
					
						
							|  |  |  |     int cursor_cpos = 0; | 
					
						
							|  |  |  |     QPen cursor_pen; | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-26 15:26:30 +01:00
										 |  |  |     d->m_searchResultOverlay->clear(); | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |     if (!d->m_searchExpr.isEmpty()) { // first pass for the search result overlays
 | 
					
						
							| 
									
										
										
										
											2009-12-01 14:47:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |         const int margin = 5; | 
					
						
							|  |  |  |         QTextBlock blockFP = block; | 
					
						
							|  |  |  |         QPointF offsetFP = offset; | 
					
						
							|  |  |  |         while (blockFP.isValid()) { | 
					
						
							|  |  |  |             QRectF r = blockBoundingRect(blockFP).translated(offsetFP); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |             if (r.bottom() >= er.top() - margin && r.top() <= er.bottom() + margin) { | 
					
						
							|  |  |  |                 d->highlightSearchResults(blockFP, | 
					
						
							|  |  |  |                                           d->m_searchResultOverlay); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             offsetFP.ry() += r.height(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (offsetFP.y() > viewportRect.height() + margin) | 
					
						
							|  |  |  |                 break; | 
					
						
							| 
									
										
										
										
											2009-05-28 11:11:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |             blockFP = blockFP.next(); | 
					
						
							| 
									
										
										
										
											2010-02-25 13:00:33 +01:00
										 |  |  |             if (!blockFP.isVisible()) { | 
					
						
							|  |  |  |                 // invisible blocks do have zero line count
 | 
					
						
							|  |  |  |                 blockFP = doc->findBlockByLineNumber(blockFP.firstLineNumber()); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-10-08 12:57:26 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |     } // end first pass
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 13:24:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 13:47:45 +01:00
										 |  |  |     { // extra pass for ifdefed out blocks
 | 
					
						
							|  |  |  |         QTextBlock blockIDO = block; | 
					
						
							|  |  |  |         QPointF offsetIDO = offset; | 
					
						
							|  |  |  |         while (blockIDO.isValid()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             QRectF r = blockBoundingRect(blockIDO).translated(offsetIDO); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (r.bottom() >= er.top() && r.top() <= er.bottom()) { | 
					
						
							|  |  |  |                 if (BaseTextDocumentLayout::ifdefedOut(blockIDO)) { | 
					
						
							|  |  |  |                     QRectF rr = r; | 
					
						
							|  |  |  |                     rr.setRight(viewportRect.width() - offset.x()); | 
					
						
							|  |  |  |                     if (lineX > 0) | 
					
						
							|  |  |  |                         rr.setRight(qMin(lineX, rr.right())); | 
					
						
							|  |  |  |                     painter.fillRect(rr, d->m_ifdefedOutFormat.background()); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             offsetIDO.ry() += r.height(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (offsetIDO.y() > viewportRect.height()) | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             blockIDO = blockIDO.next(); | 
					
						
							|  |  |  |             if (!blockIDO.isVisible()) { | 
					
						
							|  |  |  |                 // invisible blocks do have zero line count
 | 
					
						
							|  |  |  |                 blockIDO = doc->findBlockByLineNumber(blockIDO.firstLineNumber()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     // possible extra pass for the block selection find scope
 | 
					
						
							|  |  |  |     if (!d->m_findScopeStart.isNull() && d->m_findScopeVerticalBlockSelectionFirstColumn >= 0) { | 
					
						
							|  |  |  |         QTextBlock blockFS = block; | 
					
						
							|  |  |  |         QPointF offsetFS = offset; | 
					
						
							|  |  |  |         while (blockFS.isValid()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             QRectF r = blockBoundingRect(blockFS).translated(offsetFS); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (r.bottom() >= er.top() && r.top() <= er.bottom()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (blockFS.position() >= d->m_findScopeStart.block().position() | 
					
						
							|  |  |  |                         && blockFS.position() <= d->m_findScopeEnd.block().position()) { | 
					
						
							|  |  |  |                     QTextLayout *layout = blockFS.layout(); | 
					
						
							|  |  |  |                     QString text = blockFS.text(); | 
					
						
							|  |  |  |                     const TabSettings &ts = tabSettings(); | 
					
						
							| 
									
										
										
										
											2010-08-06 16:23:13 +02:00
										 |  |  |                     qreal spacew = QFontMetricsF(font()).width(QLatin1Char(' ')); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     int offset = 0; | 
					
						
							|  |  |  |                     int relativePos  =  ts.positionAtColumn(text, | 
					
						
							|  |  |  |                                                             d->m_findScopeVerticalBlockSelectionFirstColumn, | 
					
						
							|  |  |  |                                                             &offset); | 
					
						
							|  |  |  |                     QTextLine line = layout->lineForTextPosition(relativePos); | 
					
						
							|  |  |  |                     qreal x = line.cursorToX(relativePos) + offset * spacew; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     int eoffset = 0; | 
					
						
							|  |  |  |                     int erelativePos  =  ts.positionAtColumn(text, | 
					
						
							|  |  |  |                                                              d->m_findScopeVerticalBlockSelectionLastColumn, | 
					
						
							|  |  |  |                                                              &eoffset); | 
					
						
							|  |  |  |                     QTextLine eline = layout->lineForTextPosition(erelativePos); | 
					
						
							|  |  |  |                     qreal ex = eline.cursorToX(erelativePos) + eoffset * spacew; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     QRectF rr = line.naturalTextRect(); | 
					
						
							|  |  |  |                     rr.moveTop(rr.top() + r.top()); | 
					
						
							|  |  |  |                     rr.setLeft(r.left() + x); | 
					
						
							|  |  |  |                     if (line.lineNumber() == eline.lineNumber())  { | 
					
						
							|  |  |  |                         rr.setRight(r.left() + ex); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     painter.fillRect(rr, d->m_searchScopeFormat.background()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-06 12:59:02 +02:00
										 |  |  |                     QColor lineCol = d->m_searchScopeFormat.foreground().color(); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |                     QPen pen = painter.pen(); | 
					
						
							|  |  |  |                     painter.setPen(lineCol); | 
					
						
							|  |  |  |                     if (blockFS == d->m_findScopeStart.block()) | 
					
						
							|  |  |  |                         painter.drawLine(rr.topLeft(), rr.topRight()); | 
					
						
							|  |  |  |                     if (blockFS == d->m_findScopeEnd.block()) | 
					
						
							|  |  |  |                         painter.drawLine(rr.bottomLeft(), rr.bottomRight()); | 
					
						
							|  |  |  |                     painter.drawLine(rr.topLeft(), rr.bottomLeft()); | 
					
						
							|  |  |  |                     painter.drawLine(rr.topRight(), rr.bottomRight()); | 
					
						
							|  |  |  |                     painter.setPen(pen); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             offsetFS.ry() += r.height(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (offsetFS.y() > viewportRect.height()) | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             blockFS = blockFS.next(); | 
					
						
							|  |  |  |             if (!blockFS.isVisible()) { | 
					
						
							|  |  |  |                 // invisible blocks do have zero line count
 | 
					
						
							|  |  |  |                 blockFS = doc->findBlockByLineNumber(blockFS.firstLineNumber()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 13:47:45 +01:00
										 |  |  |     if (!d->m_findScopeStart.isNull() && d->m_findScopeVerticalBlockSelectionFirstColumn < 0) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         TextEditorOverlay *overlay = new TextEditorOverlay(this); | 
					
						
							|  |  |  |         overlay->addOverlaySelection(d->m_findScopeStart.position(), | 
					
						
							|  |  |  |                                      d->m_findScopeEnd.position(), | 
					
						
							|  |  |  |                                      d->m_searchScopeFormat.foreground().color(), | 
					
						
							|  |  |  |                                      d->m_searchScopeFormat.background().color(), | 
					
						
							|  |  |  |                                      TextEditorOverlay::ExpandBegin); | 
					
						
							|  |  |  |         overlay->setAlpha(false); | 
					
						
							|  |  |  |         overlay->paint(&painter, e->rect()); | 
					
						
							|  |  |  |         delete overlay; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |     d->m_searchResultOverlay->fill(&painter, | 
					
						
							|  |  |  |                                    d->m_searchResultFormat.background().color(), | 
					
						
							|  |  |  |                                    e->rect()); | 
					
						
							| 
									
										
										
										
											2009-10-08 12:57:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |     while (block.isValid()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         QRectF r = blockBoundingRect(block).translated(offset); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (r.bottom() >= er.top() && r.top() <= er.bottom()) { | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |             QTextLayout *layout = block.layout(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |             QTextOption option = layout->textOption(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |             if (suppressSyntaxInIfdefedOutBlock && BaseTextDocumentLayout::ifdefedOut(block)) { | 
					
						
							| 
									
										
										
										
											2010-03-05 12:33:33 +01:00
										 |  |  |                 option.setFlags(option.flags() | QTextOption::SuppressColors); | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |                 painter.setPen(d->m_ifdefedOutFormat.foreground().color()); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 option.setFlags(option.flags() & ~QTextOption::SuppressColors); | 
					
						
							|  |  |  |                 painter.setPen(context.palette.text().color()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             layout->setTextOption(option); | 
					
						
							| 
									
										
										
										
											2010-04-16 13:04:33 +02:00
										 |  |  |             layout->setFont(doc->defaultFont()); // this really should be in qplaintextedit when creating the layout!
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             int blpos = block.position(); | 
					
						
							|  |  |  |             int bllen = block.length(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             QVector<QTextLayout::FormatRange> selections; | 
					
						
							| 
									
										
										
										
											2009-05-04 13:46:50 +02:00
										 |  |  |             QVector<QTextLayout::FormatRange> prioritySelections; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             for (int i = 0; i < context.selections.size(); ++i) { | 
					
						
							|  |  |  |                 const QAbstractTextDocumentLayout::Selection &range = context.selections.at(i); | 
					
						
							|  |  |  |                 const int selStart = range.cursor.selectionStart() - blpos; | 
					
						
							|  |  |  |                 const int selEnd = range.cursor.selectionEnd() - blpos; | 
					
						
							| 
									
										
										
										
											2010-05-21 16:06:31 +02:00
										 |  |  |                 if (selStart < bllen && selEnd >= 0 | 
					
						
							| 
									
										
										
										
											2010-05-19 10:36:05 +02:00
										 |  |  |                     && selEnd >= selStart) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                     QTextLayout::FormatRange o; | 
					
						
							|  |  |  |                     o.start = selStart; | 
					
						
							|  |  |  |                     o.length = selEnd - selStart; | 
					
						
							|  |  |  |                     o.format = range.format; | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |                     if (i == blockSelectionIndex) { | 
					
						
							|  |  |  |                         QString text = block.text(); | 
					
						
							|  |  |  |                         const TabSettings &ts = tabSettings(); | 
					
						
							|  |  |  |                         o.start = ts.positionAtColumn(text, d->m_blockSelection.firstVisualColumn); | 
					
						
							|  |  |  |                         o.length = ts.positionAtColumn(text, d->m_blockSelection.lastVisualColumn) - o.start; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2009-05-04 13:46:50 +02:00
										 |  |  |                     if ((hasMainSelection && i == context.selections.size()-1) | 
					
						
							|  |  |  |                         || (o.format.foreground().style() == Qt::NoBrush | 
					
						
							|  |  |  |                         && o.format.underlineStyle() != QTextCharFormat::NoUnderline | 
					
						
							|  |  |  |                         && o.format.background() == Qt::NoBrush)) | 
					
						
							|  |  |  |                         prioritySelections.append(o); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                     else | 
					
						
							|  |  |  |                         selections.append(o); | 
					
						
							| 
									
										
										
										
											2010-04-14 13:39:36 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  |                 // we disable fullwidth selection. It's only used for m_highlightCurrentLine which we
 | 
					
						
							|  |  |  |                 // do differently now
 | 
					
						
							|  |  |  |                 else if (!range.cursor.hasSelection() && range.format.hasProperty(QTextFormat::FullWidthSelection) | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  |                     && block.contains(range.cursor.position())) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                     // for full width selections we don't require an actual selection, just
 | 
					
						
							|  |  |  |                     // a position to specify the line. that's more convenience in usage.
 | 
					
						
							|  |  |  |                     QTextLayout::FormatRange o; | 
					
						
							|  |  |  |                     QTextLine l = layout->lineForTextPosition(range.cursor.position() - blpos); | 
					
						
							|  |  |  |                     o.start = l.textStart(); | 
					
						
							|  |  |  |                     o.length = l.textLength(); | 
					
						
							|  |  |  |                     if (o.start + o.length == bllen - 1) | 
					
						
							|  |  |  |                         ++o.length; // include newline
 | 
					
						
							|  |  |  |                     o.format = range.format; | 
					
						
							| 
									
										
										
										
											2009-05-04 13:46:50 +02:00
										 |  |  |                     selections.append(o); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-04-14 13:39:36 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-05-04 13:46:50 +02:00
										 |  |  |             selections += prioritySelections; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-14 13:39:36 +02:00
										 |  |  |             if (d->m_highlightCurrentLine && block == textCursorBlock) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 QRectF rr = layout->lineForTextPosition(textCursor().positionInBlock()).rect(); | 
					
						
							|  |  |  |                 rr.moveTop(rr.top() + r.top()); | 
					
						
							|  |  |  |                 rr.setLeft(0); | 
					
						
							|  |  |  |                 rr.setRight(viewportRect.width() - offset.x()); | 
					
						
							| 
									
										
										
										
											2010-05-20 17:00:10 +02:00
										 |  |  |                 QColor color = d->m_currentLineFormat.background().color(); | 
					
						
							|  |  |  |                 // set alpha, otherwise we cannot see block highlighting and find scope underneath
 | 
					
						
							|  |  |  |                 color.setAlpha(128); | 
					
						
							|  |  |  |                 painter.fillRect(rr, color); | 
					
						
							| 
									
										
										
										
											2010-04-14 13:39:36 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             QRectF blockSelectionCursorRect; | 
					
						
							|  |  |  |             if (d->m_inBlockSelectionMode | 
					
						
							|  |  |  |                     && block.position() >= d->m_blockSelection.firstBlock.block().position() | 
					
						
							|  |  |  |                     && block.position() <= d->m_blockSelection.lastBlock.block().position()) { | 
					
						
							|  |  |  |                 QString text = block.text(); | 
					
						
							|  |  |  |                 const TabSettings &ts = tabSettings(); | 
					
						
							| 
									
										
										
										
											2010-08-06 16:23:13 +02:00
										 |  |  |                 qreal spacew = QFontMetricsF(font()).width(QLatin1Char(' ')); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 int offset = 0; | 
					
						
							|  |  |  |                 int relativePos  =  ts.positionAtColumn(text, d->m_blockSelection.firstVisualColumn, &offset); | 
					
						
							|  |  |  |                 QTextLine line = layout->lineForTextPosition(relativePos); | 
					
						
							|  |  |  |                 qreal x = line.cursorToX(relativePos) + offset * spacew; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 int eoffset = 0; | 
					
						
							|  |  |  |                 int erelativePos  =  ts.positionAtColumn(text, d->m_blockSelection.lastVisualColumn, &eoffset); | 
					
						
							|  |  |  |                 QTextLine eline = layout->lineForTextPosition(erelativePos); | 
					
						
							|  |  |  |                 qreal ex = eline.cursorToX(erelativePos) + eoffset * spacew; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 QRectF rr = line.naturalTextRect(); | 
					
						
							|  |  |  |                 rr.moveTop(rr.top() + r.top()); | 
					
						
							|  |  |  |                 rr.setLeft(r.left() + x); | 
					
						
							|  |  |  |                 if (line.lineNumber() == eline.lineNumber())  { | 
					
						
							|  |  |  |                     rr.setRight(r.left() + ex); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 painter.fillRect(rr, palette().highlight()); | 
					
						
							|  |  |  |                 if ((d->m_blockSelection.anchor == BaseTextBlockSelection::TopLeft | 
					
						
							|  |  |  |                         && block == d->m_blockSelection.firstBlock.block()) | 
					
						
							|  |  |  |                         || (d->m_blockSelection.anchor == BaseTextBlockSelection::BottomLeft | 
					
						
							|  |  |  |                             && block == d->m_blockSelection.lastBlock.block()) | 
					
						
							|  |  |  |                         ) { | 
					
						
							|  |  |  |                     rr.setRight(rr.left()+2); | 
					
						
							|  |  |  |                     blockSelectionCursorRect = rr; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 for (int i = line.lineNumber() + 1; i < eline.lineNumber(); ++i) { | 
					
						
							|  |  |  |                     rr = layout->lineAt(i).naturalTextRect(); | 
					
						
							|  |  |  |                     rr.moveTop(rr.top() + r.top()); | 
					
						
							|  |  |  |                     rr.setLeft(r.left() + x); | 
					
						
							|  |  |  |                     painter.fillRect(rr, palette().highlight()); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 rr = eline.naturalTextRect(); | 
					
						
							|  |  |  |                 rr.moveTop(rr.top() + r.top()); | 
					
						
							|  |  |  |                 rr.setRight(r.left() + ex); | 
					
						
							|  |  |  |                 if (line.lineNumber() != eline.lineNumber()) | 
					
						
							|  |  |  |                     painter.fillRect(rr, palette().highlight()); | 
					
						
							|  |  |  |                 if ((d->m_blockSelection.anchor == BaseTextBlockSelection::TopRight | 
					
						
							|  |  |  |                      && block == d->m_blockSelection.firstBlock.block()) | 
					
						
							|  |  |  |                         || (d->m_blockSelection.anchor == BaseTextBlockSelection::BottomRight | 
					
						
							|  |  |  |                             && block == d->m_blockSelection.lastBlock.block())) { | 
					
						
							|  |  |  |                     rr.setLeft(rr.right()-2); | 
					
						
							|  |  |  |                     blockSelectionCursorRect = rr; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-16 13:04:33 +02:00
										 |  |  |             bool drawCursor = ((editable || true) // we want the cursor in read-only mode
 | 
					
						
							|  |  |  |                                && context.cursorPosition >= blpos | 
					
						
							|  |  |  |                                && context.cursorPosition < blpos + bllen); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             bool drawCursorAsBlock = drawCursor && overwriteMode() ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (drawCursorAsBlock) { | 
					
						
							|  |  |  |                 int relativePos = context.cursorPosition - blpos; | 
					
						
							| 
									
										
										
										
											2010-04-16 13:25:44 +02:00
										 |  |  |                 bool doSelection = true; | 
					
						
							| 
									
										
										
										
											2010-04-16 13:04:33 +02:00
										 |  |  |                 QTextLine line = layout->lineForTextPosition(relativePos); | 
					
						
							|  |  |  |                 qreal x = line.cursorToX(relativePos); | 
					
						
							|  |  |  |                 qreal w = 0; | 
					
						
							|  |  |  |                 if (relativePos < line.textLength() - line.textStart()) { | 
					
						
							|  |  |  |                     w = line.cursorToX(relativePos + 1) - x; | 
					
						
							|  |  |  |                     if (doc->characterAt(context.cursorPosition) == QLatin1Char('\t')) { | 
					
						
							| 
									
										
										
										
											2010-04-16 13:25:44 +02:00
										 |  |  |                         doSelection = false; | 
					
						
							| 
									
										
										
										
											2010-08-06 16:23:13 +02:00
										 |  |  |                         qreal space = QFontMetricsF(layout->font()).width(QLatin1Char(' ')); | 
					
						
							| 
									
										
										
										
											2010-04-16 13:04:33 +02:00
										 |  |  |                         if (w > space) { | 
					
						
							|  |  |  |                             x += w-space; | 
					
						
							|  |  |  |                             w = space; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } else | 
					
						
							|  |  |  |                     w = QFontMetrics(layout->font()).width(QLatin1Char(' ')); // in sync with QTextLine::draw()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 QRectF rr = line.rect(); | 
					
						
							|  |  |  |                 rr.moveTop(rr.top() + r.top()); | 
					
						
							|  |  |  |                 rr.moveLeft(r.left() + x); | 
					
						
							|  |  |  |                 rr.setWidth(w); | 
					
						
							|  |  |  |                 painter.fillRect(rr, palette().text()); | 
					
						
							| 
									
										
										
										
											2010-04-16 13:25:44 +02:00
										 |  |  |                 if (doSelection) { | 
					
						
							|  |  |  |                     QTextLayout::FormatRange o; | 
					
						
							|  |  |  |                     o.start = relativePos; | 
					
						
							|  |  |  |                     o.length = 1; | 
					
						
							|  |  |  |                     o.format.setForeground(palette().base()); | 
					
						
							|  |  |  |                     selections.append(o); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-04-16 13:04:33 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             layout->draw(&painter, offset, selections, er); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ((drawCursor && !drawCursorAsBlock) | 
					
						
							|  |  |  |                 || (editable && context.cursorPosition < -1 | 
					
						
							|  |  |  |                     && !layout->preeditAreaText().isEmpty())) { | 
					
						
							|  |  |  |                 int cpos = context.cursorPosition; | 
					
						
							|  |  |  |                 if (cpos < -1) | 
					
						
							|  |  |  |                     cpos = layout->preeditAreaPosition() - (cpos + 2); | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                     cpos -= blpos; | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |                 cursor_layout = layout; | 
					
						
							|  |  |  |                 cursor_offset = offset; | 
					
						
							|  |  |  |                 cursor_cpos = cpos; | 
					
						
							|  |  |  |                 cursor_pen = painter.pen(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifndef Q_WS_MAC // no visible cursor on mac
 | 
					
						
							|  |  |  |             if (blockSelectionCursorRect.isValid()) | 
					
						
							|  |  |  |                 painter.fillRect(blockSelectionCursorRect, palette().text()); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         offset.ry() += r.height(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (offset.y() > viewportRect.height()) | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         block = block.next(); | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         if (!block.isVisible()) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             if (block.blockNumber() == d->visibleFoldedBlockNumber) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                 visibleCollapsedBlock = block; | 
					
						
							| 
									
										
										
										
											2009-04-28 12:55:31 +02:00
										 |  |  |                 visibleCollapsedBlockOffset = offset + QPointF(0,1); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // invisible blocks do have zero line count
 | 
					
						
							|  |  |  |             block = doc->findBlockByLineNumber(block.firstLineNumber()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-10-05 18:49:03 +02:00
										 |  |  |     painter.setPen(context.palette.text().color()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (backgroundVisible() && !block.isValid() && offset.y() <= er.bottom() | 
					
						
							|  |  |  |         && (centerOnScroll() || verticalScrollBar()->maximum() == verticalScrollBar()->minimum())) { | 
					
						
							|  |  |  |         painter.fillRect(QRect(QPoint((int)er.left(), (int)offset.y()), er.bottomRight()), palette().background()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //end QPlainTextEdit::paintEvent()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     offset = contentOffset(); | 
					
						
							|  |  |  |     block = firstVisibleBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-31 15:03:38 +02:00
										 |  |  |     qreal top = blockBoundingGeometry(block).translated(offset).top(); | 
					
						
							|  |  |  |     qreal bottom = top + blockBoundingRect(block).height(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     bool hasSelection = cursor.hasSelection(); | 
					
						
							|  |  |  |     int selectionStart = cursor.selectionStart(); | 
					
						
							|  |  |  |     int selectionEnd = cursor.selectionEnd(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (block.isValid() && top <= e->rect().bottom()) { | 
					
						
							|  |  |  |         QTextBlock nextBlock = block.next(); | 
					
						
							|  |  |  |         QTextBlock nextVisibleBlock = nextBlock; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-05 19:14:31 +02:00
										 |  |  |         if (!nextVisibleBlock.isVisible()) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             // invisible blocks do have zero line count
 | 
					
						
							|  |  |  |             nextVisibleBlock = doc->findBlockByLineNumber(nextVisibleBlock.firstLineNumber()); | 
					
						
							| 
									
										
										
										
											2009-10-05 19:14:31 +02:00
										 |  |  |             // paranoia in case our code somewhere did not set the line count
 | 
					
						
							|  |  |  |             // of the invisible block to 0
 | 
					
						
							|  |  |  |             while (nextVisibleBlock.isValid() && !nextVisibleBlock.isVisible()) | 
					
						
							|  |  |  |                 nextVisibleBlock = nextVisibleBlock.next(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         if (block.isVisible() && bottom >= e->rect().top()) { | 
					
						
							|  |  |  |             if (d->m_displaySettings.m_visualizeWhitespace) { | 
					
						
							|  |  |  |                 QTextLayout *layout = block.layout(); | 
					
						
							|  |  |  |                 int lineCount = layout->lineCount(); | 
					
						
							|  |  |  |                 if (lineCount >= 2 || !nextBlock.isValid()) { | 
					
						
							|  |  |  |                     painter.save(); | 
					
						
							|  |  |  |                     painter.setPen(Qt::lightGray); | 
					
						
							|  |  |  |                     for (int i = 0; i < lineCount-1; ++i) { // paint line wrap indicator
 | 
					
						
							|  |  |  |                         QTextLine line = layout->lineAt(i); | 
					
						
							|  |  |  |                         QRectF lineRect = line.naturalTextRect().translated(offset.x(), top); | 
					
						
							|  |  |  |                         QChar visualArrow((ushort)0x21b5); | 
					
						
							| 
									
										
										
										
											2010-05-31 15:03:38 +02:00
										 |  |  |                         painter.drawText(QPointF(lineRect.right(), | 
					
						
							|  |  |  |                                                  lineRect.top() + line.ascent()), | 
					
						
							|  |  |  |                                          visualArrow); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                     } | 
					
						
							|  |  |  |                     if (!nextBlock.isValid()) { // paint EOF symbol
 | 
					
						
							|  |  |  |                         QTextLine line = layout->lineAt(lineCount-1); | 
					
						
							|  |  |  |                         QRectF lineRect = line.naturalTextRect().translated(offset.x(), top); | 
					
						
							|  |  |  |                         int h = 4; | 
					
						
							|  |  |  |                         lineRect.adjust(0, 0, -1, -1); | 
					
						
							|  |  |  |                         QPainterPath path; | 
					
						
							|  |  |  |                         QPointF pos(lineRect.topRight() + QPointF(h+4, line.ascent())); | 
					
						
							|  |  |  |                         path.moveTo(pos); | 
					
						
							|  |  |  |                         path.lineTo(pos + QPointF(-h, -h)); | 
					
						
							|  |  |  |                         path.lineTo(pos + QPointF(0, -2*h)); | 
					
						
							|  |  |  |                         path.lineTo(pos + QPointF(h, -h)); | 
					
						
							|  |  |  |                         path.closeSubpath(); | 
					
						
							|  |  |  |                         painter.setBrush(painter.pen().color()); | 
					
						
							|  |  |  |                         painter.drawPath(path); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     painter.restore(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (nextBlock.isValid() && !nextBlock.isVisible()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 bool selectThis = (hasSelection | 
					
						
							|  |  |  |                                    && nextBlock.position() >= selectionStart | 
					
						
							|  |  |  |                                    && nextBlock.position() < selectionEnd); | 
					
						
							|  |  |  |                 if (selectThis) { | 
					
						
							|  |  |  |                     painter.save(); | 
					
						
							|  |  |  |                     painter.setBrush(palette().highlight()); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 QTextLayout *layout = block.layout(); | 
					
						
							|  |  |  |                 QTextLine line = layout->lineAt(layout->lineCount()-1); | 
					
						
							|  |  |  |                 QRectF lineRect = line.naturalTextRect().translated(offset.x(), top); | 
					
						
							|  |  |  |                 lineRect.adjust(0, 0, -1, -1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 QRectF collapseRect(lineRect.right() + 12, | 
					
						
							|  |  |  |                                     lineRect.top(), | 
					
						
							|  |  |  |                                     fontMetrics().width(QLatin1String(" {...}; ")), | 
					
						
							|  |  |  |                                     lineRect.height()); | 
					
						
							|  |  |  |                 painter.setRenderHint(QPainter::Antialiasing, true); | 
					
						
							|  |  |  |                 painter.translate(.5, .5); | 
					
						
							|  |  |  |                 painter.drawRoundedRect(collapseRect.adjusted(0, 0, 0, -1), 3, 3); | 
					
						
							|  |  |  |                 painter.setRenderHint(QPainter::Antialiasing, false); | 
					
						
							|  |  |  |                 painter.translate(-.5, -.5); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 QString replacement = QLatin1String("..."); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                 if (TextBlockUserData *nextBlockUserData = BaseTextDocumentLayout::testUserData(nextBlock)) { | 
					
						
							|  |  |  |                     if (nextBlockUserData->foldingStartIncluded()) | 
					
						
							|  |  |  |                         replacement.prepend(nextBlock.text().trimmed().left(1)); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 block = nextVisibleBlock.previous(); | 
					
						
							|  |  |  |                 if (!block.isValid()) | 
					
						
							|  |  |  |                     block = doc->lastBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                 if (TextBlockUserData *blockUserData = BaseTextDocumentLayout::testUserData(block)) { | 
					
						
							|  |  |  |                     if (blockUserData->foldingEndIncluded()) { | 
					
						
							|  |  |  |                         QString right = block.text().trimmed(); | 
					
						
							|  |  |  |                         if (right.endsWith(QLatin1Char(';'))) { | 
					
						
							|  |  |  |                             right.chop(1); | 
					
						
							|  |  |  |                             right = right.trimmed(); | 
					
						
							|  |  |  |                             replacement.append(right.right(right.endsWith(QLatin1Char('/')) ? 2 : 1)); | 
					
						
							|  |  |  |                             replacement.append(QLatin1Char(';')); | 
					
						
							|  |  |  |                         } else { | 
					
						
							|  |  |  |                             replacement.append(right.right(right.endsWith(QLatin1Char('/')) ? 2 : 1)); | 
					
						
							|  |  |  |                         } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                 if (selectThis) | 
					
						
							|  |  |  |                     painter.setPen(palette().highlightedText().color()); | 
					
						
							|  |  |  |                 painter.drawText(collapseRect, Qt::AlignCenter, replacement); | 
					
						
							|  |  |  |                 if (selectThis) | 
					
						
							|  |  |  |                     painter.restore(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         block = nextVisibleBlock; | 
					
						
							|  |  |  |         top = bottom; | 
					
						
							| 
									
										
										
										
											2010-05-31 15:03:38 +02:00
										 |  |  |         bottom = top + blockBoundingRect(block).height(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 19:02:58 +02:00
										 |  |  |     if (d->m_animator && d->m_animator->isRunning()) { | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |         QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |         cursor.setPosition(d->m_animator->position()); | 
					
						
							|  |  |  |         d->m_animator->draw(&painter, cursorRect(cursor).topLeft()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     // draw the overlays, but only if we do not have a find scope, otherwise the
 | 
					
						
							|  |  |  |     // view becomes too noisy.
 | 
					
						
							|  |  |  |     if (d->m_findScopeStart.isNull()) { | 
					
						
							|  |  |  |         if (d->m_overlay->isVisible()) | 
					
						
							|  |  |  |             d->m_overlay->paint(&painter, e->rect()); | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         if (d->m_snippetOverlay->isVisible()) | 
					
						
							|  |  |  |             d->m_snippetOverlay->paint(&painter, e->rect()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!d->m_refactorOverlay->isEmpty()) | 
					
						
							|  |  |  |             d->m_refactorOverlay->paint(&painter, e->rect()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-01-29 22:49:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |     if (!d->m_searchResultOverlay->isEmpty()) { | 
					
						
							| 
									
										
										
										
											2009-12-01 14:47:10 +01:00
										 |  |  |         d->m_searchResultOverlay->paint(&painter, e->rect()); | 
					
						
							| 
									
										
										
										
											2009-12-02 10:57:05 +01:00
										 |  |  |         d->m_searchResultOverlay->clear(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     // draw the cursor last, on top of everything
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     if (cursor_layout && !d->m_inBlockSelectionMode) { | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |         painter.setPen(cursor_pen); | 
					
						
							|  |  |  |         cursor_layout->drawCursor(&painter, cursor_offset, cursor_cpos, cursorWidth()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-31 13:48:40 +02:00
										 |  |  |     if (visibleCollapsedBlock.isValid()) { | 
					
						
							|  |  |  |         drawCollapsedBlockPopup(painter, | 
					
						
							|  |  |  |                                 visibleCollapsedBlock, | 
					
						
							|  |  |  |                                 visibleCollapsedBlockOffset, | 
					
						
							|  |  |  |                                 er); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::drawCollapsedBlockPopup(QPainter &painter, | 
					
						
							| 
									
										
										
										
											2010-05-31 13:48:40 +02:00
										 |  |  |                                              const QTextBlock &block, | 
					
						
							|  |  |  |                                              QPointF offset, | 
					
						
							|  |  |  |                                              const QRect &clip) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int margin = block.document()->documentMargin(); | 
					
						
							|  |  |  |     qreal maxWidth = 0; | 
					
						
							|  |  |  |     qreal blockHeight = 0; | 
					
						
							|  |  |  |     QTextBlock b = block; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (!b.isVisible()) { | 
					
						
							|  |  |  |         b.setVisible(true); // make sure block bounding rect works
 | 
					
						
							|  |  |  |         QRectF r = blockBoundingRect(b).translated(offset); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         QTextLayout *layout = b.layout(); | 
					
						
							|  |  |  |         for (int i = layout->lineCount()-1; i >= 0; --i) | 
					
						
							|  |  |  |             maxWidth = qMax(maxWidth, layout->lineAt(i).naturalTextWidth() + 2*margin); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         blockHeight += r.height(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         b.setVisible(false); // restore previous state
 | 
					
						
							|  |  |  |         b.setLineCount(0); // restore 0 line count for invisible block
 | 
					
						
							|  |  |  |         b = b.next(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     painter.save(); | 
					
						
							|  |  |  |     painter.setRenderHint(QPainter::Antialiasing, true); | 
					
						
							|  |  |  |     painter.translate(.5, .5); | 
					
						
							|  |  |  |     QBrush brush = palette().base(); | 
					
						
							|  |  |  |     if (d->m_ifdefedOutFormat.hasProperty(QTextFormat::BackgroundBrush)) | 
					
						
							|  |  |  |         brush = d->m_ifdefedOutFormat.background(); | 
					
						
							|  |  |  |     painter.setBrush(brush); | 
					
						
							|  |  |  |     painter.drawRoundedRect(QRectF(offset.x(), | 
					
						
							|  |  |  |                                    offset.y(), | 
					
						
							|  |  |  |                                    maxWidth, blockHeight).adjusted(0, 0, 0, 0), 3, 3); | 
					
						
							|  |  |  |     painter.restore(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextBlock end = b; | 
					
						
							|  |  |  |     b = block; | 
					
						
							|  |  |  |     while (b != end) { | 
					
						
							|  |  |  |         b.setVisible(true); // make sure block bounding rect works
 | 
					
						
							|  |  |  |         QRectF r = blockBoundingRect(b).translated(offset); | 
					
						
							|  |  |  |         QTextLayout *layout = b.layout(); | 
					
						
							|  |  |  |         QVector<QTextLayout::FormatRange> selections; | 
					
						
							|  |  |  |         layout->draw(&painter, offset, selections, clip); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         b.setVisible(false); // restore previous state
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         b.setLineCount(0); // restore 0 line count for invisible block
 | 
					
						
							| 
									
										
										
										
											2010-05-31 13:48:40 +02:00
										 |  |  |         offset.ry() += r.height(); | 
					
						
							|  |  |  |         b = b.next(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QWidget *BaseTextEditorWidget::extraArea() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_extraArea; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditorWidget::extraAreaWidth(int *markWidthPtr) const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(document()->documentLayout()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     if (!documentLayout) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!d->m_marksVisible && documentLayout->hasMarks) | 
					
						
							|  |  |  |         d->m_marksVisible = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int space = 0; | 
					
						
							|  |  |  |     const QFontMetrics fm(d->m_extraArea->fontMetrics()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (d->m_lineNumbersVisible) { | 
					
						
							| 
									
										
										
										
											2009-08-20 16:13:24 +02:00
										 |  |  |         QFont fnt = d->m_extraArea->font(); | 
					
						
							| 
									
										
										
										
											2011-03-21 17:32:53 +01:00
										 |  |  |         // this works under the assumption that bold or italic
 | 
					
						
							|  |  |  |         // can only make a font wider
 | 
					
						
							| 
									
										
										
										
											2009-08-20 16:13:24 +02:00
										 |  |  |         fnt.setBold(d->m_currentLineNumberFormat.font().bold()); | 
					
						
							|  |  |  |         fnt.setItalic(d->m_currentLineNumberFormat.font().italic()); | 
					
						
							|  |  |  |         const QFontMetrics linefm(fnt); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         int digits = 2; | 
					
						
							|  |  |  |         int max = qMax(1, blockCount()); | 
					
						
							|  |  |  |         while (max >= 100) { | 
					
						
							|  |  |  |             max /= 10; | 
					
						
							|  |  |  |             ++digits; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-20 16:13:24 +02:00
										 |  |  |         space += linefm.width(QLatin1Char('9')) * digits; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     int markWidth = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (d->m_marksVisible) { | 
					
						
							| 
									
										
										
										
											2011-03-23 10:45:04 +01:00
										 |  |  |         markWidth += documentLayout->maxMarkWidthFactor * fm.lineSpacing(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | //     if (documentLayout->doubleMarkCount)
 | 
					
						
							|  |  |  | //         markWidth += fm.lineSpacing() / 3;
 | 
					
						
							|  |  |  |         space += markWidth; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         space += 2; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (markWidthPtr) | 
					
						
							|  |  |  |         *markWidthPtr = markWidth; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     space += 4; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (d->m_codeFoldingVisible) | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         space += foldBoxWidth(fm); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     return space; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::slotUpdateExtraAreaWidth() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |     if (isLeftToRight()) | 
					
						
							|  |  |  |         setViewportMargins(extraAreaWidth(), 0, 0, 0); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         setViewportMargins(0, 0, extraAreaWidth(), 0); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 11:10:22 +02:00
										 |  |  | static void drawRectBox(QPainter *painter, const QRect &rect, bool start, bool end, | 
					
						
							|  |  |  |                         const QPalette &pal) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-05-29 15:31:05 +02:00
										 |  |  |     painter->save(); | 
					
						
							| 
									
										
										
										
											2009-05-04 11:10:22 +02:00
										 |  |  |     painter->setRenderHint(QPainter::Antialiasing, false); | 
					
						
							| 
									
										
										
										
											2009-06-03 20:19:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QRgb b = pal.base().color().rgb(); | 
					
						
							|  |  |  |     QRgb h = pal.highlight().color().rgb(); | 
					
						
							| 
									
										
										
										
											2009-10-05 11:06:05 +02:00
										 |  |  |     QColor c = Utils::StyleHelper::mergedColors(b,h, 50); | 
					
						
							| 
									
										
										
										
											2009-06-03 20:19:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 15:31:05 +02:00
										 |  |  |     QLinearGradient grad(rect.topLeft(), rect.topRight()); | 
					
						
							| 
									
										
										
										
											2009-06-03 20:19:47 +02:00
										 |  |  |     grad.setColorAt(0, c.lighter(110)); | 
					
						
							| 
									
										
										
										
											2009-06-05 13:59:10 +02:00
										 |  |  |     grad.setColorAt(1, c.lighter(130)); | 
					
						
							| 
									
										
										
										
											2009-06-03 20:19:47 +02:00
										 |  |  |     QColor outline = c; | 
					
						
							| 
									
										
										
										
											2009-05-29 16:50:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     painter->fillRect(rect, grad); | 
					
						
							| 
									
										
										
										
											2009-05-29 15:31:05 +02:00
										 |  |  |     painter->setPen(outline); | 
					
						
							| 
									
										
										
										
											2009-05-29 16:50:38 +02:00
										 |  |  |     if (start) | 
					
						
							|  |  |  |         painter->drawLine(rect.topLeft() + QPoint(1, 0), rect.topRight() -  QPoint(1, 0)); | 
					
						
							|  |  |  |     if (end) | 
					
						
							|  |  |  |         painter->drawLine(rect.bottomLeft() + QPoint(1, 0), rect.bottomRight() -  QPoint(1, 0)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     painter->drawLine(rect.topRight() + QPoint(0, start ? 1 : 0), rect.bottomRight() - QPoint(0, end ? 1 : 0)); | 
					
						
							|  |  |  |     painter->drawLine(rect.topLeft() + QPoint(0, start ? 1 : 0), rect.bottomLeft() - QPoint(0, end ? 1 : 0)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 15:31:05 +02:00
										 |  |  |     painter->restore(); | 
					
						
							| 
									
										
										
										
											2009-05-04 11:10:22 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::extraAreaPaintEvent(QPaintEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextDocument *doc = document(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  |     QTC_ASSERT(documentLayout, return); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 12:55:31 +02:00
										 |  |  |     int selStart = textCursor().selectionStart(); | 
					
						
							|  |  |  |     int selEnd = textCursor().selectionEnd(); | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QPalette pal = d->m_extraArea->palette(); | 
					
						
							|  |  |  |     pal.setCurrentColorGroup(QPalette::Active); | 
					
						
							|  |  |  |     QPainter painter(d->m_extraArea); | 
					
						
							| 
									
										
										
										
											2009-08-20 16:13:24 +02:00
										 |  |  |     const QFontMetrics fm(d->m_extraArea->font()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     int fmLineSpacing = fm.lineSpacing(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int markWidth = 0; | 
					
						
							|  |  |  |     if (d->m_marksVisible) | 
					
						
							|  |  |  |         markWidth += fm.lineSpacing(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     const int collapseColumnWidth = d->m_codeFoldingVisible ? foldBoxWidth(fm): 0; | 
					
						
							| 
									
										
										
										
											2009-06-09 18:17:38 +02:00
										 |  |  |     const int extraAreaWidth = d->m_extraArea->width() - collapseColumnWidth; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     painter.fillRect(e->rect(), pal.color(QPalette::Base)); | 
					
						
							|  |  |  |     painter.fillRect(e->rect().intersected(QRect(0, 0, extraAreaWidth, INT_MAX)), | 
					
						
							|  |  |  |                      pal.color(QPalette::Background)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextBlock block = firstVisibleBlock(); | 
					
						
							|  |  |  |     int blockNumber = block.blockNumber(); | 
					
						
							| 
									
										
										
										
											2010-04-12 15:37:08 +02:00
										 |  |  |     qreal top = blockBoundingGeometry(block).translated(contentOffset()).top(); | 
					
						
							|  |  |  |     qreal bottom = top; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     while (block.isValid() && top <= e->rect().bottom()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         top = bottom; | 
					
						
							| 
									
										
										
										
											2010-05-31 15:03:38 +02:00
										 |  |  |         const qreal height = blockBoundingRect(block).height(); | 
					
						
							|  |  |  |         bottom = top + height; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         QTextBlock nextBlock = block.next(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         QTextBlock nextVisibleBlock = nextBlock; | 
					
						
							|  |  |  |         int nextVisibleBlockNumber = blockNumber + 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!nextVisibleBlock.isVisible()) { | 
					
						
							|  |  |  |             // invisible blocks do have zero line count
 | 
					
						
							|  |  |  |             nextVisibleBlock = doc->findBlockByLineNumber(nextVisibleBlock.firstLineNumber()); | 
					
						
							|  |  |  |             nextVisibleBlockNumber = nextVisibleBlock.blockNumber(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-09 15:59:48 +01:00
										 |  |  |         if (bottom < e->rect().top()) { | 
					
						
							|  |  |  |             block = nextVisibleBlock; | 
					
						
							|  |  |  |             blockNumber = nextVisibleBlockNumber; | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         painter.setPen(pal.color(QPalette::Dark)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (d->m_codeFoldingVisible || d->m_marksVisible) { | 
					
						
							|  |  |  |             painter.save(); | 
					
						
							|  |  |  |             painter.setRenderHint(QPainter::Antialiasing, false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             int previousBraceDepth = block.previous().userState(); | 
					
						
							|  |  |  |             if (previousBraceDepth >= 0) | 
					
						
							|  |  |  |                 previousBraceDepth >>= 8; | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 previousBraceDepth = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             int braceDepth = block.userState(); | 
					
						
							|  |  |  |             if (!nextBlock.isVisible()) { | 
					
						
							|  |  |  |                 QTextBlock lastInvisibleBlock = nextVisibleBlock.previous(); | 
					
						
							|  |  |  |                 if (!lastInvisibleBlock.isValid()) | 
					
						
							|  |  |  |                     lastInvisibleBlock = doc->lastBlock(); | 
					
						
							|  |  |  |                 braceDepth = lastInvisibleBlock.userState(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (braceDepth >= 0) | 
					
						
							|  |  |  |                 braceDepth >>= 8; | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 braceDepth = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (TextBlockUserData *userData = static_cast<TextBlockUserData*>(block.userData())) { | 
					
						
							|  |  |  |                 if (d->m_marksVisible) { | 
					
						
							|  |  |  |                     int xoffset = 0; | 
					
						
							| 
									
										
										
										
											2011-03-21 17:32:53 +01:00
										 |  |  |                     foreach (ITextMark *mark, userData->marks()) { | 
					
						
							|  |  |  |                         const int height = fmLineSpacing - 1; | 
					
						
							|  |  |  |                         const int width = int(.5 + height * mark->widthFactor()); | 
					
						
							|  |  |  |                         const QRect r(xoffset, top, width, height); | 
					
						
							|  |  |  |                         mark->paint(&painter, r); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                         xoffset += 2; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 12:04:40 +02:00
										 |  |  |             if (d->m_codeFoldingVisible) { | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                 int extraAreaHighlightFoldBlockNumber = -1; | 
					
						
							|  |  |  |                 int extraAreaHighlightFoldEndBlockNumber = -1; | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  |                 bool endIsVisible = false; | 
					
						
							|  |  |  |                 if (!d->m_highlightBlocksInfo.isEmpty()) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                     extraAreaHighlightFoldBlockNumber =  d->m_highlightBlocksInfo.open.last(); | 
					
						
							|  |  |  |                     extraAreaHighlightFoldEndBlockNumber =  d->m_highlightBlocksInfo.close.first(); | 
					
						
							|  |  |  |                     endIsVisible = doc->findBlockByNumber(extraAreaHighlightFoldEndBlockNumber).isVisible(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //                    QTextBlock before = doc->findBlockByNumber(extraAreaHighlightCollapseBlockNumber-1);
 | 
					
						
							|  |  |  | //                    if (TextBlockUserData::hasCollapseAfter(before)) {
 | 
					
						
							|  |  |  | //                        extraAreaHighlightCollapseBlockNumber--;
 | 
					
						
							|  |  |  | //                    }
 | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |                 TextBlockUserData *nextBlockUserData = BaseTextDocumentLayout::testUserData(nextBlock); | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                 bool drawBox = nextBlockUserData | 
					
						
							|  |  |  |                                && BaseTextDocumentLayout::foldingIndent(block) < nextBlockUserData->foldingIndent(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                 bool active = blockNumber == extraAreaHighlightFoldBlockNumber; | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                 bool drawStart = active; | 
					
						
							|  |  |  |                 bool drawEnd = blockNumber == extraAreaHighlightFoldEndBlockNumber || (drawStart && !endIsVisible); | 
					
						
							|  |  |  |                 bool hovered = blockNumber >= extraAreaHighlightFoldBlockNumber | 
					
						
							|  |  |  |                                && blockNumber <= extraAreaHighlightFoldEndBlockNumber; | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                 int boxWidth = foldBoxWidth(fm); | 
					
						
							| 
									
										
										
										
											2009-05-05 10:20:43 +02:00
										 |  |  |                 if (hovered) { | 
					
						
							| 
									
										
										
										
											2010-05-06 15:26:55 +02:00
										 |  |  |                     int itop = qRound(top); | 
					
						
							|  |  |  |                     int ibottom = qRound(bottom); | 
					
						
							|  |  |  |                     QRect box = QRect(extraAreaWidth + 1, itop, boxWidth - 2, ibottom - itop); | 
					
						
							| 
									
										
										
										
											2009-05-04 11:10:22 +02:00
										 |  |  |                     drawRectBox(&painter, box, drawStart, drawEnd, pal); | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (drawBox) { | 
					
						
							| 
									
										
										
										
											2009-05-04 11:10:22 +02:00
										 |  |  |                     bool expanded = nextBlock.isVisible(); | 
					
						
							| 
									
										
										
										
											2009-06-05 16:16:03 +02:00
										 |  |  |                     int size = boxWidth/4; | 
					
						
							|  |  |  |                     QRect box(extraAreaWidth + size, top + size, | 
					
						
							|  |  |  |                               2 * (size) + 1, 2 * (size) + 1); | 
					
						
							| 
									
										
										
										
											2009-05-05 10:20:43 +02:00
										 |  |  |                     drawFoldingMarker(&painter, pal, box, expanded, active, hovered); | 
					
						
							| 
									
										
										
										
											2009-04-29 15:37:38 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             painter.restore(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (d->m_revisionsVisible && block.revision() != documentLayout->lastSaveRevision) { | 
					
						
							|  |  |  |             painter.save(); | 
					
						
							|  |  |  |             painter.setRenderHint(QPainter::Antialiasing, false); | 
					
						
							|  |  |  |             if (block.revision() < 0) | 
					
						
							|  |  |  |                 painter.setPen(QPen(Qt::darkGreen, 2)); | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 painter.setPen(QPen(Qt::red, 2)); | 
					
						
							| 
									
										
										
										
											2009-07-16 11:27:02 +02:00
										 |  |  |             painter.drawLine(extraAreaWidth - 1, top, extraAreaWidth - 1, bottom - 1); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             painter.restore(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (d->m_lineNumbersVisible) { | 
					
						
							|  |  |  |             const QString &number = QString::number(blockNumber + 1); | 
					
						
							| 
									
										
										
										
											2009-04-28 12:55:31 +02:00
										 |  |  |             bool selected = ( | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |                     (selStart < block.position() + block.length() | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |                     && selEnd > block.position()) | 
					
						
							|  |  |  |                     || (selStart == selEnd && selStart == block.position()) | 
					
						
							| 
									
										
										
										
											2009-04-28 12:55:31 +02:00
										 |  |  |                     ); | 
					
						
							|  |  |  |             if (selected) { | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |                 painter.save(); | 
					
						
							| 
									
										
										
										
											2009-04-27 14:10:54 +02:00
										 |  |  |                 QFont f = painter.font(); | 
					
						
							|  |  |  |                 f.setBold(d->m_currentLineNumberFormat.font().bold()); | 
					
						
							|  |  |  |                 f.setItalic(d->m_currentLineNumberFormat.font().italic()); | 
					
						
							|  |  |  |                 painter.setFont(f); | 
					
						
							|  |  |  |                 painter.setPen(d->m_currentLineNumberFormat.foreground().color()); | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-05-31 15:03:38 +02:00
										 |  |  |             painter.drawText(QRectF(markWidth, top, extraAreaWidth - markWidth - 4, height), Qt::AlignRight, number); | 
					
						
							| 
									
										
										
										
											2009-04-28 12:55:31 +02:00
										 |  |  |             if (selected) | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |                 painter.restore(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         block = nextVisibleBlock; | 
					
						
							|  |  |  |         blockNumber = nextVisibleBlockNumber; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::drawFoldingMarker(QPainter *painter, const QPalette &pal, | 
					
						
							| 
									
										
										
										
											2009-05-05 10:20:43 +02:00
										 |  |  |                                        const QRect &rect, | 
					
						
							|  |  |  |                                        bool expanded, | 
					
						
							|  |  |  |                                        bool active, | 
					
						
							|  |  |  |                                        bool hovered) const | 
					
						
							| 
									
										
										
										
											2009-05-04 11:10:22 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-13 17:35:17 +02:00
										 |  |  |     Q_UNUSED(active) | 
					
						
							|  |  |  |     Q_UNUSED(hovered) | 
					
						
							| 
									
										
										
										
											2009-06-08 12:07:39 +02:00
										 |  |  |     QStyle *s = style(); | 
					
						
							|  |  |  |     if (ManhattanStyle *ms = qobject_cast<ManhattanStyle*>(s)) | 
					
						
							| 
									
										
										
										
											2010-02-23 12:42:04 +01:00
										 |  |  |         s = ms->baseStyle(); | 
					
						
							| 
									
										
										
										
											2009-06-08 12:07:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!qstrcmp(s->metaObject()->className(), "OxygenStyle")) { | 
					
						
							|  |  |  |         painter->save(); | 
					
						
							|  |  |  |         painter->setPen(Qt::NoPen); | 
					
						
							|  |  |  |         int size = rect.size().width(); | 
					
						
							|  |  |  |         int sqsize = 2*(size/2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         QColor textColor = pal.buttonText().color(); | 
					
						
							|  |  |  |         QColor brushColor = textColor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         textColor.setAlpha(100); | 
					
						
							|  |  |  |         brushColor.setAlpha(100); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         QPolygon a; | 
					
						
							|  |  |  |         if (expanded) { | 
					
						
							|  |  |  |             // down arrow
 | 
					
						
							|  |  |  |             a.setPoints(3, 0, sqsize/3,  sqsize/2, sqsize  - sqsize/3,  sqsize, sqsize/3); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             // right arrow
 | 
					
						
							|  |  |  |             a.setPoints(3, sqsize - sqsize/3, sqsize/2,  sqsize/2 - sqsize/3, 0,  sqsize/2 - sqsize/3, sqsize); | 
					
						
							|  |  |  |             painter->setBrush(brushColor); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         painter->translate(0.5, 0.5); | 
					
						
							|  |  |  |         painter->setRenderHint(QPainter::Antialiasing); | 
					
						
							|  |  |  |         painter->translate(rect.topLeft()); | 
					
						
							|  |  |  |         painter->setPen(textColor); | 
					
						
							|  |  |  |         painter->setBrush(textColor); | 
					
						
							|  |  |  |         painter->drawPolygon(a); | 
					
						
							|  |  |  |         painter->restore(); | 
					
						
							| 
									
										
										
										
											2009-06-05 16:16:03 +02:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2009-06-08 12:07:39 +02:00
										 |  |  |         QStyleOptionViewItemV2 opt; | 
					
						
							|  |  |  |         opt.rect = rect; | 
					
						
							|  |  |  |         opt.state = QStyle::State_Active | QStyle::State_Item | QStyle::State_Children; | 
					
						
							|  |  |  |         if (expanded) | 
					
						
							|  |  |  |             opt.state |= QStyle::State_Open; | 
					
						
							|  |  |  |         if (active) | 
					
						
							|  |  |  |             opt.state |= QStyle::State_MouseOver | QStyle::State_Enabled | QStyle::State_Selected; | 
					
						
							|  |  |  |         if (hovered) | 
					
						
							|  |  |  |             opt.palette.setBrush(QPalette::Window, pal.highlight()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          // QGtkStyle needs a small correction to draw the marker in the right place
 | 
					
						
							|  |  |  |         if (!qstrcmp(s->metaObject()->className(), "QGtkStyle")) | 
					
						
							|  |  |  |            opt.rect.translate(-2, 0); | 
					
						
							|  |  |  |         else if (!qstrcmp(s->metaObject()->className(), "QMacStyle")) | 
					
						
							|  |  |  |             opt.rect.translate(-1, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         s->drawPrimitive(QStyle::PE_IndicatorBranch, &opt, painter, this); | 
					
						
							| 
									
										
										
										
											2009-06-05 16:16:03 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::slotModificationChanged(bool m) | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (m) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument *doc = document(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |     QTC_ASSERT(documentLayout, return); | 
					
						
							|  |  |  |     int oldLastSaveRevision = documentLayout->lastSaveRevision; | 
					
						
							|  |  |  |     documentLayout->lastSaveRevision = doc->revision(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (oldLastSaveRevision != documentLayout->lastSaveRevision) { | 
					
						
							|  |  |  |         QTextBlock block = doc->begin(); | 
					
						
							|  |  |  |         while (block.isValid()) { | 
					
						
							|  |  |  |             if (block.revision() < 0 || block.revision() != oldLastSaveRevision) { | 
					
						
							|  |  |  |                 block.setRevision(-documentLayout->lastSaveRevision - 1); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 block.setRevision(documentLayout->lastSaveRevision); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             block = block.next(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     d->m_extraArea->update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::slotUpdateRequest(const QRect &r, int dy) | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (dy) | 
					
						
							|  |  |  |         d->m_extraArea->scroll(0, dy); | 
					
						
							|  |  |  |     else if (r.width() > 4) { // wider than cursor width, not just cursor blinking
 | 
					
						
							|  |  |  |         d->m_extraArea->update(0, r.y(), d->m_extraArea->width(), r.height()); | 
					
						
							| 
									
										
										
										
											2009-12-02 11:29:38 +01:00
										 |  |  |         if (!d->m_searchExpr.isEmpty()) { | 
					
						
							|  |  |  |             const int m = d->m_searchResultOverlay->dropShadowWidth(); | 
					
						
							|  |  |  |             viewport()->update(r.adjusted(-m, -m, m, m)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (r.contains(viewport()->rect())) | 
					
						
							|  |  |  |         slotUpdateExtraAreaWidth(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::saveCurrentCursorPositionForNavigation() | 
					
						
							| 
									
										
										
										
											2009-03-19 14:18:26 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_lastCursorChangeWasInteresting = true; | 
					
						
							| 
									
										
										
										
											2009-04-02 17:56:20 +02:00
										 |  |  |     d->m_tempNavigationState = saveState(); | 
					
						
							| 
									
										
										
										
											2009-03-19 14:18:26 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::updateCurrentLineHighlight() | 
					
						
							| 
									
										
										
										
											2009-07-15 16:10:15 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QList<QTextEdit::ExtraSelection> extraSelections; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (d->m_highlightCurrentLine) { | 
					
						
							|  |  |  |         QTextEdit::ExtraSelection sel; | 
					
						
							|  |  |  |         sel.format.setBackground(d->m_currentLineFormat.background()); | 
					
						
							|  |  |  |         sel.format.setProperty(QTextFormat::FullWidthSelection, true); | 
					
						
							|  |  |  |         sel.cursor = textCursor(); | 
					
						
							|  |  |  |         sel.cursor.clearSelection(); | 
					
						
							|  |  |  |         extraSelections.append(sel); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setExtraSelections(CurrentLineSelection, extraSelections); | 
					
						
							| 
									
										
										
										
											2009-12-01 15:55:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // the extra area shows information for the entire current block, not just the currentline.
 | 
					
						
							|  |  |  |     // This is why we must force a bigger update region.
 | 
					
						
							|  |  |  |     int cursorBlockNumber = textCursor().blockNumber(); | 
					
						
							|  |  |  |     if (cursorBlockNumber != d->m_cursorBlockNumber) { | 
					
						
							|  |  |  |         QPointF offset = contentOffset(); | 
					
						
							|  |  |  |         QTextBlock block = document()->findBlockByNumber(d->m_cursorBlockNumber); | 
					
						
							|  |  |  |         if (block.isValid()) | 
					
						
							|  |  |  |             d->m_extraArea->update(blockBoundingGeometry(block).translated(offset).toAlignedRect()); | 
					
						
							|  |  |  |         block = document()->findBlockByNumber(cursorBlockNumber); | 
					
						
							| 
									
										
										
										
											2010-09-07 15:55:06 +02:00
										 |  |  |         if (block.isValid() && block.isVisible()) | 
					
						
							| 
									
										
										
										
											2009-12-01 15:55:55 +01:00
										 |  |  |             d->m_extraArea->update(blockBoundingGeometry(block).translated(offset).toAlignedRect()); | 
					
						
							|  |  |  |         d->m_cursorBlockNumber = cursorBlockNumber; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-15 16:10:15 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::slotCursorPositionChanged() | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-09-25 17:22:10 +02:00
										 |  |  | #if 0
 | 
					
						
							|  |  |  |     qDebug() << "block" << textCursor().blockNumber()+1 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             << "brace depth:" << BaseTextDocumentLayout::braceDepth(textCursor().block()) | 
					
						
							|  |  |  |             << "indent:" << BaseTextDocumentLayout::userData(textCursor().block())->foldingIndent(); | 
					
						
							| 
									
										
										
										
											2009-09-25 17:22:10 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-03-19 14:18:26 +01:00
										 |  |  |     if (!d->m_contentsChanged && d->m_lastCursorChangeWasInteresting) { | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |         Core::EditorManager::instance()->addCurrentPositionToNavigationHistory(editor(), d->m_tempNavigationState); | 
					
						
							| 
									
										
										
										
											2009-03-19 14:18:26 +01:00
										 |  |  |         d->m_lastCursorChangeWasInteresting = false; | 
					
						
							|  |  |  |     } else if (d->m_contentsChanged) { | 
					
						
							|  |  |  |         saveCurrentCursorPositionForNavigation(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 16:54:14 +01:00
										 |  |  |     updateHighlights(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-04-27 13:01:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::updateHighlights() | 
					
						
							| 
									
										
										
										
											2010-02-08 16:54:14 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-01 19:44:31 +01:00
										 |  |  |     if (d->m_parenthesesMatchingEnabled && hasFocus()) { | 
					
						
							| 
									
										
										
										
											2009-04-27 13:01:28 +02:00
										 |  |  |         // Delay update when no matching is displayed yet, to avoid flicker
 | 
					
						
							| 
									
										
										
										
											2009-09-23 12:50:02 +02:00
										 |  |  |         if (extraSelections(ParenthesesMatchingSelection).isEmpty() | 
					
						
							|  |  |  |             && d->m_animator == 0) { | 
					
						
							| 
									
										
										
										
											2009-04-27 13:01:28 +02:00
										 |  |  |             d->m_parenthesesMatchingTimer->start(50); | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2009-05-27 20:49:57 +02:00
										 |  |  |              // use 0-timer, not direct call, to give the syntax highlighter a chance
 | 
					
						
							|  |  |  |             // to update the parantheses information
 | 
					
						
							|  |  |  |             d->m_parenthesesMatchingTimer->start(0); | 
					
						
							| 
									
										
										
										
											2009-04-27 13:01:28 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-15 16:10:15 +02:00
										 |  |  |     updateCurrentLineHighlight(); | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-29 12:17:42 +02:00
										 |  |  |     if (d->m_displaySettings.m_highlightBlocks) { | 
					
						
							| 
									
										
										
										
											2009-04-27 13:01:28 +02:00
										 |  |  |         QTextCursor cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         d->extraAreaHighlightFoldedBlockNumber = cursor.blockNumber(); | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  |         d->m_highlightBlocksTimer->start(100); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::slotUpdateBlockNotify(const QTextBlock &block) | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     static bool blockRecursion = false; | 
					
						
							|  |  |  |     if (blockRecursion) | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     blockRecursion = true; | 
					
						
							|  |  |  |     if (d->m_overlay->isVisible()) { | 
					
						
							|  |  |  |         /* an overlay might draw outside the block bounderies, force
 | 
					
						
							|  |  |  |            complete viewport update */ | 
					
						
							|  |  |  |         viewport()->update(); | 
					
						
							| 
									
										
										
										
											2009-12-02 13:24:53 +01:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         if (block.previous().isValid() && block.userState() != block.previous().userState()) { | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |         /* The syntax highlighting state changes. This opens up for
 | 
					
						
							|  |  |  |            the possibility that the paragraph has braces that support | 
					
						
							|  |  |  |            code folding. In this case, do the save thing and also | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |            update the previous block, which might contain a fold | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |            box which now is invalid.*/ | 
					
						
							| 
									
										
										
										
											2009-12-02 13:24:53 +01:00
										 |  |  |             emit requestBlockUpdate(block.previous()); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-04-13 12:06:26 +02:00
										 |  |  |         if (!d->m_findScopeStart.isNull()) { | 
					
						
							|  |  |  |             if (block.position() < d->m_findScopeEnd.position() | 
					
						
							|  |  |  |                 && block.position()+block.length() >= d->m_findScopeStart.position()) { | 
					
						
							|  |  |  |                 QTextBlock b = block.document()->findBlock(d->m_findScopeStart.position()); | 
					
						
							| 
									
										
										
										
											2009-12-02 13:24:53 +01:00
										 |  |  |                 do { | 
					
						
							|  |  |  |                     emit requestBlockUpdate(b); | 
					
						
							|  |  |  |                     b = b.next(); | 
					
						
							| 
									
										
										
										
											2010-04-13 12:06:26 +02:00
										 |  |  |                 } while (b.isValid() && b.position() < d->m_findScopeEnd.position()); | 
					
						
							| 
									
										
										
										
											2009-12-02 13:24:53 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     blockRecursion = false; | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::timerEvent(QTimerEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (e->timerId() == d->autoScrollTimer.timerId()) { | 
					
						
							|  |  |  |         const QPoint globalPos = QCursor::pos(); | 
					
						
							|  |  |  |         const QPoint pos = d->m_extraArea->mapFromGlobal(globalPos); | 
					
						
							|  |  |  |         QRect visible = d->m_extraArea->rect(); | 
					
						
							|  |  |  |         verticalScrollBar()->triggerAction( pos.y() < visible.center().y() ? | 
					
						
							|  |  |  |                                             QAbstractSlider::SliderSingleStepSub | 
					
						
							|  |  |  |                                             : QAbstractSlider::SliderSingleStepAdd); | 
					
						
							|  |  |  |         QMouseEvent ev(QEvent::MouseMove, pos, globalPos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); | 
					
						
							|  |  |  |         extraAreaMouseEvent(&ev); | 
					
						
							|  |  |  |         int delta = qMax(pos.y() - visible.top(), visible.bottom() - pos.y()) - visible.height(); | 
					
						
							|  |  |  |         if (delta < 7) | 
					
						
							|  |  |  |             delta = 7; | 
					
						
							|  |  |  |         int timeout = 4900 / (delta * delta); | 
					
						
							|  |  |  |         d->autoScrollTimer.start(timeout, this); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     } else if (e->timerId() == d->foldedBlockTimer.timerId()) { | 
					
						
							|  |  |  |         d->visibleFoldedBlockNumber = d->suggestedVisibleFoldedBlockNumber; | 
					
						
							|  |  |  |         d->suggestedVisibleFoldedBlockNumber = -1; | 
					
						
							|  |  |  |         d->foldedBlockTimer.stop(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         viewport()->update(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     QPlainTextEdit::timerEvent(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  | void BaseTextEditorPrivate::clearVisibleFoldedBlock() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     if (suggestedVisibleFoldedBlockNumber) { | 
					
						
							|  |  |  |         suggestedVisibleFoldedBlockNumber = -1; | 
					
						
							|  |  |  |         foldedBlockTimer.stop(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     if (visibleFoldedBlockNumber >= 0) { | 
					
						
							|  |  |  |         visibleFoldedBlockNumber = -1; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         q->viewport()->update(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::mouseMoveEvent(QMouseEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |     updateLink(e); | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-25 11:38:54 +01:00
										 |  |  |     if (e->buttons() == Qt::NoButton) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         const QTextBlock collapsedBlock = foldedBlockAt(e->pos()); | 
					
						
							| 
									
										
										
										
											2009-03-25 11:38:54 +01:00
										 |  |  |         const int blockNumber = collapsedBlock.next().blockNumber(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         if (blockNumber < 0) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             d->clearVisibleFoldedBlock(); | 
					
						
							|  |  |  |         } else if (blockNumber != d->visibleFoldedBlockNumber) { | 
					
						
							|  |  |  |             d->suggestedVisibleFoldedBlockNumber = blockNumber; | 
					
						
							|  |  |  |             d->foldedBlockTimer.start(40, this); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-03-25 11:38:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |         const RefactorMarker refactorMarker = d->m_refactorOverlay->markerAt(e->pos()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-25 11:38:54 +01:00
										 |  |  |         // Update the mouse cursor
 | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |         if ((collapsedBlock.isValid() || refactorMarker.isValid()) && !d->m_mouseOnFoldedMarker) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             d->m_mouseOnFoldedMarker = true; | 
					
						
							| 
									
										
										
										
											2009-03-25 11:38:54 +01:00
										 |  |  |             viewport()->setCursor(Qt::PointingHandCursor); | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |         } else if (!collapsedBlock.isValid() && !refactorMarker.isValid() && d->m_mouseOnFoldedMarker) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             d->m_mouseOnFoldedMarker = false; | 
					
						
							| 
									
										
										
										
											2009-03-25 11:38:54 +01:00
										 |  |  |             viewport()->setCursor(Qt::IBeamCursor); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         QPlainTextEdit::mouseMoveEvent(e); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (e->modifiers() & Qt::AltModifier) { | 
					
						
							|  |  |  |             if (!d->m_inBlockSelectionMode) { | 
					
						
							|  |  |  |                 d->m_blockSelection.fromSelection(tabSettings(), textCursor()); | 
					
						
							|  |  |  |                 d->m_inBlockSelectionMode = true; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // get visual column
 | 
					
						
							|  |  |  |                 int column = tabSettings().columnAt(cursor.block().text(), cursor.positionInBlock()); | 
					
						
							|  |  |  |                 if (cursor.positionInBlock() == cursor.block().length()-1) { | 
					
						
							| 
									
										
										
										
											2010-08-06 16:23:13 +02:00
										 |  |  |                     column += (e->pos().x() - cursorRect().center().x())/QFontMetricsF(font()).width(QLatin1Char(' ')); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 d->m_blockSelection.moveAnchor(cursor.blockNumber(), column); | 
					
						
							|  |  |  |                 setTextCursor(d->m_blockSelection.selection(tabSettings())); | 
					
						
							|  |  |  |                 viewport()->update(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-06-12 12:38:27 +02:00
										 |  |  |     if (viewport()->cursor().shape() == Qt::BlankCursor) | 
					
						
							|  |  |  |         viewport()->setCursor(Qt::IBeamCursor); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-19 16:23:10 +01:00
										 |  |  | static bool handleForwardBackwardMouseButtons(QMouseEvent *e) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (e->button() == Qt::XButton1) { | 
					
						
							|  |  |  |         Core::EditorManager::instance()->goBackInNavigationHistory(); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (e->button() == Qt::XButton2) { | 
					
						
							|  |  |  |         Core::EditorManager::instance()->goForwardInNavigationHistory(); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::mousePressEvent(QMouseEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (e->button() == Qt::LeftButton) { | 
					
						
							|  |  |  |         d->clearBlockSelection(); // just in case, otherwise we might get strange drag and drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         QTextBlock foldedBlock = foldedBlockAt(e->pos()); | 
					
						
							|  |  |  |         if (foldedBlock.isValid()) { | 
					
						
							|  |  |  |             toggleBlockVisible(foldedBlock); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             viewport()->setCursor(Qt::IBeamCursor); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |         RefactorMarker refactorMarker = d->m_refactorOverlay->markerAt(e->pos()); | 
					
						
							|  |  |  |         if (refactorMarker.isValid()) { | 
					
						
							|  |  |  |             qDebug() << "refactorMarkerClicked" << refactorMarker.cursor.position(); | 
					
						
							|  |  |  |             emit refactorMarkerClicked(refactorMarker); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             updateLink(e); | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |             if (d->m_currentLink.isValid()) | 
					
						
							|  |  |  |                 d->m_linkPressed = true; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-03-19 16:23:10 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef Q_OS_LINUX
 | 
					
						
							|  |  |  |     if (handleForwardBackwardMouseButtons(e)) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QPlainTextEdit::mousePressEvent(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::mouseReleaseEvent(QMouseEvent *e) | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-09 16:27:34 +01:00
										 |  |  |     if (mouseNavigationEnabled() | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |         && d->m_linkPressed | 
					
						
							|  |  |  |         && e->modifiers() & Qt::ControlModifier | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  |         && !(e->modifiers() & Qt::ShiftModifier) | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |         && e->button() == Qt::LeftButton | 
					
						
							|  |  |  |         ) { | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  |         const QTextCursor cursor = cursorForPosition(e->pos()); | 
					
						
							|  |  |  |         if (openLink(findLinkAt(cursor))) { | 
					
						
							|  |  |  |             clearLink(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-19 16:23:10 +01:00
										 |  |  | #ifndef Q_OS_LINUX
 | 
					
						
							|  |  |  |     if (handleForwardBackwardMouseButtons(e)) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  |     QPlainTextEdit::mouseReleaseEvent(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::leaveEvent(QEvent *e) | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     // Clear link emulation when the mouse leaves the editor
 | 
					
						
							|  |  |  |     clearLink(); | 
					
						
							|  |  |  |     QPlainTextEdit::leaveEvent(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::keyReleaseEvent(QKeyEvent *e) | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     // Clear link emulation when Ctrl is released
 | 
					
						
							|  |  |  |     if (e->key() == Qt::Key_Control) | 
					
						
							|  |  |  |         clearLink(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QPlainTextEdit::keyReleaseEvent(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::dragEnterEvent(QDragEnterEvent *e) | 
					
						
							| 
									
										
										
										
											2010-02-19 11:25:30 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     // If the drag event contains URLs, we don't want to insert them as text
 | 
					
						
							|  |  |  |     if (e->mimeData()->hasUrls()) { | 
					
						
							|  |  |  |         e->ignore(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QPlainTextEdit::dragEnterEvent(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::extraAreaLeaveEvent(QEvent *) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |     // fake missing mouse move event from Qt
 | 
					
						
							|  |  |  |     QMouseEvent me(QEvent::MouseMove, QPoint(-1, -1), Qt::NoButton, 0, 0); | 
					
						
							|  |  |  |     extraAreaMouseEvent(&me); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::extraAreaMouseEvent(QMouseEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = cursorForPosition(QPoint(0, e->pos().y())); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int markWidth; | 
					
						
							|  |  |  |     extraAreaWidth(&markWidth); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |     if (d->m_codeFoldingVisible | 
					
						
							|  |  |  |         && e->type() == QEvent::MouseMove && e->buttons() == 0) { // mouse tracking
 | 
					
						
							| 
									
										
										
										
											2008-12-15 16:09:42 +01:00
										 |  |  |         // Update which folder marker is highlighted
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         const int highlightBlockNumber = d->extraAreaHighlightFoldedBlockNumber; | 
					
						
							|  |  |  |         d->extraAreaHighlightFoldedBlockNumber = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (e->pos().x() > extraArea()->width() - foldBoxWidth(fontMetrics())) { | 
					
						
							|  |  |  |             d->extraAreaHighlightFoldedBlockNumber = cursor.blockNumber(); | 
					
						
							| 
									
										
										
										
											2009-05-04 11:47:28 +02:00
										 |  |  |         } else if (d->m_displaySettings.m_highlightBlocks) { | 
					
						
							|  |  |  |             QTextCursor cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             d->extraAreaHighlightFoldedBlockNumber = cursor.blockNumber(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-05-04 11:47:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         if (highlightBlockNumber != d->extraAreaHighlightFoldedBlockNumber) | 
					
						
							| 
									
										
										
										
											2009-06-04 16:40:34 +02:00
										 |  |  |             d->m_highlightBlocksTimer->start(d->m_highlightBlocksInfo.isEmpty() ? 120 : 0); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-16 12:15:33 +02:00
										 |  |  |     // Set whether the mouse cursor is a hand or normal arrow
 | 
					
						
							|  |  |  |     if (e->type() == QEvent::MouseMove) { | 
					
						
							|  |  |  |         bool hand = (e->pos().x() <= markWidth); | 
					
						
							|  |  |  |         if (hand != (d->m_extraArea->cursor().shape() == Qt::PointingHandCursor)) | 
					
						
							|  |  |  |             d->m_extraArea->setCursor(hand ? Qt::PointingHandCursor : Qt::ArrowCursor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonDblClick) { | 
					
						
							|  |  |  |         if (e->button() == Qt::LeftButton) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             int boxWidth = foldBoxWidth(fontMetrics()); | 
					
						
							| 
									
										
										
										
											2009-06-05 16:16:03 +02:00
										 |  |  |             if (d->m_codeFoldingVisible && e->pos().x() > extraArea()->width() - boxWidth) { | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |                 if (!cursor.block().next().isVisible()) { | 
					
						
							|  |  |  |                     toggleBlockVisible(cursor.block()); | 
					
						
							|  |  |  |                     d->moveCursorVisible(false); | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |                 } else if (foldBox().contains(e->pos())) { | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |                     cursor.setPosition( | 
					
						
							|  |  |  |                             document()->findBlockByNumber(d->m_highlightBlocksInfo.open.last()).position() | 
					
						
							|  |  |  |                             ); | 
					
						
							|  |  |  |                     QTextBlock c = cursor.block(); | 
					
						
							|  |  |  |                     toggleBlockVisible(c); | 
					
						
							|  |  |  |                     d->moveCursorVisible(false); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-06-02 11:20:56 +02:00
										 |  |  |             } else if (d->m_lineNumbersVisible && e->pos().x() > markWidth) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                 QTextCursor selection = cursor; | 
					
						
							|  |  |  |                 selection.setVisualNavigation(true); | 
					
						
							|  |  |  |                 d->extraAreaSelectionAnchorBlockNumber = selection.blockNumber(); | 
					
						
							|  |  |  |                 selection.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |                 selection.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |                 setTextCursor(selection); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 d->extraAreaToggleMarkBlockNumber = cursor.blockNumber(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2008-12-15 16:09:42 +01:00
										 |  |  |         } else if (d->m_marksVisible && e->button() == Qt::RightButton) { | 
					
						
							| 
									
										
										
										
											2008-12-04 19:33:23 +01:00
										 |  |  |             QMenu * contextMenu = new QMenu(this); | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |             emit editor()->markContextMenuRequested(editor(), cursor.blockNumber() + 1, contextMenu); | 
					
						
							| 
									
										
										
										
											2008-12-04 19:33:23 +01:00
										 |  |  |             if (!contextMenu->isEmpty()) | 
					
						
							|  |  |  |                 contextMenu->exec(e->globalPos()); | 
					
						
							| 
									
										
										
										
											2008-12-05 12:12:20 +01:00
										 |  |  |             delete contextMenu; | 
					
						
							| 
									
										
										
										
											2011-04-27 09:25:16 +02:00
										 |  |  |             e->accept(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } else if (d->extraAreaSelectionAnchorBlockNumber >= 0) { | 
					
						
							|  |  |  |         QTextCursor selection = cursor; | 
					
						
							|  |  |  |         selection.setVisualNavigation(true); | 
					
						
							|  |  |  |         if (e->type() == QEvent::MouseMove) { | 
					
						
							|  |  |  |             QTextBlock anchorBlock = document()->findBlockByNumber(d->extraAreaSelectionAnchorBlockNumber); | 
					
						
							|  |  |  |             selection.setPosition(anchorBlock.position()); | 
					
						
							|  |  |  |             if (cursor.blockNumber() < d->extraAreaSelectionAnchorBlockNumber) { | 
					
						
							|  |  |  |                 selection.movePosition(QTextCursor::EndOfBlock); | 
					
						
							|  |  |  |                 selection.movePosition(QTextCursor::Right); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             selection.setPosition(cursor.block().position(), QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |             if (cursor.blockNumber() >= d->extraAreaSelectionAnchorBlockNumber) { | 
					
						
							|  |  |  |                 selection.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |                 selection.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (e->pos().y() >= 0 && e->pos().y() <= d->m_extraArea->height()) | 
					
						
							|  |  |  |                 d->autoScrollTimer.stop(); | 
					
						
							|  |  |  |             else if (!d->autoScrollTimer.isActive()) | 
					
						
							|  |  |  |                 d->autoScrollTimer.start(100, this); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             d->autoScrollTimer.stop(); | 
					
						
							|  |  |  |             d->extraAreaSelectionAnchorBlockNumber = -1; | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         setTextCursor(selection); | 
					
						
							|  |  |  |     } else if (d->extraAreaToggleMarkBlockNumber >= 0 && d->m_marksVisible && d->m_requestMarkEnabled) { | 
					
						
							|  |  |  |         if (e->type() == QEvent::MouseButtonRelease && e->button() == Qt::LeftButton) { | 
					
						
							|  |  |  |             int n = d->extraAreaToggleMarkBlockNumber; | 
					
						
							|  |  |  |             d->extraAreaToggleMarkBlockNumber = -1; | 
					
						
							|  |  |  |             if (cursor.blockNumber() == n) { | 
					
						
							|  |  |  |                 int line = n + 1; | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |                 emit editor()->markRequested(editor(), line); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::ensureCursorVisible() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextBlock block = textCursor().block(); | 
					
						
							|  |  |  |     if (!block.isVisible()) { | 
					
						
							|  |  |  |         while (!block.isVisible() && block.previous().isValid()) | 
					
						
							|  |  |  |             block = block.previous(); | 
					
						
							|  |  |  |         toggleBlockVisible(block); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     QPlainTextEdit::ensureCursorVisible(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::toggleBlockVisible(const QTextBlock &block) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(document()->documentLayout()); | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  |     QTC_ASSERT(documentLayout, return); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool visible = block.next().isVisible(); | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     BaseTextDocumentLayout::doFoldOrUnfold(block, !visible); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     documentLayout->requestUpdate(); | 
					
						
							|  |  |  |     documentLayout->emitDocumentSizeChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | const TabSettings &BaseTextEditorWidget::tabSettings() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_document->tabSettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 15:48:14 +01:00
										 |  |  | void BaseTextEditorWidget::setLanguageSettingsId(const QString &settingsId) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     d->m_tabSettingsId = settingsId; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString BaseTextEditorWidget::languageSettingsId() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return d->m_tabSettingsId; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorWidget::setTabPreferences(TabPreferences *tabPreferences) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (d->m_tabPreferences) { | 
					
						
							|  |  |  |         disconnect(d->m_tabPreferences, SIGNAL(currentSettingsChanged(TextEditor::TabSettings)), | 
					
						
							|  |  |  |                 this, SLOT(setTabSettings(TextEditor::TabSettings))); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     d->m_tabPreferences = tabPreferences; | 
					
						
							|  |  |  |     if (d->m_tabPreferences) { | 
					
						
							|  |  |  |         connect(d->m_tabPreferences, SIGNAL(currentSettingsChanged(TextEditor::TabSettings)), | 
					
						
							|  |  |  |                 this, SLOT(setTabSettings(TextEditor::TabSettings))); | 
					
						
							|  |  |  |         setTabSettings(d->m_tabPreferences->currentSettings()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorWidget::setCodeStylePreferences(IFallbackPreferences *preferences) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     indenter()->setCodeStylePreferences(preferences); | 
					
						
							|  |  |  |     if (d->m_codeStylePreferences) { | 
					
						
							|  |  |  |         disconnect(d->m_codeStylePreferences, SIGNAL(currentValueChanged(QVariant)), | 
					
						
							|  |  |  |                 this, SLOT(slotCodeStyleSettingsChanged(QVariant))); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     d->m_codeStylePreferences = preferences; | 
					
						
							|  |  |  |     if (d->m_codeStylePreferences) { | 
					
						
							|  |  |  |         connect(d->m_codeStylePreferences, SIGNAL(currentValueChanged(QVariant)), | 
					
						
							|  |  |  |                 this, SLOT(slotCodeStyleSettingsChanged(QVariant))); | 
					
						
							|  |  |  |         slotCodeStyleSettingsChanged(d->m_codeStylePreferences->currentValue()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorWidget::slotCodeStyleSettingsChanged(const QVariant &) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | const DisplaySettings &BaseTextEditorWidget::displaySettings() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_displaySettings; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::indentOrUnindent(bool doIndent) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-02-09 10:31:25 +01:00
										 |  |  |     const TextEditor::TabSettings &tabSettings = d->m_document->tabSettings(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2010-07-06 12:27:22 +02:00
										 |  |  |     maybeClearSomeExtraSelections(cursor); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     cursor.beginEditBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-17 10:36:59 +02:00
										 |  |  |     if (cursor.hasSelection()) { | 
					
						
							| 
									
										
										
										
											2009-12-07 16:43:11 +01:00
										 |  |  |         // Indent or unindent the selected lines
 | 
					
						
							| 
									
										
										
										
											2011-02-09 10:31:25 +01:00
										 |  |  |         int pos = cursor.position(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         int anchor = cursor.anchor(); | 
					
						
							|  |  |  |         int start = qMin(anchor, pos); | 
					
						
							|  |  |  |         int end = qMax(anchor, pos); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-09 10:31:25 +01:00
										 |  |  |         QTextDocument *doc = document(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         QTextBlock startBlock = doc->findBlock(start); | 
					
						
							|  |  |  |         QTextBlock endBlock = doc->findBlock(end-1).next(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-16 11:10:41 +01:00
										 |  |  |         if (startBlock.next() == endBlock | 
					
						
							|  |  |  |                 && (start > startBlock.position() || end < endBlock.position() - 1)) { | 
					
						
							|  |  |  |             // Only one line partially selected.
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             cursor.removeSelectedText(); | 
					
						
							| 
									
										
										
										
											2011-03-16 09:41:14 +01:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             for (QTextBlock block = startBlock; block != endBlock; block = block.next()) { | 
					
						
							|  |  |  |                 QString text = block.text(); | 
					
						
							|  |  |  |                 int indentPosition = tabSettings.lineIndentPosition(text); | 
					
						
							|  |  |  |                 if (!doIndent && !indentPosition) | 
					
						
							|  |  |  |                     indentPosition = tabSettings.firstNonSpace(text); | 
					
						
							|  |  |  |                 int targetColumn = tabSettings.indentedColumn(tabSettings.columnAt(text, indentPosition), doIndent); | 
					
						
							|  |  |  |                 cursor.setPosition(block.position() + indentPosition); | 
					
						
							|  |  |  |                 cursor.insertText(tabSettings.indentationString(0, targetColumn, block)); | 
					
						
							|  |  |  |                 cursor.setPosition(block.position()); | 
					
						
							|  |  |  |                 cursor.setPosition(block.position() + indentPosition, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |                 cursor.removeSelectedText(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             cursor.endEditBlock(); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-16 09:41:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Indent or unindent at cursor position
 | 
					
						
							|  |  |  |     QTextBlock block = cursor.block(); | 
					
						
							|  |  |  |     QString text = block.text(); | 
					
						
							|  |  |  |     int indentPosition = cursor.positionInBlock(); | 
					
						
							|  |  |  |     int spaces = tabSettings.spacesLeftFromPosition(text, indentPosition); | 
					
						
							|  |  |  |     int startColumn = tabSettings.columnAt(text, indentPosition - spaces); | 
					
						
							|  |  |  |     int targetColumn = tabSettings.indentedColumn(tabSettings.columnAt(text, indentPosition), doIndent); | 
					
						
							|  |  |  |     cursor.setPosition(block.position() + indentPosition); | 
					
						
							|  |  |  |     cursor.setPosition(block.position() + indentPosition - spaces, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     cursor.removeSelectedText(); | 
					
						
							|  |  |  |     cursor.insertText(tabSettings.indentationString(startColumn, targetColumn, block)); | 
					
						
							|  |  |  |     cursor.endEditBlock(); | 
					
						
							|  |  |  |     setTextCursor(cursor); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::handleHomeKey(bool anchor) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     QTextCursor::MoveMode mode = QTextCursor::MoveAnchor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (anchor) | 
					
						
							|  |  |  |         mode = QTextCursor::KeepAnchor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const int initpos = cursor.position(); | 
					
						
							|  |  |  |     int pos = cursor.block().position(); | 
					
						
							|  |  |  |     QChar character = characterAt(pos); | 
					
						
							|  |  |  |     const QLatin1Char tab = QLatin1Char('\t'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (character == tab || character.category() == QChar::Separator_Space) { | 
					
						
							|  |  |  |         ++pos; | 
					
						
							| 
									
										
										
										
											2008-12-11 14:11:28 +01:00
										 |  |  |         if (pos == initpos) | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         character = characterAt(pos); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Go to the start of the block when we're already at the start of the text
 | 
					
						
							|  |  |  |     if (pos == initpos) | 
					
						
							|  |  |  |         pos = cursor.block().position(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cursor.setPosition(pos, mode); | 
					
						
							|  |  |  |     setTextCursor(cursor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::handleBackspaceKey() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2009-09-16 15:39:51 +02:00
										 |  |  |     int pos = cursor.position(); | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  |     QTC_ASSERT(!cursor.hasSelection(), return); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |     bool cursorWithinSnippet = false; | 
					
						
							| 
									
										
										
										
											2010-01-19 12:53:53 +01:00
										 |  |  |     if (d->m_snippetOverlay->isVisible()) { | 
					
						
							|  |  |  |         QTextCursor snippetCursor = cursor; | 
					
						
							|  |  |  |         snippetCursor.movePosition(QTextCursor::Left); | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         cursorWithinSnippet = d->snippetCheckCursor(snippetCursor); | 
					
						
							| 
									
										
										
										
											2010-01-19 12:53:53 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     const TextEditor::TabSettings &tabSettings = d->m_document->tabSettings(); | 
					
						
							| 
									
										
										
										
											2009-09-16 15:39:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-30 14:14:33 +01:00
										 |  |  |     if (tabSettings.m_autoIndent && d->m_autoCompleter->autoBackspace(cursor)) | 
					
						
							| 
									
										
										
										
											2009-09-17 12:36:40 +02:00
										 |  |  |         return; | 
					
						
							| 
									
										
										
										
											2009-09-16 15:39:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |     bool handled = false; | 
					
						
							| 
									
										
										
										
											2009-09-16 15:39:51 +02:00
										 |  |  |     if (!tabSettings.m_smartBackspace) { | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         if (cursorWithinSnippet) | 
					
						
							|  |  |  |             cursor.beginEditBlock(); | 
					
						
							| 
									
										
										
										
											2009-09-16 15:39:51 +02:00
										 |  |  |         cursor.deletePreviousChar(); | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         handled = true; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         QTextBlock currentBlock = cursor.block(); | 
					
						
							|  |  |  |         int positionInBlock = pos - currentBlock.position(); | 
					
						
							|  |  |  |         const QString blockText = currentBlock.text(); | 
					
						
							|  |  |  |         if (cursor.atBlockStart() || tabSettings.firstNonSpace(blockText) < positionInBlock) { | 
					
						
							|  |  |  |             if (cursorWithinSnippet) | 
					
						
							|  |  |  |                 cursor.beginEditBlock(); | 
					
						
							|  |  |  |             cursor.deletePreviousChar(); | 
					
						
							|  |  |  |             handled = true; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             int previousIndent = 0; | 
					
						
							|  |  |  |             const int indent = tabSettings.columnAt(blockText, positionInBlock); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (QTextBlock previousNonEmptyBlock = currentBlock.previous(); | 
					
						
							|  |  |  |                  previousNonEmptyBlock.isValid(); | 
					
						
							|  |  |  |                  previousNonEmptyBlock = previousNonEmptyBlock.previous()) { | 
					
						
							|  |  |  |                 QString previousNonEmptyBlockText = previousNonEmptyBlock.text(); | 
					
						
							|  |  |  |                 if (previousNonEmptyBlockText.trimmed().isEmpty()) | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 previousIndent = | 
					
						
							|  |  |  |                     tabSettings.columnAt(previousNonEmptyBlockText, | 
					
						
							|  |  |  |                                          tabSettings.firstNonSpace(previousNonEmptyBlockText)); | 
					
						
							|  |  |  |                 if (previousIndent < indent) { | 
					
						
							|  |  |  |                     cursor.beginEditBlock(); | 
					
						
							|  |  |  |                     cursor.setPosition(currentBlock.position(), QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |                     cursor.insertText(tabSettings.indentationString(previousNonEmptyBlockText)); | 
					
						
							|  |  |  |                     cursor.endEditBlock(); | 
					
						
							|  |  |  |                     handled = true; | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-16 15:39:51 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |     if (!handled) { | 
					
						
							|  |  |  |         if (cursorWithinSnippet) | 
					
						
							|  |  |  |             cursor.beginEditBlock(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         cursor.deletePreviousChar(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |     if (cursorWithinSnippet) { | 
					
						
							|  |  |  |         cursor.endEditBlock(); | 
					
						
							|  |  |  |         d->m_snippetOverlay->updateEquivalentSelections(cursor); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     setTextCursor(cursor); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::wheelEvent(QWheelEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     d->clearVisibleFoldedBlock(); | 
					
						
							| 
									
										
										
										
											2009-12-09 16:27:34 +01:00
										 |  |  |     if (scrollWheelZoomingEnabled() && e->modifiers() & Qt::ControlModifier) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         const int delta = e->delta(); | 
					
						
							|  |  |  |         if (delta < 0) | 
					
						
							|  |  |  |             zoomOut(); | 
					
						
							|  |  |  |         else if (delta > 0) | 
					
						
							|  |  |  |             zoomIn(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     QPlainTextEdit::wheelEvent(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::zoomIn(int range) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     d->clearVisibleFoldedBlock(); | 
					
						
							| 
									
										
										
										
											2009-11-30 19:00:36 +01:00
										 |  |  |     emit requestFontZoom(range*10); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::zoomOut(int range) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     zoomIn(-range); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::zoomReset() | 
					
						
							| 
									
										
										
										
											2009-11-30 19:00:36 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     emit requestZoomReset(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::indentInsertedText(const QTextCursor &tc) | 
					
						
							| 
									
										
										
										
											2010-02-03 16:34:54 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     indent(tc.document(), tc, QChar::Null); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::indent(QTextDocument *doc, const QTextCursor &cursor, QChar typedChar) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-06 12:27:22 +02:00
										 |  |  |     maybeClearSomeExtraSelections(cursor); | 
					
						
							| 
									
										
										
										
											2010-11-09 10:36:02 +01:00
										 |  |  |     d->m_indenter->indent(doc, cursor, typedChar, this); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::reindent(QTextDocument *doc, const QTextCursor &cursor) | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-07-06 12:27:22 +02:00
										 |  |  |     maybeClearSomeExtraSelections(cursor); | 
					
						
							| 
									
										
										
										
											2010-11-09 10:36:02 +01:00
										 |  |  |     d->m_indenter->reindent(doc, cursor, this); | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | BaseTextEditorWidget::Link BaseTextEditorWidget::findLinkAt(const QTextCursor &, bool) | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return Link(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::openLink(const Link &link) | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (link.fileName.isEmpty()) | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (baseTextDocument()->fileName() == link.fileName) { | 
					
						
							|  |  |  |         Core::EditorManager *editorManager = Core::EditorManager::instance(); | 
					
						
							|  |  |  |         editorManager->addCurrentPositionToNavigationHistory(); | 
					
						
							|  |  |  |         gotoLine(link.line, link.column); | 
					
						
							|  |  |  |         setFocus(); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-14 11:54:29 +02:00
										 |  |  |     return openEditorAt(link.fileName, link.line, link.column, QString(), | 
					
						
							|  |  |  |                           Core::EditorManager::IgnoreNavigationHistory | 
					
						
							|  |  |  |                         | Core::EditorManager::ModeSwitch); | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::updateLink(QMouseEvent *e) | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     bool linkFound = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-09 16:27:34 +01:00
										 |  |  |     if (mouseNavigationEnabled() && e->modifiers() & Qt::ControlModifier) { | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |         // Link emulation behaviour for 'go to definition'
 | 
					
						
							|  |  |  |         const QTextCursor cursor = cursorForPosition(e->pos()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Check that the mouse was actually on the text somewhere
 | 
					
						
							|  |  |  |         bool onText = cursorRect(cursor).right() >= e->x(); | 
					
						
							|  |  |  |         if (!onText) { | 
					
						
							|  |  |  |             QTextCursor nextPos = cursor; | 
					
						
							|  |  |  |             nextPos.movePosition(QTextCursor::Right); | 
					
						
							|  |  |  |             onText = cursorRect(nextPos).right() >= e->x(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const Link link = findLinkAt(cursor, false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (onText && link.isValid()) { | 
					
						
							|  |  |  |             showLink(link); | 
					
						
							|  |  |  |             linkFound = true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!linkFound) | 
					
						
							|  |  |  |         clearLink(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::showLink(const Link &link) | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |     if (d->m_currentLink == link) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  |     QTextEdit::ExtraSelection sel; | 
					
						
							|  |  |  |     sel.cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2010-02-01 16:13:21 +01:00
										 |  |  |     sel.cursor.setPosition(link.begin); | 
					
						
							|  |  |  |     sel.cursor.setPosition(link.end, QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  |     sel.format = d->m_linkFormat; | 
					
						
							|  |  |  |     sel.format.setFontUnderline(true); | 
					
						
							|  |  |  |     setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>() << sel); | 
					
						
							|  |  |  |     viewport()->setCursor(Qt::PointingHandCursor); | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |     d->m_currentLink = link; | 
					
						
							|  |  |  |     d->m_linkPressed = false; | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::clearLink() | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |     if (!d->m_currentLink.isValid()) | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>()); | 
					
						
							|  |  |  |     viewport()->setCursor(Qt::IBeamCursor); | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |     d->m_currentLink = Link(); | 
					
						
							|  |  |  |     d->m_linkPressed = false; | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | void BaseTextEditorPrivate::updateMarksBlock(const QTextBlock &block) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     if (const TextBlockUserData *userData = BaseTextDocumentLayout::testUserData(block)) | 
					
						
							| 
									
										
										
										
											2009-11-03 14:29:49 +01:00
										 |  |  |         foreach (ITextMark *mrk, userData->marks()) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             mrk->updateBlock(block); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorPrivate::updateMarksLineNumber() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTextDocument *doc = q->document(); | 
					
						
							|  |  |  |     QTextBlock block = doc->begin(); | 
					
						
							|  |  |  |     int blockNumber = 0; | 
					
						
							|  |  |  |     while (block.isValid()) { | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |         if (const TextBlockUserData *userData = BaseTextDocumentLayout::testUserData(block)) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             foreach (ITextMark *mrk, userData->marks()) { | 
					
						
							|  |  |  |                 mrk->updateLineNumber(blockNumber + 1); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         block = block.next(); | 
					
						
							|  |  |  |         ++blockNumber; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::markBlocksAsChanged(QList<int> blockNumbers) | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QTextBlock block = document()->begin(); | 
					
						
							|  |  |  |     while (block.isValid()) { | 
					
						
							|  |  |  |         if (block.revision() < 0) | 
					
						
							|  |  |  |             block.setRevision(-block.revision() - 1); | 
					
						
							|  |  |  |         block = block.next(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     foreach (const int blockNumber, blockNumbers) { | 
					
						
							|  |  |  |         QTextBlock block = document()->findBlockByNumber(blockNumber); | 
					
						
							|  |  |  |         if (block.isValid()) | 
					
						
							|  |  |  |             block.setRevision(-block.revision() - 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::highlightSearchResults(const QString &txt, Find::FindFlags findFlags) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-01 19:09:17 +01:00
										 |  |  |     QString pattern = txt; | 
					
						
							|  |  |  |     if (pattern.size() < 2) | 
					
						
							|  |  |  |         pattern.clear(); // highlighting single characters is a bit pointless
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (d->m_searchExpr.pattern() == pattern) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         return; | 
					
						
							| 
									
										
										
										
											2009-12-01 19:09:17 +01:00
										 |  |  |     d->m_searchExpr.setPattern(pattern); | 
					
						
							| 
									
										
										
										
											2010-07-15 13:30:04 +02:00
										 |  |  |     d->m_searchExpr.setPatternSyntax((findFlags & Find::FindRegularExpression) ? | 
					
						
							| 
									
										
										
										
											2009-05-29 16:52:12 +02:00
										 |  |  |                                      QRegExp::RegExp : QRegExp::FixedString); | 
					
						
							| 
									
										
										
										
											2010-07-15 13:30:04 +02:00
										 |  |  |     d->m_searchExpr.setCaseSensitivity((findFlags & Find::FindCaseSensitively) ? | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                                        Qt::CaseSensitive : Qt::CaseInsensitive); | 
					
						
							|  |  |  |     d->m_findFlags = findFlags; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 14:47:10 +01:00
										 |  |  |     d->m_delayedUpdateTimer->start(10); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditorWidget::verticalBlockSelectionFirstColumn() const | 
					
						
							| 
									
										
										
										
											2010-04-12 20:49:40 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     if (d->m_inBlockSelectionMode) | 
					
						
							|  |  |  |         return d->m_blockSelection.firstVisualColumn; | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-04-12 20:49:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditorWidget::verticalBlockSelectionLastColumn() const | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (d->m_inBlockSelectionMode) | 
					
						
							|  |  |  |         return d->m_blockSelection.lastVisualColumn; | 
					
						
							|  |  |  |     return -1; | 
					
						
							| 
									
										
										
										
											2010-04-12 20:49:40 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QRegion BaseTextEditorWidget::translatedLineRegion(int lineStart, int lineEnd) const | 
					
						
							| 
									
										
										
										
											2010-07-09 16:09:08 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QRegion region; | 
					
						
							|  |  |  |     for (int i = lineStart ; i <= lineEnd; i++) { | 
					
						
							|  |  |  |         QTextBlock block = document()->findBlockByNumber(i); | 
					
						
							|  |  |  |         QPoint topLeft = blockBoundingGeometry(block).translated(contentOffset()).topLeft().toPoint(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-14 10:41:57 +02:00
										 |  |  |         if (block.isValid()) { | 
					
						
							|  |  |  |             QTextLayout *layout = block.layout(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (int i = 0; i < layout->lineCount();i++) { | 
					
						
							|  |  |  |                 QTextLine line = layout->lineAt(i); | 
					
						
							|  |  |  |                 region += line.naturalTextRect().translated(topLeft).toRect(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-07-09 16:09:08 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return region; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setFindScope(const QTextCursor &start, const QTextCursor &end, | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |                                   int verticalBlockSelectionFirstColumn, | 
					
						
							|  |  |  |                                   int verticalBlockSelectionLastColumn) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |     if (start != d->m_findScopeStart | 
					
						
							|  |  |  |             || end != d->m_findScopeEnd | 
					
						
							|  |  |  |             || verticalBlockSelectionFirstColumn != d->m_findScopeVerticalBlockSelectionFirstColumn | 
					
						
							|  |  |  |             || verticalBlockSelectionLastColumn != d->m_findScopeVerticalBlockSelectionLastColumn) { | 
					
						
							| 
									
										
										
										
											2010-04-13 12:06:26 +02:00
										 |  |  |         d->m_findScopeStart = start; | 
					
						
							|  |  |  |         d->m_findScopeEnd = end; | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         d->m_findScopeVerticalBlockSelectionFirstColumn = verticalBlockSelectionFirstColumn; | 
					
						
							|  |  |  |         d->m_findScopeVerticalBlockSelectionLastColumn = verticalBlockSelectionLastColumn; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         viewport()->update(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::_q_animateUpdate(int position, QPointF lastPos, QRectF rect) | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor(textCursor()); | 
					
						
							|  |  |  |     cursor.setPosition(position); | 
					
						
							|  |  |  |     viewport()->update(QRectF(cursorRect(cursor).topLeft() + rect.topLeft(), rect.size()).toAlignedRect()); | 
					
						
							| 
									
										
										
										
											2009-09-23 12:50:02 +02:00
										 |  |  |     if (!lastPos.isNull()) | 
					
						
							|  |  |  |         viewport()->update(QRectF(lastPos + rect.topLeft(), rect.size()).toAlignedRect()); | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | BaseTextEditorAnimator::BaseTextEditorAnimator(QObject *parent) | 
					
						
							|  |  |  |         :QObject(parent) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_value = 0; | 
					
						
							| 
									
										
										
										
											2009-04-29 12:17:42 +02:00
										 |  |  |     m_timeline = new QTimeLine(256, this); | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |     m_timeline->setCurveShape(QTimeLine::SineCurve); | 
					
						
							|  |  |  |     connect(m_timeline, SIGNAL(valueChanged(qreal)), this, SLOT(step(qreal))); | 
					
						
							|  |  |  |     connect(m_timeline, SIGNAL(finished()), this, SLOT(deleteLater())); | 
					
						
							|  |  |  |     m_timeline->start(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorAnimator::setData(QFont f, QPalette pal, const QString &text) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-05-04 11:10:22 +02:00
										 |  |  |     m_font = f; | 
					
						
							|  |  |  |     m_palette = pal; | 
					
						
							|  |  |  |     m_text = text; | 
					
						
							|  |  |  |     QFontMetrics fm(m_font); | 
					
						
							|  |  |  |     m_size = QSizeF(fm.width(m_text), fm.height()); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorAnimator::draw(QPainter *p, const QPointF &pos) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-09-23 12:50:02 +02:00
										 |  |  |     m_lastDrawPos = pos; | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |     p->setPen(m_palette.text().color()); | 
					
						
							|  |  |  |     QFont f = m_font; | 
					
						
							| 
									
										
										
										
											2009-04-29 12:17:42 +02:00
										 |  |  |     f.setPointSizeF(f.pointSizeF() * (1.0 + m_value/2)); | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |     QFontMetrics fm(f); | 
					
						
							|  |  |  |     int width = fm.width(m_text); | 
					
						
							|  |  |  |     QRectF r((m_size.width()-width)/2, (m_size.height() - fm.height())/2, width, fm.height()); | 
					
						
							|  |  |  |     r.translate(pos); | 
					
						
							|  |  |  |     p->fillRect(r, m_palette.base()); | 
					
						
							|  |  |  |     p->setFont(f); | 
					
						
							|  |  |  |     p->drawText(r, m_text); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 19:02:58 +02:00
										 |  |  | bool BaseTextEditorAnimator::isRunning() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_timeline->state() == QTimeLine::Running; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  | QRectF BaseTextEditorAnimator::rect() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QFont f = m_font; | 
					
						
							| 
									
										
										
										
											2009-04-29 12:17:42 +02:00
										 |  |  |     f.setPointSizeF(f.pointSizeF() * (1.0 + m_value/2)); | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |     QFontMetrics fm(f); | 
					
						
							|  |  |  |     int width = fm.width(m_text); | 
					
						
							|  |  |  |     return QRectF((m_size.width()-width)/2, (m_size.height() - fm.height())/2, width, fm.height()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorAnimator::step(qreal v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QRectF before = rect(); | 
					
						
							|  |  |  |     m_value = v; | 
					
						
							|  |  |  |     QRectF after = rect(); | 
					
						
							| 
									
										
										
										
											2009-09-23 12:50:02 +02:00
										 |  |  |     emit updateRequest(m_position, m_lastDrawPos, before.united(after)); | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorAnimator::finish() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-09-23 12:50:02 +02:00
										 |  |  |     m_timeline->stop(); | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |     step(0); | 
					
						
							|  |  |  |     deleteLater(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::_q_matchParentheses() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (isReadOnly()) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor backwardMatch = textCursor(); | 
					
						
							|  |  |  |     QTextCursor forwardMatch = textCursor(); | 
					
						
							|  |  |  |     const TextBlockUserData::MatchType backwardMatchType = TextBlockUserData::matchCursorBackward(&backwardMatch); | 
					
						
							|  |  |  |     const TextBlockUserData::MatchType forwardMatchType = TextBlockUserData::matchCursorForward(&forwardMatch); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-05 13:19:57 +01:00
										 |  |  |     QList<QTextEdit::ExtraSelection> extraSelections; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-27 13:01:28 +02:00
										 |  |  |     if (backwardMatchType == TextBlockUserData::NoMatch && forwardMatchType == TextBlockUserData::NoMatch) { | 
					
						
							|  |  |  |         setExtraSelections(ParenthesesMatchingSelection, extraSelections); // clear
 | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |     int animatePosition = -1; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     if (backwardMatch.hasSelection()) { | 
					
						
							|  |  |  |         QTextEdit::ExtraSelection sel; | 
					
						
							|  |  |  |         if (backwardMatchType == TextBlockUserData::Mismatch) { | 
					
						
							|  |  |  |             sel.cursor = backwardMatch; | 
					
						
							|  |  |  |             sel.format = d->m_mismatchFormat; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-29 12:17:42 +02:00
										 |  |  |             if (d->m_displaySettings.m_animateMatchingParentheses) { | 
					
						
							|  |  |  |                 animatePosition = backwardMatch.selectionStart(); | 
					
						
							|  |  |  |             } else if (d->m_formatRange) { | 
					
						
							|  |  |  |                 sel.cursor = backwardMatch; | 
					
						
							|  |  |  |                 sel.format = d->m_rangeFormat; | 
					
						
							|  |  |  |                 extraSelections.append(sel); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             sel.cursor = backwardMatch; | 
					
						
							|  |  |  |             sel.format = d->m_matchFormat; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             sel.cursor.setPosition(backwardMatch.selectionStart()); | 
					
						
							|  |  |  |             sel.cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |             extraSelections.append(sel); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             sel.cursor.setPosition(backwardMatch.selectionEnd()); | 
					
						
							|  |  |  |             sel.cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         extraSelections.append(sel); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (forwardMatch.hasSelection()) { | 
					
						
							|  |  |  |         QTextEdit::ExtraSelection sel; | 
					
						
							|  |  |  |         if (forwardMatchType == TextBlockUserData::Mismatch) { | 
					
						
							|  |  |  |             sel.cursor = forwardMatch; | 
					
						
							|  |  |  |             sel.format = d->m_mismatchFormat; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-29 12:17:42 +02:00
										 |  |  |             if (d->m_displaySettings.m_animateMatchingParentheses) { | 
					
						
							|  |  |  |                 animatePosition = forwardMatch.selectionEnd()-1; | 
					
						
							|  |  |  |             } else if (d->m_formatRange) { | 
					
						
							|  |  |  |                 sel.cursor = forwardMatch; | 
					
						
							|  |  |  |                 sel.format = d->m_rangeFormat; | 
					
						
							|  |  |  |                 extraSelections.append(sel); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             sel.cursor = forwardMatch; | 
					
						
							|  |  |  |             sel.format = d->m_matchFormat; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             sel.cursor.setPosition(forwardMatch.selectionStart()); | 
					
						
							|  |  |  |             sel.cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |             extraSelections.append(sel); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             sel.cursor.setPosition(forwardMatch.selectionEnd()); | 
					
						
							|  |  |  |             sel.cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         extraSelections.append(sel); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-06 11:18:56 +02:00
										 |  |  |     if (animatePosition >= 0) { | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |         foreach (const QTextEdit::ExtraSelection &sel, BaseTextEditorWidget::extraSelections(ParenthesesMatchingSelection)) { | 
					
						
							| 
									
										
										
										
											2009-05-06 11:18:56 +02:00
										 |  |  |             if (sel.cursor.selectionStart() == animatePosition | 
					
						
							|  |  |  |                 || sel.cursor.selectionEnd() - 1 == animatePosition) { | 
					
						
							|  |  |  |                 animatePosition = -1; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  |     if (animatePosition >= 0) { | 
					
						
							|  |  |  |         if (d->m_animator) | 
					
						
							|  |  |  |             d->m_animator->finish();  // one animation is enough
 | 
					
						
							|  |  |  |         d->m_animator = new BaseTextEditorAnimator(this); | 
					
						
							|  |  |  |         d->m_animator->setPosition(animatePosition); | 
					
						
							|  |  |  |         QPalette pal; | 
					
						
							|  |  |  |         pal.setBrush(QPalette::Text, d->m_matchFormat.foreground()); | 
					
						
							|  |  |  |         pal.setBrush(QPalette::Base, d->m_rangeFormat.background()); | 
					
						
							|  |  |  |         d->m_animator->setData(font(), pal, characterAt(d->m_animator->position())); | 
					
						
							| 
									
										
										
										
											2009-09-23 12:50:02 +02:00
										 |  |  |         connect(d->m_animator, SIGNAL(updateRequest(int,QPointF,QRectF)), | 
					
						
							|  |  |  |                 this, SLOT(_q_animateUpdate(int,QPointF,QRectF))); | 
					
						
							| 
									
										
										
										
											2009-05-06 11:18:56 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-04-28 18:34:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-06 11:18:56 +02:00
										 |  |  |     setExtraSelections(ParenthesesMatchingSelection, extraSelections); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::_q_highlightBlocks() | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     BaseTextEditorPrivateHighlightBlocks highlightBlocksInfo; | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     QTextBlock block; | 
					
						
							|  |  |  |     if (d->extraAreaHighlightFoldedBlockNumber >= 0) { | 
					
						
							|  |  |  |         block = document()->findBlockByNumber(d->extraAreaHighlightFoldedBlockNumber); | 
					
						
							|  |  |  |         if (block.isValid() | 
					
						
							|  |  |  |             && block.next().isValid() | 
					
						
							|  |  |  |             && BaseTextDocumentLayout::foldingIndent(block.next()) | 
					
						
							|  |  |  |             > BaseTextDocumentLayout::foldingIndent(block)) | 
					
						
							|  |  |  |             block = block.next(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextBlock closeBlock = block; | 
					
						
							|  |  |  |     while (block.isValid()) { | 
					
						
							|  |  |  |         int foldingIndent = BaseTextDocumentLayout::foldingIndent(block); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         while (block.previous().isValid() && BaseTextDocumentLayout::foldingIndent(block) >= foldingIndent) | 
					
						
							|  |  |  |             block = block.previous(); | 
					
						
							|  |  |  |         int nextIndent = BaseTextDocumentLayout::foldingIndent(block); | 
					
						
							|  |  |  |         if (nextIndent == foldingIndent) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         highlightBlocksInfo.open.prepend(block.blockNumber()); | 
					
						
							|  |  |  |         while (closeBlock.next().isValid() | 
					
						
							|  |  |  |             && BaseTextDocumentLayout::foldingIndent(closeBlock.next()) >= foldingIndent ) | 
					
						
							|  |  |  |             closeBlock = closeBlock.next(); | 
					
						
							|  |  |  |         highlightBlocksInfo.close.append(closeBlock.blockNumber()); | 
					
						
							|  |  |  |         int visualIndent = qMin(d->visualIndent(block), d->visualIndent(closeBlock)); | 
					
						
							|  |  |  |         highlightBlocksInfo.visualIndent.prepend(visualIndent); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  |     if (block.isValid()) { | 
					
						
							|  |  |  |         QTextCursor cursor(block); | 
					
						
							|  |  |  |         if (d->extraAreaHighlightCollapseColumn >= 0) | 
					
						
							|  |  |  |             cursor.setPosition(cursor.position() + qMin(d->extraAreaHighlightCollapseColumn, | 
					
						
							|  |  |  |                                                         block.length()-1)); | 
					
						
							|  |  |  |         QTextCursor closeCursor; | 
					
						
							|  |  |  |         bool firstRun = true; | 
					
						
							|  |  |  |         while (TextBlockUserData::findPreviousBlockOpenParenthesis(&cursor, firstRun)) { | 
					
						
							|  |  |  |             firstRun = false; | 
					
						
							|  |  |  |             highlightBlocksInfo.open.prepend(cursor.blockNumber()); | 
					
						
							|  |  |  |             int visualIndent = d->visualIndent(cursor.block()); | 
					
						
							|  |  |  |             if (closeCursor.isNull()) | 
					
						
							|  |  |  |                 closeCursor = cursor; | 
					
						
							|  |  |  |             if (TextBlockUserData::findNextBlockClosingParenthesis(&closeCursor)) { | 
					
						
							|  |  |  |                 highlightBlocksInfo.close.append(closeCursor.blockNumber()); | 
					
						
							|  |  |  |                 visualIndent = qMin(visualIndent, d->visualIndent(closeCursor.block())); | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             highlightBlocksInfo.visualIndent.prepend(visualIndent); | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  |     if (d->m_highlightBlocksInfo != highlightBlocksInfo) { | 
					
						
							|  |  |  |         d->m_highlightBlocksInfo = highlightBlocksInfo; | 
					
						
							|  |  |  |         viewport()->update(); | 
					
						
							| 
									
										
										
										
											2009-04-24 16:44:48 +02:00
										 |  |  |         d->m_extraArea->update(); | 
					
						
							| 
									
										
										
										
											2009-04-23 17:28:53 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setActionHack(QObject *hack) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_actionHack = hack; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QObject *BaseTextEditorWidget::actionHack() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_actionHack; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::changeEvent(QEvent *e) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QPlainTextEdit::changeEvent(e); | 
					
						
							|  |  |  |     if (e->type() == QEvent::ApplicationFontChange | 
					
						
							|  |  |  |         || e->type() == QEvent::FontChange) { | 
					
						
							|  |  |  |         if (d->m_extraArea) { | 
					
						
							|  |  |  |             QFont f = d->m_extraArea->font(); | 
					
						
							| 
									
										
										
										
											2010-10-15 17:19:36 +02:00
										 |  |  |             f.setPointSizeF(font().pointSizeF()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             d->m_extraArea->setFont(f); | 
					
						
							|  |  |  |             slotUpdateExtraAreaWidth(); | 
					
						
							|  |  |  |             d->m_extraArea->update(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::focusInEvent(QFocusEvent *e) | 
					
						
							| 
									
										
										
										
											2009-12-01 19:44:31 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QPlainTextEdit::focusInEvent(e); | 
					
						
							| 
									
										
										
										
											2010-02-08 16:54:14 +01:00
										 |  |  |     updateHighlights(); | 
					
						
							| 
									
										
										
										
											2009-12-01 19:44:31 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::focusOutEvent(QFocusEvent *e) | 
					
						
							| 
									
										
										
										
											2009-11-30 19:13:20 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QPlainTextEdit::focusOutEvent(e); | 
					
						
							|  |  |  |     if (viewport()->cursor().shape() == Qt::BlankCursor) | 
					
						
							|  |  |  |         viewport()->setCursor(Qt::IBeamCursor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::maybeSelectLine() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     if (!cursor.hasSelection()) { | 
					
						
							|  |  |  |         const QTextBlock &block = cursor.block(); | 
					
						
							|  |  |  |         if (block.next().isValid()) { | 
					
						
							|  |  |  |             cursor.setPosition(block.position()); | 
					
						
							|  |  |  |             cursor.setPosition(block.next().position(), QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             cursor.movePosition(QTextCursor::EndOfBlock); | 
					
						
							|  |  |  |             cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |             cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         setTextCursor(cursor); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-05-14 17:24:35 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // shift+del
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::cutLine() | 
					
						
							| 
									
										
										
										
											2009-05-14 17:24:35 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     maybeSelectLine(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     cut(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-17 11:07:24 +01:00
										 |  |  | // ctrl+ins
 | 
					
						
							| 
									
										
										
										
											2010-11-27 14:02:20 +09:00
										 |  |  | void BaseTextEditorWidget::copyLine() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTextCursor prevCursor = textCursor(); | 
					
						
							|  |  |  |     maybeSelectLine(); | 
					
						
							|  |  |  |     copy(); | 
					
						
							|  |  |  |     setTextCursor(prevCursor); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::deleteLine() | 
					
						
							| 
									
										
										
										
											2009-05-14 17:24:35 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     maybeSelectLine(); | 
					
						
							|  |  |  |     textCursor().removeSelectedText(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setExtraSelections(ExtraSelectionKind kind, const QList<QTextEdit::ExtraSelection> &selections) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-05 13:19:57 +01:00
										 |  |  |     if (selections.isEmpty() && d->m_extraSelections[kind].isEmpty()) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     d->m_extraSelections[kind] = selections; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     if (kind == CodeSemanticsSelection) { | 
					
						
							|  |  |  |         d->m_overlay->clear(); | 
					
						
							|  |  |  |         foreach (const QTextEdit::ExtraSelection &selection, d->m_extraSelections[kind]) { | 
					
						
							| 
									
										
										
										
											2009-12-03 18:35:36 +01:00
										 |  |  |             d->m_overlay->addOverlaySelection(selection.cursor, | 
					
						
							|  |  |  |                                               selection.format.background().color(), | 
					
						
							|  |  |  |                                               selection.format.background().color(), | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |                                               TextEditorOverlay::LockSize); | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |         d->m_overlay->setVisible(!d->m_overlay->isEmpty()); | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |     } else if (kind == SnippetPlaceholderSelection) { | 
					
						
							|  |  |  |         d->m_snippetOverlay->clear(); | 
					
						
							|  |  |  |         foreach (const QTextEdit::ExtraSelection &selection, d->m_extraSelections[kind]) { | 
					
						
							|  |  |  |             d->m_snippetOverlay->addOverlaySelection(selection.cursor, | 
					
						
							|  |  |  |                                               selection.format.background().color(), | 
					
						
							|  |  |  |                                               selection.format.background().color(), | 
					
						
							|  |  |  |                                               TextEditorOverlay::ExpandBegin); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-11-02 15:35:42 +01:00
										 |  |  |         d->m_snippetOverlay->mapEquivalentSelections(); | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |         d->m_snippetOverlay->setVisible(!d->m_snippetOverlay->isEmpty()); | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         QList<QTextEdit::ExtraSelection> all; | 
					
						
							|  |  |  |         for (int i = 0; i < NExtraSelectionKinds; ++i) { | 
					
						
							| 
									
										
										
										
											2010-01-19 12:28:50 +01:00
										 |  |  |             if (i == CodeSemanticsSelection || i == SnippetPlaceholderSelection) | 
					
						
							| 
									
										
										
										
											2009-11-25 15:55:45 +01:00
										 |  |  |                 continue; | 
					
						
							|  |  |  |             all += d->m_extraSelections[i]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         QPlainTextEdit::setExtraSelections(all); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QList<QTextEdit::ExtraSelection> BaseTextEditorWidget::extraSelections(ExtraSelectionKind kind) const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-05 13:19:57 +01:00
										 |  |  |     return d->m_extraSelections[kind]; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::maybeClearSomeExtraSelections(const QTextCursor &cursor) | 
					
						
							| 
									
										
										
										
											2010-07-06 12:27:22 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     const int smallSelectionSize = 50 * 50; | 
					
						
							|  |  |  |     if (cursor.selectionEnd() - cursor.selectionStart() < smallSelectionSize) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     d->m_extraSelections[UndefinedSymbolSelection].clear(); | 
					
						
							|  |  |  |     d->m_extraSelections[ObjCSelection].clear(); | 
					
						
							|  |  |  |     d->m_extraSelections[CodeWarningsSelection].clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QList<QTextEdit::ExtraSelection> all; | 
					
						
							|  |  |  |     for (int i = 0; i < NExtraSelectionKinds; ++i) { | 
					
						
							|  |  |  |         if (i == CodeSemanticsSelection || i == SnippetPlaceholderSelection) | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         all += d->m_extraSelections[i]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     QPlainTextEdit::setExtraSelections(all); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QString BaseTextEditorWidget::extraSelectionTooltip(int pos) const | 
					
						
							| 
									
										
										
										
											2009-11-30 17:23:31 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QList<QTextEdit::ExtraSelection> all; | 
					
						
							|  |  |  |     for (int i = 0; i < NExtraSelectionKinds; ++i) { | 
					
						
							|  |  |  |         const QList<QTextEdit::ExtraSelection> &sel = d->m_extraSelections[i]; | 
					
						
							|  |  |  |         for (int j = 0; j < sel.size(); ++j) { | 
					
						
							|  |  |  |             const QTextEdit::ExtraSelection &s = sel.at(j); | 
					
						
							|  |  |  |             if (s.cursor.selectionStart() <= pos | 
					
						
							|  |  |  |                 && s.cursor.selectionEnd() >= pos | 
					
						
							|  |  |  |                 && !s.format.toolTip().isEmpty()) | 
					
						
							|  |  |  |                 return s.format.toolTip(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return QString(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // the blocks list must be sorted
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setIfdefedOutBlocks(const QList<BaseTextEditorWidget::BlockRange> &blocks) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextDocument *doc = document(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  |     QTC_ASSERT(documentLayout, return); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool needUpdate = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextBlock block = doc->firstBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int rangeNumber = 0; | 
					
						
							| 
									
										
										
										
											2009-09-25 17:22:10 +02:00
										 |  |  |     int braceDepthDelta = 0; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     while (block.isValid()) { | 
					
						
							| 
									
										
										
										
											2009-09-25 17:22:10 +02:00
										 |  |  |         bool cleared = false; | 
					
						
							|  |  |  |         bool set = false; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         if (rangeNumber < blocks.size()) { | 
					
						
							|  |  |  |             const BlockRange &range = blocks.at(rangeNumber); | 
					
						
							| 
									
										
										
										
											2009-10-08 12:57:26 +02:00
										 |  |  |             if (block.position() >= range.first && ((block.position() + block.length() - 1) <= range.last || !range.last)) { | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |                 set = BaseTextDocumentLayout::setIfdefedOut(block); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |                 cleared = BaseTextDocumentLayout::clearIfdefedOut(block); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (block.contains(range.last)) | 
					
						
							|  |  |  |                 ++rangeNumber; | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |             cleared = BaseTextDocumentLayout::clearIfdefedOut(block); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-25 17:22:10 +02:00
										 |  |  |         if (cleared || set) { | 
					
						
							|  |  |  |             needUpdate = true; | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |             int delta = BaseTextDocumentLayout::braceDepthDelta(block); | 
					
						
							| 
									
										
										
										
											2009-09-25 17:22:10 +02:00
										 |  |  |             if (cleared) | 
					
						
							|  |  |  |                 braceDepthDelta += delta; | 
					
						
							|  |  |  |             else if (set) | 
					
						
							|  |  |  |                 braceDepthDelta -= delta; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         if (braceDepthDelta) { | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |             BaseTextDocumentLayout::changeBraceDepth(block,braceDepthDelta); | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |             BaseTextDocumentLayout::changeFoldingIndent(block, braceDepthDelta); // ### C++ only, refactor!
 | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-25 17:22:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         block = block.next(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (needUpdate) | 
					
						
							|  |  |  |         documentLayout->requestUpdate(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::format() | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     cursor.beginEditBlock(); | 
					
						
							|  |  |  |     indent(document(), cursor, QChar::Null); | 
					
						
							|  |  |  |     cursor.endEditBlock(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::rewrapParagraph() | 
					
						
							| 
									
										
										
										
											2009-07-21 10:37:00 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     const int paragraphWidth = displaySettings().m_wrapColumn; | 
					
						
							|  |  |  |     const QRegExp anyLettersOrNumbers = QRegExp("\\w"); | 
					
						
							|  |  |  |     const int tabSize = tabSettings().m_tabSize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |     cursor.beginEditBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Find start of paragraph.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (cursor.movePosition(QTextCursor::PreviousBlock, QTextCursor::MoveAnchor)) { | 
					
						
							|  |  |  |         QTextBlock block = cursor.block(); | 
					
						
							|  |  |  |         QString text = block.text(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // If this block is empty, move marker back to previous and terminate.
 | 
					
						
							|  |  |  |         if (!text.contains(anyLettersOrNumbers)) { | 
					
						
							|  |  |  |             cursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Find indent level of current block.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int indentLevel = 0; | 
					
						
							|  |  |  |     QString text = cursor.block().text(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (int i = 0; i < text.length(); i++) { | 
					
						
							|  |  |  |         const QChar ch = text.at(i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (ch == QLatin1Char(' ')) | 
					
						
							|  |  |  |             indentLevel++; | 
					
						
							|  |  |  |         else if (ch == QLatin1Char('\t')) | 
					
						
							|  |  |  |             indentLevel += tabSize - (indentLevel % tabSize); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // If there is a common prefix, it should be kept and expanded to all lines.
 | 
					
						
							|  |  |  |     // this allows nice reflowing of doxygen style comments.
 | 
					
						
							|  |  |  |     QTextCursor nextBlock = cursor; | 
					
						
							|  |  |  |     QString commonPrefix; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (nextBlock.movePosition(QTextCursor::NextBlock)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |          QString nText = nextBlock.block().text(); | 
					
						
							|  |  |  |          int maxLength = qMin(text.length(), nText.length()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          for (int i = 0; i < maxLength; ++i) { | 
					
						
							|  |  |  |              const QChar ch = text.at(i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              if (ch != nText[i] || ch.isLetterOrNumber()) | 
					
						
							|  |  |  |                  break; | 
					
						
							|  |  |  |              commonPrefix.append(ch); | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Find end of paragraph.
 | 
					
						
							|  |  |  |     while (cursor.movePosition(QTextCursor::NextBlock, QTextCursor::KeepAnchor)) { | 
					
						
							|  |  |  |         QString text = cursor.block().text(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!text.contains(anyLettersOrNumbers)) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QString selectedText = cursor.selectedText(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Preserve initial indent level.or common prefix.
 | 
					
						
							|  |  |  |     QString spacing; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (commonPrefix.isEmpty()) { | 
					
						
							| 
									
										
										
										
											2009-10-11 12:19:46 +05:30
										 |  |  |         spacing = tabSettings().indentationString(0, indentLevel, textCursor().block()); | 
					
						
							| 
									
										
										
										
											2009-07-21 10:37:00 +02:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         spacing = commonPrefix; | 
					
						
							|  |  |  |         indentLevel = commonPrefix.length(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int currentLength = indentLevel; | 
					
						
							|  |  |  |     QString result; | 
					
						
							|  |  |  |     result.append(spacing); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Remove existing instances of any common prefix from paragraph to
 | 
					
						
							|  |  |  |     // reflow.
 | 
					
						
							|  |  |  |     selectedText.remove(0, commonPrefix.length()); | 
					
						
							|  |  |  |     commonPrefix.prepend(QChar::ParagraphSeparator); | 
					
						
							|  |  |  |     selectedText.replace(commonPrefix, QLatin1String("\n")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // remove any repeated spaces, trim lines to PARAGRAPH_WIDTH width and
 | 
					
						
							|  |  |  |     // keep the same indentation level as first line in paragraph.
 | 
					
						
							|  |  |  |     QString currentWord; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (int i = 0; i < selectedText.length(); ++i) { | 
					
						
							|  |  |  |         QChar ch = selectedText.at(i); | 
					
						
							|  |  |  |         if (ch.isSpace()) { | 
					
						
							|  |  |  |             if (!currentWord.isEmpty()) { | 
					
						
							|  |  |  |                 currentLength += currentWord.length() + 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 10:37:00 +02:00
										 |  |  |                 if (currentLength > paragraphWidth) { | 
					
						
							| 
									
										
										
										
											2009-07-21 10:37:00 +02:00
										 |  |  |                     currentLength = currentWord.length() + 1 + indentLevel; | 
					
						
							| 
									
										
										
										
											2009-07-21 12:34:56 +02:00
										 |  |  |                     result.chop(1); // remove trailing space
 | 
					
						
							| 
									
										
										
										
											2009-07-21 10:37:00 +02:00
										 |  |  |                     result.append(QChar::ParagraphSeparator); | 
					
						
							|  |  |  |                     result.append(spacing); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 result.append(currentWord); | 
					
						
							| 
									
										
										
										
											2009-07-21 12:37:04 +02:00
										 |  |  |                 result.append(QLatin1Char(' ')); | 
					
						
							| 
									
										
										
										
											2009-07-21 10:37:00 +02:00
										 |  |  |                 currentWord.clear(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         currentWord.append(ch); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-07-21 12:34:56 +02:00
										 |  |  |     result.chop(1); | 
					
						
							| 
									
										
										
										
											2009-07-21 10:37:00 +02:00
										 |  |  |     result.append(QChar::ParagraphSeparator); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cursor.insertText(result); | 
					
						
							|  |  |  |     cursor.endEditBlock(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::unCommentSelection() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::showEvent(QShowEvent* e) | 
					
						
							| 
									
										
										
										
											2009-06-17 19:12:19 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!d->m_fontSettings.isEmpty()) { | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  |         setFontSettings(d->m_fontSettings); | 
					
						
							|  |  |  |         d->m_fontSettings.clear(); | 
					
						
							| 
									
										
										
										
											2009-06-17 19:12:19 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     QPlainTextEdit::showEvent(e); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setFontSettingsIfVisible(const TextEditor::FontSettings &fs) | 
					
						
							| 
									
										
										
										
											2009-06-17 19:12:19 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!isVisible()) { | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  |         d->m_fontSettings = fs; | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2009-06-17 19:12:19 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     setFontSettings(fs); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setFontSettings(const TextEditor::FontSettings &fs) | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     const QTextCharFormat textFormat = fs.toTextCharFormat(QLatin1String(Constants::C_TEXT)); | 
					
						
							|  |  |  |     const QTextCharFormat selectionFormat = fs.toTextCharFormat(QLatin1String(Constants::C_SELECTION)); | 
					
						
							|  |  |  |     const QTextCharFormat lineNumberFormat = fs.toTextCharFormat(QLatin1String(Constants::C_LINE_NUMBER)); | 
					
						
							|  |  |  |     const QTextCharFormat searchResultFormat = fs.toTextCharFormat(QLatin1String(Constants::C_SEARCH_RESULT)); | 
					
						
							| 
									
										
										
										
											2009-04-27 14:10:54 +02:00
										 |  |  |     d->m_searchScopeFormat = fs.toTextCharFormat(QLatin1String(Constants::C_SEARCH_SCOPE)); | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |     const QTextCharFormat parenthesesFormat = fs.toTextCharFormat(QLatin1String(Constants::C_PARENTHESES)); | 
					
						
							| 
									
										
										
										
											2009-04-27 14:10:54 +02:00
										 |  |  |     d->m_currentLineFormat = fs.toTextCharFormat(QLatin1String(Constants::C_CURRENT_LINE)); | 
					
						
							|  |  |  |     d->m_currentLineNumberFormat = fs.toTextCharFormat(QLatin1String(Constants::C_CURRENT_LINE_NUMBER)); | 
					
						
							| 
									
										
										
										
											2009-09-08 13:03:24 +02:00
										 |  |  |     d->m_linkFormat = fs.toTextCharFormat(QLatin1String(TextEditor::Constants::C_LINK)); | 
					
						
							| 
									
										
										
										
											2009-04-27 14:10:54 +02:00
										 |  |  |     d->m_ifdefedOutFormat = fs.toTextCharFormat(QLatin1String(Constants::C_DISABLED_CODE)); | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |     QFont font(textFormat.font()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QColor foreground = textFormat.foreground().color(); | 
					
						
							|  |  |  |     const QColor background = textFormat.background().color(); | 
					
						
							|  |  |  |     QPalette p = palette(); | 
					
						
							|  |  |  |     p.setColor(QPalette::Text, foreground); | 
					
						
							|  |  |  |     p.setColor(QPalette::Foreground, foreground); | 
					
						
							|  |  |  |     p.setColor(QPalette::Base, background); | 
					
						
							|  |  |  |     p.setColor(QPalette::Highlight, (selectionFormat.background().style() != Qt::NoBrush) ? | 
					
						
							|  |  |  |                selectionFormat.background().color() : | 
					
						
							|  |  |  |                QApplication::palette().color(QPalette::Highlight)); | 
					
						
							| 
									
										
										
										
											2010-08-06 12:59:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     p.setBrush(QPalette::HighlightedText, selectionFormat.foreground()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |     p.setBrush(QPalette::Inactive, QPalette::Highlight, p.highlight()); | 
					
						
							|  |  |  |     p.setBrush(QPalette::Inactive, QPalette::HighlightedText, p.highlightedText()); | 
					
						
							|  |  |  |     setPalette(p); | 
					
						
							|  |  |  |     setFont(font); | 
					
						
							|  |  |  |     setTabSettings(d->m_document->tabSettings()); // update tabs, they depend on the font
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Line numbers
 | 
					
						
							|  |  |  |     QPalette ep = d->m_extraArea->palette(); | 
					
						
							|  |  |  |     ep.setColor(QPalette::Dark, lineNumberFormat.foreground().color()); | 
					
						
							|  |  |  |     ep.setColor(QPalette::Background, lineNumberFormat.background().style() != Qt::NoBrush ? | 
					
						
							|  |  |  |                 lineNumberFormat.background().color() : background); | 
					
						
							|  |  |  |     d->m_extraArea->setPalette(ep); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Search results
 | 
					
						
							|  |  |  |     d->m_searchResultFormat.setBackground(searchResultFormat.background()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Matching braces
 | 
					
						
							|  |  |  |     d->m_matchFormat.setForeground(parenthesesFormat.foreground()); | 
					
						
							|  |  |  |     d->m_rangeFormat.setBackground(parenthesesFormat.background()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-29 16:44:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // snippests
 | 
					
						
							|  |  |  |     d->m_occurrencesFormat = fs.toTextCharFormat(QLatin1String(TextEditor::Constants::C_OCCURRENCES)); | 
					
						
							|  |  |  |     d->m_occurrencesFormat.clearForeground(); | 
					
						
							|  |  |  |     d->m_occurrenceRenameFormat = fs.toTextCharFormat(QLatin1String(TextEditor::Constants::C_OCCURRENCES_RENAME)); | 
					
						
							|  |  |  |     d->m_occurrenceRenameFormat.clearForeground(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-15 16:10:15 +02:00
										 |  |  |     slotUpdateExtraAreaWidth();   // Adjust to new font width
 | 
					
						
							|  |  |  |     updateCurrentLineHighlight(); // Make sure it takes the new color
 | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setTabSettings(const TabSettings &ts) | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_document->setTabSettings(ts); | 
					
						
							|  |  |  |     int charWidth = QFontMetrics(font()).width(QChar(' ')); | 
					
						
							|  |  |  |     setTabStopWidth(charWidth * ts.m_tabSize); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setDisplaySettings(const DisplaySettings &ds) | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     setLineWrapMode(ds.m_textWrapping ? QPlainTextEdit::WidgetWidth : QPlainTextEdit::NoWrap); | 
					
						
							|  |  |  |     setLineNumbersVisible(ds.m_displayLineNumbers); | 
					
						
							|  |  |  |     setVisibleWrapColumn(ds.m_showWrapColumn ? ds.m_wrapColumn : 0); | 
					
						
							|  |  |  |     setHighlightCurrentLine(ds.m_highlightCurrentLine); | 
					
						
							| 
									
										
										
										
											2009-07-16 11:27:02 +02:00
										 |  |  |     setRevisionsVisible(ds.m_markTextChanges); | 
					
						
							| 
									
										
										
										
											2010-04-14 11:49:58 +02:00
										 |  |  |     setCenterOnScroll(ds.m_centerCursorOnScroll); | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (d->m_displaySettings.m_visualizeWhitespace != ds.m_visualizeWhitespace) { | 
					
						
							| 
									
										
										
										
											2010-07-09 14:47:18 +02:00
										 |  |  |         if (SyntaxHighlighter *highlighter = baseTextDocument()->syntaxHighlighter()) | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  |             highlighter->rehighlight(); | 
					
						
							|  |  |  |         QTextOption option =  document()->defaultTextOption(); | 
					
						
							|  |  |  |         if (ds.m_visualizeWhitespace) | 
					
						
							|  |  |  |             option.setFlags(option.flags() | QTextOption::ShowTabsAndSpaces); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             option.setFlags(option.flags() & ~QTextOption::ShowTabsAndSpaces); | 
					
						
							|  |  |  |         option.setFlags(option.flags() | QTextOption::AddSpaceForLineAndParagraphSeparators); | 
					
						
							|  |  |  |         document()->setDefaultTextOption(option); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     d->m_displaySettings = ds; | 
					
						
							| 
									
										
										
										
											2009-05-08 18:24:44 +02:00
										 |  |  |     if (!ds.m_highlightBlocks) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         d->extraAreaHighlightFoldedBlockNumber = -1; | 
					
						
							| 
									
										
										
										
											2009-05-08 18:24:44 +02:00
										 |  |  |         d->m_highlightBlocksInfo = BaseTextEditorPrivateHighlightBlocks(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-05-28 11:11:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-10 15:09:18 +01:00
										 |  |  |     updateCodeFoldingVisible(); | 
					
						
							| 
									
										
										
										
											2010-02-08 16:54:14 +01:00
										 |  |  |     updateHighlights(); | 
					
						
							| 
									
										
										
										
											2009-04-29 16:46:54 +02:00
										 |  |  |     viewport()->update(); | 
					
						
							|  |  |  |     extraArea()->update(); | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setBehaviorSettings(const TextEditor::BehaviorSettings &bs) | 
					
						
							| 
									
										
										
										
											2009-12-08 17:37:40 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     setMouseNavigationEnabled(bs.m_mouseNavigation); | 
					
						
							| 
									
										
										
										
											2009-12-09 16:27:34 +01:00
										 |  |  |     setScrollWheelZoomingEnabled(bs.m_scrollWheelZooming); | 
					
						
							| 
									
										
										
										
											2009-12-08 17:37:40 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setStorageSettings(const StorageSettings &storageSettings) | 
					
						
							| 
									
										
										
										
											2009-03-17 16:16:36 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_document->setStorageSettings(storageSettings); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setCompletionSettings(const TextEditor::CompletionSettings &completionSettings) | 
					
						
							| 
									
										
										
										
											2010-05-11 11:33:31 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-30 14:14:33 +01:00
										 |  |  |     d->m_autoCompleter->setAutoParenthesesEnabled(completionSettings.m_autoInsertBrackets); | 
					
						
							|  |  |  |     d->m_autoCompleter->setSurroundWithEnabled(completionSettings.m_autoInsertBrackets); | 
					
						
							| 
									
										
										
										
											2010-05-11 11:33:31 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setExtraEncodingSettings(const ExtraEncodingSettings &extraEncodingSettings) | 
					
						
							| 
									
										
										
										
											2011-02-01 14:13:54 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     d->m_document->setExtraEncodingSettings(extraEncodingSettings); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::fold() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextDocument *doc = document(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  |     QTC_ASSERT(documentLayout, return); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QTextBlock block = textCursor().block(); | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     if (!(BaseTextDocumentLayout::canFold(block) && block.next().isVisible())) { | 
					
						
							|  |  |  |         // find the closest previous block which can fold
 | 
					
						
							|  |  |  |         int indent = BaseTextDocumentLayout::foldingIndent(block); | 
					
						
							|  |  |  |         while (block.isValid() && (BaseTextDocumentLayout::foldingIndent(block) >= indent || !block.isVisible())) | 
					
						
							|  |  |  |             block = block.previous(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     if (block.isValid()) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         BaseTextDocumentLayout::doFoldOrUnfold(block, false); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         d->moveCursorVisible(); | 
					
						
							|  |  |  |         documentLayout->requestUpdate(); | 
					
						
							|  |  |  |         documentLayout->emitDocumentSizeChanged(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::unfold() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextDocument *doc = document(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  |     QTC_ASSERT(documentLayout, return); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     QTextBlock block = textCursor().block(); | 
					
						
							|  |  |  |     while (block.isValid() && !block.isVisible()) | 
					
						
							|  |  |  |         block = block.previous(); | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |     BaseTextDocumentLayout::doFoldOrUnfold(block, true); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     d->moveCursorVisible(); | 
					
						
							|  |  |  |     documentLayout->requestUpdate(); | 
					
						
							|  |  |  |     documentLayout->emitDocumentSizeChanged(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::unfoldAll() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextDocument *doc = document(); | 
					
						
							| 
									
										
										
										
											2010-04-26 14:06:29 +02:00
										 |  |  |     BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  |     QTC_ASSERT(documentLayout, return); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QTextBlock block = doc->firstBlock(); | 
					
						
							|  |  |  |     bool makeVisible = true; | 
					
						
							|  |  |  |     while (block.isValid()) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         if (block.isVisible() && BaseTextDocumentLayout::canFold(block) && block.next().isVisible()) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             makeVisible = false; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         block = block.next(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     block = doc->firstBlock(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while (block.isValid()) { | 
					
						
							| 
									
										
										
										
											2010-05-20 15:10:26 +02:00
										 |  |  |         if (BaseTextDocumentLayout::canFold(block)) | 
					
						
							|  |  |  |             BaseTextDocumentLayout::doFoldOrUnfold(block, makeVisible); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         block = block.next(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     d->moveCursorVisible(); | 
					
						
							|  |  |  |     documentLayout->requestUpdate(); | 
					
						
							|  |  |  |     documentLayout->emitDocumentSizeChanged(); | 
					
						
							| 
									
										
										
										
											2009-02-17 16:14:52 +01:00
										 |  |  |     centerCursor(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setTextCodec(QTextCodec *codec) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     baseTextDocument()->setCodec(codec); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QTextCodec *BaseTextEditorWidget::textCodec() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return baseTextDocument()->codec(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setReadOnly(bool b) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QPlainTextEdit::setReadOnly(b); | 
					
						
							|  |  |  |     if (b) | 
					
						
							|  |  |  |         setTextInteractionFlags(textInteractionFlags() | Qt::TextSelectableByKeyboard); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::cut() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (d->m_inBlockSelectionMode) { | 
					
						
							|  |  |  |         copy(); | 
					
						
							|  |  |  |         d->removeBlockSelection(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     QPlainTextEdit::cut(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::paste() | 
					
						
							| 
									
										
										
										
											2008-12-04 18:37:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (d->m_inBlockSelectionMode) { | 
					
						
							|  |  |  |         d->removeBlockSelection(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     QPlainTextEdit::paste(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QMimeData *BaseTextEditorWidget::createMimeDataFromSelection() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (d->m_inBlockSelectionMode) { | 
					
						
							|  |  |  |         QMimeData *mimeData = new QMimeData; | 
					
						
							|  |  |  |         QString text = d->copyBlockSelection(); | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |         mimeData->setData(QLatin1String("application/vnd.nokia.qtcreator.vblocktext"), text.toUtf8()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         mimeData->setText(text); // for exchangeability
 | 
					
						
							|  |  |  |         return mimeData; | 
					
						
							| 
									
										
										
										
											2010-03-05 11:50:37 +01:00
										 |  |  |     } else if (textCursor().hasSelection()) { | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |         QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |         QMimeData *mimeData = new QMimeData; | 
					
						
							| 
									
										
										
										
											2010-03-05 11:50:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Copy the selected text as plain text
 | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |         QString text = cursor.selectedText(); | 
					
						
							| 
									
										
										
										
											2009-09-30 17:48:57 +02:00
										 |  |  |         convertToPlainText(text); | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |         mimeData->setText(text); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-05 11:50:37 +01:00
										 |  |  |         // Copy the selected text as HTML
 | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // Create a new document from the selected text document fragment
 | 
					
						
							|  |  |  |             QTextDocument *tempDocument = new QTextDocument; | 
					
						
							|  |  |  |             QTextCursor tempCursor(tempDocument); | 
					
						
							|  |  |  |             tempCursor.insertFragment(cursor.selection()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Apply the additional formats set by the syntax highlighter
 | 
					
						
							|  |  |  |             QTextBlock start = document()->findBlock(cursor.selectionStart()); | 
					
						
							|  |  |  |             QTextBlock end = document()->findBlock(cursor.selectionEnd()); | 
					
						
							|  |  |  |             end = end.next(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const int selectionStart = cursor.selectionStart(); | 
					
						
							|  |  |  |             const int endOfDocument = tempDocument->characterCount() - 1; | 
					
						
							|  |  |  |             for (QTextBlock current = start; current.isValid() && current != end; current = current.next()) { | 
					
						
							|  |  |  |                 const QTextLayout *layout = current.layout(); | 
					
						
							|  |  |  |                 foreach (const QTextLayout::FormatRange &range, layout->additionalFormats()) { | 
					
						
							|  |  |  |                     const int start = current.position() + range.start - selectionStart; | 
					
						
							|  |  |  |                     const int end = start + range.length; | 
					
						
							|  |  |  |                     if (end <= 0 || start >= endOfDocument) | 
					
						
							|  |  |  |                         continue; | 
					
						
							|  |  |  |                     tempCursor.setPosition(qMax(start, 0)); | 
					
						
							|  |  |  |                     tempCursor.setPosition(qMin(end, endOfDocument), QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |                     tempCursor.setCharFormat(range.format); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Reset the user states since they are not interesting
 | 
					
						
							|  |  |  |             for (QTextBlock block = tempDocument->begin(); block.isValid(); block = block.next()) | 
					
						
							|  |  |  |                 block.setUserState(-1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Make sure the text appears pre-formatted
 | 
					
						
							|  |  |  |             tempCursor.setPosition(0); | 
					
						
							|  |  |  |             tempCursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |             QTextBlockFormat blockFormat = tempCursor.blockFormat(); | 
					
						
							|  |  |  |             blockFormat.setNonBreakableLines(true); | 
					
						
							|  |  |  |             tempCursor.setBlockFormat(blockFormat); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             mimeData->setHtml(tempCursor.selection().toHtml()); | 
					
						
							|  |  |  |             delete tempDocument; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |         /*
 | 
					
						
							|  |  |  |           Try to figure out whether we are copying an entire block, and store the complete block | 
					
						
							|  |  |  |           including indentation in the qtcreator.blocktext mimetype. | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |         QTextCursor selstart = cursor; | 
					
						
							|  |  |  |         selstart.setPosition(cursor.selectionStart()); | 
					
						
							|  |  |  |         QTextCursor selend = cursor; | 
					
						
							|  |  |  |         selend.setPosition(cursor.selectionEnd()); | 
					
						
							|  |  |  |         const TabSettings &ts = d->m_document->tabSettings(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         bool startOk = ts.cursorIsAtBeginningOfLine(selstart); | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |         bool multipleBlocks = (selend.block() != selstart.block()); | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |         if (startOk && multipleBlocks) { | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |             selstart.movePosition(QTextCursor::StartOfBlock); | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |             if (ts.cursorIsAtBeginningOfLine(selend)) | 
					
						
							|  |  |  |                 selend.movePosition(QTextCursor::StartOfBlock); | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |             cursor.setPosition(selstart.position()); | 
					
						
							|  |  |  |             cursor.setPosition(selend.position(), QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |             text = cursor.selectedText(); | 
					
						
							|  |  |  |             mimeData->setData(QLatin1String("application/vnd.nokia.qtcreator.blocktext"), text.toUtf8()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return mimeData; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::canInsertFromMimeData(const QMimeData *source) const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return QPlainTextEdit::canInsertFromMimeData(source); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::insertFromMimeData(const QMimeData *source) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |     if (isReadOnly()) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (source->hasFormat(QLatin1String("application/vnd.nokia.qtcreator.vblocktext"))) { | 
					
						
							|  |  |  |         QString text = QString::fromUtf8(source->data(QLatin1String("application/vnd.nokia.qtcreator.vblocktext"))); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         if (text.isEmpty()) | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2010-09-24 11:35:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  |         if (d->m_codeAssistant->hasContext()) | 
					
						
							|  |  |  |             d->m_codeAssistant->destroyContext(); | 
					
						
							| 
									
										
										
										
											2010-09-24 11:35:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         QStringList lines = text.split(QLatin1Char('\n')); | 
					
						
							|  |  |  |         QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  |         cursor.beginEditBlock(); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         const TabSettings &ts = d->m_document->tabSettings(); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         int initialCursorPosition = cursor.position(); | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |         int column = ts.columnAt(cursor.block().text(), cursor.positionInBlock()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         cursor.insertText(lines.first()); | 
					
						
							|  |  |  |         for (int i = 1; i < lines.count(); ++i) { | 
					
						
							|  |  |  |             QTextBlock next = cursor.block().next(); | 
					
						
							|  |  |  |             if (next.isValid()) { | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |                 cursor.setPosition(next.position()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 cursor.movePosition(QTextCursor::EndOfBlock); | 
					
						
							|  |  |  |                 cursor.insertBlock(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  |             int offset = 0; | 
					
						
							|  |  |  |             int position = ts.positionAtColumn(cursor.block().text(), column, &offset); | 
					
						
							|  |  |  |             cursor.setPosition(cursor.block().position() + position); | 
					
						
							|  |  |  |             if (offset < 0) { | 
					
						
							|  |  |  |                 cursor.deleteChar(); | 
					
						
							|  |  |  |                 cursor.insertText(QString(-offset, QLatin1Char(' '))); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 cursor.insertText(QString(offset, QLatin1Char(' '))); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |             cursor.insertText(lines.at(i)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         cursor.setPosition(initialCursorPosition); | 
					
						
							|  |  |  |         cursor.endEditBlock(); | 
					
						
							|  |  |  |         setTextCursor(cursor); | 
					
						
							|  |  |  |         ensureCursorVisible(); | 
					
						
							| 
									
										
										
										
											2010-09-24 13:02:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (d->m_snippetOverlay->isVisible() && lines.count() > 1) { | 
					
						
							|  |  |  |             d->m_snippetOverlay->hide(); | 
					
						
							|  |  |  |             d->m_snippetOverlay->clear(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-24 13:39:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QString text = source->text(); | 
					
						
							|  |  |  |     if (text.isEmpty()) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  |     if (d->m_codeAssistant->hasContext()) | 
					
						
							|  |  |  |         d->m_codeAssistant->destroyContext(); | 
					
						
							| 
									
										
										
										
											2010-09-24 11:35:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-24 13:02:13 +02:00
										 |  |  |     if (d->m_snippetOverlay->isVisible() && (text.contains(QLatin1Char('\n')) | 
					
						
							|  |  |  |                                              || text.contains(QLatin1Char('\t')))) { | 
					
						
							|  |  |  |         d->m_snippetOverlay->hide(); | 
					
						
							|  |  |  |         d->m_snippetOverlay->clear(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-24 11:34:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-24 13:39:45 +02:00
										 |  |  |     const TabSettings &ts = d->m_document->tabSettings(); | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |     if (!ts.m_autoIndent) { | 
					
						
							| 
									
										
										
										
											2009-09-24 13:39:45 +02:00
										 |  |  |         cursor.beginEditBlock(); | 
					
						
							|  |  |  |         cursor.insertText(text); | 
					
						
							|  |  |  |         cursor.endEditBlock(); | 
					
						
							|  |  |  |         setTextCursor(cursor); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cursor.beginEditBlock(); | 
					
						
							| 
									
										
										
										
											2009-11-09 15:55:47 +01:00
										 |  |  |     cursor.removeSelectedText(); | 
					
						
							| 
									
										
										
										
											2009-09-24 13:39:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |     bool insertAtBeginningOfLine = ts.cursorIsAtBeginningOfLine(cursor); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (insertAtBeginningOfLine | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  |         && source->hasFormat(QLatin1String("application/vnd.nokia.qtcreator.blocktext"))) { | 
					
						
							|  |  |  |         text = QString::fromUtf8(source->data(QLatin1String("application/vnd.nokia.qtcreator.blocktext"))); | 
					
						
							|  |  |  |         if (text.isEmpty()) | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-29 12:44:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |     int reindentBlockStart = cursor.blockNumber() + (insertAtBeginningOfLine?0:1); | 
					
						
							| 
									
										
										
										
											2009-09-28 16:22:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |     bool hasFinalNewline = (text.endsWith(QLatin1Char('\n')) | 
					
						
							|  |  |  |                             || text.endsWith(QChar::ParagraphSeparator) | 
					
						
							|  |  |  |                             || text.endsWith(QLatin1Char('\r'))); | 
					
						
							| 
									
										
										
										
											2009-09-28 16:22:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-27 15:22:01 +01:00
										 |  |  |     if (insertAtBeginningOfLine | 
					
						
							|  |  |  |         && hasFinalNewline) // since we'll add a final newline, preserve current line's indentation
 | 
					
						
							| 
									
										
										
										
											2009-09-30 17:31:12 +02:00
										 |  |  |         cursor.setPosition(cursor.block().position()); | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 12:40:08 +02:00
										 |  |  |     int cursorPosition = cursor.position(); | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |     cursor.insertText(text); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int reindentBlockEnd = cursor.blockNumber() - (hasFinalNewline?1:0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-30 17:31:12 +02:00
										 |  |  |     if (reindentBlockStart < reindentBlockEnd | 
					
						
							|  |  |  |         || (reindentBlockStart == reindentBlockEnd | 
					
						
							|  |  |  |             && (!insertAtBeginningOfLine || hasFinalNewline))) { | 
					
						
							| 
									
										
										
										
											2009-10-01 12:40:08 +02:00
										 |  |  |         if (insertAtBeginningOfLine && !hasFinalNewline) { | 
					
						
							|  |  |  |             QTextCursor unnecessaryWhitespace = cursor; | 
					
						
							|  |  |  |             unnecessaryWhitespace.setPosition(cursorPosition); | 
					
						
							|  |  |  |             unnecessaryWhitespace.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |             unnecessaryWhitespace.removeSelectedText(); | 
					
						
							| 
									
										
										
										
											2009-10-01 12:40:08 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-30 17:10:58 +02:00
										 |  |  |         QTextCursor c = cursor; | 
					
						
							|  |  |  |         c.setPosition(cursor.document()->findBlockByNumber(reindentBlockStart).position()); | 
					
						
							|  |  |  |         c.setPosition(cursor.document()->findBlockByNumber(reindentBlockEnd).position(), | 
					
						
							|  |  |  |                       QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |         reindent(document(), c); | 
					
						
							| 
									
										
										
										
											2009-09-24 13:39:45 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cursor.endEditBlock(); | 
					
						
							|  |  |  |     setTextCursor(cursor); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::appendStandardContextMenuActions(QMenu *menu) | 
					
						
							| 
									
										
										
										
											2010-04-26 14:02:09 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     menu->addSeparator(); | 
					
						
							|  |  |  |     Core::ActionManager *am = Core::ICore::instance()->actionManager(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QAction *a = am->command(Core::Constants::CUT)->action(); | 
					
						
							|  |  |  |     if (a && a->isEnabled()) | 
					
						
							|  |  |  |         menu->addAction(a); | 
					
						
							|  |  |  |     a = am->command(Core::Constants::COPY)->action(); | 
					
						
							|  |  |  |     if (a && a->isEnabled()) | 
					
						
							|  |  |  |         menu->addAction(a); | 
					
						
							|  |  |  |     a = am->command(Core::Constants::PASTE)->action(); | 
					
						
							|  |  |  |     if (a && a->isEnabled()) | 
					
						
							|  |  |  |         menu->addAction(a); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | BaseTextEditor::BaseTextEditor(BaseTextEditorWidget *editor) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |   : e(editor) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-04-13 13:00:30 +02:00
										 |  |  |     setWidget(e); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     using namespace Find; | 
					
						
							|  |  |  |     Aggregation::Aggregate *aggregate = new Aggregation::Aggregate; | 
					
						
							|  |  |  |     BaseTextFind *baseTextFind = new BaseTextFind(editor); | 
					
						
							| 
									
										
										
										
											2011-02-16 10:02:30 +01:00
										 |  |  |     connect(baseTextFind, SIGNAL(highlightAll(QString,Find::FindFlags)), | 
					
						
							|  |  |  |             editor, SLOT(highlightSearchResults(QString,Find::FindFlags))); | 
					
						
							|  |  |  |     connect(baseTextFind, SIGNAL(findScopeChanged(QTextCursor,QTextCursor,int,int)), | 
					
						
							|  |  |  |             editor, SLOT(setFindScope(QTextCursor,QTextCursor,int,int))); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     aggregate->add(baseTextFind); | 
					
						
							|  |  |  |     aggregate->add(editor); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-05 11:06:05 +02:00
										 |  |  |     m_cursorPositionLabel = new Utils::LineColumnLabel; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-25 15:58:02 +01:00
										 |  |  |     m_stretchWidget = new QWidget; | 
					
						
							|  |  |  |     m_stretchWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     m_toolBar = new QToolBar; | 
					
						
							| 
									
										
										
										
											2011-02-25 15:58:02 +01:00
										 |  |  |     m_toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); | 
					
						
							|  |  |  |     m_toolBar->addWidget(m_stretchWidget); | 
					
						
							|  |  |  |     m_cursorPositionLabelAction = m_toolBar->addWidget(m_cursorPositionLabel); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     connect(editor, SIGNAL(cursorPositionChanged()), this, SLOT(updateCursorPosition())); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | BaseTextEditor::~BaseTextEditor() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     delete m_toolBar; | 
					
						
							|  |  |  |     delete e; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QWidget *BaseTextEditor::toolBar() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return m_toolBar; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-25 15:58:02 +01:00
										 |  |  | void BaseTextEditor::insertExtraToolBarWidget(BaseTextEditor::Side side, | 
					
						
							|  |  |  |                                               QWidget *widget) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (widget->sizePolicy().horizontalPolicy() & QSizePolicy::ExpandFlag) { | 
					
						
							|  |  |  |         if (m_stretchWidget) | 
					
						
							|  |  |  |             m_stretchWidget->deleteLater(); | 
					
						
							|  |  |  |         m_stretchWidget = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (side == Right) | 
					
						
							|  |  |  |         m_toolBar->insertWidget(m_cursorPositionLabelAction, widget); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         m_toolBar->insertWidget(m_toolBar->actions().first(), widget); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditor::find(const QString &) const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditor::currentLine() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return e->textCursor().blockNumber() + 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditor::currentColumn() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = e->textCursor(); | 
					
						
							|  |  |  |     return cursor.position() - cursor.block().position() + 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditor::columnCount() const | 
					
						
							| 
									
										
										
										
											2010-12-13 15:17:33 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return e->columnCount(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditor::rowCount() const | 
					
						
							| 
									
										
										
										
											2010-12-13 15:17:33 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return e->rowCount(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QRect BaseTextEditor::cursorRect(int pos) const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor tc = e->textCursor(); | 
					
						
							|  |  |  |     if (pos >= 0) | 
					
						
							|  |  |  |         tc.setPosition(pos); | 
					
						
							|  |  |  |     QRect result = e->cursorRect(tc); | 
					
						
							|  |  |  |     result.moveTo(e->viewport()->mapToGlobal(result.topLeft())); | 
					
						
							|  |  |  |     return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QString BaseTextEditor::contents() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return e->toPlainText(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QString BaseTextEditor::selectedText() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (e->textCursor().hasSelection()) | 
					
						
							|  |  |  |         return e->textCursor().selectedText(); | 
					
						
							|  |  |  |     return QString(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QString BaseTextEditor::textAt(int pos, int length) const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  |     return Convenience::textAt(e->textCursor(), pos, length); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditor::remove(int length) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor tc = e->textCursor(); | 
					
						
							|  |  |  |     tc.setPosition(tc.position() + length, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     tc.removeSelectedText(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditor::insert(const QString &string) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor tc = e->textCursor(); | 
					
						
							|  |  |  |     tc.insertText(string); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditor::replace(int length, const QString &string) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor tc = e->textCursor(); | 
					
						
							|  |  |  |     tc.setPosition(tc.position() + length, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     tc.insertText(string); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditor::setCursorPosition(int pos) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor tc = e->textCursor(); | 
					
						
							|  |  |  |     tc.setPosition(pos); | 
					
						
							|  |  |  |     e->setTextCursor(tc); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditor::select(int toPos) | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QTextCursor tc = e->textCursor(); | 
					
						
							|  |  |  |     tc.setPosition(toPos, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     e->setTextCursor(tc); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditor::updateCursorPosition() | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     const QTextCursor cursor = e->textCursor(); | 
					
						
							|  |  |  |     const QTextBlock block = cursor.block(); | 
					
						
							|  |  |  |     const int line = block.blockNumber() + 1; | 
					
						
							| 
									
										
										
										
											2009-06-09 19:45:18 +02:00
										 |  |  |     const int column = cursor.position() - block.position(); | 
					
						
							|  |  |  |     m_cursorPositionLabel->setText(tr("Line: %1, Col: %2").arg(line).arg(e->tabSettings().columnAt(block.text(), column)+1), | 
					
						
							| 
									
										
										
										
											2011-02-25 16:00:23 +01:00
										 |  |  |                                    tr("Line: 9999, Col: 999")); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     m_contextHelpId.clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!block.isVisible()) | 
					
						
							|  |  |  |         e->ensureCursorVisible(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | QString BaseTextEditor::contextHelpId() const | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (m_contextHelpId.isEmpty()) | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  |         emit const_cast<BaseTextEditor*>(this)->contextHelpIdRequested(e->editor(), | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |                                                                                e->textCursor().position()); | 
					
						
							|  |  |  |     return m_contextHelpId; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setRefactorMarkers(const Internal::RefactorMarkers &markers) | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-01 16:29:45 +01:00
										 |  |  |     foreach (const RefactorMarker &marker, d->m_refactorOverlay->markers()) | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |         requestBlockUpdate(marker.cursor.block()); | 
					
						
							|  |  |  |     d->m_refactorOverlay->setMarkers(markers); | 
					
						
							| 
									
										
										
										
											2010-11-01 16:29:45 +01:00
										 |  |  |     foreach (const RefactorMarker &marker, markers) | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  |         requestBlockUpdate(marker.cursor.block()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::doFoo() { | 
					
						
							| 
									
										
										
										
											2010-07-02 13:47:14 +02:00
										 |  |  | #ifdef DO_FOO
 | 
					
						
							|  |  |  |     qDebug() << Q_FUNC_INFO; | 
					
						
							|  |  |  |     RefactorMarkers markers = d->m_refactorOverlay->markers(); | 
					
						
							|  |  |  |     RefactorMarker marker; | 
					
						
							|  |  |  |     marker.tooltip = "Hello World"; | 
					
						
							|  |  |  |     marker.cursor = textCursor(); | 
					
						
							|  |  |  |     markers += marker; | 
					
						
							|  |  |  |     setRefactorMarkers(markers); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void Internal::BaseTextBlockSelection::moveAnchor(int blockNumber, int visualColumn) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (visualColumn >= 0) { | 
					
						
							|  |  |  |         if (anchor % 2) { | 
					
						
							|  |  |  |             lastVisualColumn = visualColumn; | 
					
						
							|  |  |  |             if (lastVisualColumn < firstVisualColumn) { | 
					
						
							|  |  |  |                 qSwap(firstVisualColumn, lastVisualColumn); | 
					
						
							|  |  |  |                 anchor = (Anchor) (anchor - 1); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             firstVisualColumn = visualColumn; | 
					
						
							|  |  |  |             if (firstVisualColumn > lastVisualColumn) { | 
					
						
							|  |  |  |                 qSwap(firstVisualColumn, lastVisualColumn); | 
					
						
							|  |  |  |                 anchor = (Anchor) (anchor + 1); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (blockNumber >= 0 && blockNumber < firstBlock.document()->blockCount()) { | 
					
						
							|  |  |  |         if (anchor <= TopRight) { | 
					
						
							|  |  |  |             firstBlock.setPosition(firstBlock.document()->findBlockByNumber(blockNumber).position()); | 
					
						
							|  |  |  |             if (firstBlock.blockNumber() > lastBlock.blockNumber()) { | 
					
						
							|  |  |  |                 qSwap(firstBlock, lastBlock); | 
					
						
							|  |  |  |                 anchor = (Anchor) (anchor + 2); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             lastBlock.setPosition(firstBlock.document()->findBlockByNumber(blockNumber).position()); | 
					
						
							|  |  |  |             if (lastBlock.blockNumber() < firstBlock.blockNumber()) { | 
					
						
							|  |  |  |                 qSwap(firstBlock, lastBlock); | 
					
						
							|  |  |  |                 anchor = (Anchor) (anchor - 2); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     firstBlock.movePosition(QTextCursor::StartOfBlock); | 
					
						
							|  |  |  |     lastBlock.movePosition(QTextCursor::EndOfBlock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QTextCursor Internal::BaseTextBlockSelection::selection(const TabSettings &ts) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = firstBlock; | 
					
						
							|  |  |  |     if (anchor <= TopRight) { | 
					
						
							|  |  |  |         cursor.setPosition(lastBlock.block().position() + ts.positionAtColumn(lastBlock.block().text(), lastVisualColumn)); | 
					
						
							|  |  |  |         cursor.setPosition(firstBlock.block().position() + ts.positionAtColumn(firstBlock.block().text(), firstVisualColumn), | 
					
						
							|  |  |  |                            QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         cursor.setPosition(firstBlock.block().position() + ts.positionAtColumn(firstBlock.block().text(), firstVisualColumn)); | 
					
						
							|  |  |  |         cursor.setPosition(lastBlock.block().position() + ts.positionAtColumn(lastBlock.block().text(), lastVisualColumn), | 
					
						
							|  |  |  |                            QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return cursor; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Internal::BaseTextBlockSelection::fromSelection(const TabSettings &ts, const QTextCursor &selection) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     firstBlock = selection; | 
					
						
							|  |  |  |     firstBlock.setPosition(selection.selectionStart()); | 
					
						
							|  |  |  |     firstVisualColumn = ts.columnAt(firstBlock.block().text(), firstBlock.positionInBlock()); | 
					
						
							|  |  |  |     lastBlock = selection; | 
					
						
							|  |  |  |     lastBlock.setPosition(selection.selectionEnd()); | 
					
						
							|  |  |  |     lastVisualColumn = ts.columnAt(lastBlock.block().text(), lastBlock.positionInBlock()); | 
					
						
							|  |  |  |     if (selection.anchor() > selection.position()) | 
					
						
							|  |  |  |         anchor = TopLeft; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         anchor = BottomRight; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     firstBlock.movePosition(QTextCursor::StartOfBlock); | 
					
						
							|  |  |  |     lastBlock.movePosition(QTextCursor::EndOfBlock); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::inFindScope(const QTextCursor &cursor) | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (cursor.isNull()) | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     return inFindScope(cursor.selectionStart(), cursor.selectionEnd()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::inFindScope(int selectionStart, int selectionEnd) | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (d->m_findScopeStart.isNull()) | 
					
						
							|  |  |  |         return true; // no scope, everything is included
 | 
					
						
							|  |  |  |     if (selectionStart < d->m_findScopeStart.position()) | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     if (selectionEnd > d->m_findScopeEnd.position()) | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     if (d->m_findScopeVerticalBlockSelectionFirstColumn < 0) | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     QTextBlock block = document()->findBlock(selectionStart); | 
					
						
							|  |  |  |     if (block != document()->findBlock(selectionEnd)) | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     QString text = block.text(); | 
					
						
							|  |  |  |     const TabSettings &ts = tabSettings(); | 
					
						
							|  |  |  |     int startPosition = ts.positionAtColumn(text, d->m_findScopeVerticalBlockSelectionFirstColumn); | 
					
						
							|  |  |  |     int endPosition = ts.positionAtColumn(text, d->m_findScopeVerticalBlockSelectionLastColumn); | 
					
						
							|  |  |  |     if (selectionStart - block.position() < startPosition) | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     if (selectionEnd - block.position() > endPosition) | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::setBlockSelection(bool on) | 
					
						
							| 
									
										
										
										
											2010-09-13 13:52:50 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (d->m_inBlockSelectionMode != on) { | 
					
						
							|  |  |  |         d->m_inBlockSelectionMode = on; | 
					
						
							|  |  |  |         if (on) | 
					
						
							|  |  |  |             d->m_blockSelection.fromSelection(tabSettings(), textCursor()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-14 14:04:13 +02:00
										 |  |  |     viewport()->update(); | 
					
						
							| 
									
										
										
										
											2010-09-13 13:52:50 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | bool BaseTextEditorWidget::hasBlockSelection() const | 
					
						
							| 
									
										
										
										
											2010-09-13 13:52:50 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return d->m_inBlockSelectionMode; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | void BaseTextEditorWidget::handleBlockSelection(int diff_row, int diff_col) | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!d->m_inBlockSelectionMode) { | 
					
						
							|  |  |  |         d->m_blockSelection.fromSelection(tabSettings(), textCursor()); | 
					
						
							|  |  |  |         d->m_inBlockSelectionMode = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     d->m_blockSelection.moveAnchor(d->m_blockSelection.anchorBlockNumber() + diff_row, | 
					
						
							|  |  |  |                                    d->m_blockSelection.anchorColumnNumber() + diff_col); | 
					
						
							|  |  |  |     setTextCursor(d->m_blockSelection.selection(tabSettings())); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     viewport()->update(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-13 15:17:33 +01:00
										 |  |  | // ### TODO ensure horizontal visibility
 | 
					
						
							| 
									
										
										
										
											2010-08-05 15:01:20 +02:00
										 |  |  | //    const bool rtl = q->isRightToLeft();
 | 
					
						
							|  |  |  | //    if (cr.left() < visible.left() || cr.right() > visible.right()) {
 | 
					
						
							|  |  |  | //        int x = cr.center().x() + horizontalOffset() - visible.width()/2;
 | 
					
						
							|  |  |  | //        hbar->setValue(rtl ? hbar->maximum() - x : x);
 | 
					
						
							|  |  |  | //    }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-12-13 15:17:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditorWidget::columnCount() const | 
					
						
							| 
									
										
										
										
											2010-12-13 15:17:33 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QFontMetricsF fm(font()); | 
					
						
							|  |  |  |     return viewport()->rect().width() / fm.width(QLatin1Char('x')); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 16:02:26 +01:00
										 |  |  | int BaseTextEditorWidget::rowCount() const | 
					
						
							| 
									
										
										
										
											2010-12-13 15:17:33 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QFontMetricsF fm(font()); | 
					
						
							|  |  |  |     return viewport()->rect().height() / fm.lineSpacing(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-02-25 11:10:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   Helper method to transform a selected text. If nothing is selected at the moment | 
					
						
							|  |  |  |   the word under the cursor is used. | 
					
						
							|  |  |  |   The type of the transformation is determined by the method pointer given. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @param method     pointer to the QString method to use for the transformation | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @see uppercaseSelection, lowercaseSelection | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | void BaseTextEditorWidget::transformSelection(Internal::TransformationMethod method) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTextCursor cursor = textCursor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int pos    = cursor.position(); | 
					
						
							|  |  |  |     int anchor = cursor.anchor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!cursor.hasSelection()) { | 
					
						
							|  |  |  |         // if nothing is selected, select the word over the cursor
 | 
					
						
							|  |  |  |         cursor.select(QTextCursor::WordUnderCursor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QString text = cursor.selectedText(); | 
					
						
							|  |  |  |     QString transformedText = (text.*method)(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (transformedText == text) { | 
					
						
							|  |  |  |         // if the transformation does not do anything to the selection, do no create an undo step
 | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cursor.insertText(transformedText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // (re)select the changed text
 | 
					
						
							|  |  |  |     // Note: this assumes the transformation did not change the length,
 | 
					
						
							|  |  |  |     cursor.setPosition(anchor); | 
					
						
							|  |  |  |     cursor.setPosition(pos, QTextCursor::KeepAnchor); | 
					
						
							|  |  |  |     setTextCursor(cursor); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-04-06 14:55:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorWidget::inSnippetMode(bool *active) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     *active = d->m_snippetOverlay->isVisible(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-04-15 16:19:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void BaseTextEditorWidget::invokeAssist(AssistKind kind, IAssistProvider *provider) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     d->m_codeAssistant->invoke(kind, provider); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | IAssistInterface *BaseTextEditorWidget::createAssistInterface(AssistKind kind, | 
					
						
							|  |  |  |                                                               AssistReason reason) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Q_UNUSED(kind); | 
					
						
							|  |  |  |     return new DefaultAssistInterface(document(), position(), d->m_document, reason); | 
					
						
							|  |  |  | } |