Beautifier: ClangFormat: Add action "Disable Formatting for Selected Text"

Change-Id: I0786dfdc0679bbdf1cf1157067bd7f572ac7d108
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Reviewed-by: Lorenz Haas <lorenz.haas@histomatics.de>
This commit is contained in:
Nikolai Kosjar
2017-09-04 15:18:42 +02:00
parent 189dbc585e
commit edab564cf0
7 changed files with 60 additions and 0 deletions

View File

@@ -58,6 +58,7 @@ For Windows:
In Menu: Tools > Options > Environment > Keyboard In Menu: Tools > Options > Environment > Keyboard
* ClangFormat / FormatFile - e.g. Alt+C, F * ClangFormat / FormatFile - e.g. Alt+C, F
* ClangFormat / FormatSelectedText - e.g. Alt+C, S * ClangFormat / FormatSelectedText - e.g. Alt+C, S
* ClangFormat / DisableFormattingSelectedText - e.g. Alt+C, D
Due to several issues outlined below the FormatFile action might be of limited Due to several issues outlined below the FormatFile action might be of limited
use. use.

View File

@@ -178,4 +178,8 @@
select it when no text is selected, the whole file is formatted by default. select it when no text is selected, the whole file is formatted by default.
To disable this behavior, deselect the To disable this behavior, deselect the
\uicontrol {Format entire file if no text was selected} check box. \uicontrol {Format entire file if no text was selected} check box.
ClangFormat provides additionally the \uicontrol {Disable Formatting for
Selected Text} command. If you select it, the selected lines will be
wrapped within \c {// clang-format off} and \c {// clang-format on}.
*/ */

View File

@@ -496,6 +496,12 @@ QString BeautifierPlugin::msgFormatSelectedText()
return tr("Format &Selected Text"); return tr("Format &Selected Text");
} }
QString BeautifierPlugin::msgDisableFormattingSelectedText()
{
//: Menu entry
return tr("&Disable Formatting for Selected Text");
}
QString BeautifierPlugin::msgCommandPromptDialogTitle(const QString &command) QString BeautifierPlugin::msgCommandPromptDialogTitle(const QString &command)
{ {
//: File dialog title for path chooser when choosing binary //: File dialog title for path chooser when choosing binary

View File

@@ -80,6 +80,7 @@ public:
static QString msgCannotGetConfigurationFile(const QString &command); static QString msgCannotGetConfigurationFile(const QString &command);
static QString msgFormatCurrentFile(); static QString msgFormatCurrentFile();
static QString msgFormatSelectedText(); static QString msgFormatSelectedText();
static QString msgDisableFormattingSelectedText();
static QString msgCommandPromptDialogTitle(const QString &command); static QString msgCommandPromptDialogTitle(const QString &command);
static void showError(const QString &error); static void showError(const QString &error);

View File

@@ -48,6 +48,7 @@
#include <QAction> #include <QAction>
#include <QMenu> #include <QMenu>
#include <QTextBlock>
namespace Beautifier { namespace Beautifier {
namespace Internal { namespace Internal {
@@ -88,6 +89,14 @@ bool ClangFormat::initialize()
menu->addAction(cmd); menu->addAction(cmd);
connect(m_formatRange, &QAction::triggered, this, &ClangFormat::formatSelectedText); connect(m_formatRange, &QAction::triggered, this, &ClangFormat::formatSelectedText);
m_disableFormattingSelectedText
= new QAction(BeautifierPlugin::msgDisableFormattingSelectedText(), this);
cmd = Core::ActionManager::registerAction(
m_disableFormattingSelectedText, Constants::ClangFormat::ACTION_DISABLEFORMATTINGSELECTED);
menu->addAction(cmd);
connect(m_disableFormattingSelectedText, &QAction::triggered,
this, &ClangFormat::disableFormattingSelectedText);
Core::ActionManager::actionContainer(Constants::MENU_ID)->addMenu(menu); Core::ActionManager::actionContainer(Constants::MENU_ID)->addMenu(menu);
connect(m_settings, &ClangFormatSettings::supportedMimeTypesChanged, connect(m_settings, &ClangFormatSettings::supportedMimeTypesChanged,
@@ -130,6 +139,42 @@ void ClangFormat::formatSelectedText()
} }
} }
void ClangFormat::disableFormattingSelectedText()
{
TextEditor::TextEditorWidget *widget = TextEditor::TextEditorWidget::currentTextEditorWidget();
if (!widget)
return;
const QTextCursor tc = widget->textCursor();
if (!tc.hasSelection())
return;
// Insert start marker
const QTextBlock selectionStartBlock = tc.document()->findBlock(tc.selectionStart());
QTextCursor insertCursor(tc.document());
insertCursor.beginEditBlock();
insertCursor.setPosition(selectionStartBlock.position());
insertCursor.insertText("// clang-format off\n");
const int positionToRestore = tc.position();
// Insert end marker
QTextBlock selectionEndBlock = tc.document()->findBlock(tc.selectionEnd());
insertCursor.setPosition(selectionEndBlock.position() + selectionEndBlock.length() - 1);
insertCursor.insertText("\n// clang-format on");
insertCursor.endEditBlock();
// Reset the cursor position in order to clear the selection.
QTextCursor restoreCursor(tc.document());
restoreCursor.setPosition(positionToRestore);
widget->setTextCursor(restoreCursor);
// The indentation of these markers might be undesired, so reformat.
// This is not optimal because two undo steps will be needed to remove the markers.
const int reformatTextLength = insertCursor.position() - selectionStartBlock.position();
m_beautifierPlugin->formatCurrentFile(command(selectionStartBlock.position(),
reformatTextLength));
}
Command ClangFormat::command() const Command ClangFormat::command() const
{ {
Command command; Command command;

View File

@@ -55,9 +55,11 @@ public:
private: private:
void formatFile(); void formatFile();
void formatSelectedText(); void formatSelectedText();
void disableFormattingSelectedText();
BeautifierPlugin *m_beautifierPlugin; BeautifierPlugin *m_beautifierPlugin;
QAction *m_formatFile = nullptr; QAction *m_formatFile = nullptr;
QAction *m_formatRange = nullptr; QAction *m_formatRange = nullptr;
QAction *m_disableFormattingSelectedText = nullptr;
ClangFormatSettings *m_settings; ClangFormatSettings *m_settings;
Command command(int offset, int length) const; Command command(int offset, int length) const;
}; };

View File

@@ -34,6 +34,7 @@ namespace ClangFormat {
const char DISPLAY_NAME[] = QT_TRANSLATE_NOOP("Beautifier::Internal::ClangFormat::ClangFormat", "ClangFormat"); const char DISPLAY_NAME[] = QT_TRANSLATE_NOOP("Beautifier::Internal::ClangFormat::ClangFormat", "ClangFormat");
const char ACTION_FORMATFILE[] = "ClangFormat.FormatFile"; const char ACTION_FORMATFILE[] = "ClangFormat.FormatFile";
const char ACTION_FORMATSELECTED[] = "ClangFormat.FormatSelectedText"; const char ACTION_FORMATSELECTED[] = "ClangFormat.FormatSelectedText";
const char ACTION_DISABLEFORMATTINGSELECTED[] = "ClangFormat.DisableFormattingSelectedText";
const char MENU_ID[] = "ClangFormat.Menu"; const char MENU_ID[] = "ClangFormat.Menu";
const char OPTION_ID[] = "ClangFormat"; const char OPTION_ID[] = "ClangFormat";
const char SETTINGS_NAME[] = "clangformat"; const char SETTINGS_NAME[] = "clangformat";