forked from qt-creator/qt-creator
TextEditor: Pimpl BaseTextEditor
Change-Id: I876025562678513dd8e8c6537783c81aef7cb2aa Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user