summaryrefslogtreecommitdiff
path: root/src/plugins/texteditor/quickfix.h
blob: 869c3518917eefcb425faf193cc45c66c5dccd20 (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/

#ifndef TEXTEDITORQUICKFIX_H
#define TEXTEDITORQUICKFIX_H

#include "texteditor_global.h"
#include "icompletioncollector.h"

#include <QtCore/QSharedPointer>

namespace TextEditor {

class BaseTextEditorWidget;

/*!
    State of the editor on which the QuickFixFactory and the QuickFixOperation work.

    This class contains a reference
 */
class TEXTEDITOR_EXPORT QuickFixState
{
public:
    /// Creates a new state object for the given text editor.
    QuickFixState(TextEditor::BaseTextEditorWidget *editor);
    virtual ~QuickFixState();

    TextEditor::BaseTextEditorWidget *editor() const;

private:
    TextEditor::BaseTextEditorWidget *_editor;
};

/*!
    Class to perform a single quick-fix.

    Quick-fix operations cannot be copied, and must be passed around as explicitly
    shared pointers ( QuickFixOperation::Ptr ).

    Subclasses should make sure that they copy parts of, or the whole QuickFixState ,
    which are needed to perform the quick-fix operation.
 */
class TEXTEDITOR_EXPORT QuickFixOperation
{
    Q_DISABLE_COPY(QuickFixOperation)

public:
    typedef QSharedPointer<QuickFixOperation> Ptr;

public:
    QuickFixOperation(int priority = -1);
    virtual ~QuickFixOperation();

    /*!
        \returns The priority for this quick-fix. See the QuickFixCollector for more
                 information.
     */
    virtual int priority() const;

    /// Sets the priority for this quick-fix operation.
    void setPriority(int priority);

    /*!
        \returns The description for this quick-fix. This description is shown to the
                 user.
     */
    virtual QString description() const;

    /// Sets the description for this quick-fix, which will be shown to the user.
    void setDescription(const QString &description);

    /*!
        Perform this quick-fix's operation.

        Subclasses should implement this method to do the actual changes.
     */
    virtual void perform() = 0;

private:
    int _priority;
    QString _description;
};

/*!
    The QuickFixFactory is responsible for generating QuickFixOperation s which are
    applicable to the given QuickFixState.

    A QuickFixFactory should not have any state -- it can be invoked multiple times
    for different QuickFixState objects to create the matching operations, before any
    of those operations are applied (or released).

    This way, a single factory can be used by multiple editors, and a single editor
    can have multiple QuickFixCollector objects for different parts of the code.
 */
class TEXTEDITOR_EXPORT QuickFixFactory: public QObject
{
    Q_OBJECT

public:
    QuickFixFactory(QObject *parent = 0);
    virtual ~QuickFixFactory() = 0;

    /*!
        \returns A list of operations which can be performed for the given state.
     */
    virtual QList<QuickFixOperation::Ptr> matchingOperations(QuickFixState *state) = 0;
};

/*!
    A completion collector which will use the QuickFixFactory classes to generate
    quickfixes for the given editor.

    All QuickFixFactory instances returned by #quickFixFactories are queried for
    possible quick-fix operations. The operations(s) with the highest priority are
    stored, and can be queried by calling #quickFixes .
 */
class TEXTEDITOR_EXPORT QuickFixCollector: public TextEditor::IQuickFixCollector
{
    Q_OBJECT

public:
    QuickFixCollector();
    virtual ~QuickFixCollector();

    QList<TextEditor::QuickFixOperation::Ptr> quickFixes() const
    { return m_quickFixes; }

    virtual TextEditor::ITextEditor *editor() const;
    virtual int startPosition() const;
    virtual bool triggersCompletion(TextEditor::ITextEditor *editor);
    virtual int startCompletion(TextEditor::ITextEditor *editor);
    virtual void completions(QList<TextEditor::CompletionItem> *completions);

    virtual bool supportsPolicy(TextEditor::CompletionPolicy policy) const
    { return policy == TextEditor::QuickFixCompletion; }

    /// See IQuickFixCollector::fix
    virtual void fix(const TextEditor::CompletionItem &item);

    /// See ICompletionCollector::cleanup .
    virtual void cleanup();

    /// Called from #startCompletion to create a QuickFixState .
    virtual TextEditor::QuickFixState *initializeCompletion(BaseTextEditorWidget *editable) = 0;

    virtual QList<QuickFixFactory *> quickFixFactories() const = 0;

private:
    TextEditor::ITextEditor *m_editor;
    QList<QuickFixOperation::Ptr> m_quickFixes;
};

} // namespace TextEditor

#endif // TEXTEDITORQUICKFIX_H