TextEditor: Pimpl BaseTextEditor

Change-Id: I876025562678513dd8e8c6537783c81aef7cb2aa
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
hjk
2014-07-26 12:45:48 +02:00
parent 18ab4539f1
commit 78bb9cd525
2 changed files with 86 additions and 65 deletions

View File

@@ -162,6 +162,20 @@ private:
QSizeF m_size; QSizeF m_size;
}; };
class BaseTextEditorPrivate
{
public:
// Note: This is always a copy of IContext::m_widget.
BaseTextEditorWidget *m_editorWidget;
QToolBar *m_toolBar;
QWidget *m_stretchWidget;
QAction *m_cursorPositionLabelAction;
Utils::LineColumnLabel *m_cursorPositionLabel;
QAction *m_fileEncodingLabelAction;
Utils::LineColumnLabel *m_fileEncodingLabel;
};
class BaseTextEditorWidgetPrivate class BaseTextEditorWidgetPrivate
{ {
BaseTextEditorWidgetPrivate(const BaseTextEditorWidgetPrivate &); BaseTextEditorWidgetPrivate(const BaseTextEditorWidgetPrivate &);
@@ -792,8 +806,8 @@ bool BaseTextEditorWidget::open(QString *errorString, const QString &fileName, c
if (d->m_document->open(errorString, fileName, realFileName)) { if (d->m_document->open(errorString, fileName, realFileName)) {
moveCursor(QTextCursor::Start); moveCursor(QTextCursor::Start);
d->updateCannotDecodeInfo(); d->updateCannotDecodeInfo();
if (editor()->m_fileEncodingLabel) { if (editor()->fileEncodingLabel()) {
connect(editor()->m_fileEncodingLabel, SIGNAL(clicked()), this, connect(editor()->fileEncodingLabel(), SIGNAL(clicked()), this,
SLOT(selectEncoding()), Qt::UniqueConnection); SLOT(selectEncoding()), Qt::UniqueConnection);
connect(d->m_document->document(), SIGNAL(modificationChanged(bool)), this, connect(d->m_document->document(), SIGNAL(modificationChanged(bool)), this,
SLOT(updateTextCodecLabel()), Qt::UniqueConnection); SLOT(updateTextCodecLabel()), Qt::UniqueConnection);
@@ -6372,9 +6386,10 @@ void BaseTextEditorWidget::appendStandardContextMenuActions(QMenu *menu)
BaseTextEditor::BaseTextEditor(BaseTextEditorWidget *editor) BaseTextEditor::BaseTextEditor(BaseTextEditorWidget *editor)
: m_editorWidget(editor) : d(new BaseTextEditorPrivate)
{ {
setWidget(m_editorWidget); setWidget(editor);
d->m_editorWidget = editor;
Aggregation::Aggregate *aggregate = new Aggregation::Aggregate; Aggregation::Aggregate *aggregate = new Aggregation::Aggregate;
BaseTextFind *baseTextFind = new BaseTextFind(editor); BaseTextFind *baseTextFind = new BaseTextFind(editor);
connect(baseTextFind, SIGNAL(highlightAll(QString,Core::FindFlags)), connect(baseTextFind, SIGNAL(highlightAll(QString,Core::FindFlags)),
@@ -6384,147 +6399,148 @@ BaseTextEditor::BaseTextEditor(BaseTextEditorWidget *editor)
aggregate->add(baseTextFind); aggregate->add(baseTextFind);
aggregate->add(editor); aggregate->add(editor);
m_cursorPositionLabel = new Utils::LineColumnLabel; d->m_cursorPositionLabel = new Utils::LineColumnLabel;
const int spacing = editor->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing) / 2; const int spacing = editor->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing) / 2;
m_cursorPositionLabel->setContentsMargins(spacing, 0, spacing, 0); d->m_cursorPositionLabel->setContentsMargins(spacing, 0, spacing, 0);
m_fileEncodingLabel = new Utils::LineColumnLabel; d->m_fileEncodingLabel = new Utils::LineColumnLabel;
m_fileEncodingLabel->setContentsMargins(spacing, 0, spacing, 0); d->m_fileEncodingLabel->setContentsMargins(spacing, 0, spacing, 0);
m_stretchWidget = new QWidget; d->m_stretchWidget = new QWidget;
m_stretchWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); d->m_stretchWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
m_toolBar = new QToolBar; d->m_toolBar = new QToolBar;
m_toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); d->m_toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
m_toolBar->addWidget(m_stretchWidget); d->m_toolBar->addWidget(d->m_stretchWidget);
m_cursorPositionLabelAction = m_toolBar->addWidget(m_cursorPositionLabel); d->m_cursorPositionLabelAction = d->m_toolBar->addWidget(d->m_cursorPositionLabel);
m_fileEncodingLabelAction = m_toolBar->addWidget(m_fileEncodingLabel); d->m_fileEncodingLabelAction = d->m_toolBar->addWidget(d->m_fileEncodingLabel);
setFileEncodingLabelVisible(editor->displaySettings().m_displayFileEncoding); setFileEncodingLabelVisible(editor->displaySettings().m_displayFileEncoding);
connect(editor, SIGNAL(cursorPositionChanged()), this, SLOT(updateCursorPosition())); connect(editor, SIGNAL(cursorPositionChanged()), this, SLOT(updateCursorPosition()));
connect(m_cursorPositionLabel, SIGNAL(clicked()), this, SLOT(openGotoLocator())); connect(d->m_cursorPositionLabel, SIGNAL(clicked()), this, SLOT(openGotoLocator()));
} }
BaseTextEditor::~BaseTextEditor() BaseTextEditor::~BaseTextEditor()
{ {
delete m_toolBar; delete d->m_toolBar;
delete m_editorWidget; delete d->m_editorWidget;
delete d;
} }
BaseTextDocument *BaseTextEditor::baseTextDocument() BaseTextDocument *BaseTextEditor::baseTextDocument()
{ {
return m_editorWidget->baseTextDocument(); return d->m_editorWidget->baseTextDocument();
} }
IDocument *BaseTextEditor::document() IDocument *BaseTextEditor::document()
{ {
return m_editorWidget->baseTextDocument(); return d->m_editorWidget->baseTextDocument();
} }
QWidget *BaseTextEditor::toolBar() QWidget *BaseTextEditor::toolBar()
{ {
return m_toolBar; return d->m_toolBar;
} }
void BaseTextEditor::insertExtraToolBarWidget(BaseTextEditor::Side side, void BaseTextEditor::insertExtraToolBarWidget(BaseTextEditor::Side side,
QWidget *widget) QWidget *widget)
{ {
if (widget->sizePolicy().horizontalPolicy() & QSizePolicy::ExpandFlag) { if (widget->sizePolicy().horizontalPolicy() & QSizePolicy::ExpandFlag) {
if (m_stretchWidget) if (d->m_stretchWidget)
m_stretchWidget->deleteLater(); d->m_stretchWidget->deleteLater();
m_stretchWidget = 0; d->m_stretchWidget = 0;
} }
if (side == Right) if (side == Right)
m_toolBar->insertWidget(m_cursorPositionLabelAction, widget); d->m_toolBar->insertWidget(d->m_cursorPositionLabelAction, widget);
else else
m_toolBar->insertWidget(m_toolBar->actions().first(), widget); d->m_toolBar->insertWidget(d->m_toolBar->actions().first(), widget);
} }
int BaseTextEditor::currentLine() const int BaseTextEditor::currentLine() const
{ {
return m_editorWidget->textCursor().blockNumber() + 1; return d->m_editorWidget->textCursor().blockNumber() + 1;
} }
int BaseTextEditor::currentColumn() const int BaseTextEditor::currentColumn() const
{ {
QTextCursor cursor = m_editorWidget->textCursor(); QTextCursor cursor = d->m_editorWidget->textCursor();
return cursor.position() - cursor.block().position() + 1; return cursor.position() - cursor.block().position() + 1;
} }
void BaseTextEditor::gotoLine(int line, int column, bool centerLine) void BaseTextEditor::gotoLine(int line, int column, bool centerLine)
{ {
m_editorWidget->gotoLine(line, column, centerLine); d->m_editorWidget->gotoLine(line, column, centerLine);
} }
int BaseTextEditor::columnCount() const int BaseTextEditor::columnCount() const
{ {
return m_editorWidget->columnCount(); return d->m_editorWidget->columnCount();
} }
int BaseTextEditor::rowCount() const int BaseTextEditor::rowCount() const
{ {
return m_editorWidget->rowCount(); return d->m_editorWidget->rowCount();
} }
int BaseTextEditor::position(BaseTextEditor::PositionOperation posOp, int at) const int BaseTextEditor::position(BaseTextEditor::PositionOperation posOp, int at) const
{ {
return m_editorWidget->position(posOp, at); return d->m_editorWidget->position(posOp, at);
} }
void BaseTextEditor::convertPosition(int pos, int *line, int *column) const void BaseTextEditor::convertPosition(int pos, int *line, int *column) const
{ {
m_editorWidget->convertPosition(pos, line, column); d->m_editorWidget->convertPosition(pos, line, column);
} }
QRect BaseTextEditor::cursorRect(int pos) const QRect BaseTextEditor::cursorRect(int pos) const
{ {
QTextCursor tc = m_editorWidget->textCursor(); QTextCursor tc = d->m_editorWidget->textCursor();
if (pos >= 0) if (pos >= 0)
tc.setPosition(pos); tc.setPosition(pos);
QRect result = m_editorWidget->cursorRect(tc); QRect result = d->m_editorWidget->cursorRect(tc);
result.moveTo(m_editorWidget->viewport()->mapToGlobal(result.topLeft())); result.moveTo(d->m_editorWidget->viewport()->mapToGlobal(result.topLeft()));
return result; return result;
} }
QString BaseTextEditor::selectedText() const QString BaseTextEditor::selectedText() const
{ {
return m_editorWidget->selectedText(); return d->m_editorWidget->selectedText();
} }
void BaseTextEditor::remove(int length) void BaseTextEditor::remove(int length)
{ {
QTextCursor tc = m_editorWidget->textCursor(); QTextCursor tc = d->m_editorWidget->textCursor();
tc.setPosition(tc.position() + length, QTextCursor::KeepAnchor); tc.setPosition(tc.position() + length, QTextCursor::KeepAnchor);
tc.removeSelectedText(); tc.removeSelectedText();
} }
void BaseTextEditor::insert(const QString &string) void BaseTextEditor::insert(const QString &string)
{ {
m_editorWidget->insertPlainText(string); d->m_editorWidget->insertPlainText(string);
} }
void BaseTextEditor::replace(int length, const QString &string) void BaseTextEditor::replace(int length, const QString &string)
{ {
QTextCursor tc = m_editorWidget->textCursor(); QTextCursor tc = d->m_editorWidget->textCursor();
tc.setPosition(tc.position() + length, QTextCursor::KeepAnchor); tc.setPosition(tc.position() + length, QTextCursor::KeepAnchor);
tc.insertText(string); tc.insertText(string);
} }
void BaseTextEditor::setCursorPosition(int pos) void BaseTextEditor::setCursorPosition(int pos)
{ {
m_editorWidget->setBlockSelection(false); d->m_editorWidget->setBlockSelection(false);
QTextCursor tc = m_editorWidget->textCursor(); QTextCursor tc = d->m_editorWidget->textCursor();
tc.setPosition(pos); tc.setPosition(pos);
m_editorWidget->setTextCursor(tc); d->m_editorWidget->setTextCursor(tc);
} }
void BaseTextEditor::select(int toPos) void BaseTextEditor::select(int toPos)
{ {
m_editorWidget->setBlockSelection(false); d->m_editorWidget->setBlockSelection(false);
QTextCursor tc = m_editorWidget->textCursor(); QTextCursor tc = d->m_editorWidget->textCursor();
tc.setPosition(toPos, QTextCursor::KeepAnchor); tc.setPosition(toPos, QTextCursor::KeepAnchor);
m_editorWidget->setTextCursor(tc); d->m_editorWidget->setTextCursor(tc);
} }
const CommentDefinition *BaseTextEditor::commentDefinition() const const CommentDefinition *BaseTextEditor::commentDefinition() const
@@ -6537,20 +6553,25 @@ CompletionAssistProvider *BaseTextEditor::completionAssistProvider()
return 0; return 0;
} }
QObject *BaseTextEditor::fileEncodingLabel() const
{
return d->m_fileEncodingLabel;
}
void BaseTextEditor::updateCursorPosition() void BaseTextEditor::updateCursorPosition()
{ {
const QTextCursor cursor = m_editorWidget->textCursor(); const QTextCursor cursor = d->m_editorWidget->textCursor();
const QTextBlock block = cursor.block(); const QTextBlock block = cursor.block();
const int line = block.blockNumber() + 1; const int line = block.blockNumber() + 1;
const int column = cursor.position() - block.position(); const int column = cursor.position() - block.position();
m_cursorPositionLabel->setText(tr("Line: %1, Col: %2").arg(line) d->m_cursorPositionLabel->setText(tr("Line: %1, Col: %2").arg(line)
.arg(baseTextDocument()->tabSettings().columnAt(block.text(), .arg(baseTextDocument()->tabSettings().columnAt(block.text(),
column)+1), column)+1),
tr("Line: 9999, Col: 999")); tr("Line: 9999, Col: 999"));
m_contextHelpId.clear(); m_contextHelpId.clear();
if (!block.isVisible()) if (!block.isVisible())
m_editorWidget->ensureCursorVisible(); d->m_editorWidget->ensureCursorVisible();
} }
@@ -6565,19 +6586,19 @@ void BaseTextEditor::openGotoLocator()
void BaseTextEditor::setFileEncodingLabelVisible(bool visible) void BaseTextEditor::setFileEncodingLabelVisible(bool visible)
{ {
m_fileEncodingLabelAction->setVisible(visible); d->m_fileEncodingLabelAction->setVisible(visible);
} }
void BaseTextEditor::setFileEncodingLabelText(const QString &text) void BaseTextEditor::setFileEncodingLabelText(const QString &text)
{ {
m_fileEncodingLabel->setText(text, text); d->m_fileEncodingLabel->setText(text, text);
} }
QString BaseTextEditor::contextHelpId() const QString BaseTextEditor::contextHelpId() const
{ {
if (m_contextHelpId.isEmpty()) if (m_contextHelpId.isEmpty())
emit const_cast<BaseTextEditor*>(this)->contextHelpIdRequested(const_cast<BaseTextEditor*>(this), emit const_cast<BaseTextEditor*>(this)->contextHelpIdRequested(const_cast<BaseTextEditor*>(this),
m_editorWidget->textCursor().position()); d->m_editorWidget->textCursor().position());
return m_contextHelpId; return m_contextHelpId;
} }
@@ -6875,17 +6896,17 @@ QString BaseTextEditorWidget::foldReplacementText(const QTextBlock &) const
bool BaseTextEditor::open(QString *errorString, const QString &fileName, const QString &realFileName) bool BaseTextEditor::open(QString *errorString, const QString &fileName, const QString &realFileName)
{ {
return m_editorWidget->open(errorString, fileName, realFileName); return d->m_editorWidget->open(errorString, fileName, realFileName);
} }
QByteArray BaseTextEditor::saveState() const QByteArray BaseTextEditor::saveState() const
{ {
return m_editorWidget->saveState(); return d->m_editorWidget->saveState();
} }
bool BaseTextEditor::restoreState(const QByteArray &state) bool BaseTextEditor::restoreState(const QByteArray &state)
{ {
return m_editorWidget->restoreState(state); return d->m_editorWidget->restoreState(state);
} }
BaseTextDocument *BaseTextEditor::textDocument() BaseTextDocument *BaseTextEditor::textDocument()
@@ -6898,6 +6919,11 @@ BaseTextEditor *BaseTextEditor::currentTextEditor()
return qobject_cast<BaseTextEditor *>(Core::EditorManager::currentEditor()); return qobject_cast<BaseTextEditor *>(Core::EditorManager::currentEditor());
} }
BaseTextEditorWidget *BaseTextEditor::editorWidget() const
{
return d->m_editorWidget;
}
} // namespace TextEditor } // namespace TextEditor
#include "basetexteditor.moc" #include "basetexteditor.moc"

View File

@@ -70,6 +70,7 @@ class CompletionAssistProvider;
typedef QList<RefactorMarker> RefactorMarkers; typedef QList<RefactorMarker> RefactorMarkers;
namespace Internal { namespace Internal {
class BaseTextEditorPrivate;
class BaseTextEditorWidgetPrivate; class BaseTextEditorWidgetPrivate;
class TextEditorOverlay; class TextEditorOverlay;
} }
@@ -131,7 +132,7 @@ public:
static BaseTextEditor *currentTextEditor(); static BaseTextEditor *currentTextEditor();
friend class BaseTextEditorWidget; friend class BaseTextEditorWidget;
BaseTextEditorWidget *editorWidget() const { return m_editorWidget; } BaseTextEditorWidget *editorWidget() const;
BaseTextDocument *baseTextDocument(); BaseTextDocument *baseTextDocument();
// IEditor // IEditor
@@ -183,6 +184,8 @@ public:
virtual CompletionAssistProvider *completionAssistProvider(); virtual CompletionAssistProvider *completionAssistProvider();
QObject *fileEncodingLabel() const; // FIXME: Remove
signals: signals:
void markRequested(TextEditor::BaseTextEditor *editor, int line, TextEditor::BaseTextEditor::MarkRequestKind kind); void markRequested(TextEditor::BaseTextEditor *editor, int line, TextEditor::BaseTextEditor::MarkRequestKind kind);
void markContextMenuRequested(TextEditor::BaseTextEditor *editor, int line, QMenu *menu); void markContextMenuRequested(TextEditor::BaseTextEditor *editor, int line, QMenu *menu);
@@ -198,15 +201,7 @@ private slots:
void setFileEncodingLabelText(const QString &text); void setFileEncodingLabelText(const QString &text);
private: private:
// Note: This is always a copy of IContext::m_widget. Internal::BaseTextEditorPrivate *d;
BaseTextEditorWidget *m_editorWidget;
QToolBar *m_toolBar;
QWidget *m_stretchWidget;
QAction *m_cursorPositionLabelAction;
Utils::LineColumnLabel *m_cursorPositionLabel;
QAction *m_fileEncodingLabelAction;
Utils::LineColumnLabel *m_fileEncodingLabel;
}; };