2010-07-16 11:18:30 +02:00
|
|
|
/**************************************************************************
|
|
|
|
|
**
|
2013-01-28 17:12:19 +01:00
|
|
|
** Copyright (c) 2013 Denis Mingulov
|
2012-10-02 09:12:39 +02:00
|
|
|
** Contact: http://www.qt-project.org/legal
|
2010-07-16 11:18:30 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** This file is part of Qt Creator.
|
2010-07-16 11:18:30 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Digia. For licensing terms and
|
|
|
|
|
** conditions see http://qt.digia.com/licensing. For further information
|
|
|
|
|
** use the contact form at http://qt.digia.com/contact-us.
|
2010-07-16 11:18:30 +02:00
|
|
|
**
|
|
|
|
|
** GNU Lesser General Public License Usage
|
2012-10-02 09:12:39 +02:00
|
|
|
** Alternatively, 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, Digia gives you certain additional
|
|
|
|
|
** rights. These rights are described in the Digia Qt LGPL Exception
|
2010-12-17 16:01:08 +01:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
****************************************************************************/
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
#include "classviewmanager.h"
|
2013-03-12 12:25:16 +01:00
|
|
|
#include "classviewsymbollocation.h"
|
2010-07-16 11:18:30 +02:00
|
|
|
#include "classviewnavigationwidgetfactory.h"
|
|
|
|
|
#include "classviewparser.h"
|
|
|
|
|
#include "classviewutils.h"
|
|
|
|
|
|
|
|
|
|
#include <utils/qtcassert.h>
|
|
|
|
|
#include <projectexplorer/projectexplorer.h>
|
|
|
|
|
#include <projectexplorer/session.h>
|
2013-04-02 11:52:31 +02:00
|
|
|
#include <cpptools/cppmodelmanagerinterface.h>
|
2010-07-16 11:18:30 +02:00
|
|
|
#include <cpptools/cpptoolsconstants.h>
|
|
|
|
|
#include <coreplugin/icore.h>
|
|
|
|
|
#include <coreplugin/progressmanager/progressmanager.h>
|
|
|
|
|
#include <coreplugin/editormanager/editormanager.h>
|
|
|
|
|
#include <coreplugin/editormanager/ieditor.h>
|
|
|
|
|
#include <texteditor/itexteditor.h>
|
|
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QThread>
|
|
|
|
|
#include <QMutex>
|
|
|
|
|
#include <QMutexLocker>
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
namespace ClassView {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
|
|
///////////////////////////////// ManagerPrivate //////////////////////////////////
|
|
|
|
|
|
2011-07-06 17:40:54 +02:00
|
|
|
// static variable initialization
|
|
|
|
|
static Manager *managerInstance = 0;
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
/*!
|
2013-05-24 17:35:14 +02:00
|
|
|
\class ClassView::Internal::Manager
|
|
|
|
|
|
|
|
|
|
\brief The Manager class implements a class view manager that interacts with
|
|
|
|
|
other \QC plugins and acts as a proxy between them and the parser.
|
|
|
|
|
|
|
|
|
|
The parser is moved to a separate thread and is connected to the manager by
|
|
|
|
|
using signals and slots. Manager's signals starting with 'request' are for
|
|
|
|
|
the parser.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn explicit ClassView::Internal::Manager(QObject *parent = 0)
|
|
|
|
|
|
|
|
|
|
Creates a shared instance of a \a parent object.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn void ClassView::Internal::Manager::stateChanged(bool state)
|
|
|
|
|
|
|
|
|
|
Changes the internal manager state. \a state returns true if manager is
|
|
|
|
|
enabled, otherwise false.
|
|
|
|
|
|
|
|
|
|
\sa setState, state
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn void ClassView::Internal::Manager::treeDataUpdate(QSharedPointer<QStandardItem> result)
|
|
|
|
|
|
|
|
|
|
Emits a signal about a tree data update (to tree view). \a result holds the
|
|
|
|
|
item with the current tree.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn void ClassView::Internal::Manager::requestTreeDataUpdate()
|
|
|
|
|
|
|
|
|
|
Emits a signal that a request for sending the tree view has to be handled by
|
|
|
|
|
listeners (the parser).
|
|
|
|
|
|
|
|
|
|
\sa onRequestTreeDataUpdate
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn void ClassView::Internal::Manager::requestDocumentUpdated(CPlusPlus::Document::Ptr doc)
|
|
|
|
|
|
|
|
|
|
Emits a signal that \a doc was updated and has to be reparsed.
|
|
|
|
|
|
|
|
|
|
\sa onDocumentUpdated
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn void ClassView::Internal::Manager::requestResetCurrentState()
|
|
|
|
|
|
|
|
|
|
Emits a signal that the parser has to reset its internal state to the
|
|
|
|
|
current state from the code manager.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn void ClassView::Internal::Manager::requestClearCache()
|
|
|
|
|
|
|
|
|
|
Requests the parser to clear a cache.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn void ClassView::Internal::Manager::requestClearCacheAll()
|
|
|
|
|
|
|
|
|
|
Requests the parser to clear a full cache.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn void ClassView::Internal::Manager::requestSetFlatMode(bool flat)
|
|
|
|
|
|
|
|
|
|
Requests the manager to set the flat mode without subprojects. Set \a flat
|
|
|
|
|
to \c true to enable flat mode and to false to disable it.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\class ManagerPrivate
|
2011-01-07 08:07:35 +01:00
|
|
|
\internal
|
2013-05-24 17:35:14 +02:00
|
|
|
\brief The ManagerPrivate class contains private class data for the Manager
|
|
|
|
|
class.
|
2010-07-16 11:18:30 +02:00
|
|
|
\sa Manager
|
2013-05-24 17:35:14 +02:00
|
|
|
*/
|
|
|
|
|
|
2011-07-06 17:40:54 +02:00
|
|
|
class ManagerPrivate
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2011-07-06 17:40:54 +02:00
|
|
|
public:
|
2011-01-07 08:07:35 +01:00
|
|
|
ManagerPrivate() : state(false), disableCodeParser(false) {}
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
//! State mutex
|
|
|
|
|
QMutex mutexState;
|
|
|
|
|
|
|
|
|
|
//! code state/changes parser
|
|
|
|
|
Parser parser;
|
|
|
|
|
|
|
|
|
|
//! separate thread for the parser
|
|
|
|
|
QThread parserThread;
|
|
|
|
|
|
2011-01-07 08:07:35 +01:00
|
|
|
//! Internal manager state. \sa Manager::state
|
|
|
|
|
bool state;
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
//! there is some massive operation ongoing so temporary we should wait
|
|
|
|
|
bool disableCodeParser;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
///////////////////////////////// Manager //////////////////////////////////
|
|
|
|
|
|
|
|
|
|
Manager::Manager(QObject *parent)
|
|
|
|
|
: QObject(parent),
|
2011-07-06 17:40:54 +02:00
|
|
|
d(new ManagerPrivate())
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2011-07-06 17:40:54 +02:00
|
|
|
managerInstance = this;
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// register - to be able send between signal/slots
|
|
|
|
|
qRegisterMetaType<QSharedPointer<QStandardItem> >("QSharedPointer<QStandardItem>");
|
|
|
|
|
|
|
|
|
|
initialize();
|
|
|
|
|
|
|
|
|
|
// start a separate thread for the parser
|
2011-07-06 17:40:54 +02:00
|
|
|
d->parser.moveToThread(&d->parserThread);
|
|
|
|
|
d->parserThread.start();
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// initial setup
|
|
|
|
|
onProjectListChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Manager::~Manager()
|
|
|
|
|
{
|
2011-07-06 17:40:54 +02:00
|
|
|
d->parserThread.quit();
|
|
|
|
|
d->parserThread.wait();
|
|
|
|
|
delete d;
|
|
|
|
|
managerInstance = 0;
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2011-07-06 17:40:54 +02:00
|
|
|
Manager *Manager::instance()
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2011-07-06 17:40:54 +02:00
|
|
|
return managerInstance;
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Checks \a item for lazy data population of a QStandardItemModel.
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
bool Manager::canFetchMore(QStandardItem *item) const
|
|
|
|
|
{
|
2011-07-06 17:40:54 +02:00
|
|
|
return d->parser.canFetchMore(item);
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Checks \a item for lazy data population of a QStandardItemModel.
|
|
|
|
|
\a skipRoot item is needed for the manual update, call not from model.
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::fetchMore(QStandardItem *item, bool skipRoot)
|
|
|
|
|
{
|
2011-07-06 17:40:54 +02:00
|
|
|
d->parser.fetchMore(item, skipRoot);
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Manager::initialize()
|
|
|
|
|
{
|
|
|
|
|
// use Qt::QueuedConnection everywhere
|
|
|
|
|
|
|
|
|
|
// widget factory signals
|
2011-07-06 17:40:54 +02:00
|
|
|
connect(NavigationWidgetFactory::instance(), SIGNAL(widgetIsCreated()),
|
2010-07-16 11:18:30 +02:00
|
|
|
SLOT(onWidgetIsCreated()), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
|
|
// internal manager state is changed
|
|
|
|
|
connect(this, SIGNAL(stateChanged(bool)), SLOT(onStateChanged(bool)), Qt::QueuedConnection);
|
|
|
|
|
|
2010-10-30 21:54:23 +02:00
|
|
|
// connections to enable/disable navi widget factory
|
2010-07-16 11:18:30 +02:00
|
|
|
ProjectExplorer::SessionManager *sessionManager =
|
|
|
|
|
ProjectExplorer::ProjectExplorerPlugin::instance()->session();
|
|
|
|
|
connect(sessionManager, SIGNAL(projectAdded(ProjectExplorer::Project*)),
|
|
|
|
|
SLOT(onProjectListChanged()), Qt::QueuedConnection);
|
|
|
|
|
connect(sessionManager, SIGNAL(projectRemoved(ProjectExplorer::Project*)),
|
|
|
|
|
SLOT(onProjectListChanged()), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
|
|
// connect to the progress manager for signals about Parsing tasks
|
2012-01-24 15:36:40 +01:00
|
|
|
connect(Core::ICore::progressManager(), SIGNAL(taskStarted(QString)),
|
2010-07-16 11:18:30 +02:00
|
|
|
SLOT(onTaskStarted(QString)), Qt::QueuedConnection);
|
2012-01-24 15:36:40 +01:00
|
|
|
connect(Core::ICore::progressManager(), SIGNAL(allTasksFinished(QString)),
|
2010-07-16 11:18:30 +02:00
|
|
|
SLOT(onAllTasksFinished(QString)), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
|
|
// when we signals that really document is updated - sent it to the parser
|
|
|
|
|
connect(this, SIGNAL(requestDocumentUpdated(CPlusPlus::Document::Ptr)),
|
2011-07-06 17:40:54 +02:00
|
|
|
&d->parser, SLOT(parseDocument(CPlusPlus::Document::Ptr)), Qt::QueuedConnection);
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// translate data update from the parser to listeners
|
2011-07-06 17:40:54 +02:00
|
|
|
connect(&d->parser, SIGNAL(treeDataUpdate(QSharedPointer<QStandardItem>)),
|
2010-07-16 11:18:30 +02:00
|
|
|
this, SLOT(onTreeDataUpdate(QSharedPointer<QStandardItem>)), Qt::QueuedConnection);
|
|
|
|
|
|
|
|
|
|
// requet current state - immediately after a notification
|
|
|
|
|
connect(this, SIGNAL(requestTreeDataUpdate()),
|
2011-07-06 17:40:54 +02:00
|
|
|
&d->parser, SLOT(requestCurrentState()), Qt::QueuedConnection);
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// full reset request to parser
|
|
|
|
|
connect(this, SIGNAL(requestResetCurrentState()),
|
2011-07-06 17:40:54 +02:00
|
|
|
&d->parser, SLOT(resetDataToCurrentState()), Qt::QueuedConnection);
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// clear cache request
|
|
|
|
|
connect(this, SIGNAL(requestClearCache()),
|
2011-07-06 17:40:54 +02:00
|
|
|
&d->parser, SLOT(clearCache()), Qt::QueuedConnection);
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// clear full cache request
|
|
|
|
|
connect(this, SIGNAL(requestClearCacheAll()),
|
2011-07-06 17:40:54 +02:00
|
|
|
&d->parser, SLOT(clearCacheAll()), Qt::QueuedConnection);
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// flat mode request
|
|
|
|
|
connect(this, SIGNAL(requestSetFlatMode(bool)),
|
2011-07-06 17:40:54 +02:00
|
|
|
&d->parser, SLOT(setFlatMode(bool)), Qt::QueuedConnection);
|
2011-01-06 18:34:06 +01:00
|
|
|
|
|
|
|
|
// connect to the cpp model manager for signals about document updates
|
2013-04-02 11:28:11 +02:00
|
|
|
CppTools::CppModelManagerInterface *codeModelManager
|
|
|
|
|
= CppTools::CppModelManagerInterface::instance();
|
2011-01-06 18:34:06 +01:00
|
|
|
|
|
|
|
|
// when code manager signals that document is updated - handle it by ourselves
|
|
|
|
|
connect(codeModelManager, SIGNAL(documentUpdated(CPlusPlus::Document::Ptr)),
|
|
|
|
|
SLOT(onDocumentUpdated(CPlusPlus::Document::Ptr)), Qt::QueuedConnection);
|
|
|
|
|
//
|
|
|
|
|
connect(codeModelManager, SIGNAL(aboutToRemoveFiles(QStringList)),
|
2011-07-06 17:40:54 +02:00
|
|
|
&d->parser, SLOT(removeFiles(QStringList)), Qt::QueuedConnection);
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Gets the internal manager state. If it is disabled, does not emit signals
|
|
|
|
|
about parsing requests. If enabled, does parsing in the background even if
|
|
|
|
|
the navigation pane is not visible. Returns true if the manager is enabled,
|
|
|
|
|
false otherwise.
|
|
|
|
|
|
|
|
|
|
\sa setState, stateChanged
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
bool Manager::state() const
|
|
|
|
|
{
|
2011-07-06 17:40:54 +02:00
|
|
|
return d->state;
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Sets the internal manager \a state to \c true if the manager has to be
|
|
|
|
|
enabled, otherwise sets it to \c false.
|
|
|
|
|
|
|
|
|
|
\sa state, stateChanged
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::setState(bool state)
|
|
|
|
|
{
|
2011-07-06 17:40:54 +02:00
|
|
|
QMutexLocker locker(&d->mutexState);
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// boolean comparsion - should be done correctly by any compiler
|
2011-07-06 17:40:54 +02:00
|
|
|
if (state == d->state)
|
2010-07-16 11:18:30 +02:00
|
|
|
return;
|
|
|
|
|
|
2011-07-06 17:40:54 +02:00
|
|
|
d->state = state;
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2011-07-06 17:40:54 +02:00
|
|
|
emit stateChanged(d->state);
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Reacts to the widget factory creating a widget.
|
|
|
|
|
|
|
|
|
|
\sa setState, state
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::onWidgetIsCreated()
|
|
|
|
|
{
|
|
|
|
|
// do nothing - continue to sleep
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Reacts to the \a visibility of one navigation pane widget being changed
|
|
|
|
|
(there might be a lot of them).
|
|
|
|
|
|
|
|
|
|
\sa setState, state
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::onWidgetVisibilityIsChanged(bool visibility)
|
|
|
|
|
{
|
|
|
|
|
// activate data handling - when 1st time 'Class View' will be open
|
|
|
|
|
if (visibility)
|
|
|
|
|
setState(true);
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Reacts to the state changed signal for the current manager \a state.
|
|
|
|
|
For example, requests the currect code snapshot if needed.
|
|
|
|
|
|
|
|
|
|
\sa setState, state, stateChanged
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::onStateChanged(bool state)
|
|
|
|
|
{
|
|
|
|
|
if (state) {
|
|
|
|
|
// enabled - request a current snapshots etc?..
|
|
|
|
|
emit requestResetCurrentState();
|
|
|
|
|
} else {
|
|
|
|
|
// disabled - clean parsers internal cache
|
|
|
|
|
emit requestClearCacheAll();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Reacts to the project list being changed by updating the navigation pane
|
|
|
|
|
visibility if necessary.
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::onProjectListChanged()
|
|
|
|
|
{
|
|
|
|
|
// do nothing if Manager is disabled
|
|
|
|
|
if (!state())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// update to the latest state
|
|
|
|
|
requestTreeDataUpdate();
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Handles parse tasks started by the progress manager. \a type holds the
|
|
|
|
|
task index, which should be \c CppTools::Constants::TASK_INDEX.
|
|
|
|
|
|
|
|
|
|
\sa CppTools::Constants::TASK_INDEX
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::onTaskStarted(const QString &type)
|
|
|
|
|
{
|
2012-01-20 15:13:56 +01:00
|
|
|
if (type != QLatin1String(CppTools::Constants::TASK_INDEX))
|
2010-07-16 11:18:30 +02:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// disable tree updates to speed up
|
2011-07-06 17:40:54 +02:00
|
|
|
d->disableCodeParser = true;
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Handles parse tasks finished by the progress manager.\a type holds the
|
|
|
|
|
task index, which should be \c CppTools::Constants::TASK_INDEX.
|
|
|
|
|
|
|
|
|
|
\sa CppTools::Constants::TASK_INDEX
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::onAllTasksFinished(const QString &type)
|
|
|
|
|
{
|
2012-01-20 15:13:56 +01:00
|
|
|
if (type != QLatin1String(CppTools::Constants::TASK_INDEX))
|
2010-07-16 11:18:30 +02:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// parsing is finished, enable tree updates
|
2011-07-06 17:40:54 +02:00
|
|
|
d->disableCodeParser = false;
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// do nothing if Manager is disabled
|
|
|
|
|
if (!state())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// any document might be changed, emit signal to clear cache
|
|
|
|
|
emit requestClearCache();
|
|
|
|
|
|
|
|
|
|
// request to update a tree to the current state
|
|
|
|
|
emit requestResetCurrentState();
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Emits the signal \c documentUpdated when the code model manager state is
|
|
|
|
|
changed for \a doc.
|
|
|
|
|
|
|
|
|
|
\sa documentUpdated
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::onDocumentUpdated(CPlusPlus::Document::Ptr doc)
|
|
|
|
|
{
|
|
|
|
|
// do nothing if Manager is disabled
|
|
|
|
|
if (!state())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// do nothing if updates are disabled
|
2011-07-06 17:40:54 +02:00
|
|
|
if (d->disableCodeParser)
|
2010-07-16 11:18:30 +02:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
emit requestDocumentUpdated(doc);
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Opens the text editor for the file \a fileName on \a line (1-based) and
|
|
|
|
|
\a column (1-based).
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::gotoLocation(const QString &fileName, int line, int column)
|
|
|
|
|
{
|
2013-05-30 17:26:51 +02:00
|
|
|
Core::EditorManager::openEditorAt(fileName, line, column);
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Opens the text editor for any of the symbol locations in the \a list.
|
|
|
|
|
|
|
|
|
|
\sa Manager::gotoLocations
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::gotoLocations(const QList<QVariant> &list)
|
|
|
|
|
{
|
|
|
|
|
QSet<SymbolLocation> locations = Utils::roleToLocations(list);
|
|
|
|
|
|
|
|
|
|
if (locations.count() == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
QString fileName;
|
|
|
|
|
int line = 0;
|
|
|
|
|
int column = 0;
|
|
|
|
|
bool currentPositionAvailable = false;
|
|
|
|
|
|
|
|
|
|
// what is open now?
|
2012-05-08 09:43:14 +02:00
|
|
|
if (Core::IEditor *editor = Core::EditorManager::currentEditor()) {
|
2010-07-16 11:18:30 +02:00
|
|
|
// get current file name
|
2013-01-04 10:48:42 +01:00
|
|
|
if (Core::IDocument *document = editor->document())
|
2012-02-14 16:43:51 +01:00
|
|
|
fileName = document->fileName();
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
// if text file - what is current position?
|
|
|
|
|
TextEditor::ITextEditor *textEditor = qobject_cast<TextEditor::ITextEditor *>(editor);
|
|
|
|
|
if (textEditor) {
|
|
|
|
|
// there is open currently text editor
|
|
|
|
|
int position = textEditor->position();
|
|
|
|
|
textEditor->convertPosition(position, &line, &column);
|
|
|
|
|
currentPositionAvailable = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// if there is something open - try to check, is it currently activated symbol?
|
|
|
|
|
if (currentPositionAvailable) {
|
|
|
|
|
SymbolLocation current(fileName, line, column);
|
|
|
|
|
QSet<SymbolLocation>::const_iterator it = locations.find(current);
|
|
|
|
|
QSet<SymbolLocation>::const_iterator end = locations.constEnd();
|
|
|
|
|
// is it known location?
|
|
|
|
|
if (it != end) {
|
|
|
|
|
// found - do one additional step
|
|
|
|
|
++it;
|
|
|
|
|
if (it == end)
|
|
|
|
|
it = locations.begin();
|
|
|
|
|
const SymbolLocation &found = *it;
|
|
|
|
|
gotoLocation(found.fileName(), found.line(), found.column());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// no success - open first item in the list
|
|
|
|
|
const SymbolLocation loc = *locations.constBegin();
|
|
|
|
|
|
|
|
|
|
gotoLocation(loc.fileName(), loc.line(), loc.column());
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Emits the signal \c requestTreeDataUpdate if the latest tree info is
|
|
|
|
|
requested and if parsing is enabled.
|
|
|
|
|
|
|
|
|
|
\sa requestTreeDataUpdate, NavigationWidget::requestDataUpdate
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::onRequestTreeDataUpdate()
|
|
|
|
|
{
|
|
|
|
|
// do nothing if Manager is disabled
|
|
|
|
|
if (!state())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
emit requestTreeDataUpdate();
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Switches to flat mode (without subprojects) if \a flat is set to \c true.
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::setFlatMode(bool flat)
|
|
|
|
|
{
|
|
|
|
|
emit requestSetFlatMode(flat);
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Sends a new tree data update to a tree view. \a result holds the item with
|
|
|
|
|
the current tree.
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
void Manager::onTreeDataUpdate(QSharedPointer<QStandardItem> result)
|
|
|
|
|
{
|
|
|
|
|
// do nothing if Manager is disabled
|
|
|
|
|
if (!state())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
emit treeDataUpdate(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace ClassView
|