OSDN Git Service

f27e82bdb9634786af68fd9d225fb4be2edc3f3d
[qt-creator-jp/qt-creator-jp.git] / src / plugins / cppeditor / cppplugin.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
8 **
9 ** Commercial Usage
10 **
11 ** Licensees holding valid Qt Commercial licenses may use this file in
12 ** accordance with the Qt Commercial License Agreement provided with the
13 ** Software or, alternatively, in accordance with the terms contained in
14 ** a written agreement between you and Nokia.
15 **
16 ** GNU Lesser General Public License Usage
17 **
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** If you are unsure which license is appropriate for your use, please
26 ** contact the sales department at http://qt.nokia.com/contact.
27 **
28 **************************************************************************/
29
30 #include "cppplugin.h"
31 #include "cppclasswizard.h"
32 #include "cppeditor.h"
33 #include "cppeditorconstants.h"
34 #include "cppeditorenums.h"
35 #include "cppfilewizard.h"
36 #include "cpphoverhandler.h"
37
38 #include <coreplugin/icore.h>
39 #include <coreplugin/coreconstants.h>
40 #include <coreplugin/mimedatabase.h>
41 #include <coreplugin/uniqueidmanager.h>
42 #include <coreplugin/fileiconprovider.h>
43 #include <coreplugin/actionmanager/actionmanager.h>
44 #include <coreplugin/actionmanager/command.h>
45 #include <coreplugin/editormanager/editormanager.h>
46 #include <texteditor/completionsupport.h>
47 #include <texteditor/fontsettings.h>
48 #include <texteditor/storagesettings.h>
49 #include <texteditor/texteditoractionhandler.h>
50 #include <texteditor/texteditorplugin.h>
51 #include <texteditor/texteditorsettings.h>
52 #include <texteditor/texteditorconstants.h>
53 #include <cpptools/cpptoolsconstants.h>
54
55 #include <QtCore/QFileInfo>
56 #include <QtCore/QSettings>
57 #include <QtGui/QMenu>
58 #include <QtGui/QAction>
59
60 using namespace CppEditor::Internal;
61
62 //////////////////////////// CppEditorFactory /////////////////////////////
63
64 CppEditorFactory::CppEditorFactory(CppPlugin *owner) :
65     m_kind(QLatin1String(CppEditor::Constants::CPPEDITOR_KIND)),
66     m_owner(owner)
67 {
68     m_mimeTypes << QLatin1String(CppEditor::Constants::C_SOURCE_MIMETYPE)
69             << QLatin1String(CppEditor::Constants::C_HEADER_MIMETYPE)
70             << QLatin1String(CppEditor::Constants::CPP_SOURCE_MIMETYPE)
71             << QLatin1String(CppEditor::Constants::CPP_HEADER_MIMETYPE);
72
73 #ifndef Q_WS_MAC
74     Core::FileIconProvider *iconProvider = Core::FileIconProvider::instance();
75     Core::MimeDatabase *mimeDatabase = Core::ICore::instance()->mimeDatabase();
76     iconProvider->registerIconOverlayForMimeType(QIcon(":/cppeditor/images/qt_cpp.png"),
77                                                  mimeDatabase->findByType(QLatin1String(CppEditor::Constants::CPP_SOURCE_MIMETYPE)));
78     iconProvider->registerIconOverlayForMimeType(QIcon(":/cppeditor/images/qt_c.png"),
79                                                  mimeDatabase->findByType(QLatin1String(CppEditor::Constants::C_SOURCE_MIMETYPE)));
80     iconProvider->registerIconOverlayForMimeType(QIcon(":/cppeditor/images/qt_h.png"),
81                                                  mimeDatabase->findByType(QLatin1String(CppEditor::Constants::CPP_HEADER_MIMETYPE)));
82 #endif
83 }
84
85 QString CppEditorFactory::kind() const
86 {
87     return m_kind;
88 }
89
90 Core::IFile *CppEditorFactory::open(const QString &fileName)
91 {
92     Core::IEditor *iface = Core::EditorManager::instance()->openEditor(fileName, kind());
93     return iface ? iface->file() : 0;
94 }
95
96 Core::IEditor *CppEditorFactory::createEditor(QWidget *parent)
97 {
98     CPPEditor *editor = new CPPEditor(parent);
99     editor->setRevisionsVisible(true);
100     m_owner->initializeEditor(editor);
101     return editor->editableInterface();
102 }
103
104 QStringList CppEditorFactory::mimeTypes() const
105 {
106     return m_mimeTypes;
107 }
108
109 ///////////////////////////////// CppPlugin //////////////////////////////////
110
111 CppPlugin *CppPlugin::m_instance = 0;
112
113 CppPlugin::CppPlugin() :
114     m_actionHandler(0),
115     m_sortedMethodOverview(false)
116 {
117     m_instance = this;
118 }
119
120 CppPlugin::~CppPlugin()
121 {
122     delete m_actionHandler;
123     m_instance = 0;
124 }
125
126 CppPlugin *CppPlugin::instance()
127 {
128     return m_instance;
129 }
130
131 void CppPlugin::initializeEditor(CPPEditor *editor)
132 {
133     m_actionHandler->setupActions(editor);
134
135     TextEditor::TextEditorSettings::instance()->initializeEditor(editor);
136
137     // auto completion
138     connect(editor, SIGNAL(requestAutoCompletion(ITextEditable*, bool)),
139             TextEditor::Internal::CompletionSupport::instance(), SLOT(autoComplete(ITextEditable*, bool)));
140
141     // quick fix
142     connect(editor, SIGNAL(requestQuickFix(ITextEditable*)),
143             TextEditor::Internal::CompletionSupport::instance(), SLOT(quickFix(ITextEditable*)));
144
145     // method combo box sorting
146     connect(this, SIGNAL(methodOverviewSortingChanged(bool)),
147             editor, SLOT(setSortedMethodOverview(bool)));
148 }
149
150 void CppPlugin::setSortedMethodOverview(bool sorted)
151 {
152     m_sortedMethodOverview = sorted;
153     emit methodOverviewSortingChanged(sorted);
154 }
155
156 bool CppPlugin::sortedMethodOverview() const
157 {
158     return m_sortedMethodOverview;
159 }
160
161 bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage)
162 {
163     Core::ICore *core = Core::ICore::instance();
164
165     if (!core->mimeDatabase()->addMimeTypes(QLatin1String(":/cppeditor/CppEditor.mimetypes.xml"), errorMessage))
166         return false;
167
168     addAutoReleasedObject(new CppEditorFactory(this));
169     addAutoReleasedObject(new CppHoverHandler);
170
171     CppFileWizard::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard);
172
173     wizardParameters.setCategory(QLatin1String("C++"));
174     wizardParameters.setTrCategory(tr("C++"));
175     wizardParameters.setDescription(tr("Creates a C++ header file."));
176     wizardParameters.setName(tr("C++ Header File"));
177     addAutoReleasedObject(new CppFileWizard(wizardParameters, Header, core));
178
179     wizardParameters.setDescription(tr("Creates a C++ source file."));
180     wizardParameters.setName(tr("C++ Source File"));
181     addAutoReleasedObject(new CppFileWizard(wizardParameters, Source, core));
182
183     wizardParameters.setKind(Core::IWizard::ClassWizard);
184     wizardParameters.setName(tr("C++ Class"));
185     wizardParameters.setDescription(tr("Creates a header and a source file for a new class."));
186     addAutoReleasedObject(new CppClassWizard(wizardParameters, core));
187
188     QList<int> context;
189     context << core->uniqueIDManager()->uniqueIdentifier(CppEditor::Constants::C_CPPEDITOR);
190
191     Core::ActionManager *am = core->actionManager();
192     Core::ActionContainer *contextMenu= am->createMenu(CppEditor::Constants::M_CONTEXT);
193
194     Core::Command *cmd;
195
196     QAction *jumpToDefinition = new QAction(tr("Follow Symbol under Cursor"), this);
197     cmd = am->registerAction(jumpToDefinition,
198         Constants::JUMP_TO_DEFINITION, context);
199     cmd->setDefaultKeySequence(QKeySequence(Qt::Key_F2));
200     connect(jumpToDefinition, SIGNAL(triggered()),
201             this, SLOT(jumpToDefinition()));
202     contextMenu->addAction(cmd);
203     am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd);
204
205     QAction *switchDeclarationDefinition = new QAction(tr("Switch between Method Declaration/Definition"), this);
206     cmd = am->registerAction(switchDeclarationDefinition,
207         Constants::SWITCH_DECLARATION_DEFINITION, context);
208     cmd->setDefaultKeySequence(QKeySequence("Shift+F2"));
209     connect(switchDeclarationDefinition, SIGNAL(triggered()),
210             this, SLOT(switchDeclarationDefinition()));
211     contextMenu->addAction(cmd);
212     am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd);
213
214     QAction *findUsagesAction = new QAction(tr("Find Usages"), this);
215     cmd = am->registerAction(findUsagesAction, Constants::FIND_USAGES, context);
216     cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U")));
217     connect(findUsagesAction, SIGNAL(triggered()), this, SLOT(findUsages()));
218     contextMenu->addAction(cmd);
219     am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd);
220
221     QAction *renameSymbolUnderCursorAction = new QAction(tr("Rename Symbol under Cursor"), this);
222     cmd = am->registerAction(renameSymbolUnderCursorAction,
223         Constants::RENAME_SYMBOL_UNDER_CURSOR, context);
224     cmd->setDefaultKeySequence(QKeySequence("CTRL+SHIFT+R"));
225     connect(renameSymbolUnderCursorAction, SIGNAL(triggered()), this, SLOT(renameSymbolUnderCursor()));
226     contextMenu->addAction(cmd);
227     am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd);
228
229     m_actionHandler = new TextEditor::TextEditorActionHandler(CppEditor::Constants::C_CPPEDITOR,
230         TextEditor::TextEditorActionHandler::Format
231         | TextEditor::TextEditorActionHandler::UnCommentSelection
232         | TextEditor::TextEditorActionHandler::UnCollapseAll);
233
234     m_actionHandler->initializeActions();
235     
236     QAction *separator = new QAction(this);
237     separator->setSeparator(true);
238     cmd = am->registerAction(separator, CppEditor::Constants::SEPARATOR, context);
239     contextMenu->addAction(cmd);
240
241     cmd = am->command(TextEditor::Constants::AUTO_INDENT_SELECTION);
242     contextMenu->addAction(cmd);
243
244     cmd = am->command(TextEditor::Constants::UN_COMMENT_SELECTION);
245     contextMenu->addAction(cmd);
246
247
248     readSettings();
249     return true;
250 }
251
252 void CppPlugin::readSettings()
253 {
254     m_sortedMethodOverview = Core::ICore::instance()->settings()->value("CppTools/SortedMethodOverview", false).toBool();
255 }
256
257 void CppPlugin::writeSettings()
258 {
259     Core::ICore::instance()->settings()->setValue("CppTools/SortedMethodOverview", m_sortedMethodOverview);
260 }
261
262 void CppPlugin::extensionsInitialized()
263 {
264 }
265
266 void CppPlugin::shutdown()
267 {
268     writeSettings();
269 }
270
271 void CppPlugin::switchDeclarationDefinition()
272 {
273     Core::EditorManager *em = Core::EditorManager::instance();
274     CPPEditor *editor = qobject_cast<CPPEditor*>(em->currentEditor()->widget());
275     if (editor)
276         editor->switchDeclarationDefinition();
277 }
278
279 void CppPlugin::jumpToDefinition()
280 {
281     Core::EditorManager *em = Core::EditorManager::instance();
282     CPPEditor *editor = qobject_cast<CPPEditor*>(em->currentEditor()->widget());
283     if (editor)
284         editor->jumpToDefinition();
285 }
286
287 void CppPlugin::renameSymbolUnderCursor()
288 {
289     Core::EditorManager *em = Core::EditorManager::instance();
290     CPPEditor *editor = qobject_cast<CPPEditor*>(em->currentEditor()->widget());
291     if (editor)
292         editor->renameSymbolUnderCursor();
293 }
294
295 void CppPlugin::findUsages()
296 {
297     Core::EditorManager *em = Core::EditorManager::instance();
298     CPPEditor *editor = qobject_cast<CPPEditor*>(em->currentEditor()->widget());
299     if (editor)
300         editor->findUsages();
301 }
302
303 Q_EXPORT_PLUGIN(CppPlugin)