forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/4.11'
Change-Id: I65ce6aa917219a8f8b91b48c7077f8097248375c
This commit is contained in:
@@ -56,7 +56,8 @@ depends += qtwidgets \
|
|||||||
qtsensors \
|
qtsensors \
|
||||||
qtuitools \
|
qtuitools \
|
||||||
qtwebkit \
|
qtwebkit \
|
||||||
qtxml
|
qtxml \
|
||||||
|
qttestlib
|
||||||
|
|
||||||
include(../../config/macros.qdocconf)
|
include(../../config/macros.qdocconf)
|
||||||
include(../../config/qt-cpp-ignore.qdocconf)
|
include(../../config/qt-cpp-ignore.qdocconf)
|
||||||
|
@@ -31,33 +31,36 @@
|
|||||||
/*!
|
/*!
|
||||||
\namespace Aggregation
|
\namespace Aggregation
|
||||||
\brief The Aggregation namespace contains support for bundling related components,
|
\brief The Aggregation namespace contains support for bundling related components,
|
||||||
such that each component exposes the properties and behavior of the
|
so that each component exposes the properties and behavior of the
|
||||||
other components to the outside.
|
other components to the outside.
|
||||||
|
|
||||||
Components that are bundled to an Aggregate can be "cast" to each other
|
Components that are bundled into an aggregate can be \e cast to each other
|
||||||
and have a coupled life cycle. See the documentation of Aggregation::Aggregate for
|
and have a coupled life cycle. See the documentation of Aggregation::Aggregate for
|
||||||
details and examples.
|
details and examples.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class Aggregation::Aggregate
|
\class Aggregation::Aggregate
|
||||||
\mainclass
|
\ingroup mainclasses
|
||||||
\threadsafe
|
\threadsafe
|
||||||
|
|
||||||
\brief The Aggregate class defines a collection of related components that
|
\brief The Aggregate class defines a collection of related components that
|
||||||
can be viewed as a unit.
|
can be viewed as a unit.
|
||||||
|
|
||||||
An Aggregate is a collection of components that are handled as a unit,
|
An aggregate is a collection of components that are handled as a unit,
|
||||||
such that each component exposes the properties and behavior of the
|
such that each component exposes the properties and behavior of the
|
||||||
other components in the Aggregate to the outside.
|
other components in the aggregate to the outside.
|
||||||
Specifically that means:
|
Specifically that means:
|
||||||
\list
|
\list
|
||||||
\li They can be "cast" to each other (using query and query_all functions).
|
\li They can be \e cast to each other (using query() and query_all()
|
||||||
\li Their life cycle is coupled, i.e. whenever one is deleted all of them are.
|
functions).
|
||||||
|
\li Their life cycle is coupled. That is, whenever one is deleted, all of
|
||||||
|
them are.
|
||||||
\endlist
|
\endlist
|
||||||
Components can be of any QObject derived type.
|
Components can be of any QObject derived type.
|
||||||
|
|
||||||
You can use an Aggregate to simulate multiple inheritance by aggregation. Assume we have
|
You can use an aggregate to simulate multiple inheritance by aggregation.
|
||||||
|
Assuming we have the following code:
|
||||||
\code
|
\code
|
||||||
using namespace Aggregation;
|
using namespace Aggregation;
|
||||||
class MyInterface : public QObject { ........ };
|
class MyInterface : public QObject { ........ };
|
||||||
@@ -65,21 +68,21 @@
|
|||||||
[...]
|
[...]
|
||||||
MyInterface *object = new MyInterface; // this is single inheritance
|
MyInterface *object = new MyInterface; // this is single inheritance
|
||||||
\endcode
|
\endcode
|
||||||
The query function works like a qobject_cast with normal objects:
|
The query function works like a qobject_cast() with normal objects:
|
||||||
\code
|
\code
|
||||||
Q_ASSERT(query<MyInterface>(object) == object);
|
Q_ASSERT(query<MyInterface>(object) == object);
|
||||||
Q_ASSERT(query<MyInterfaceEx>(object) == 0);
|
Q_ASSERT(query<MyInterfaceEx>(object) == 0);
|
||||||
\endcode
|
\endcode
|
||||||
If we want 'object' to also implement the class MyInterfaceEx,
|
If we want \c object to also implement the class \c MyInterfaceEx,
|
||||||
but don't want to or cannot use multiple inheritance, we can do it
|
but don't want to or cannot use multiple inheritance, we can do it
|
||||||
at any point using an Aggregate:
|
at any point using an aggregate:
|
||||||
\code
|
\code
|
||||||
MyInterfaceEx *objectEx = new MyInterfaceEx;
|
MyInterfaceEx *objectEx = new MyInterfaceEx;
|
||||||
Aggregate *aggregate = new Aggregate;
|
Aggregate *aggregate = new Aggregate;
|
||||||
aggregate->add(object);
|
aggregate->add(object);
|
||||||
aggregate->add(objectEx);
|
aggregate->add(objectEx);
|
||||||
\endcode
|
\endcode
|
||||||
The Aggregate bundles the two objects together.
|
The aggregate bundles the two objects together.
|
||||||
If we have any part of the collection we get all parts:
|
If we have any part of the collection we get all parts:
|
||||||
\code
|
\code
|
||||||
Q_ASSERT(query<MyInterface>(object) == object);
|
Q_ASSERT(query<MyInterface>(object) == object);
|
||||||
@@ -87,25 +90,24 @@
|
|||||||
Q_ASSERT(query<MyInterface>(objectEx) == object);
|
Q_ASSERT(query<MyInterface>(objectEx) == object);
|
||||||
Q_ASSERT(query<MyInterfaceEx>(objectEx) == objectEx);
|
Q_ASSERT(query<MyInterfaceEx>(objectEx) == objectEx);
|
||||||
\endcode
|
\endcode
|
||||||
The following deletes all three: object, objectEx and aggregate:
|
The following deletes all three: \c object, \c objectEx and \c aggregate:
|
||||||
\code
|
\code
|
||||||
delete objectEx;
|
delete objectEx;
|
||||||
// or delete object;
|
// or delete object;
|
||||||
// or delete aggregate;
|
// or delete aggregate;
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
Aggregation aware code never uses qobject_cast, but always uses
|
Aggregation-aware code never uses qobject_cast(). It always uses
|
||||||
Aggregation::query which behaves like a qobject_cast as a fallback.
|
Aggregation::query(), which behaves like a qobject_cast() as a fallback.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn T *Aggregate::component()
|
\fn T *Aggregate::component()
|
||||||
|
|
||||||
Template function that returns the component with the given type, if there is one.
|
Template function that returns the component with the given type, if there is one.
|
||||||
If there are multiple components with that type a random one is returned.
|
If there are multiple components with that type, a random one is returned.
|
||||||
|
|
||||||
\sa Aggregate::components()
|
\sa Aggregate::components(), add()
|
||||||
\sa Aggregate::add()
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -113,8 +115,7 @@
|
|||||||
|
|
||||||
Template function that returns all components with the given type, if there are any.
|
Template function that returns all components with the given type, if there are any.
|
||||||
|
|
||||||
\sa Aggregate::component()
|
\sa Aggregate::component(), add()
|
||||||
\sa Aggregate::add()
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -131,10 +132,10 @@
|
|||||||
\relates Aggregation::Aggregate
|
\relates Aggregation::Aggregate
|
||||||
\fn T *Aggregation::query<T *>(QObject *obj)
|
\fn T *Aggregation::query<T *>(QObject *obj)
|
||||||
|
|
||||||
Performs a dynamic cast that is aware of a possible Aggregate that \a obj
|
Performs a dynamic cast that is aware of a possible aggregate that \a obj
|
||||||
might belong to. If \a obj itself is of the requested type then it is simply cast
|
might belong to. If \a obj itself is of the requested type, it is simply cast
|
||||||
and returned. Otherwise, if \a obj belongs to an Aggregate all its components are
|
and returned. Otherwise, if \a obj belongs to an aggregate, all its components are
|
||||||
checked, or if it doesn't belong to an Aggregate null is returned.
|
checked. If it doesn't belong to an aggregate, null is returned.
|
||||||
|
|
||||||
\sa Aggregate::component()
|
\sa Aggregate::component()
|
||||||
*/
|
*/
|
||||||
@@ -143,18 +144,25 @@
|
|||||||
\relates Aggregation::Aggregate
|
\relates Aggregation::Aggregate
|
||||||
\fn QList<T *> Aggregation::query_all<T *>(QObject *obj)
|
\fn QList<T *> Aggregation::query_all<T *>(QObject *obj)
|
||||||
|
|
||||||
If \a obj belongs to an Aggregate, all components that can be cast to the given
|
If \a obj belongs to an aggregate, all components that can be cast to the given
|
||||||
type are returned. Otherwise, \a obj is returned if it is of the requested type.
|
type are returned. Otherwise, \a obj is returned if it is of the requested type.
|
||||||
|
|
||||||
\sa Aggregate::components()
|
\sa Aggregate::components()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn void Aggregation::Aggregate::changed()
|
||||||
|
|
||||||
|
This signal is emitted when a component is added to or removed from an
|
||||||
|
aggregate.
|
||||||
|
|
||||||
|
\sa add(), remove()
|
||||||
|
*/
|
||||||
|
|
||||||
using namespace Aggregation;
|
using namespace Aggregation;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn Aggregate *Aggregate::parentAggregate(QObject *obj)
|
Returns the aggregate object of \a obj if there is one. Otherwise returns 0.
|
||||||
|
|
||||||
Returns the Aggregate object of \a obj if there is one. Otherwise returns 0.
|
|
||||||
*/
|
*/
|
||||||
Aggregate *Aggregate::parentAggregate(QObject *obj)
|
Aggregate *Aggregate::parentAggregate(QObject *obj)
|
||||||
{
|
{
|
||||||
@@ -169,7 +177,6 @@ QHash<QObject *, Aggregate *> &Aggregate::aggregateMap()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn QReadWriteLock &Aggregate::lock()
|
|
||||||
\internal
|
\internal
|
||||||
*/
|
*/
|
||||||
QReadWriteLock &Aggregate::lock()
|
QReadWriteLock &Aggregate::lock()
|
||||||
@@ -179,10 +186,8 @@ QReadWriteLock &Aggregate::lock()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn Aggregate::Aggregate(QObject *parent)
|
Creates a new aggregate with the given \a parent.
|
||||||
|
The parent is directly passed to the QObject part
|
||||||
Creates a new Aggregate with the given \a parent.
|
|
||||||
The \a parent is passed directly passed to the QObject part
|
|
||||||
of the class and is not used beside that.
|
of the class and is not used beside that.
|
||||||
*/
|
*/
|
||||||
Aggregate::Aggregate(QObject *parent)
|
Aggregate::Aggregate(QObject *parent)
|
||||||
@@ -193,8 +198,6 @@ Aggregate::Aggregate(QObject *parent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn Aggregate::~Aggregate()
|
|
||||||
|
|
||||||
Deleting the aggregate automatically deletes all its components.
|
Deleting the aggregate automatically deletes all its components.
|
||||||
*/
|
*/
|
||||||
Aggregate::~Aggregate()
|
Aggregate::~Aggregate()
|
||||||
@@ -224,13 +227,11 @@ void Aggregate::deleteSelf(QObject *obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn void Aggregate::add(QObject *component)
|
|
||||||
|
|
||||||
Adds the \a component to the aggregate.
|
Adds the \a component to the aggregate.
|
||||||
You can't add a component that is part of a different aggregate
|
You cannot add a component that is part of a different aggregate
|
||||||
or an aggregate itself.
|
or an aggregate itself.
|
||||||
|
|
||||||
\sa Aggregate::remove()
|
\sa remove()
|
||||||
*/
|
*/
|
||||||
void Aggregate::add(QObject *component)
|
void Aggregate::add(QObject *component)
|
||||||
{
|
{
|
||||||
@@ -253,11 +254,9 @@ void Aggregate::add(QObject *component)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn void Aggregate::remove(QObject *component)
|
|
||||||
|
|
||||||
Removes the \a component from the aggregate.
|
Removes the \a component from the aggregate.
|
||||||
|
|
||||||
\sa Aggregate::add()
|
\sa add()
|
||||||
*/
|
*/
|
||||||
void Aggregate::remove(QObject *component)
|
void Aggregate::remove(QObject *component)
|
||||||
{
|
{
|
||||||
|
@@ -30,22 +30,20 @@
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class ExtensionSystem::IPlugin
|
\class ExtensionSystem::IPlugin
|
||||||
\mainclass
|
\ingroup mainclasses
|
||||||
\brief The IPlugin class is the base class for all plugins.
|
\brief The IPlugin class is the base class for all plugins.
|
||||||
|
|
||||||
The IPlugin class is an abstract class that must be implemented
|
The IPlugin class is an abstract class that must be implemented
|
||||||
once for each plugin.
|
once for each plugin.
|
||||||
A plugin consists of two parts: A description file, and a library
|
A plugin consists of two parts: a description file, and a library
|
||||||
that at least contains the IPlugin implementation.
|
that at least contains the IPlugin implementation.
|
||||||
|
|
||||||
\tableofcontents
|
|
||||||
|
|
||||||
\section1 Plugin Specification
|
\section1 Plugin Specification
|
||||||
|
|
||||||
A plugin needs to provide a plugin specification file in addition
|
A plugin needs to provide a plugin specification file in addition
|
||||||
to the actual plugin library, so the plugin manager can find the plugin,
|
to the actual plugin library, so the plugin manager can find the plugin,
|
||||||
resolve its dependencies, and load it. For more information,
|
resolve its dependencies, and load it. For more information,
|
||||||
see \l{Plugin Specifications}.
|
see \l{Plugin Meta Data}.
|
||||||
|
|
||||||
\section1 Plugin Implementation
|
\section1 Plugin Implementation
|
||||||
Plugins must provide one implementation of the IPlugin class, located
|
Plugins must provide one implementation of the IPlugin class, located
|
||||||
@@ -65,7 +63,7 @@
|
|||||||
needed by other plugins and register them via appropriate core functions
|
needed by other plugins and register them via appropriate core functions
|
||||||
or, if a weak dependency is neceessary to be implemented, to put
|
or, if a weak dependency is neceessary to be implemented, to put
|
||||||
them into the global object pool.
|
them into the global object pool.
|
||||||
\li All plugins' extensionsInitialized functions are called in \e{leaf-to-root}
|
\li All plugins' extensionsInitialized() functions are called in \e{leaf-to-root}
|
||||||
order of the dependency tree. At this point, plugins can
|
order of the dependency tree. At this point, plugins can
|
||||||
be sure that all plugins that depend on this plugin have
|
be sure that all plugins that depend on this plugin have
|
||||||
been initialized completely and objects these plugins wish to
|
been initialized completely and objects these plugins wish to
|
||||||
@@ -75,17 +73,31 @@
|
|||||||
that depend on that plugin also fail.
|
that depend on that plugin also fail.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\enum IPlugin::ShutdownFlag
|
||||||
|
|
||||||
|
This enum type holds whether the plugin is shut down synchronously or
|
||||||
|
asynchronously.
|
||||||
|
|
||||||
|
\value SynchronousShutdown
|
||||||
|
The plugin is shut down synchronously.
|
||||||
|
\value AsynchronousShutdown
|
||||||
|
The plugin needs to perform asynchronous
|
||||||
|
actions before it shuts down.
|
||||||
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn bool IPlugin::initialize(const QStringList &arguments, QString *errorString)
|
\fn bool IPlugin::initialize(const QStringList &arguments, QString *errorString)
|
||||||
\brief Called after the plugin has been loaded and the IPlugin instance
|
Called after the plugin has been loaded and the IPlugin instance
|
||||||
has been created.
|
has been created.
|
||||||
|
|
||||||
The initialize functions of plugins that depend
|
The initialize functions of plugins that depend on this plugin are called
|
||||||
on this plugin are called after the initialize function of this plugin
|
after the initialize function of this plugin has been called with
|
||||||
has been called. Plugins should initialize their internal state in this
|
\a arguments. Plugins should initialize their internal state in this
|
||||||
function. Returns if initialization of successful. If it wasn't successful,
|
function.
|
||||||
the \a errorString should be set to a user-readable message
|
|
||||||
describing the reason.
|
Returns whether initialization succeeds. If it does not, \a errorString
|
||||||
|
should be set to a user-readable message describing the reason.
|
||||||
|
|
||||||
\sa extensionsInitialized()
|
\sa extensionsInitialized()
|
||||||
\sa delayedInitialize()
|
\sa delayedInitialize()
|
||||||
@@ -93,12 +105,12 @@
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn void IPlugin::extensionsInitialized()
|
\fn void IPlugin::extensionsInitialized()
|
||||||
\brief Called after the IPlugin::initialize() function has been called,
|
Called after the initialize() function has been called,
|
||||||
and after both the IPlugin::initialize() and IPlugin::extensionsInitialized()
|
and after both the initialize() and \c extensionsInitialized()
|
||||||
functions of plugins that depend on this plugin have been called.
|
functions of plugins that depend on this plugin have been called.
|
||||||
|
|
||||||
In this function, the plugin can assume that plugins that depend on
|
In this function, the plugin can assume that plugins that depend on
|
||||||
this plugin are fully 'up and running'. It is a good place to
|
this plugin are fully \e {up and running}. It is a good place to
|
||||||
look in the global object pool for objects that have been provided
|
look in the global object pool for objects that have been provided
|
||||||
by weakly dependent plugins.
|
by weakly dependent plugins.
|
||||||
|
|
||||||
@@ -108,19 +120,21 @@
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn bool IPlugin::delayedInitialize()
|
\fn bool IPlugin::delayedInitialize()
|
||||||
\brief Called after all plugins' IPlugin::extensionsInitialized() function has been called,
|
Called after all plugins' extensionsInitialized() function has been called,
|
||||||
and after the IPlugin::delayedInitialize() function of plugins that depend on this plugin
|
and after the \c delayedInitialize() function of plugins that depend on this
|
||||||
have been called.
|
plugin have been called.
|
||||||
|
|
||||||
The plugins' delayedInitialize() functions are called after the application is already running,
|
The plugins' \c delayedInitialize() functions are called after the
|
||||||
with a few milliseconds delay to application startup, and between individual delayedInitialize
|
application is already running, with a few milliseconds delay to
|
||||||
function calls. To avoid unnecessary delays, a plugin should return true from the function if it
|
application startup, and between individual \c delayedInitialize()
|
||||||
actually implements it, to indicate that the next plugins' delayedInitialize() call should
|
function calls. To avoid unnecessary delays, a plugin should return
|
||||||
be delayed a few milliseconds to give input and paint events a chance to be processed.
|
\c true from the function if it actually implements it, to indicate
|
||||||
|
that the next plugins' \c delayedInitialize() call should be delayed
|
||||||
|
a few milliseconds to give input and paint events a chance to be processed.
|
||||||
|
|
||||||
This function can be used if a plugin needs to do non-trivial setup that doesn't
|
This function can be used if a plugin needs to do non-trivial setup that doesn't
|
||||||
necessarily need to be done directly at startup, but still should be done within a
|
necessarily need to be done directly at startup, but still should be done within a
|
||||||
short time afterwards. This can decrease the felt plugin/application startup
|
short time afterwards. This can decrease the perceived plugin or application startup
|
||||||
time a lot, with very little effort.
|
time a lot, with very little effort.
|
||||||
|
|
||||||
\sa initialize()
|
\sa initialize()
|
||||||
@@ -129,7 +143,7 @@
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn IPlugin::ShutdownFlag IPlugin::aboutToShutdown()
|
\fn IPlugin::ShutdownFlag IPlugin::aboutToShutdown()
|
||||||
\brief Called during a shutdown sequence in the same order as initialization
|
Called during a shutdown sequence in the same order as initialization
|
||||||
before the plugins get deleted in reverse order.
|
before the plugins get deleted in reverse order.
|
||||||
|
|
||||||
This function should be used to disconnect from other plugins,
|
This function should be used to disconnect from other plugins,
|
||||||
@@ -138,34 +152,44 @@
|
|||||||
it needs to wait for external processes to finish for a clean shutdown,
|
it needs to wait for external processes to finish for a clean shutdown,
|
||||||
the plugin can return IPlugin::AsynchronousShutdown from this function. This
|
the plugin can return IPlugin::AsynchronousShutdown from this function. This
|
||||||
will keep the main event loop running after the aboutToShutdown() sequence
|
will keep the main event loop running after the aboutToShutdown() sequence
|
||||||
has finished, until all plugins requesting AsynchronousShutdown have sent
|
has finished, until all plugins requesting asynchronous shutdown have sent
|
||||||
the asynchronousShutdownFinished() signal.
|
the asynchronousShutdownFinished() signal.
|
||||||
|
|
||||||
The default implementation of this function does nothing and returns
|
The default implementation of this function does nothing and returns
|
||||||
IPlugin::SynchronousShutdown.
|
IPlugin::SynchronousShutdown.
|
||||||
|
|
||||||
Returns IPlugin::AsynchronousShutdown if the plugin needs to perform
|
Returns IPlugin::AsynchronousShutdown if the plugin needs to perform
|
||||||
asynchronous actions before performing the shutdown.
|
asynchronous actions before shutdown.
|
||||||
|
|
||||||
\sa asynchronousShutdownFinished()
|
\sa asynchronousShutdownFinished()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn QObject *IPlugin::remoteCommand(const QStringList &options, const QStringList &arguments)
|
\fn QObject *IPlugin::remoteCommand(const QStringList &options,
|
||||||
\brief When \QC is executed with the -client argument while already another instance of \QC
|
const QString &workingDirectory,
|
||||||
is running, this function of plugins is called in the running instance.
|
const QStringList &arguments)
|
||||||
|
|
||||||
|
When \QC is executed with the \c -client argument while another \QC instance
|
||||||
|
is running, this function of the plugin is called in the running instance.
|
||||||
|
|
||||||
|
The \a workingDirectory argument specifies the working directory of the
|
||||||
|
calling process. For example, if you're in a directory, and you execute
|
||||||
|
\c { qtcreator -client file.cpp}, the working directory of the calling
|
||||||
|
process is passed to the running instance and \c {file.cpp} is transformed
|
||||||
|
into an absolute path starting from this directory.
|
||||||
|
|
||||||
Plugin-specific arguments are passed in \a options, while the rest of the
|
Plugin-specific arguments are passed in \a options, while the rest of the
|
||||||
arguments are passed in \a arguments.
|
arguments are passed in \a arguments.
|
||||||
|
|
||||||
\returns a QObject that blocks the command until it is destroyed, if -block is used.
|
Returns a QObject that blocks the command until it is destroyed, if \c -block
|
||||||
|
is used.
|
||||||
|
|
||||||
\sa PluginManager::serializedArguments()
|
\sa PluginManager::serializedArguments()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn void IPlugin::asynchronousShutdownFinished()
|
\fn void IPlugin::asynchronousShutdownFinished()
|
||||||
Sent by the plugin implementation after a asynchronous shutdown
|
Sent by the plugin implementation after an asynchronous shutdown
|
||||||
is ready to proceed with the shutdown sequence.
|
is ready to proceed with the shutdown sequence.
|
||||||
|
|
||||||
\sa aboutToShutdown()
|
\sa aboutToShutdown()
|
||||||
@@ -174,7 +198,6 @@
|
|||||||
using namespace ExtensionSystem;
|
using namespace ExtensionSystem;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn IPlugin::IPlugin()
|
|
||||||
\internal
|
\internal
|
||||||
*/
|
*/
|
||||||
IPlugin::IPlugin()
|
IPlugin::IPlugin()
|
||||||
@@ -183,7 +206,6 @@ IPlugin::IPlugin()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn IPlugin::~IPlugin()
|
|
||||||
\internal
|
\internal
|
||||||
*/
|
*/
|
||||||
IPlugin::~IPlugin()
|
IPlugin::~IPlugin()
|
||||||
@@ -193,11 +215,10 @@ IPlugin::~IPlugin()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn QVector<QObject *> IPlugin::createTestObjects() const
|
Returns objects that are meant to be passed on to \l QTest::qExec().
|
||||||
|
|
||||||
Returns objects that are meant to be passed on to QTest::qExec().
|
This function will be called if the user starts \QC with
|
||||||
|
\c {-test PluginName} or \c {-test all}.
|
||||||
This function will be called if the user starts \QC with '-test PluginName' or '-test all'.
|
|
||||||
|
|
||||||
The ownership of returned objects is transferred to caller.
|
The ownership of returned objects is transferred to caller.
|
||||||
*/
|
*/
|
||||||
@@ -207,7 +228,6 @@ QVector<QObject *> IPlugin::createTestObjects() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn PluginSpec *IPlugin::pluginSpec() const
|
|
||||||
Returns the PluginSpec corresponding to this plugin.
|
Returns the PluginSpec corresponding to this plugin.
|
||||||
This is not available in the constructor.
|
This is not available in the constructor.
|
||||||
*/
|
*/
|
||||||
|
@@ -89,7 +89,7 @@ enum { debugLeaks = 0 };
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class ExtensionSystem::PluginManager
|
\class ExtensionSystem::PluginManager
|
||||||
\mainclass
|
\ingroup mainclasses
|
||||||
|
|
||||||
\brief The PluginManager class implements the core plugin system that
|
\brief The PluginManager class implements the core plugin system that
|
||||||
manages the plugins, their life cycle, and their registered objects.
|
manages the plugins, their life cycle, and their registered objects.
|
||||||
@@ -97,13 +97,13 @@ enum { debugLeaks = 0 };
|
|||||||
The plugin manager is used for the following tasks:
|
The plugin manager is used for the following tasks:
|
||||||
\list
|
\list
|
||||||
\li Manage plugins and their state
|
\li Manage plugins and their state
|
||||||
\li Manipulate a 'common object pool'
|
\li Manipulate a \e {common object pool}
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
\section1 Plugins
|
\section1 Plugins
|
||||||
Plugins consist of an XML descriptor file, and of a library that contains a Qt plugin
|
Plugins must derive from the IPlugin class and have the IID
|
||||||
that must derive from the IPlugin class and has an IID of
|
|
||||||
\c "org.qt-project.Qt.QtCreatorPlugin".
|
\c "org.qt-project.Qt.QtCreatorPlugin".
|
||||||
|
|
||||||
The plugin manager is used to set a list of file system directories to search for
|
The plugin manager is used to set a list of file system directories to search for
|
||||||
plugins, retrieve information about the state of these plugins, and to load them.
|
plugins, retrieve information about the state of these plugins, and to load them.
|
||||||
|
|
||||||
@@ -114,22 +114,22 @@ enum { debugLeaks = 0 };
|
|||||||
PluginManager::setPluginPaths(QStringList("plugins"));
|
PluginManager::setPluginPaths(QStringList("plugins"));
|
||||||
PluginManager::loadPlugins(); // try to load all the plugins
|
PluginManager::loadPlugins(); // try to load all the plugins
|
||||||
\endcode
|
\endcode
|
||||||
Additionally, it is possible to directly access the plugin specifications
|
Additionally, it is possible to directly access plugin meta data, instances,
|
||||||
(the information in the descriptor file), the plugin instances (via PluginSpec),
|
and state.
|
||||||
and their state.
|
|
||||||
|
|
||||||
\section1 Object Pool
|
\section1 Object Pool
|
||||||
Plugins (and everybody else) can add objects to a common 'pool' that is located in
|
Plugins (and everybody else) can add objects to a common \e pool that is located in
|
||||||
the plugin manager. Objects in the pool must derive from QObject, there are no other
|
the plugin manager. Objects in the pool must derive from QObject, there are no other
|
||||||
prerequisites. Objects can be retrieved from the object pool via the getObject()
|
prerequisites. Objects can be retrieved from the object pool via the getObject()
|
||||||
and getObjectByName() functions.
|
and getObjectByName() functions.
|
||||||
|
|
||||||
Whenever the state of the object pool changes a corresponding signal is emitted by the plugin manager.
|
Whenever the state of the object pool changes, a corresponding signal is
|
||||||
|
emitted by the plugin manager.
|
||||||
|
|
||||||
A common usecase for the object pool is that a plugin (or the application) provides
|
A common usecase for the object pool is that a plugin (or the application) provides
|
||||||
an "extension point" for other plugins, which is a class / interface that can
|
an \e {extension point} for other plugins, which is a class or interface that can
|
||||||
be implemented and added to the object pool. The plugin that provides the
|
be implemented and added to the object pool. The plugin that provides the
|
||||||
extension point looks for implementations of the class / interface in the object pool.
|
extension point looks for implementations of the class or interface in the object pool.
|
||||||
\code
|
\code
|
||||||
// Plugin A provides a "MimeTypeHandler" extension point
|
// Plugin A provides a "MimeTypeHandler" extension point
|
||||||
// in plugin B:
|
// in plugin B:
|
||||||
@@ -141,15 +141,15 @@ enum { debugLeaks = 0 };
|
|||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
|
|
||||||
The \c{ExtensionSystem::Invoker} class template provides "syntactic sugar"
|
The ExtensionSystem::Invoker class template provides \e {syntactic sugar}
|
||||||
for using "soft" extension points that may or may not be provided by an
|
for using \e soft extension points that may or may not be provided by an
|
||||||
object in the pool. This approach does neither require the "user" plugin being
|
object in the pool. This approach neither requires the \e user plugin being
|
||||||
linked against the "provider" plugin nor a common shared
|
linked against the \e provider plugin nor a common shared
|
||||||
header file. The exposed interface is implicitly given by the
|
header file. The exposed interface is implicitly given by the
|
||||||
invokable functions of the "provider" object in the object pool.
|
invokable functions of the provider object in the object pool.
|
||||||
|
|
||||||
The \c{ExtensionSystem::invoke} function template encapsulates
|
The ExtensionSystem::invoke() function template encapsulates
|
||||||
{ExtensionSystem::Invoker} construction for the common case where
|
ExtensionSystem::Invoker construction for the common case where
|
||||||
the success of the call is not checked.
|
the success of the call is not checked.
|
||||||
|
|
||||||
\code
|
\code
|
||||||
@@ -205,35 +205,18 @@ enum { debugLeaks = 0 };
|
|||||||
is deduced from the parameters themselves and must match the type of
|
is deduced from the parameters themselves and must match the type of
|
||||||
the arguments of the called functions \e{exactly}. No conversion or even
|
the arguments of the called functions \e{exactly}. No conversion or even
|
||||||
integer promotions are applicable, so to invoke a function with a \c{long}
|
integer promotions are applicable, so to invoke a function with a \c{long}
|
||||||
parameter explicitly use \c{long(43)} or such.
|
parameter explicitly, use \c{long(43)} or such.
|
||||||
|
|
||||||
\note The object pool manipulating functions are thread-safe.
|
\note The object pool manipulating functions are thread-safe.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn void PluginManager::objectAdded(QObject *obj)
|
|
||||||
Signals that \a obj has been added to the object pool.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn void PluginManager::aboutToRemoveObject(QObject *obj)
|
|
||||||
Signals that \a obj will be removed from the object pool.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\fn void PluginManager::pluginsChanged()
|
|
||||||
Signals that the list of available plugins has changed.
|
|
||||||
|
|
||||||
\sa plugins()
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn T *PluginManager::getObject()
|
\fn T *PluginManager::getObject()
|
||||||
|
|
||||||
Retrieves the object of a given type from the object pool.
|
Retrieves the object of a given type from the object pool.
|
||||||
|
|
||||||
This function uses \c qobject_cast to determine the type of an object.
|
This function uses \c qobject_cast to determine the type of an object.
|
||||||
If there are more than one object of the given type in
|
If there are more than one objects of the given type in
|
||||||
the object pool, this function will arbitrarily choose one of them.
|
the object pool, this function will arbitrarily choose one of them.
|
||||||
|
|
||||||
\sa addObject()
|
\sa addObject()
|
||||||
@@ -293,10 +276,10 @@ PluginManager::~PluginManager()
|
|||||||
Adds the object \a obj to the object pool, so it can be retrieved
|
Adds the object \a obj to the object pool, so it can be retrieved
|
||||||
again from the pool by type.
|
again from the pool by type.
|
||||||
|
|
||||||
The plugin manager does not do any memory management - added objects
|
The plugin manager does not do any memory management. Added objects
|
||||||
must be removed from the pool and deleted manually by whoever is responsible for the object.
|
must be removed from the pool and deleted manually by whoever is responsible for the object.
|
||||||
|
|
||||||
Emits the objectAdded() signal.
|
Emits the \c objectAdded() signal.
|
||||||
|
|
||||||
\sa PluginManager::removeObject()
|
\sa PluginManager::removeObject()
|
||||||
\sa PluginManager::getObject()
|
\sa PluginManager::getObject()
|
||||||
@@ -308,7 +291,8 @@ void PluginManager::addObject(QObject *obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Emits aboutToRemoveObject() and removes the object \a obj from the object pool.
|
Emits the \c aboutToRemoveObject() signal and removes the object \a obj
|
||||||
|
from the object pool.
|
||||||
\sa PluginManager::addObject()
|
\sa PluginManager::addObject()
|
||||||
*/
|
*/
|
||||||
void PluginManager::removeObject(QObject *obj)
|
void PluginManager::removeObject(QObject *obj)
|
||||||
@@ -328,6 +312,9 @@ QVector<QObject *> PluginManager::allObjects()
|
|||||||
return d->allObjects;
|
return d->allObjects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\internal
|
||||||
|
*/
|
||||||
QReadWriteLock *PluginManager::listLock()
|
QReadWriteLock *PluginManager::listLock()
|
||||||
{
|
{
|
||||||
return &d->m_lock;
|
return &d->m_lock;
|
||||||
@@ -347,7 +334,7 @@ void PluginManager::loadPlugins()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns true if any plugin has errors even though it is enabled.
|
Returns \c true if any plugin has errors even though it is enabled.
|
||||||
Most useful to call after loadPlugins().
|
Most useful to call after loadPlugins().
|
||||||
*/
|
*/
|
||||||
bool PluginManager::hasError()
|
bool PluginManager::hasError()
|
||||||
@@ -455,9 +442,8 @@ QStringList PluginManager::pluginPaths()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Sets the plugin search paths, i.e. the file system paths where the plugin manager
|
Sets the plugin paths. All the specified \a paths and their subdirectory
|
||||||
looks for plugin descriptions. All given \a paths and their sub directory trees
|
trees are searched for plugins.
|
||||||
are searched for plugin xml description files.
|
|
||||||
|
|
||||||
\sa pluginPaths()
|
\sa pluginPaths()
|
||||||
\sa loadPlugins()
|
\sa loadPlugins()
|
||||||
@@ -478,11 +464,14 @@ QString PluginManager::pluginIID()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Sets the IID that valid plugins must have. Only plugins with this IID are loaded, others are
|
Sets the IID that valid plugins must have to \a iid. Only plugins with this
|
||||||
silently ignored.
|
IID are loaded, others are silently ignored.
|
||||||
|
|
||||||
At the moment this must be called before setPluginPaths() is called.
|
At the moment this must be called before setPluginPaths() is called.
|
||||||
|
|
||||||
|
\omit
|
||||||
// ### TODO let this + setPluginPaths read the plugin meta data lazyly whenever loadPlugins() or plugins() is called.
|
// ### TODO let this + setPluginPaths read the plugin meta data lazyly whenever loadPlugins() or plugins() is called.
|
||||||
|
\endomit
|
||||||
*/
|
*/
|
||||||
void PluginManager::setPluginIID(const QString &iid)
|
void PluginManager::setPluginIID(const QString &iid)
|
||||||
{
|
{
|
||||||
@@ -490,7 +479,7 @@ void PluginManager::setPluginIID(const QString &iid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Defines the user specific settings to use for information about enabled and
|
Defines the user specific \a settings to use for information about enabled and
|
||||||
disabled plugins.
|
disabled plugins.
|
||||||
Needs to be set before the plugin search path is set with setPluginPaths().
|
Needs to be set before the plugin search path is set with setPluginPaths().
|
||||||
*/
|
*/
|
||||||
@@ -500,7 +489,7 @@ void PluginManager::setSettings(QSettings *settings)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Defines the global (user-independent) settings to use for information about
|
Defines the global (user-independent) \a settings to use for information about
|
||||||
default disabled plugins.
|
default disabled plugins.
|
||||||
Needs to be set before the plugin search path is set with setPluginPaths().
|
Needs to be set before the plugin search path is set with setPluginPaths().
|
||||||
*/
|
*/
|
||||||
@@ -552,10 +541,10 @@ QStringList PluginManager::argumentsForRestart()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
List of all plugin specifications that have been found in the plugin search paths.
|
List of all plugins that have been found in the plugin search paths.
|
||||||
This list is valid directly after the setPluginPaths() call.
|
This list is valid directly after the setPluginPaths() call.
|
||||||
The plugin specifications contain the information from the plugins' xml description files
|
The plugin specifications contain plugin metadata and the current state
|
||||||
and the current state of the plugins. If a plugin's library has been already successfully loaded,
|
of the plugins. If a plugin's library has been already successfully loaded,
|
||||||
the plugin specification has a reference to the created plugin instance as well.
|
the plugin specification has a reference to the created plugin instance as well.
|
||||||
|
|
||||||
\sa setPluginPaths()
|
\sa setPluginPaths()
|
||||||
@@ -631,7 +620,7 @@ static QStringList subList(const QStringList &in, const QString &key)
|
|||||||
and passes them on to the respective plugins along with the arguments.
|
and passes them on to the respective plugins along with the arguments.
|
||||||
|
|
||||||
\a socket is passed for disconnecting the peer when the operation is done (for example,
|
\a socket is passed for disconnecting the peer when the operation is done (for example,
|
||||||
document is closed) for supporting the -block flag.
|
document is closed) for supporting the \c -block flag.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void PluginManager::remoteArguments(const QString &serializedArgument, QObject *socket)
|
void PluginManager::remoteArguments(const QString &serializedArgument, QObject *socket)
|
||||||
@@ -659,13 +648,17 @@ void PluginManager::remoteArguments(const QString &serializedArgument, QObject *
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
Takes the list of command line options in \a args and parses them.
|
Takes the list of command line options in \a args and parses them.
|
||||||
The plugin manager itself might process some options itself directly (-noload <plugin>), and
|
The plugin manager itself might process some options itself directly
|
||||||
adds options that are registered by plugins to their plugin specs.
|
(\c {-noload <plugin>}), and adds options that are registered by
|
||||||
The caller (the application) may register itself for options via the \a appOptions list, containing pairs
|
plugins to their plugin specs.
|
||||||
of "option string" and a bool that indicates if the option requires an argument.
|
|
||||||
|
The caller (the application) may register itself for options via the
|
||||||
|
\a appOptions list, containing pairs of \e {option string} and a bool
|
||||||
|
that indicates whether the option requires an argument.
|
||||||
Application options always override any plugin's options.
|
Application options always override any plugin's options.
|
||||||
|
|
||||||
\a foundAppOptions is set to pairs of ("option string", "argument") for any application options that were found.
|
\a foundAppOptions is set to pairs of (\e {option string}, \e argument)
|
||||||
|
for any application options that were found.
|
||||||
The command line options that were not processed can be retrieved via the arguments() function.
|
The command line options that were not processed can be retrieved via the arguments() function.
|
||||||
If an error occurred (like missing argument for an option that requires one), \a errorString contains
|
If an error occurred (like missing argument for an option that requires one), \a errorString contains
|
||||||
a descriptive message of the error.
|
a descriptive message of the error.
|
||||||
|
@@ -360,6 +360,8 @@ void ProjectTreeWidget::rowsInserted(const QModelIndex &parent, int start, int e
|
|||||||
|
|
||||||
Node *ProjectTreeWidget::nodeForFile(const FilePath &fileName)
|
Node *ProjectTreeWidget::nodeForFile(const FilePath &fileName)
|
||||||
{
|
{
|
||||||
|
if (fileName.isEmpty())
|
||||||
|
return nullptr;
|
||||||
Node *bestNode = nullptr;
|
Node *bestNode = nullptr;
|
||||||
int bestNodeExpandCount = INT_MAX;
|
int bestNodeExpandCount = INT_MAX;
|
||||||
|
|
||||||
|
Submodule src/shared/qbs updated: f8c9a663fb...40ae3324be
Reference in New Issue
Block a user