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
static 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
int calcMergingIndex(
const QDomElement &element, MergingIndexList::Iterator &it,
QString &group );
00208
00209
QStringList customTags;
00210
QStringList containerTags;
00211
00212
QPtrList<QWidget> containerList;
00213
00214 ContainerClient *containerClient;
00215
00216
bool ignoreDefaultMergingIndex;
00217
00218 BuildState &m_state;
00219
00220 ContainerNode *parentNode;
00221 };
00222
00223
struct BuildState
00224 {
00225 BuildState() : guiClient( 0 ), builder( 0 ), clientBuilder( 0 ) {}
00226
00227
void reset();
00228
00229
QString clientName;
00230
00231
QString actionListName;
00232 ActionList actionList;
00233
00234
KXMLGUIClient *guiClient;
00235
00236 MergingIndexList::Iterator currentDefaultMergingIt;
00237 MergingIndexList::Iterator currentClientMergingIt;
00238
00239
KXMLGUIBuilder *builder;
00240
QStringList builderCustomTags;
00241
QStringList builderContainerTags;
00242
00243
KXMLGUIBuilder *clientBuilder;
00244
QStringList clientBuilderCustomTags;
00245
QStringList clientBuilderContainerTags;
00246 };
00247
00248
typedef QValueStack<BuildState> BuildStateStack;
00249
00250 }
00251
00252
#endif
00253
00254