aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/texteditor/codestyleeditor.cpp
blob: 070a230e384656ff98733d8356f4167baa5a95cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#include "codestyleeditor.h"

#include "textdocument.h"
#include "icodestylepreferencesfactory.h"
#include "icodestylepreferences.h"
#include "codestyleselectorwidget.h"
#include "texteditortr.h"
#include "displaysettings.h"
#include "tabsettings.h"
#include "indenter.h"
#include "snippets/snippeteditor.h"
#include "snippets/snippetprovider.h"

#include <QVBoxLayout>
#include <QTextBlock>
#include <QLabel>

namespace TextEditor {

CodeStyleEditor::CodeStyleEditor(ICodeStylePreferencesFactory *factory,
                                 ICodeStylePreferences *codeStyle,
                                 ProjectExplorer::Project *project,
                                 QWidget *parent)
    : CodeStyleEditorWidget(parent)
    , m_factory(factory)
    , m_codeStyle(codeStyle)
{
    m_layout = new QVBoxLayout(this);
    m_layout->setContentsMargins(0, 0, 0, 0);
    auto selector = new CodeStyleSelectorWidget(factory, project, this);
    selector->setCodeStyle(codeStyle);
    m_additionalGlobalSettingsWidget = factory->createAdditionalGlobalSettings(codeStyle,
                                                                               project,
                                                                               parent);

    if (m_additionalGlobalSettingsWidget)
        m_layout->addWidget(m_additionalGlobalSettingsWidget);

    m_layout->addWidget(selector);
    if (!project) {
        m_widget = factory->createEditor(codeStyle, project, parent);

        if (m_widget)
            m_layout->addWidget(m_widget);
        return;
    }

    QLabel *label = new QLabel(
        Tr::tr("Edit preview contents to see how the current settings "
               "are applied to custom code snippets. Changes in the preview "
               "do not affect the current settings."), this);
    QFont font = label->font();
    font.setItalic(true);
    label->setFont(font);
    label->setWordWrap(true);

    m_preview = new SnippetEditorWidget(this);
    DisplaySettings displaySettings = m_preview->displaySettings();
    displaySettings.m_visualizeWhitespace = true;
    m_preview->setDisplaySettings(displaySettings);
    QString groupId = factory->snippetProviderGroupId();
    SnippetProvider::decorateEditor(m_preview, groupId);

    m_layout->addWidget(m_preview);
    m_layout->addWidget(label);
    connect(codeStyle, &ICodeStylePreferences::currentTabSettingsChanged,
            this, &CodeStyleEditor::updatePreview);
    connect(codeStyle, &ICodeStylePreferences::currentValueChanged,
            this, &CodeStyleEditor::updatePreview);
    connect(codeStyle, &ICodeStylePreferences::currentPreferencesChanged,
            this, &CodeStyleEditor::updatePreview);
    m_preview->setCodeStyle(m_codeStyle);
    m_preview->setPlainText(factory->previewText());

    updatePreview();
}

void CodeStyleEditor::updatePreview()
{
    QTextDocument *doc = m_preview->document();

    m_preview->textDocument()->indenter()->invalidateCache();

    QTextBlock block = doc->firstBlock();
    QTextCursor tc = m_preview->textCursor();
    tc.beginEditBlock();
    while (block.isValid()) {
        m_preview->textDocument()->indenter()->indentBlock(block,
                                                           QChar::Null,
                                                           m_codeStyle->currentTabSettings());
        block = block.next();
    }
    tc.endEditBlock();
}

void CodeStyleEditor::apply()
{
    if (m_widget)
        m_widget->apply();

    if (m_additionalGlobalSettingsWidget)
        m_additionalGlobalSettingsWidget->apply();
}

void CodeStyleEditor::finish()
{
    if (m_widget)
        m_widget->finish();

    if (m_additionalGlobalSettingsWidget)
        m_additionalGlobalSettingsWidget->finish();
}

} // TextEditor