source: trunk/src/tools/uic/cpp/cppwriteinitialization.h@ 477

Last change on this file since 477 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 14.1 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the tools applications of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef CPPWRITEINITIALIZATION_H
43#define CPPWRITEINITIALIZATION_H
44
45#include "treewalker.h"
46#include <QtCore/QPair>
47#include <QtCore/QHash>
48#include <QtCore/QSet>
49#include <QtCore/QMap>
50#include <QtCore/QStack>
51#include <QtCore/QTextStream>
52
53QT_BEGIN_NAMESPACE
54
55class Driver;
56class Uic;
57class DomBrush;
58class DomFont;
59class DomResourceIcon;
60class DomSizePolicy;
61struct Option;
62
63namespace CPP {
64 // Handle for a flat DOM font to get comparison functionality required for maps
65 class FontHandle {
66 public:
67 FontHandle(const DomFont *domFont);
68 int compare(const FontHandle &) const;
69 private:
70 const DomFont *m_domFont;
71#if defined(Q_OS_MAC) && defined(Q_CC_GNU) && (__GNUC__ == 3 && __GNUC_MINOR__ == 3)
72 friend uint qHash(const FontHandle &);
73#endif
74 };
75 inline bool operator ==(const FontHandle &f1, const FontHandle &f2) { return f1.compare(f2) == 0; }
76 inline bool operator <(const FontHandle &f1, const FontHandle &f2) { return f1.compare(f2) < 0; }
77
78 // Handle for a flat DOM icon to get comparison functionality required for maps
79 class IconHandle {
80 public:
81 IconHandle(const DomResourceIcon *domIcon);
82 int compare(const IconHandle &) const;
83 private:
84 const DomResourceIcon *m_domIcon;
85#if defined(Q_OS_MAC) && defined(Q_CC_GNU) && (__GNUC__ == 3 && __GNUC_MINOR__ == 3)
86 friend uint qHash(const IconHandle &);
87#endif
88 };
89 inline bool operator ==(const IconHandle &i1, const IconHandle &i2) { return i1.compare(i2) == 0; }
90 inline bool operator <(const IconHandle &i1, const IconHandle &i2) { return i1.compare(i2) < 0; }
91
92 // Handle for a flat DOM size policy to get comparison functionality required for maps
93 class SizePolicyHandle {
94 public:
95 SizePolicyHandle(const DomSizePolicy *domSizePolicy);
96 int compare(const SizePolicyHandle &) const;
97 private:
98 const DomSizePolicy *m_domSizePolicy;
99#if defined(Q_OS_MAC) && defined(Q_CC_GNU) && (__GNUC__ == 3 && __GNUC_MINOR__ == 3)
100 friend uint qHash(const SizePolicyHandle &);
101#endif
102 };
103 inline bool operator ==(const SizePolicyHandle &f1, const SizePolicyHandle &f2) { return f1.compare(f2) == 0; }
104#if !(defined(Q_OS_MAC) && defined(Q_CC_GNU) && (__GNUC__ == 3 && __GNUC_MINOR__ == 3))
105 inline bool operator <(const SizePolicyHandle &f1, const SizePolicyHandle &f2) { return f1.compare(f2) < 0; }
106#endif
107
108
109
110struct WriteInitialization : public TreeWalker
111{
112 typedef QList<DomProperty*> DomPropertyList;
113 typedef QHash<QString, DomProperty*> DomPropertyMap;
114
115 WriteInitialization(Uic *uic, bool activateScripts);
116
117//
118// widgets
119//
120 void acceptUI(DomUI *node);
121 void acceptWidget(DomWidget *node);
122 void acceptWidgetScripts(const DomScripts &, DomWidget *node, const DomWidgets &childWidgets);
123
124 void acceptLayout(DomLayout *node);
125 void acceptSpacer(DomSpacer *node);
126 void acceptLayoutItem(DomLayoutItem *node);
127
128//
129// actions
130//
131 void acceptActionGroup(DomActionGroup *node);
132 void acceptAction(DomAction *node);
133 void acceptActionRef(DomActionRef *node);
134
135//
136// tab stops
137//
138 void acceptTabStops(DomTabStops *tabStops);
139
140//
141// custom widgets
142//
143 void acceptCustomWidgets(DomCustomWidgets *node);
144 void acceptCustomWidget(DomCustomWidget *node);
145
146//
147// layout defaults/functions
148//
149 void acceptLayoutDefault(DomLayoutDefault *node) { m_LayoutDefaultHandler.acceptLayoutDefault(node); }
150 void acceptLayoutFunction(DomLayoutFunction *node) { m_LayoutDefaultHandler.acceptLayoutFunction(node); }
151
152//
153// signal/slot connections
154//
155 void acceptConnection(DomConnection *connection);
156
157//
158// images
159//
160 void acceptImage(DomImage *image);
161
162 enum {
163 Use43UiFile = 0,
164 TopLevelMargin,
165 ChildMargin,
166 SubLayoutMargin
167 };
168
169private:
170 static QString domColor2QString(const DomColor *c);
171
172 QString iconCall(const DomProperty *prop);
173 QString pixCall(const DomProperty *prop) const;
174 QString pixCall(const QString &type, const QString &text) const;
175 QString trCall(const QString &str, const QString &comment = QString()) const;
176 QString trCall(DomString *str, const QString &defaultString = QString()) const;
177 QString noTrCall(DomString *str, const QString &defaultString = QString()) const;
178 QString autoTrCall(DomString *str, const QString &defaultString = QString()) const;
179 QTextStream &autoTrOutput(DomString *str, const QString &defaultString = QString());
180 // Apply a comma-separated list of values using a function "setSomething(int idx, value)"
181 void writePropertyList(const QString &varName, const QString &setFunction, const QString &value, const QString &defaultValue);
182
183 enum { WritePropertyIgnoreMargin = 1, WritePropertyIgnoreSpacing = 2, WritePropertyIgnoreObjectName = 4 };
184 void writeProperties(const QString &varName, const QString &className, const DomPropertyList &lst, unsigned flags = 0);
185 void writeColorGroup(DomColorGroup *colorGroup, const QString &group, const QString &paletteName);
186 void writeBrush(const DomBrush *brush, const QString &brushName);
187
188//
189// special initialization
190//
191 class Item {
192 public:
193 Item(const QString &itemClassName, const QString &indent, QTextStream &setupUiStream, QTextStream &retranslateUiStream, Driver *driver);
194 ~Item();
195 enum EmptyItemPolicy {
196 DontConstruct,
197 ConstructItemOnly,
198 ConstructItemAndVariable
199 };
200 QString writeSetupUi(const QString &parent, EmptyItemPolicy emptyItemPolicy = ConstructItemOnly);
201 void writeRetranslateUi(const QString &parentPath);
202 void addSetter(const QString &setter, const QString &directive = QString(), bool translatable = false); // don't call it if you already added *this as a child of another Item
203 void addChild(Item *child); // all setters should already been added
204 int setupUiCount() const { return m_setupUiData.setters.count(); }
205 int retranslateUiCount() const { return m_retranslateUiData.setters.count(); }
206 private:
207 struct ItemData {
208 ItemData() : policy(DontGenerate) {}
209 QMultiMap<QString, QString> setters; // directive to setter
210 QSet<QString> directives;
211 enum TemporaryVariableGeneratorPolicy { // policies with priority, number describes the priority
212 DontGenerate = 1,
213 GenerateWithMultiDirective = 2,
214 Generate = 3
215 } policy;
216 };
217 ItemData m_setupUiData;
218 ItemData m_retranslateUiData;
219 QList<Item *> m_children;
220 Item *m_parent;
221
222 const QString m_itemClassName;
223 const QString m_indent;
224 QTextStream &m_setupUiStream;
225 QTextStream &m_retranslateUiStream;
226 Driver *m_driver;
227 };
228
229 void addInitializer(Item *item,
230 const QString &name, int column, const QString &value, const QString &directive = QString(), bool translatable = false) const;
231 void addQtFlagsInitializer(Item *item, const DomPropertyMap &properties,
232 const QString &name, int column = -1) const;
233 void addQtEnumInitializer(Item *item,
234 const DomPropertyMap &properties, const QString &name, int column = -1) const;
235 void addBrushInitializer(Item *item,
236 const DomPropertyMap &properties, const QString &name, int column = -1);
237 void addStringInitializer(Item *item,
238 const DomPropertyMap &properties, const QString &name, int column = -1, const QString &directive = QString()) const;
239 void addCommonInitializers(Item *item,
240 const DomPropertyMap &properties, int column = -1);
241
242 void initializeMenu(DomWidget *w, const QString &parentWidget);
243 void initializeComboBox(DomWidget *w);
244 void initializeComboBox3(DomWidget *w);
245 void initializeListWidget(DomWidget *w);
246 void initializeTreeWidget(DomWidget *w);
247 QList<Item *> initializeTreeWidgetItems(const QList<DomItem *> &domItems);
248 void initializeTableWidget(DomWidget *w);
249
250 QString disableSorting(DomWidget *w, const QString &varName);
251 void enableSorting(DomWidget *w, const QString &varName, const QString &tempName);
252
253//
254// special initialization for the Q3 support classes
255//
256 void initializeQ3ListBox(DomWidget *w);
257 void initializeQ3IconView(DomWidget *w);
258 void initializeQ3ListView(DomWidget *w);
259 void initializeQ3ListViewItems(const QString &className, const QString &varName, const QList<DomItem*> &items);
260 void initializeQ3Table(DomWidget *w);
261 void initializeQ3TableItems(const QString &className, const QString &varName, const QList<DomItem*> &items);
262
263//
264// Sql
265//
266 void initializeQ3SqlDataTable(DomWidget *w);
267 void initializeQ3SqlDataBrowser(DomWidget *w);
268
269 QString findDeclaration(const QString &name);
270 DomWidget *findWidget(const QLatin1String &widgetClass);
271 DomImage *findImage(const QString &name) const;
272
273 bool isValidObject(const QString &name) const;
274
275private:
276 QString writeFontProperties(const DomFont *f);
277 QString writeIconProperties(const DomResourceIcon *i);
278 QString writeSizePolicy(const DomSizePolicy *sp);
279 QString writeBrushInitialization(const DomBrush *brush);
280 void addButtonGroup(const DomWidget *node, const QString &varName);
281 void addWizardPage(const QString &pageVarName, const DomWidget *page, const QString &parentWidget);
282
283 const Uic *m_uic;
284 Driver *m_driver;
285 QTextStream &m_output;
286 const Option &m_option;
287 QString m_indent;
288 QString m_dindent;
289 bool m_stdsetdef;
290
291 struct Buddy
292 {
293 Buddy(const QString &oN, const QString &b)
294 : objName(oN), buddy(b) {}
295 QString objName;
296 QString buddy;
297 };
298
299 QStack<DomWidget*> m_widgetChain;
300 QStack<DomLayout*> m_layoutChain;
301 QStack<DomActionGroup*> m_actionGroupChain;
302 QList<Buddy> m_buddies;
303
304 QSet<QString> m_buttonGroups;
305 QHash<QString, DomWidget*> m_registeredWidgets;
306 QHash<QString, DomImage*> m_registeredImages;
307 QHash<QString, DomAction*> m_registeredActions;
308 typedef QHash<uint, QString> ColorBrushHash;
309 ColorBrushHash m_colorBrushHash;
310 // Map from font properties to font variable name for reuse
311 // Map from size policy to variable for reuse
312#if defined(Q_OS_MAC) && defined(Q_CC_GNU) && (__GNUC__ == 3 && __GNUC_MINOR__ == 3)
313 typedef QHash<FontHandle, QString> FontPropertiesNameMap;
314 typedef QHash<IconHandle, QString> IconPropertiesNameMap;
315 typedef QHash<SizePolicyHandle, QString> SizePolicyNameMap;
316#else
317 typedef QMap<FontHandle, QString> FontPropertiesNameMap;
318 typedef QMap<IconHandle, QString> IconPropertiesNameMap;
319 typedef QMap<SizePolicyHandle, QString> SizePolicyNameMap;
320#endif
321 FontPropertiesNameMap m_fontPropertiesNameMap;
322 IconPropertiesNameMap m_iconPropertiesNameMap;
323 SizePolicyNameMap m_sizePolicyNameMap;
324
325 class LayoutDefaultHandler {
326 public:
327 LayoutDefaultHandler();
328 void acceptLayoutDefault(DomLayoutDefault *node);
329 void acceptLayoutFunction(DomLayoutFunction *node);
330
331 // Write out the layout margin and spacing properties applying the defaults.
332 void writeProperties(const QString &indent, const QString &varName,
333 const DomPropertyMap &pm, int marginType,
334 bool suppressMarginDefault, QTextStream &str) const;
335 private:
336 void writeProperty(int p, const QString &indent, const QString &objectName, const DomPropertyMap &pm,
337 const QString &propertyName, const QString &setter, int defaultStyleValue,
338 bool suppressDefault, QTextStream &str) const;
339
340 enum Properties { Margin, Spacing, NumProperties };
341 enum StateFlags { HasDefaultValue = 1, HasDefaultFunction = 2};
342 unsigned m_state[NumProperties];
343 int m_defaultValues[NumProperties];
344 QString m_functions[NumProperties];
345 };
346
347 // layout defaults
348 LayoutDefaultHandler m_LayoutDefaultHandler;
349 int m_layoutMarginType;
350
351 QString m_generatedClass;
352 QString m_mainFormVarName;
353
354 QString m_delayedInitialization;
355 QTextStream m_delayedOut;
356
357 QString m_refreshInitialization;
358 QTextStream m_refreshOut;
359
360 QString m_delayedActionInitialization;
361 QTextStream m_actionOut;
362 const bool m_activateScripts;
363
364 bool m_layoutWidget;
365};
366
367} // namespace CPP
368
369QT_END_NAMESPACE
370
371#endif // CPPWRITEINITIALIZATION_H
Note: See TracBrowser for help on using the repository browser.