mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-24 10:52:53 +00:00
205 lines
7.9 KiB
Text
205 lines
7.9 KiB
Text
![]() |
General
|
||
|
-------
|
||
|
KDevelop 2 could be generally divided into the following categories:
|
||
|
|
||
|
- The core: Which connects the parts and plug-ins to the user
|
||
|
interface
|
||
|
- Parts: Which implements various parts of the KDevelop based on
|
||
|
Components architecture.
|
||
|
- Plug-ins: Which implements some other stuff based on the plug-in
|
||
|
architecture. For the difference between Components and plug-ins
|
||
|
see bellow.
|
||
|
|
||
|
The Core
|
||
|
--------
|
||
|
Resided in kdevelop/, sets up the GUI, loads various components
|
||
|
(throug the Component Manager - see bellow), communicates with the
|
||
|
components to let them talk to the user interface.
|
||
|
|
||
|
Components/Component Architecture
|
||
|
---------------------------------
|
||
|
Initial functionalities whithin KDevelop are divided into some
|
||
|
Parts. These are parts which KDevelop needs to run and function. For
|
||
|
instance you can think of the editor, or the class parser.
|
||
|
|
||
|
To give the component identities and uniformation, they shold be
|
||
|
derived from the class KDevComponent as defined in
|
||
|
kdevelop/lib/ComponentManager/kdevcomponent.h. This class defines some
|
||
|
minimal functionality needed for instance for communications. Each
|
||
|
component can communicate with other components or with the core.
|
||
|
KDevComponent defines some virtual methods which could be overrided in
|
||
|
each component.
|
||
|
|
||
|
To let the components communicate with each other, every component
|
||
|
should have some minimum access to the component which it's going to
|
||
|
communicate with. That's why the communicating components should be
|
||
|
divided into a generalization and a specialization.
|
||
|
|
||
|
The Generalization is directly derived from KDevComponent and provides
|
||
|
minimum access for other components which may communicate. The
|
||
|
Specialization is a derived class from the Generalization, and extends
|
||
|
the components and implements it fully. The generalizations are
|
||
|
resided in kdevelop/lib/ComponentManger/Components/ and the
|
||
|
specializations are defined as Parts in kdevelop/parts.
|
||
|
|
||
|
If a component does not need to communicate with other components, or
|
||
|
nobody wants to communicate with it, it does not need to have
|
||
|
generalization and it could directly derive from KDevComponent. In
|
||
|
this case it is called a global component.
|
||
|
|
||
|
The Generalizations are identified externally by ServiceTypes of
|
||
|
KDE. The Specializations are identified externally by Services.
|
||
|
The MUST have these. (See Component Manager)
|
||
|
|
||
|
The components can communicate also with the core, or the core may
|
||
|
want to communicate with them. This happens through the Component
|
||
|
Manager (See bellow).
|
||
|
|
||
|
Plug-ins/ Plug-in architecture
|
||
|
------------------------------
|
||
|
Extended specializations of the Parts and also some other
|
||
|
functionalities are defined as Plug-ins. Plug-ins are resided in
|
||
|
/kdevelop/plugin.
|
||
|
|
||
|
Component Manager
|
||
|
-----------------
|
||
|
To give a uniform structure to the Core<->Component communications and
|
||
|
to organize the loading/unloading the componens and to register them
|
||
|
correctly there is Component Manager.
|
||
|
|
||
|
Class KDevComponentManager, resided in lib/ComponentManager is
|
||
|
responsible for loading the components (using the klibloader and
|
||
|
kservice). Everybody (mostly the core) who wants to load a component,
|
||
|
loads it using the KDevComponentManager. KDevComponentManager
|
||
|
provides the needed methods. When KDevComponentManager loads a module,
|
||
|
registers it as well, so it can give the pointer to the rest, if they
|
||
|
ask for it.
|
||
|
|
||
|
Another aspect of the KDevComponentManager is the Core<->Component
|
||
|
communications. It provides some public slots and signals. Send the
|
||
|
right signal to it, it distributes the signal over the registerd
|
||
|
components. So can the core communicate easily with the components
|
||
|
just using the KDevComponentManager to deliver its qt signals.
|
||
|
|
||
|
Creating a KDevComponent
|
||
|
------------------------
|
||
|
A new KDevComponent should have the following characters:
|
||
|
|
||
|
- It could have a generalization.
|
||
|
- It must have a specialization.
|
||
|
- The generalization (if exists) must derive from the class
|
||
|
KDevComponent.
|
||
|
- The specialization must derive from the generalization (if exists,
|
||
|
otherwise from the class KDevComponent)
|
||
|
- The generalization (if exists) must provide a ServiceType.
|
||
|
- The specialization must provide a Service associating with the
|
||
|
ServiceType of the generalization (if exists, otherwise the
|
||
|
ServiceType of KDevComponent).
|
||
|
- The generalization (if exists) must reside in
|
||
|
kdevelop/lib/ComponentManager/Components.
|
||
|
- The specialization must reside in kdevelop/parts.
|
||
|
- It must have a KInstance and should be able to be loaded with
|
||
|
klibloader.
|
||
|
|
||
|
Note:
|
||
|
Not everything should be component. The Component architecture is
|
||
|
complex enough and should stay understandable. Take a look, perhaps it
|
||
|
is better to make a plug-in out of it.
|
||
|
|
||
|
KDevNode
|
||
|
--------
|
||
|
A KDevNode (lib/general/kdevnodes.h) is a data structure which holds
|
||
|
information for an object in KDevelop. This can be used if components
|
||
|
want to exchange information about a specific object. For instance a
|
||
|
Projectspace can raise the signal
|
||
|
"sigAddedFileToProject(KDevFileNode*)" to inform all other running
|
||
|
components that a file was added. The KDevFileNode is a subclass of
|
||
|
KDevNode and contains information about Projectspace,Projectname and
|
||
|
of course the filenname of this file.
|
||
|
|
||
|
KDevNodeAction
|
||
|
--------------
|
||
|
KDevNodeAction is a special KAction which stores a KDevNode and raise
|
||
|
it if the action was activated. In KDevelop 2 it is possible to
|
||
|
extend the the popup menus in the treeviews or similar things at
|
||
|
'runtime' for every object 'indivual'. For this you will need
|
||
|
KDevNodeAction (lib/general/kdevactions.h), the following signal and
|
||
|
method :
|
||
|
|
||
|
void KDevComponent::needKDevNodeActions(KDevNode* pNode, QList<KAction>*pList)
|
||
|
QList<KAction>*KDevComponent::kdevNodeActions(KDevNode* pNode).
|
||
|
|
||
|
An example: (asking for actions)
|
||
|
|
||
|
the Projectview need some actions (the user clicked the right
|
||
|
mousebutton) for the file "main.cpp" in the project "foobar",
|
||
|
projectspace: "foo".
|
||
|
|
||
|
The Projectview creates now a KDevFileNode (pNode) with these
|
||
|
properties and an empty list (pList). After this it raise the signal
|
||
|
|
||
|
KDevComponent::needKDevNodeActions(KDevNode* pNode,QList<KAction>* pList)
|
||
|
|
||
|
The list (pList) will be filled with actions (from running components)
|
||
|
for these KDevNode. You can use it with:
|
||
|
|
||
|
+++
|
||
|
for(pAction=pList->first();pAction!=0;pAction= pList->next()){
|
||
|
pAction->plug(pPopup,-1);// add all available actions to the popupmenu
|
||
|
}
|
||
|
+++
|
||
|
|
||
|
An example: (implementing a new action for an KDevNode) An
|
||
|
implemention from a ProjectSpace component which add a "Move to"
|
||
|
action could look like this:
|
||
|
|
||
|
+++
|
||
|
QList<KAction>* ProjectSpace::kdevNodeActions(KDevNode* pNode){
|
||
|
QList<KAction>* pList = new QList<KAction>;
|
||
|
|
||
|
KDevNodeAction* pAction=0;
|
||
|
if(pNode->inherits("KDevFileNode")){
|
||
|
pList->append(new KActionSeparator());
|
||
|
pAction = new KDevNodeAction(pNode,"Move to..."); // pNode is stored in the Action
|
||
|
connect(pAction,SIGNAL(activated(KDevNode*)),this,
|
||
|
SLOT(slotMoveFileTo(KDevNode*)));
|
||
|
pList->append(pAction);
|
||
|
...
|
||
|
return pList;
|
||
|
}
|
||
|
|
||
|
Coding style rules for KDevelop 2
|
||
|
---------------------------------
|
||
|
- prefix "m_" for class attributes
|
||
|
- prefix "p" for pointers but no further type-prefixes
|
||
|
- prefix "m_p" for class attributes which are pointers
|
||
|
- upper case letters for each single word in a compound word: e.g.
|
||
|
KDevViewHandler instead of Kdevviewhandler.
|
||
|
- tab space = 4
|
||
|
- tabs replaced by spaces
|
||
|
- no prefix "get" at the beginning of a get function.
|
||
|
|
||
|
How to help
|
||
|
-----------
|
||
|
|
||
|
Please take a look at TODO file (kdevelop/TODO). Perhaps there is
|
||
|
something you can do. You can also look for bugs and fix them. You can
|
||
|
implement new idea's. You can provide translations. You can add
|
||
|
comment and documentations. If you create something, made some pics,
|
||
|
provide a patch, etc., you can upload it into our anonymous ftp site.
|
||
|
(please visit: http://www.kdevelop.org/index.html?filename=upload.html).
|
||
|
And please don't fprget to inform us per email.
|
||
|
|
||
|
Is there any question? Is there something unclear? Do you need
|
||
|
additional information? Just ask! There will be someone at the
|
||
|
mailinglist to answer your question.
|
||
|
|
||
|
|
||
|
28-02-2001
|
||
|
KDevelop Team
|
||
|
Omid Givi, omid@kdevelop.org
|
||
|
|
||
|
|
||
|
|
||
|
|