1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
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.
16 ** GNU Lesser General Public License Usage
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.
25 ** If you are unsure which license is appropriate for your use, please
26 ** contact the sales department at http://qt.nokia.com/contact.
28 **************************************************************************/
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"
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>
55 #include <QtCore/QFileInfo>
56 #include <QtCore/QSettings>
57 #include <QtGui/QMenu>
58 #include <QtGui/QAction>
60 using namespace CppEditor::Internal;
62 //////////////////////////// CppEditorFactory /////////////////////////////
64 CppEditorFactory::CppEditorFactory(CppPlugin *owner) :
65 m_kind(QLatin1String(CppEditor::Constants::CPPEDITOR_KIND)),
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);
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)));
85 QString CppEditorFactory::kind() const
90 Core::IFile *CppEditorFactory::open(const QString &fileName)
92 Core::IEditor *iface = Core::EditorManager::instance()->openEditor(fileName, kind());
93 return iface ? iface->file() : 0;
96 Core::IEditor *CppEditorFactory::createEditor(QWidget *parent)
98 CPPEditor *editor = new CPPEditor(parent);
99 editor->setRevisionsVisible(true);
100 m_owner->initializeEditor(editor);
101 return editor->editableInterface();
104 QStringList CppEditorFactory::mimeTypes() const
109 ///////////////////////////////// CppPlugin //////////////////////////////////
111 CppPlugin *CppPlugin::m_instance = 0;
113 CppPlugin::CppPlugin() :
115 m_sortedMethodOverview(false)
120 CppPlugin::~CppPlugin()
122 delete m_actionHandler;
126 CppPlugin *CppPlugin::instance()
131 void CppPlugin::initializeEditor(CPPEditor *editor)
133 m_actionHandler->setupActions(editor);
135 TextEditor::TextEditorSettings::instance()->initializeEditor(editor);
138 connect(editor, SIGNAL(requestAutoCompletion(ITextEditable*, bool)),
139 TextEditor::Internal::CompletionSupport::instance(), SLOT(autoComplete(ITextEditable*, bool)));
142 connect(editor, SIGNAL(requestQuickFix(ITextEditable*)),
143 TextEditor::Internal::CompletionSupport::instance(), SLOT(quickFix(ITextEditable*)));
145 // method combo box sorting
146 connect(this, SIGNAL(methodOverviewSortingChanged(bool)),
147 editor, SLOT(setSortedMethodOverview(bool)));
150 void CppPlugin::setSortedMethodOverview(bool sorted)
152 m_sortedMethodOverview = sorted;
153 emit methodOverviewSortingChanged(sorted);
156 bool CppPlugin::sortedMethodOverview() const
158 return m_sortedMethodOverview;
161 bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage)
163 Core::ICore *core = Core::ICore::instance();
165 if (!core->mimeDatabase()->addMimeTypes(QLatin1String(":/cppeditor/CppEditor.mimetypes.xml"), errorMessage))
168 addAutoReleasedObject(new CppEditorFactory(this));
169 addAutoReleasedObject(new CppHoverHandler);
171 CppFileWizard::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard);
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));
179 wizardParameters.setDescription(tr("Creates a C++ source file."));
180 wizardParameters.setName(tr("C++ Source File"));
181 addAutoReleasedObject(new CppFileWizard(wizardParameters, Source, core));
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));
189 context << core->uniqueIDManager()->uniqueIdentifier(CppEditor::Constants::C_CPPEDITOR);
191 Core::ActionManager *am = core->actionManager();
192 Core::ActionContainer *contextMenu= am->createMenu(CppEditor::Constants::M_CONTEXT);
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);
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);
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);
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);
229 m_actionHandler = new TextEditor::TextEditorActionHandler(CppEditor::Constants::C_CPPEDITOR,
230 TextEditor::TextEditorActionHandler::Format
231 | TextEditor::TextEditorActionHandler::UnCommentSelection
232 | TextEditor::TextEditorActionHandler::UnCollapseAll);
234 m_actionHandler->initializeActions();
236 QAction *separator = new QAction(this);
237 separator->setSeparator(true);
238 cmd = am->registerAction(separator, CppEditor::Constants::SEPARATOR, context);
239 contextMenu->addAction(cmd);
241 cmd = am->command(TextEditor::Constants::AUTO_INDENT_SELECTION);
242 contextMenu->addAction(cmd);
244 cmd = am->command(TextEditor::Constants::UN_COMMENT_SELECTION);
245 contextMenu->addAction(cmd);
252 void CppPlugin::readSettings()
254 m_sortedMethodOverview = Core::ICore::instance()->settings()->value("CppTools/SortedMethodOverview", false).toBool();
257 void CppPlugin::writeSettings()
259 Core::ICore::instance()->settings()->setValue("CppTools/SortedMethodOverview", m_sortedMethodOverview);
262 void CppPlugin::extensionsInitialized()
266 void CppPlugin::shutdown()
271 void CppPlugin::switchDeclarationDefinition()
273 Core::EditorManager *em = Core::EditorManager::instance();
274 CPPEditor *editor = qobject_cast<CPPEditor*>(em->currentEditor()->widget());
276 editor->switchDeclarationDefinition();
279 void CppPlugin::jumpToDefinition()
281 Core::EditorManager *em = Core::EditorManager::instance();
282 CPPEditor *editor = qobject_cast<CPPEditor*>(em->currentEditor()->widget());
284 editor->jumpToDefinition();
287 void CppPlugin::renameSymbolUnderCursor()
289 Core::EditorManager *em = Core::EditorManager::instance();
290 CPPEditor *editor = qobject_cast<CPPEditor*>(em->currentEditor()->widget());
292 editor->renameSymbolUnderCursor();
295 void CppPlugin::findUsages()
297 Core::EditorManager *em = Core::EditorManager::instance();
298 CPPEditor *editor = qobject_cast<CPPEditor*>(em->currentEditor()->widget());
300 editor->findUsages();
303 Q_EXPORT_PLUGIN(CppPlugin)