Editor: Show file encoding in editor toolbar

The file encoding is shown next to the current line in the toolbar. If
the label is clicked a dialog for encoding selection is shown.

Task-number: QTCREATORBUG-8376
Change-Id: I9adee76a31929de5f698d14fe5ca5abce3cc4633
Reviewed-by: David Schulz <david.schulz@digia.com>
This commit is contained in:
Lorenz Haas
2013-04-18 10:06:13 +02:00
committed by David Schulz
parent 63a04e0c15
commit 7d2a7685aa
6 changed files with 53 additions and 3 deletions

View File

@@ -541,12 +541,18 @@ void BaseTextEditorWidget::selectEncoding()
case CodecSelector::Save: case CodecSelector::Save:
doc->setCodec(codecSelector.selectedCodec()); doc->setCodec(codecSelector.selectedCodec());
Core::EditorManager::instance()->saveEditor(editor()); Core::EditorManager::instance()->saveEditor(editor());
updateTextCodecLabel();
break; break;
case CodecSelector::Cancel: case CodecSelector::Cancel:
break; break;
} }
} }
void BaseTextEditorWidget::updateTextCodecLabel()
{
editor()->setFileEncodingLabelText(QString::fromLatin1(d->m_document->codec()->name()));
}
QString BaseTextEditorWidget::msgTextTooLarge(quint64 size) QString BaseTextEditorWidget::msgTextTooLarge(quint64 size)
{ {
return tr("The text is too large to be displayed (%1 MB)."). return tr("The text is too large to be displayed (%1 MB).").
@@ -584,6 +590,13 @@ 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);
updateCannotDecodeInfo(); updateCannotDecodeInfo();
if (editor()->m_fileEncodingLabel) {
connect(editor()->m_fileEncodingLabel, SIGNAL(clicked()), this,
SLOT(selectEncoding()), Qt::UniqueConnection);
connect(d->m_document->document(), SIGNAL(modificationChanged(bool)), this,
SLOT(updateTextCodecLabel()), Qt::UniqueConnection);
updateTextCodecLabel();
}
return true; return true;
} }
return false; return false;
@@ -5761,6 +5774,7 @@ void BaseTextEditorWidget::setDisplaySettings(const DisplaySettings &ds)
setHighlightCurrentLine(ds.m_highlightCurrentLine); setHighlightCurrentLine(ds.m_highlightCurrentLine);
setRevisionsVisible(ds.m_markTextChanges); setRevisionsVisible(ds.m_markTextChanges);
setCenterOnScroll(ds.m_centerCursorOnScroll); setCenterOnScroll(ds.m_centerCursorOnScroll);
editor()->setFileEncodingLabelVisible(ds.m_displayFileEncoding);
if (d->m_displaySettings.m_visualizeWhitespace != ds.m_visualizeWhitespace) { if (d->m_displaySettings.m_visualizeWhitespace != ds.m_visualizeWhitespace) {
if (SyntaxHighlighter *highlighter = baseTextDocument()->syntaxHighlighter()) if (SyntaxHighlighter *highlighter = baseTextDocument()->syntaxHighlighter())
@@ -6277,6 +6291,9 @@ BaseTextEditor::BaseTextEditor(BaseTextEditorWidget *editor)
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); m_cursorPositionLabel->setContentsMargins(spacing, 0, spacing, 0);
m_fileEncodingLabel = new Utils::LineColumnLabel;
m_fileEncodingLabel->setContentsMargins(spacing, 0, spacing, 0);
m_stretchWidget = new QWidget; m_stretchWidget = new QWidget;
m_stretchWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); m_stretchWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
@@ -6284,7 +6301,9 @@ BaseTextEditor::BaseTextEditor(BaseTextEditorWidget *editor)
m_toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); m_toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
m_toolBar->addWidget(m_stretchWidget); m_toolBar->addWidget(m_stretchWidget);
m_cursorPositionLabelAction = m_toolBar->addWidget(m_cursorPositionLabel); m_cursorPositionLabelAction = m_toolBar->addWidget(m_cursorPositionLabel);
m_fileEncodingLabelAction = m_toolBar->addWidget(m_fileEncodingLabel);
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(m_cursorPositionLabel, SIGNAL(clicked()), this, SLOT(openGotoLocator()));
} }
@@ -6432,11 +6451,21 @@ void BaseTextEditor::openGotoLocator()
} }
} }
void BaseTextEditor::setFileEncodingLabelVisible(bool visible)
{
m_fileEncodingLabelAction->setVisible(visible);
}
void BaseTextEditor::setFileEncodingLabelText(const QString &text)
{
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(e->editor(), emit const_cast<BaseTextEditor*>(this)->contextHelpIdRequested(e->editor(),
e->textCursor().position()); e->textCursor().position());
return m_contextHelpId; return m_contextHelpId;
} }

View File

@@ -279,6 +279,7 @@ public slots:
void fold(); void fold();
void unfold(); void unfold();
void selectEncoding(); void selectEncoding();
void updateTextCodecLabel();
void gotoBlockStart(); void gotoBlockStart();
void gotoBlockEnd(); void gotoBlockEnd();
@@ -673,6 +674,8 @@ public:
private slots: private slots:
void updateCursorPosition(); void updateCursorPosition();
void openGotoLocator(); void openGotoLocator();
void setFileEncodingLabelVisible(bool visible);
void setFileEncodingLabelText(const QString &text);
private: private:
BaseTextEditorWidget *e; BaseTextEditorWidget *e;
@@ -680,6 +683,8 @@ private:
QWidget *m_stretchWidget; QWidget *m_stretchWidget;
QAction *m_cursorPositionLabelAction; QAction *m_cursorPositionLabelAction;
Utils::LineColumnLabel *m_cursorPositionLabel; Utils::LineColumnLabel *m_cursorPositionLabel;
QAction *m_fileEncodingLabelAction;
Utils::LineColumnLabel *m_fileEncodingLabel;
}; };
} // namespace TextEditor } // namespace TextEditor

View File

@@ -46,6 +46,7 @@ static const char markTextChangesKey[] = "MarkTextChanges";
static const char autoFoldFirstCommentKey[] = "AutoFoldFirstComment"; static const char autoFoldFirstCommentKey[] = "AutoFoldFirstComment";
static const char centerCursorOnScrollKey[] = "CenterCursorOnScroll"; static const char centerCursorOnScrollKey[] = "CenterCursorOnScroll";
static const char openLinksInNextSplitKey[] = "OpenLinksInNextSplitKey"; static const char openLinksInNextSplitKey[] = "OpenLinksInNextSplitKey";
static const char displayFileEncodingKey[] = "DisplayFileEncoding";
static const char groupPostfix[] = "DisplaySettings"; static const char groupPostfix[] = "DisplaySettings";
namespace TextEditor { namespace TextEditor {
@@ -65,7 +66,8 @@ DisplaySettings::DisplaySettings() :
m_autoFoldFirstComment(true), m_autoFoldFirstComment(true),
m_centerCursorOnScroll(false), m_centerCursorOnScroll(false),
m_openLinksInNextSplit(false), m_openLinksInNextSplit(false),
m_forceOpenLinksInNextSplit(false) m_forceOpenLinksInNextSplit(false),
m_displayFileEncoding(false)
{ {
} }
@@ -89,6 +91,7 @@ void DisplaySettings::toSettings(const QString &category, QSettings *s) const
s->setValue(QLatin1String(autoFoldFirstCommentKey), m_autoFoldFirstComment); s->setValue(QLatin1String(autoFoldFirstCommentKey), m_autoFoldFirstComment);
s->setValue(QLatin1String(centerCursorOnScrollKey), m_centerCursorOnScroll); s->setValue(QLatin1String(centerCursorOnScrollKey), m_centerCursorOnScroll);
s->setValue(QLatin1String(openLinksInNextSplitKey), m_openLinksInNextSplit); s->setValue(QLatin1String(openLinksInNextSplitKey), m_openLinksInNextSplit);
s->setValue(QLatin1String(displayFileEncodingKey), m_displayFileEncoding);
s->endGroup(); s->endGroup();
} }
@@ -115,6 +118,7 @@ void DisplaySettings::fromSettings(const QString &category, const QSettings *s)
m_autoFoldFirstComment = s->value(group + QLatin1String(autoFoldFirstCommentKey), m_autoFoldFirstComment).toBool(); m_autoFoldFirstComment = s->value(group + QLatin1String(autoFoldFirstCommentKey), m_autoFoldFirstComment).toBool();
m_centerCursorOnScroll = s->value(group + QLatin1String(centerCursorOnScrollKey), m_centerCursorOnScroll).toBool(); m_centerCursorOnScroll = s->value(group + QLatin1String(centerCursorOnScrollKey), m_centerCursorOnScroll).toBool();
m_openLinksInNextSplit = s->value(group + QLatin1String(openLinksInNextSplitKey), m_openLinksInNextSplit).toBool(); m_openLinksInNextSplit = s->value(group + QLatin1String(openLinksInNextSplitKey), m_openLinksInNextSplit).toBool();
m_displayFileEncoding = s->value(group + QLatin1String(displayFileEncodingKey), m_displayFileEncoding).toBool();
} }
bool DisplaySettings::equals(const DisplaySettings &ds) const bool DisplaySettings::equals(const DisplaySettings &ds) const
@@ -134,6 +138,7 @@ bool DisplaySettings::equals(const DisplaySettings &ds) const
&& m_centerCursorOnScroll == ds.m_centerCursorOnScroll && m_centerCursorOnScroll == ds.m_centerCursorOnScroll
&& m_openLinksInNextSplit == ds.m_openLinksInNextSplit && m_openLinksInNextSplit == ds.m_openLinksInNextSplit
&& m_forceOpenLinksInNextSplit == ds.m_forceOpenLinksInNextSplit && m_forceOpenLinksInNextSplit == ds.m_forceOpenLinksInNextSplit
&& m_displayFileEncoding == ds.m_displayFileEncoding
; ;
} }

View File

@@ -61,6 +61,7 @@ public:
bool m_centerCursorOnScroll; bool m_centerCursorOnScroll;
bool m_openLinksInNextSplit; bool m_openLinksInNextSplit;
bool m_forceOpenLinksInNextSplit; bool m_forceOpenLinksInNextSplit;
bool m_displayFileEncoding;
bool equals(const DisplaySettings &ds) const; bool equals(const DisplaySettings &ds) const;
}; };

View File

@@ -85,7 +85,8 @@ QWidget *DisplaySettingsPage::createPage(QWidget *parent)
<< ' ' << d->m_page->enableTextWrapping->text() << ' ' << d->m_page->enableTextWrapping->text()
<< ' ' << d->m_page->autoFoldFirstComment->text() << ' ' << d->m_page->autoFoldFirstComment->text()
<< ' ' << d->m_page->centerOnScroll->text() << ' ' << d->m_page->centerOnScroll->text()
<< ' ' << d->m_page->openLinksInNextSplit->text(); << ' ' << d->m_page->openLinksInNextSplit->text()
<< ' ' << d->m_page->displayFileEncoding->text();
d->m_searchKeywords.remove(QLatin1Char('&')); d->m_searchKeywords.remove(QLatin1Char('&'));
} }
return w; return w;
@@ -125,6 +126,7 @@ void DisplaySettingsPage::settingsFromUI(DisplaySettings &displaySettings) const
displaySettings.m_autoFoldFirstComment = d->m_page->autoFoldFirstComment->isChecked(); displaySettings.m_autoFoldFirstComment = d->m_page->autoFoldFirstComment->isChecked();
displaySettings.m_centerCursorOnScroll = d->m_page->centerOnScroll->isChecked(); displaySettings.m_centerCursorOnScroll = d->m_page->centerOnScroll->isChecked();
displaySettings.m_openLinksInNextSplit = d->m_page->openLinksInNextSplit->isChecked(); displaySettings.m_openLinksInNextSplit = d->m_page->openLinksInNextSplit->isChecked();
displaySettings.m_displayFileEncoding = d->m_page->displayFileEncoding->isChecked();
} }
void DisplaySettingsPage::settingsToUI() void DisplaySettingsPage::settingsToUI()
@@ -144,6 +146,7 @@ void DisplaySettingsPage::settingsToUI()
d->m_page->autoFoldFirstComment->setChecked(displaySettings.m_autoFoldFirstComment); d->m_page->autoFoldFirstComment->setChecked(displaySettings.m_autoFoldFirstComment);
d->m_page->centerOnScroll->setChecked(displaySettings.m_centerCursorOnScroll); d->m_page->centerOnScroll->setChecked(displaySettings.m_centerCursorOnScroll);
d->m_page->openLinksInNextSplit->setChecked(displaySettings.m_openLinksInNextSplit); d->m_page->openLinksInNextSplit->setChecked(displaySettings.m_openLinksInNextSplit);
d->m_page->displayFileEncoding->setChecked(displaySettings.m_displayFileEncoding);
} }
const DisplaySettings &DisplaySettingsPage::displaySettings() const const DisplaySettings &DisplaySettingsPage::displaySettings() const

View File

@@ -160,6 +160,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="1">
<widget class="QCheckBox" name="displayFileEncoding">
<property name="text">
<string>Display file encoding</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>