kxmlguifactory_p.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __kxmlguifactory_p_h__
00020 #define __kxmlguifactory_p_h__
00021
00022 #include <qstringlist.h>
00023 #include <qmap.h>
00024 #include <qdom.h>
00025 #include <qvaluestack.h>
00026
00027 #include <kaction.h>
00028
00029 class QWidget;
00030 class KXMLGUIClient;
00031 class KXMLGUIBuilder;
00032 class KXMLGUIFactory;
00033
00034 namespace KXMLGUI
00035 {
00036
00037 struct BuildState;
00038
00039 class ActionList : public QPtrList<KAction>
00040 {
00041 public:
00042 ActionList() {}
00043 ActionList( const QPtrList<KAction> &rhs )
00044 : QPtrList<KAction>( rhs )
00045 {}
00046 ActionList &operator=( const QPtrList<KAction> &rhs )
00047 { QPtrList<KAction>::operator=( rhs ); return *this; }
00048
00049 void plug( QWidget *container, int index ) const;
00050 void unplug( QWidget *container ) const;
00051 };
00052
00053 typedef QPtrListIterator<KAction> ActionListIt;
00054 typedef QMap< QString, ActionList > ActionListMap;
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 struct ContainerClient
00069 {
00070 KXMLGUIClient *client;
00071 ActionList actions;
00072 QValueList<int> customElements;
00073 QString groupName;
00074 ActionListMap actionLists;
00075 QString mergingName;
00076 };
00077 typedef QPtrList<ContainerClient> ContainerClientList;
00078 typedef QPtrListIterator<ContainerClient> ContainerClientListIt;
00079
00080 class ContainerNode;
00081
00082 struct MergingIndex
00083 {
00084 int value;
00085 QString mergingName;
00086
00087 QString clientName;
00088 };
00089 typedef QValueList<MergingIndex> MergingIndexList;
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 struct ContainerNode
00111 {
00112 ContainerNode( QWidget *_container, const QString &_tagName, const QString &_name,
00113 ContainerNode *_parent = 0L, KXMLGUIClient *_client = 0L,
00114 KXMLGUIBuilder *_builder = 0L, int id = -1,
00115 const QString &_mergingName = QString::null,
00116 const QString &groupName = QString::null,
00117 const QStringList &customTags = QStringList(),
00118 const QStringList &containerTags = QStringList() );
00119
00120 ContainerNode *parent;
00121 KXMLGUIClient *client;
00122 KXMLGUIBuilder *builder;
00123 QStringList builderCustomTags;
00124 QStringList builderContainerTags;
00125 QWidget *container;
00126 int containerId;
00127
00128 QString tagName;
00129 QString name;
00130
00131 QString groupName;
00132
00133 ContainerClientList clients;
00134 QPtrList<ContainerNode> children;
00135
00136 int index;
00137 MergingIndexList mergingIndices;
00138
00139 QString mergingName;
00140
00141 void clearChildren() { children.clear(); }
00142 void removeChild( ContainerNode *child );
00143
00144 MergingIndexList::Iterator findIndex( const QString &name );
00145 ContainerNode *findContainerNode( QWidget *container );
00146 ContainerNode *findContainer( const QString &_name, bool tag );
00147 ContainerNode *findContainer( const QString &name, const QString &tagName,
00148 const QPtrList<QWidget> *excludeList,
00149 KXMLGUIClient *currClient );
00150
00151 ContainerClient *findChildContainerClient( KXMLGUIClient *currentGUIClient,
00152 const QString &groupName,
00153 const MergingIndexList::Iterator &mergingIdx );
00154
00155 void plugActionList( BuildState &state );
00156 void plugActionList( BuildState &state, const MergingIndexList::Iterator &mergingIdxIt );
00157
00158 void unplugActionList( BuildState &state );
00159 void unplugActionList( BuildState &state, const MergingIndexList::Iterator &mergingIdxIt );
00160
00161 void adjustMergingIndices( int offset, const MergingIndexList::Iterator &it );
00162
00163 bool destruct( QDomElement element, BuildState &state );
00164 void destructChildren( const QDomElement &element, BuildState &state );
00165 QDomElement findElementForChild( const QDomElement &baseElement,
00166 ContainerNode *childNode );
00167 void unplugActions( BuildState &state );
00168 void unplugClient( ContainerClient *client );
00169
00170 void reset();
00171
00172 int calcMergingIndex( const QString &mergingName,
00173 MergingIndexList::Iterator &it,
00174 BuildState &state,
00175 bool ignoreDefaultMergingIndex );
00176 };
00177
00178 typedef QPtrList<ContainerNode> ContainerNodeList;
00179 typedef QPtrListIterator<ContainerNode> ContainerNodeListIt;
00180
00181 class BuildHelper
00182 {
00183 public:
00184 BuildHelper( BuildState &state,
00185 ContainerNode *node );
00186
00187 void build( const QDomElement &element );
00188
00189 private:
00190 void processElement( const QDomElement &element );
00191
00192 void processActionOrCustomElement( const QDomElement &e, bool isActionTag );
00193 bool processActionElement( const QDomElement &e, int idx );
00194 bool processCustomElement( const QDomElement &e, int idx );
00195
00196 void processStateElement( const QDomElement &element );
00197
00198 void processMergeElement( const QString &tag, const QString &name, const QDomElement &e );
00199
00200 void processContainerElement( const QDomElement &e, const QString &tag,
00201 const QString &name );
00202
00203
00204 QWidget *createContainer( QWidget *parent, int index, const QDomElement &element,
00205 int &id, KXMLGUIBuilder **builder );
00206
00207 QStringList customTags;
00208 QStringList containerTags;
00209
00210 QPtrList<QWidget> containerList;
00211
00212 ContainerClient *containerClient;
00213
00214 bool ignoreDefaultMergingIndex;
00215
00216 BuildState &m_state;
00217
00218 ContainerNode *parentNode;
00219 };
00220
00221 struct BuildState
00222 {
00223 BuildState() : guiClient( 0 ), builder( 0 ), clientBuilder( 0 ) {}
00224
00225 void reset();
00226
00227 QString clientName;
00228
00229 QString actionListName;
00230 ActionList actionList;
00231
00232 KXMLGUIClient *guiClient;
00233
00234 MergingIndexList::Iterator currentDefaultMergingIt;
00235 MergingIndexList::Iterator currentClientMergingIt;
00236
00237 KXMLGUIBuilder *builder;
00238 QStringList builderCustomTags;
00239 QStringList builderContainerTags;
00240
00241 KXMLGUIBuilder *clientBuilder;
00242 QStringList clientBuilderCustomTags;
00243 QStringList clientBuilderContainerTags;
00244 };
00245
00246 typedef QValueStack<BuildState> BuildStateStack;
00247
00248 }
00249
00250 #endif
00251
00252
This file is part of the documentation for kdelibs Version 3.1.4.